Bugzilla – Attachment 178007 Details for
Bug 35246
Bad data erorrs should provide better logs for api/v1/biblios
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 35246: Make Koha::Biblio->to_api throw relevant exception if no biblioitem row
Bug-35246-Make-KohaBiblio-toapi-throw-relevant-exc.patch (text/plain), 3.64 KB, created by
Tomás Cohen Arazi (tcohen)
on 2025-02-13 13:22:53 UTC
(
hide
)
Description:
Bug 35246: Make Koha::Biblio->to_api throw relevant exception if no biblioitem row
Filename:
MIME Type:
Creator:
Tomás Cohen Arazi (tcohen)
Created:
2025-02-13 13:22:53 UTC
Size:
3.64 KB
patch
obsolete
>From 2190dc0877c903543796f96d24903c080c36e7ec Mon Sep 17 00:00:00 2001 >From: Tomas Cohen Arazi <tomascohen@theke.io> >Date: Thu, 13 Feb 2025 13:02:00 +0000 >Subject: [PATCH] Bug 35246: Make Koha::Biblio->to_api throw relevant exception > if no biblioitem row > >This patch makes the `to_api()` method return an proper exception when >the `$self->biblioitem` accessor returns `undef`. This is a bad data >scenario and we could do better in terms of logging the situation. > >The new exception will be correctly rendered in the logs by the >`unhandled_exception` Mojolicious helper and no behavior change on the >API. > >I wasn't sure to keep the api tests I wrote. I originally added handling >for the specific exception in the controller, but it become obvious it >was not worth: too much code, the `GET /biblios` endpoint would need the >same treatment, etc. And the current `500 Internal server error` is good >enough as a response, and the logs explain the situation correctly. > >To test: >1. On a fresh `KTD` pick a biblio (say biblionumber=1) >2. Use your favourite REST tool (Postman?) to access the record with > `Accept: application/json`. i.e. > >``` >GET kohadev.localhost/api/v1/biblios/1 >Accept: application/json >``` > >=> SUCCESS: All good >3. Delete the related `biblioitems` row: > $ ktd --shell > k$ koha-mysql kohadev > > DELETE FROM biblioitems WHERE biblionumber=1; \q >4. Repeat 2 >=> SUCCESS: You get a 500 error >5. Check the logs >=> FAIL: You get a cryptic message about accessing a method on an >undefined object: > >``` >2025/02/13 13:15:00] [ERROR] GET /api/v1/biblios: unhandled exception (Mojo::Exception)<<Can't call method "to_api" on an undefined value at /usr/share/koha/Koha/Biblio.pm line 1433.>> >``` > >6. Apply this patch >7. Restart things: > k$ restart_all >8. Repeat 2 >=> SUCCESS: You get a 500 error >9. Check the logs >=> SUCCESS: You get a more meaningful exception: > >``` >[2025/02/13 13:20:00] [ERROR] GET /api/v1/biblios/1: unhandled exception (Koha::Exceptions::RelatedObjectNotFound)<<Exception 'Koha::Exceptions::RelatedObjectNotFound' thrown 'The requested related object does not exist' with accessor => biblioitem, class => Koha::Biblioitem>> >``` > >10. Run the tests: > k$ prove t/db_dependent/Koha/Biblio.t \ > t/db_dependent/api/v1/biblios.t >=> SUCCESS: They pass! >11. Sign off :-D >--- > Koha/Biblio.pm | 7 ++++++- > Koha/Exceptions.pm | 5 +++++ > 2 files changed, 11 insertions(+), 1 deletion(-) > >diff --git a/Koha/Biblio.pm b/Koha/Biblio.pm >index 030da1a371b..c9baa0d1540 100644 >--- a/Koha/Biblio.pm >+++ b/Koha/Biblio.pm >@@ -1713,7 +1713,12 @@ sub to_api { > $args = defined $args ? {%$args} : {}; > delete $args->{embed}; > >- my $json_biblioitem = $self->biblioitem->to_api($args); >+ my $biblioitem = $self->biblioitem; >+ >+ Koha::Exceptions::RelatedObjectNotFound->throw( accessor => 'biblioitem', class => 'Koha::Biblioitem' ) >+ unless $biblioitem; >+ >+ my $json_biblioitem = $biblioitem->to_api($args); > return unless $json_biblioitem; > > return { %$json_biblio, %$json_biblioitem }; >diff --git a/Koha/Exceptions.pm b/Koha/Exceptions.pm >index 5166e7fb650..d308f192290 100644 >--- a/Koha/Exceptions.pm >+++ b/Koha/Exceptions.pm >@@ -37,6 +37,11 @@ use Exception::Class ( > isa => 'Koha::Exception', > description => 'The object have not been created', > }, >+ 'Koha::Exceptions::RelatedObjectNotFound' => { >+ isa => 'Koha::Exception', >+ description => 'The requested related object does not exist', >+ fields => [ 'accessor', 'class' ], >+ }, > 'Koha::Exceptions::CannotDeleteDefault' => { > isa => 'Koha::Exception', > description => 'The default value cannot be deleted' >-- >2.48.1
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 35246
:
178001
|
178002
|
178007
|
178018
|
178019
|
178173