MDL-64417 message_popup: remove old notifications during cleanup task.
authorPaul Holden <paulh@moodle.com>
Mon, 10 Feb 2020 08:19:49 +0000 (08:19 +0000)
committerPaul Holden <paulh@moodle.com>
Tue, 21 Apr 2020 13:48:22 +0000 (14:48 +0100)
Add upgrade step to remove existing orphaned records.

message/output/popup/db/upgrade.php
message/output/popup/message_output_popup.php
message/output/popup/tests/messaging_cleanup_test.php [new file with mode: 0644]
message/output/popup/version.php
message/upgrade.txt

index 131dfa7..d1dbfa8 100644 (file)
@@ -30,7 +30,7 @@ defined('MOODLE_INTERNAL') || die();
  * @param int $oldversion The version that we are upgrading from
  */
 function xmldb_message_popup_upgrade($oldversion) {
  * @param int $oldversion The version that we are upgrading from
  */
 function xmldb_message_popup_upgrade($oldversion) {
-    global $CFG;
+    global $DB;
 
     // Automatically generated Moodle v3.5.0 release upgrade line.
     // Put any upgrade step following this.
 
     // Automatically generated Moodle v3.5.0 release upgrade line.
     // Put any upgrade step following this.
@@ -44,5 +44,13 @@ function xmldb_message_popup_upgrade($oldversion) {
     // Automatically generated Moodle v3.8.0 release upgrade line.
     // Put any upgrade step following this.
 
     // Automatically generated Moodle v3.8.0 release upgrade line.
     // Put any upgrade step following this.
 
+    if ($oldversion < 2020020600) {
+        // Clean up orphaned popup notification records.
+        $DB->delete_records_select('message_popup_notifications', 'notificationid NOT IN (SELECT id FROM {notifications})');
+
+        // Reportbuilder savepoint reached.
+        upgrade_plugin_savepoint(true, 2020020600, 'message', 'popup');
+    }
+
     return true;
 }
     return true;
 }
index e8bb366..69a9cd3 100644 (file)
@@ -111,4 +111,30 @@ class message_output_popup extends message_output {
 
         return !empty($CFG->messaging);
     }
 
         return !empty($CFG->messaging);
     }
+
+    /**
+     * Remove all popup notifications up to specified time
+     *
+     * @param int $notificationdeletetime
+     * @return void
+     */
+    public function cleanup_all_notifications(int $notificationdeletetime): void {
+        global $DB;
+
+        $DB->delete_records_select('message_popup_notifications',
+            'notificationid IN (SELECT id FROM {notifications} WHERE timecreated < ?)', [$notificationdeletetime]);
+    }
+
+    /**
+     * Remove read popup notifications up to specified time
+     *
+     * @param int $notificationdeletetime
+     * @return void
+     */
+    public function cleanup_read_notifications(int $notificationdeletetime): void {
+        global $DB;
+
+        $DB->delete_records_select('message_popup_notifications',
+            'notificationid IN (SELECT id FROM {notifications} WHERE timeread < ?)', [$notificationdeletetime]);
+    }
 }
 }
diff --git a/message/output/popup/tests/messaging_cleanup_test.php b/message/output/popup/tests/messaging_cleanup_test.php
new file mode 100644 (file)
index 0000000..6a2f4cb
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Test message popup messaging cleanup task
+ *
+ * @package     message_popup
+ * @category    test
+ * @copyright   2020 Paul Holden <paulh@moodle.com>
+ * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+use core\task\messaging_cleanup_task;
+
+global $CFG;
+require_once($CFG->dirroot . '/message/output/popup/tests/base.php');
+
+/**
+ * Test class
+ *
+ * @package     message_popup
+ * @category    test
+ * @copyright   2020 Paul Holden <paulh@moodle.com>
+ * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class message_popup_messaging_cleanup_testcase extends advanced_testcase {
+
+    // Helper trait for sending fake popup notifications.
+    use message_popup_test_helper;
+
+    /**
+     * Test that all popup notifications are cleaned up
+     *
+     * @return void
+     */
+    public function test_cleanup_all_notifications() {
+        global $DB;
+
+        $this->resetAfterTest();
+
+        $userfrom = $this->getDataGenerator()->create_user();
+        $userto = $this->getDataGenerator()->create_user();
+
+        $now = time();
+
+        $this->send_fake_unread_popup_notification($userfrom, $userto, 'Message 1', $now - 10);
+        $notificationid = $this->send_fake_unread_popup_notification($userfrom, $userto, 'Message 2', $now);
+
+        // Sanity check.
+        $this->assertEquals(2, $DB->count_records('message_popup_notifications'));
+
+        // Delete all notifications >5 seconds old.
+        set_config('messagingdeleteallnotificationsdelay', 5);
+        (new messaging_cleanup_task())->execute();
+
+        // We should have just one record now, matching the second notification we sent.
+        $records = $DB->get_records('message_popup_notifications');
+        $this->assertCount(1, $records);
+        $this->assertEquals($notificationid, reset($records)->notificationid);
+    }
+
+    /**
+     * Test that read popup notifications are cleaned up
+     *
+     * @return void
+     */
+    public function test_cleanup_read_notifications() {
+        global $DB;
+
+        $this->resetAfterTest();
+
+        $userfrom = $this->getDataGenerator()->create_user();
+        $userto = $this->getDataGenerator()->create_user();
+
+        $now = time();
+
+        $this->send_fake_read_popup_notification($userfrom, $userto, 'Message 1', $now - 20, $now - 10);
+        $notificationid = $this->send_fake_read_popup_notification($userfrom, $userto, 'Message 2', $now - 15, $now);
+
+        // Sanity check.
+        $this->assertEquals(2, $DB->count_records('message_popup_notifications'));
+
+        // Delete read notifications >5 seconds old.
+        set_config('messagingdeletereadnotificationsdelay', 5);
+        (new messaging_cleanup_task())->execute();
+
+        // We should have just one record now, matching the second notification we sent.
+        $records = $DB->get_records('message_popup_notifications');
+        $this->assertCount(1, $records);
+        $this->assertEquals($notificationid, reset($records)->notificationid);
+    }
+}
index 40cda62..a4cef35 100644 (file)
@@ -24,6 +24,6 @@
 
 defined('MOODLE_INTERNAL') || die();
 
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2020012300;        // The current plugin version (Date: YYYYMMDDXX)
+$plugin->version   = 2020020600;        // The current plugin version (Date: YYYYMMDDXX)
 $plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'message_popup';  // Full name of the plugin (used for diagnostics)
 $plugin->requires  = 2019111200;        // Requires this Moodle version
 $plugin->component = 'message_popup';  // Full name of the plugin (used for diagnostics)
index 886e788..be6da94 100644 (file)
@@ -2,7 +2,6 @@ This files describes API changes in /message/ messaging system,
 information provided here is intended especially for developers.
 
 === 3.9 ===
 information provided here is intended especially for developers.
 
 === 3.9 ===
-
 * Removed the following deprecated functions:
   - message_move_userfrom_unread2read
   - message_get_blocked_users
 * Removed the following deprecated functions:
   - message_move_userfrom_unread2read
   - message_get_blocked_users