From 6c88022e0954d504e1e0b622db3f51e0630a3c80 Mon Sep 17 00:00:00 2001 From: Grigory Vodyanov Date: Mon, 2 Mar 2026 22:59:50 +0100 Subject: [PATCH] feat: add default reminder setting caldav Signed-off-by: Grigory Vodyanov --- .../composer/composer/autoload_classmap.php | 1 + .../dav/composer/composer/autoload_static.php | 1 + apps/dav/lib/CalDAV/CalDavBackend.php | 2 + apps/dav/lib/DAV/CustomPropertiesBackend.php | 1 + .../Version1037Date20260302000000.php | 39 +++++++++++++++++++ .../tests/unit/CalDAV/CalDavBackendTest.php | 39 +++++++++++++++++++ 6 files changed, 83 insertions(+) create mode 100644 apps/dav/lib/Migration/Version1037Date20260302000000.php diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php index c010a3e98d602..e87470cab6311 100644 --- a/apps/dav/composer/composer/autoload_classmap.php +++ b/apps/dav/composer/composer/autoload_classmap.php @@ -388,6 +388,7 @@ 'OCA\\DAV\\Migration\\Version1031Date20240610134258' => $baseDir . '/../lib/Migration/Version1031Date20240610134258.php', 'OCA\\DAV\\Migration\\Version1034Date20250605132605' => $baseDir . '/../lib/Migration/Version1034Date20250605132605.php', 'OCA\\DAV\\Migration\\Version1034Date20250813093701' => $baseDir . '/../lib/Migration/Version1034Date20250813093701.php', + 'OCA\\DAV\\Migration\\Version1035Date20260302000000' => $baseDir . '/../lib/Migration/Version1035Date20260302000000.php', 'OCA\\DAV\\Migration\\Version1036Date20251202000000' => $baseDir . '/../lib/Migration/Version1036Date20251202000000.php', 'OCA\\DAV\\Model\\ExampleEvent' => $baseDir . '/../lib/Model/ExampleEvent.php', 'OCA\\DAV\\Paginate\\LimitedCopyIterator' => $baseDir . '/../lib/Paginate/LimitedCopyIterator.php', diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php index bdb965aab3ee0..d0b0cef12a221 100644 --- a/apps/dav/composer/composer/autoload_static.php +++ b/apps/dav/composer/composer/autoload_static.php @@ -403,6 +403,7 @@ class ComposerStaticInitDAV 'OCA\\DAV\\Migration\\Version1031Date20240610134258' => __DIR__ . '/..' . '/../lib/Migration/Version1031Date20240610134258.php', 'OCA\\DAV\\Migration\\Version1034Date20250605132605' => __DIR__ . '/..' . '/../lib/Migration/Version1034Date20250605132605.php', 'OCA\\DAV\\Migration\\Version1034Date20250813093701' => __DIR__ . '/..' . '/../lib/Migration/Version1034Date20250813093701.php', + 'OCA\\DAV\\Migration\\Version1035Date20260302000000' => __DIR__ . '/..' . '/../lib/Migration/Version1035Date20260302000000.php', 'OCA\\DAV\\Migration\\Version1036Date20251202000000' => __DIR__ . '/..' . '/../lib/Migration/Version1036Date20251202000000.php', 'OCA\\DAV\\Model\\ExampleEvent' => __DIR__ . '/..' . '/../lib/Model/ExampleEvent.php', 'OCA\\DAV\\Paginate\\LimitedCopyIterator' => __DIR__ . '/..' . '/../lib/Paginate/LimitedCopyIterator.php', diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index 117a79cb0fda5..005cda1f3fecf 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -151,6 +151,8 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription '{http://apple.com/ns/ical/}calendar-order' => ['calendarorder', 'int'], '{http://apple.com/ns/ical/}calendar-color' => ['calendarcolor', 'string'], '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_NEXTCLOUD . '}deleted-at' => ['deleted_at', 'int'], + '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_NEXTCLOUD . '}default-alarm' => ['default_alarm', 'string'], + '{' . \OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD . '}default-alarm' => ['default_alarm', 'string'], ]; /** diff --git a/apps/dav/lib/DAV/CustomPropertiesBackend.php b/apps/dav/lib/DAV/CustomPropertiesBackend.php index c95e1ea1a7024..0a7640c7ee740 100644 --- a/apps/dav/lib/DAV/CustomPropertiesBackend.php +++ b/apps/dav/lib/DAV/CustomPropertiesBackend.php @@ -84,6 +84,7 @@ class CustomPropertiesBackend implements BackendInterface { private const ALLOWED_NC_PROPERTIES = [ '{http://owncloud.org/ns}calendar-enabled', '{http://owncloud.org/ns}enabled', + '{http://owncloud.org/ns}default-alarm', ]; /** diff --git a/apps/dav/lib/Migration/Version1037Date20260302000000.php b/apps/dav/lib/Migration/Version1037Date20260302000000.php new file mode 100644 index 0000000000000..3a2ce42309bcb --- /dev/null +++ b/apps/dav/lib/Migration/Version1037Date20260302000000.php @@ -0,0 +1,39 @@ +getTable('calendars'); + + if (!$calendarsTable->hasColumn('default_alarm')) { + $calendarsTable->addColumn('default_alarm', Types::STRING, [ + 'notnull' => false, + 'length' => 10, + 'default' => null, + ]); + } + + return $schema; + } +} + diff --git a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php index 802e73208b0e6..694a552ebe032 100644 --- a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php +++ b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php @@ -1881,4 +1881,43 @@ public function testUnshare(): void { ); } + + public function testDefaultAlarmProperty(): void { + $calendarId = $this->createTestCalendar(); + + // Test setting default alarm property to 15 minutes before (-900 seconds) + $patch = new PropPatch([ + '{http://nextcloud.com/ns}default-alarm' => '-900' + ]); + $this->backend->updateCalendar($calendarId, $patch); + $patch->commit(); + + // Verify the property was set + $calendars = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER); + $this->assertCount(1, $calendars); + $this->assertEquals('-900', $calendars[0]['{http://nextcloud.com/ns}default-alarm']); + + // Test updating to a different value (1 day before = -86400 seconds) + $patch = new PropPatch([ + '{http://nextcloud.com/ns}default-alarm' => '-86400' + ]); + $this->backend->updateCalendar($calendarId, $patch); + $patch->commit(); + + $calendars = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER); + $this->assertEquals('-86400', $calendars[0]['{http://nextcloud.com/ns}default-alarm']); + + // Test setting to "none" + $patch = new PropPatch([ + '{http://nextcloud.com/ns}default-alarm' => 'none' + ]); + $this->backend->updateCalendar($calendarId, $patch); + $patch->commit(); + + $calendars = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER); + $this->assertEquals('none', $calendars[0]['{http://nextcloud.com/ns}default-alarm']); + + // Clean up + $this->backend->deleteCalendar($calendars[0]['id'], true); + } }