From a13affea565858760f848e7b82106f8c47fc5fcd Mon Sep 17 00:00:00 2001
From: Demian Katz <demian.katz@villanova.edu>
Date: Fri, 22 Nov 2019 12:39:28 -0500
Subject: [PATCH] Add setting to suppress older deletes from OAI responses.
 (#1496)

---
 config/vufind/config.ini                |  6 ++++++
 module/VuFind/src/VuFind/OAI/Server.php | 23 +++++++++++++++++++++--
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/config/vufind/config.ini b/config/vufind/config.ini
index 8f154b41f38..cee79fca883 100644
--- a/config/vufind/config.ini
+++ b/config/vufind/config.ini
@@ -1270,6 +1270,11 @@ url             = https://www.myendnoteweb.com/EndNoteWeb.html
 ; filters. They can be used e.g. to limit results to records that can be returned in
 ; the requested format.
 ;
+; delete_lifetime controls how many days' worth of deleted records to include in
+; responses. Records deleted before the cut-off will not be included in responses.
+; Omit this setting to return all deleted records. This can be useful for long-lived
+; systems with many deleted records, to prevent full harvests from becoming unwieldy.
+;
 ;[OAI]
 ;identifier       = myuniversity.edu
 ;repository_name  = "MyUniversity Catalog"
@@ -1281,6 +1286,7 @@ url             = https://www.myendnoteweb.com/EndNoteWeb.html
 ;default_query = "institution:kfu"
 ;vufind_api_format_fields = "id,authors,cleanIsbn,cleanIssn,formats,title"
 ;record_format_filters[marc21] = "record_format:marc"
+;delete_lifetime = 365
 
 ; Proxy Server is Optional.
 [Proxy]
diff --git a/module/VuFind/src/VuFind/OAI/Server.php b/module/VuFind/src/VuFind/OAI/Server.php
index c4b823a8be2..fc74c13b098 100644
--- a/module/VuFind/src/VuFind/OAI/Server.php
+++ b/module/VuFind/src/VuFind/OAI/Server.php
@@ -203,6 +203,14 @@ class Server
      */
     protected $recordFormatFilters = [];
 
+    /**
+     * Limit on display of deleted records (in days); older deleted records will not
+     * be returned by the server. Set to null for no limit.
+     *
+     * @var int
+     */
+    protected $deleteLifetime = null;
+
     /**
      * Constructor
      *
@@ -677,6 +685,11 @@ class Server
             $this->recordFormatFilters
                 = $config->OAI->record_format_filters->toArray();
         }
+
+        // Initialize delete lifetime, if set:
+        if (isset($config->OAI->delete_lifetime)) {
+            $this->deleteLifetime = intval($config->OAI->delete_lifetime);
+        }
     }
 
     /**
@@ -763,10 +776,16 @@ class Server
         // The verb determines whether we're returning headers only or full records:
         $headersOnly = ($verb != 'ListRecords');
 
+        // Apply the delete lifetime limit to the from date if necessary:
+        $deleteCutoff = $this->deleteLifetime
+            ? strtotime('-' . $this->deleteLifetime . ' days') : 0;
+        $deleteFrom = ($deleteCutoff < $from) ? $from : $deleteCutoff;
+
         // Get deleted records in the requested range (if applicable):
-        $deletedCount = $this->listRecordsGetDeletedCount($from, $until);
+        $deletedCount = $this->listRecordsGetDeletedCount($deleteFrom, $until);
         if ($deletedCount > 0 && $currentCursor < $deletedCount) {
-            $deleted = $this->listRecordsGetDeleted($from, $until, $currentCursor);
+            $deleted = $this
+                ->listRecordsGetDeleted($deleteFrom, $until, $currentCursor);
             foreach ($deleted as $current) {
                 $this->attachDeleted($xml, $current, $headersOnly);
                 $currentCursor++;
-- 
GitLab