From b37dfea68793567f924e8eefc9a0f698a49f55dc Mon Sep 17 00:00:00 2001 From: hamza221 Date: Fri, 24 Nov 2023 17:45:32 +0100 Subject: [PATCH] fix: handle-duplicate-reminder Signed-off-by: hamza221 --- apps/dav/lib/CalDAV/Reminder/Backend.php | 5 +++-- apps/dav/lib/CalDAV/Reminder/ReminderService.php | 7 +++++++ apps/dav/tests/unit/CalDAV/Reminder/BackendTest.php | 4 ++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/apps/dav/lib/CalDAV/Reminder/Backend.php b/apps/dav/lib/CalDAV/Reminder/Backend.php index ce4469228d39b..a4f3c7c6e12f4 100644 --- a/apps/dav/lib/CalDAV/Reminder/Backend.php +++ b/apps/dav/lib/CalDAV/Reminder/Backend.php @@ -44,11 +44,12 @@ public function __construct(IDBConnection $db, */ public function getRemindersToProcess():array { $query = $this->db->getQueryBuilder(); - $query->select(['cr.*', 'co.calendardata', 'c.displayname', 'c.principaluri']) + $query->select(['cr.*', 'co.calendardata', 'c.displayname', 'c.principaluri','cr.notification_date', 'cr.event_hash', 'cr.type']) ->from('calendar_reminders', 'cr') ->where($query->expr()->lte('cr.notification_date', $query->createNamedParameter($this->timeFactory->getTime()))) ->join('cr', 'calendarobjects', 'co', $query->expr()->eq('cr.object_id', 'co.id')) - ->join('cr', 'calendars', 'c', $query->expr()->eq('cr.calendar_id', 'c.id')); + ->join('cr', 'calendars', 'c', $query->expr()->eq('cr.calendar_id', 'c.id')) + ->groupBy('cr.event_hash', 'cr.notification_date', 'cr.type'); $stmt = $query->execute(); return array_map( diff --git a/apps/dav/lib/CalDAV/Reminder/ReminderService.php b/apps/dav/lib/CalDAV/Reminder/ReminderService.php index 617e71d6d261b..be81e534dd347 100644 --- a/apps/dav/lib/CalDAV/Reminder/ReminderService.php +++ b/apps/dav/lib/CalDAV/Reminder/ReminderService.php @@ -444,7 +444,14 @@ private function getRemindersForVAlarm(VAlarm $valarm, * @param array $reminders */ private function writeRemindersToDatabase(array $reminders): void { + $uniqueReminders = []; foreach ($reminders as $reminder) { + $key = $reminder['notification_date']. $reminder['event_hash'].$reminder['type']; + if(!isset($uniqueReminders[$key])) { + $uniqueReminders[$key] = $reminder; + } + } + foreach (array_values($uniqueReminders) as $reminder) { $this->backend->insertReminder( (int) $reminder['calendar_id'], (int) $reminder['object_id'], diff --git a/apps/dav/tests/unit/CalDAV/Reminder/BackendTest.php b/apps/dav/tests/unit/CalDAV/Reminder/BackendTest.php index ffba1a2fc96d1..9900c77bf54bd 100644 --- a/apps/dav/tests/unit/CalDAV/Reminder/BackendTest.php +++ b/apps/dav/tests/unit/CalDAV/Reminder/BackendTest.php @@ -127,7 +127,7 @@ public function testGetRemindersToProcess(): void { 'is_recurrence_exception' => false, 'event_hash' => 'asd123', 'alarm_hash' => 'asd567', - 'type' => 'EMAIL', + 'type' => 'AUDIO', 'is_relative' => true, 'notification_date' => 123456, 'is_repeat_based' => false, @@ -144,7 +144,7 @@ public function testGetRemindersToProcess(): void { 'is_recurrence_exception' => false, 'event_hash' => 'asd123', 'alarm_hash' => 'asd567', - 'type' => 'AUDIO', + 'type' => 'EMAIL', 'is_relative' => true, 'notification_date' => 123456, 'is_repeat_based' => false,