Bug 17003: (follow-up) Update definitions according to voted RFC
authorJosef Moravec <josef.moravec@gmail.com>
Fri, 29 Mar 2019 07:53:27 +0000 (07:53 +0000)
committerMartin Renvoize <martin.renvoize@ptfs-europe.com>
Mon, 1 Jul 2019 15:10:15 +0000 (16:10 +0100)
Test plan:
1) Have some patrons with checkouts, some renewable and some not
renewable
2) Use your favorite API tester and access GET
http://koha.url/api/v1/checkouts/{checkout_id}/allows_renewal
3) Check the response is OK according to voted RFC:
https://wiki.koha-community.org/wiki/Checkouts_endpoint_RFC#Checkout_renewability_2
4) prove t/db_dependent/api/v1/checkouts.t

Signed-off-by: Michal Denar <black23@gmail.com>
Signed-off-by: Johanna Raisa <johanna.raisa@gmail.com>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Koha/REST/V1/Checkouts.pm
api/v1/swagger/definitions.json
api/v1/swagger/definitions/allows_renewal.json [new file with mode: 0644]
api/v1/swagger/definitions/renewability.json [deleted file]
api/v1/swagger/paths.json
api/v1/swagger/paths/checkouts.json
t/db_dependent/api/v1/checkouts.t

index b1bc863..bb349a7 100644 (file)
@@ -24,6 +24,7 @@ use C4::Auth qw( haspermission );
 use C4::Context;
 use C4::Circulation;
 use Koha::Checkouts;
+use Koha::IssuingRules;
 
 use Try::Tiny;
 
@@ -128,7 +129,13 @@ sub renew {
     );
 }
 
-sub renewability {
+=head3 allows_renewal
+
+Checks if the checkout could be renewed and return the related information.
+
+=cut
+
+sub allows_renewal {
     my $c = shift->openapi->valid_input or return;
 
     my $checkout_id = $c->validation->param('checkout_id');
@@ -146,9 +153,22 @@ sub renewability {
 
     my $renewable = Mojo::JSON->false;
     $renewable = Mojo::JSON->true if $can_renew;
+
+    my $rule = Koha::IssuingRules->get_effective_issuing_rule(
+        {
+            categorycode => $checkout->patron->categorycode,
+            itemtype     => $checkout->item->effective_itemtype,
+            branchcode   => $checkout->branchcode,
+        }
+    );
     return $c->render(
         status => 200,
-        openapi => { renewable => $renewable, error => $error }
+        openapi => {
+            allows_renewal => $renewable,
+            max_renewals => $rule->renewalsallowed,
+            current_renewals => $checkout->renewals,
+            error => $error
+        }
     );
 }
 
index 8fe086d..e3001b5 100644 (file)
@@ -32,8 +32,8 @@
   "patron_balance": {
     "$ref": "definitions/patron_balance.json"
   },
-  "renewability": {
-    "$ref": "definitions/renewability.json"
+  "allows_renewal": {
+    "$ref": "definitions/allows_renewal.json"
   },
   "vendor": {
     "$ref": "definitions/vendor.json"
diff --git a/api/v1/swagger/definitions/allows_renewal.json b/api/v1/swagger/definitions/allows_renewal.json
new file mode 100644 (file)
index 0000000..6db074b
--- /dev/null
@@ -0,0 +1,21 @@
+{
+  "type": "object",
+  "properties": {
+    "allows_renewal": {
+      "type": "boolean",
+      "description": "Renewability status; true = renewable, false = not renewable"
+    },
+    "max_renewals": {
+      "type": "integer",
+      "description": "Maximum number of possible renewals"
+    },
+     "current_renewals": {
+      "type": "integer",
+      "description": "Current used renewals"
+    },
+    "error": {
+      "type": ["string", "null"],
+      "description": "Description on false allows_renewal."
+    }
+  }
+}
diff --git a/api/v1/swagger/definitions/renewability.json b/api/v1/swagger/definitions/renewability.json
deleted file mode 100644 (file)
index 654691e..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "renewable": {
-      "type": "boolean",
-      "description": "Renewability status; true = renewable, false = not renewable"
-    },
-    "error": {
-      "type": ["string", "null"],
-      "description": "Description on false renewability."
-    }
-  }
-}
index 9a6bf3c..5d544f5 100644 (file)
@@ -44,8 +44,8 @@
   "/libraries/{library_id}": {
     "$ref": "paths/libraries.json#/~1libraries~1{library_id}"
   },
-  "/checkouts/{checkout_id}/renewability": {
-    "$ref": "paths/checkouts.json#/~1checkouts~1{checkout_id}~1renewability"
+  "/checkouts/{checkout_id}/allows_renewal": {
+    "$ref": "paths/checkouts.json#/~1checkouts~1{checkout_id}~1allows_renewal"
   },
   "/patrons": {
     "$ref": "paths/patrons.json#/~1patrons"
index 342aa5a..7d89e3c 100644 (file)
       }
     }
   },
-  "/checkouts/{checkout_id}/renewability": {
+  "/checkouts/{checkout_id}/allows_renewal": {
     "get": {
-      "x-mojo-to": "Checkout#renewability",
-      "operationId": "renewabilityCheckout",
+      "x-mojo-to": "Checkouts#allows_renewal",
+      "operationId": "allows_renewalCheckout",
       "tags": ["patrons", "checkouts"],
       "parameters": [{
-        "$ref": "../parameters.json#/checkoutIdPathParam"
+        "$ref": "../parameters.json#/checkout_id_pp"
       }],
       "produces": ["application/json"],
       "responses": {
         "200": {
-          "description": "Checkout renewability",
-          "schema": { "$ref": "../definitions.json#/renewability" }
+          "description": "Checkout renewability information",
+          "schema": { "$ref": "../definitions.json#/allows_renewal" }
         },
         "403": {
           "description": "Forbidden",
index 5c92694..fb0d350 100644 (file)
@@ -169,9 +169,14 @@ $t->post_ok( "//$unauth_userid:$unauth_password@/api/v1/checkouts/" . $issue3->i
               required_permissions => { circulate => "circulate_remaining_permissions" }
             });
 
-$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id . "/renewability")
+$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id . "/allows_renewal")
   ->status_is(200)
-  ->json_is({ renewable => Mojo::JSON->true, error => undef });
+  ->json_is({
+        allows_renewal   => Mojo::JSON->true,
+        max_renewals     => 1,
+        current_renewals => 0,
+        error            => undef
+    });
 
 $t->post_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id . "/renewal" )
   ->status_is(201)
@@ -183,6 +188,11 @@ $t->post_ok( "//$userid:$password@/api/v1/checkouts/" . $issue1->issue_id . "/re
   ->status_is(403)
   ->json_is({ error => 'Renewal not authorized (too_many)' });
 
-$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id . "/renewability")
+$t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id . "/allows_renewal")
   ->status_is(200)
-  ->json_is({ renewable => Mojo::JSON->false, error => 'too_many' });
+  ->json_is({
+        allows_renewal   => Mojo::JSON->false,
+        max_renewals     => 1,
+        current_renewals => 1,
+        error            => 'too_many'
+    });