@@ -, +, @@ try { ... } catch { if ( know_exception ) { handle_known_exception($_); } $c->unhandled_exception($_); } die("Nada"); before the render step. introduced lines for API with the right path. use Koha::Exceptions; Koha::Exceptions::DuplicateObject->throw("Nada"); --- Koha/REST/Plugin/Exceptions.pm | 83 ++++++++++++++++++++++++++++++++++ Koha/REST/V1.pm | 3 ++ 2 files changed, 86 insertions(+) create mode 100644 Koha/REST/Plugin/Exceptions.pm --- a/Koha/REST/Plugin/Exceptions.pm +++ a/Koha/REST/Plugin/Exceptions.pm @@ -0,0 +1,83 @@ +package Koha::REST::Plugin::Exceptions; + +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# Koha is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . + +use Modern::Perl; + +use Scalar::Util qw( blessed ); +use Koha::Logger; + +use Mojo::Base 'Mojolicious::Plugin'; + +=head1 NAME + +Koha::REST::Plugin::Exceptions + +=head1 API + +=head2 Helper methods + +=head3 unhandled_exception + + try { + ... + } + catch { + if ( know_exception ) { + handle_known_exception($_); + } + + $c->unhandled_exception($_); + } + +Provides a generic and reusable way to throw unhandled exceptions. This way we +can centralize the behaviour control (e.g. production vs. development environmet) + +=cut + +sub register { + my ( $self, $app ) = @_; + + $app->helper( + 'unhandled_exception' => sub { + my ( $c, $exception ) = @_; + + my $req = $c->req; + my $method = $req->method; + my $path = $req->url->to_abs->path; + my $type = ""; + + if ( blessed $exception ) { + $type = "(" . ref($exception) . ")"; + } + + my $message = "$method $path: unhandled exception $type\<\<$exception\>\>"; + + $c->app->log->error("$message"); + + $c->render( + status => 500, + openapi => { + error => + "Something went wrong, check Koha logs for details." + } + ); + } + + ); +} + +1; --- a/Koha/REST/V1.pm +++ a/Koha/REST/V1.pm @@ -40,6 +40,8 @@ Overloaded Mojolicious->startup method. It is called at application startup. sub startup { my $self = shift; + $self->log( Koha::Logger->get({ interface => 'api' }) ); + $self->hook( before_dispatch => sub { my $c = shift; @@ -132,6 +134,7 @@ sub startup { $self->plugin( 'Koha::REST::Plugin::Pagination' ); $self->plugin( 'Koha::REST::Plugin::Query' ); $self->plugin( 'Koha::REST::Plugin::Objects' ); + $self->plugin( 'Koha::REST::Plugin::Exceptions' ); } 1; --