From fe3e86768d4e67373ca194dbfe26124451fb152c Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Mon, 28 Jan 2019 07:40:15 -0300 Subject: [PATCH] Bug 22206: Add routes to suspend/resume holds This patch introduces: - POST /holds/{hold_id}/suspension { "expiration_date": "2019-01-30" } - DELETE /holds/{hold_id}/suspension to suspend a hold or resume a suspended hold, respectively. To test: - Apply this patches - Run: $ kshell k$ prove t/db_dependent/api/v1/holds.t => SUCCESS: Tests pass! - Sign off :-D Signed-off-by: Martin Renvoize --- Koha/REST/V1/Holds.pm | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/Koha/REST/V1/Holds.pm b/Koha/REST/V1/Holds.pm index 98b05a4..48bd18f 100644 --- a/Koha/REST/V1/Holds.pm +++ b/Koha/REST/V1/Holds.pm @@ -270,6 +270,82 @@ sub delete { return $c->render( status => 200, openapi => {} ); } +=head3 suspend + +Method that handles suspending a hold + +=cut + +sub suspend { + my $c = shift->openapi->valid_input or return; + + my $hold_id = $c->validation->param('hold_id'); + my $hold = Koha::Holds->find($hold_id); + my $body = $c->req->json; + my $exp_date = ($body) ? $body->{expiration_date} : undef; + + unless ($hold) { + return $c->render( status => 404, openapi => { error => 'Hold not found.' } ); + } + + return try { + my $date = ($exp_date) ? dt_from_string( $exp_date, 'rfc3339' ) : undef; + $hold->suspend_hold($date); + $hold->discard_changes; + $c->res->headers->location( $c->req->url->to_string ); + return $c->render( + status => 201, + openapi => { + expiration_date => output_pref( + { dt => dt_from_string( $hold->suspend_until ), + dateformat => 'rfc3339', + dateonly => 1 + } + ) + } + ); + } + catch { + if ( blessed $_ and $_->isa('Koha::Exceptions::Hold::CannotSuspendFound') ) { + return $c->render( status => 400, openapi => { error => "$_" } ); + } + else { + return $c->render( + status => 500, + openapi => { error => "Something went wrong. check the logs." } + ); + } + }; +} + +=head3 resume + +Method that handles resuming a hold + +=cut + +sub resume { + my $c = shift->openapi->valid_input or return; + + my $hold_id = $c->validation->param('hold_id'); + my $hold = Koha::Holds->find($hold_id); + my $body = $c->req->json; + + unless ($hold) { + return $c->render( status => 404, openapi => { error => 'Hold not found.' } ); + } + + return try { + $hold->resume; + return $c->render( status => 204, openapi => {} ); + } + catch { + return $c->render( + status => 500, + openapi => { error => "Something went wrong. check the logs." } + ); + }; +} =head3 _to_api -- 2.1.4