From 1069996bc61853a38b98e8ce6a52be39d8deb50d Mon Sep 17 00:00:00 2001
From: Johanna Raisa <johanna.raisa@gmail.com>
Date: Tue, 22 Oct 2019 14:41:38 +0300
Subject: [PATCH 1/3] Bug 18795: DELETE (anonymize) checkout history

Anonymize patron's checkout history via REST API

DELETE /checkouts/history?patron_id=123

To test:
1. prove t/db_dependent/api/v1/checkouts.t
2. Manually send DELETE request to /api/v1/checkouts/history?patron_id=123 where 123 is your patron's borrowernumber

Sponsored-by: Koha-Suomi Oy
---
 Koha/REST/V1/Checkouts.pm           | 26 ++++++++++++++++++++++++++
 api/v1/swagger/paths.json           |  3 +++
 api/v1/swagger/paths/checkouts.json | 28 ++++++++++++++++++++++++++++
 t/db_dependent/api/v1/checkouts.t   | 19 ++++++++++++++++++-
 4 files changed, 75 insertions(+), 1 deletion(-)

diff --git a/Koha/REST/V1/Checkouts.pm b/Koha/REST/V1/Checkouts.pm
index c8ded14ef7..26d1da04a0 100644
--- a/Koha/REST/V1/Checkouts.pm
+++ b/Koha/REST/V1/Checkouts.pm
@@ -182,6 +182,32 @@ sub allows_renewal {
     );
 }
 
+=head3 delete_history
+
+Anonymize patron's checkout history.
+
+=cut
+
+sub delete_history {
+    my $c = shift->openapi->valid_input or return;
+
+    my $patron_id = $c->validation->param('patron_id');
+
+    my $patrons = Koha::Patrons->search({
+        'me.borrowernumber' => $patron_id
+    });
+
+    $patrons->anonymise_issue_history;
+
+    unless ($patrons->count) {
+        return $c->render( status => 404, openapi => {
+            error => "Patron doesn't exist"
+        });
+    }
+
+    return $c->render( status => 204, openapi => "" );
+}
+
 =head3 _to_api
 
 Helper function that maps a hashref of Koha::Checkout attributes into REST api
diff --git a/api/v1/swagger/paths.json b/api/v1/swagger/paths.json
index 95278ec23a..803e3b5d35 100644
--- a/api/v1/swagger/paths.json
+++ b/api/v1/swagger/paths.json
@@ -20,6 +20,9 @@
   "/checkouts/{checkout_id}/renewal": {
     "$ref": "paths/checkouts.json#/~1checkouts~1{checkout_id}~1renewal"
   },
+  "/checkouts/history": {
+    "$ref": "paths/checkouts.json#/~1checkouts~1history"
+  },
   "/cities": {
     "$ref": "paths/cities.json#/~1cities"
   },
diff --git a/api/v1/swagger/paths/checkouts.json b/api/v1/swagger/paths/checkouts.json
index ca6d970dbb..9634e0c139 100644
--- a/api/v1/swagger/paths/checkouts.json
+++ b/api/v1/swagger/paths/checkouts.json
@@ -135,5 +135,33 @@
         }
       }
     }
+  },
+  "/checkouts/history": {
+    "delete": {
+      "x-mojo-to": "Checkouts#delete_history",
+      "operationId": "delete_historyCheckouts",
+      "tags": ["patrons", "checkouts"],
+      "parameters": [{
+        "$ref": "../parameters.json#/patron_id_qp"
+      }],
+      "produces": ["application/json"],
+      "responses": {
+        "204": {
+          "description": "Checkout history deleted successfully",
+          "schema": {
+            "type": "string"
+          }
+        },
+        "404": {
+          "description": "Patron not found",
+          "schema": { "$ref": "../definitions.json#/error" }
+        }
+      },
+      "x-koha-authorization": {
+        "permissions": {
+          "circulate": "circulate_remaining_permissions"
+        }
+      }
+    }
   }
 }
diff --git a/t/db_dependent/api/v1/checkouts.t b/t/db_dependent/api/v1/checkouts.t
index 5a3447412e..a1df3a6254 100644
--- a/t/db_dependent/api/v1/checkouts.t
+++ b/t/db_dependent/api/v1/checkouts.t
@@ -17,7 +17,7 @@
 
 use Modern::Perl;
 
-use Test::More tests => 93;
+use Test::More tests => 99;
 use Test::MockModule;
 use Test::Mojo;
 use t::lib::Mocks;
@@ -216,3 +216,20 @@ $t->get_ok( "//$userid:$password@/api/v1/checkouts/" . $issue2->issue_id . "/all
         current_renewals => 1,
         error            => 'too_many'
     });
+
+$t->delete_ok( "//$userid:$password@/api/v1/checkouts/history?patron_id=$patron_id")
+  ->status_is(204)
+  ->content_is('');
+
+my $patron_to_delete = $builder->build_object({
+    class => 'Koha::Patrons',
+    value => { flags => 0 }
+});
+
+my $patron_to_delete_id = $patron_to_delete->borrowernumber;
+
+$patron_to_delete->delete;
+
+$t->delete_ok( "//$userid:$password@/api/v1/checkouts/history?patron_id=$patron_to_delete_id")
+  ->status_is(404)
+  ->json_is({error => "Patron doesn't exist"});
-- 
2.17.1