From 54cb5666c183906cb6d769b562407ed7ebbfc505 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Mon, 10 Feb 2020 08:19:49 +0000 Subject: [PATCH 1/1] MDL-64417 message_popup: remove old notifications during cleanup task. Add upgrade step to remove existing orphaned records. --- message/output/popup/db/upgrade.php | 10 +- message/output/popup/message_output_popup.php | 26 +++++ .../popup/tests/messaging_cleanup_test.php | 107 ++++++++++++++++++ message/output/popup/version.php | 2 +- message/upgrade.txt | 1 - 5 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 message/output/popup/tests/messaging_cleanup_test.php diff --git a/message/output/popup/db/upgrade.php b/message/output/popup/db/upgrade.php index 131dfa7ad04..d1dbfa81b85 100644 --- a/message/output/popup/db/upgrade.php +++ b/message/output/popup/db/upgrade.php @@ -30,7 +30,7 @@ defined('MOODLE_INTERNAL') || die(); * @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. @@ -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. + 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; } diff --git a/message/output/popup/message_output_popup.php b/message/output/popup/message_output_popup.php index e8bb3663430..69a9cd365e3 100644 --- a/message/output/popup/message_output_popup.php +++ b/message/output/popup/message_output_popup.php @@ -111,4 +111,30 @@ class message_output_popup extends message_output { 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 index 00000000000..6a2f4cb16e7 --- /dev/null +++ b/message/output/popup/tests/messaging_cleanup_test.php @@ -0,0 +1,107 @@ +. + +/** + * Test message popup messaging cleanup task + * + * @package message_popup + * @category test + * @copyright 2020 Paul Holden + * @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 + * @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); + } +} diff --git a/message/output/popup/version.php b/message/output/popup/version.php index 40cda625704..a4cef3589c3 100644 --- a/message/output/popup/version.php +++ b/message/output/popup/version.php @@ -24,6 +24,6 @@ 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) diff --git a/message/upgrade.txt b/message/upgrade.txt index 886e788ebf0..be6da940d4a 100644 --- a/message/upgrade.txt +++ b/message/upgrade.txt @@ -2,7 +2,6 @@ This files describes API changes in /message/ messaging system, information provided here is intended especially for developers. === 3.9 === - * Removed the following deprecated functions: - message_move_userfrom_unread2read - message_get_blocked_users -- 2.43.0