diff --git a/apps/dav/lib/CalDAV/CalendarImpl.php b/apps/dav/lib/CalDAV/CalendarImpl.php index c8a1b82a39a6d..a4f4fb9835741 100644 --- a/apps/dav/lib/CalDAV/CalendarImpl.php +++ b/apps/dav/lib/CalDAV/CalendarImpl.php @@ -9,6 +9,7 @@ namespace OCA\DAV\CalDAV; use Generator; +use InvalidArgumentException; use OCA\DAV\CalDAV\Auth\CustomPrincipalPlugin; use OCA\DAV\CalDAV\InvitationResponse\InvitationResponseServer; use OCP\Calendar\CalendarExportRange; @@ -29,6 +30,8 @@ use Sabre\VObject\ITip\Message; use Sabre\VObject\Property; use Sabre\VObject\Reader; +use Sabre\VObject\UUIDUtil; + use function Sabre\Uri\split as uriSplit; class CalendarImpl implements ICreateFromString, IHandleImipMessage, ICalendarIsWritable, ICalendarIsShared, ICalendarImport, ICalendarExport { @@ -290,12 +293,40 @@ public function export(?CalendarExportRange $range = null): Generator { * @since 31.0.0 * */ - public function import(CalendarImportSettings $settings, VCalendar ...$vObjects): void { + public function import(CalendarImportSettings $settings, VCalendar ...$vObjects): array { + $calendarId = $this->getKey(); + $outcome = []; foreach ($vObjects as $vObject) { + + $components = $vObject->getBaseComponents(); + if (count($components) > 1) { + throw new InvalidArgumentException('Import failure: objects can not contain more than one base instance object'); + } + $uid = $components[0]->UID->getValue(); + $objectId = $this->backend->getCalendarObjectByUID($this->calendarInfo['principaluri'], $uid); + $objectData = $vObject->serialize(); + + // create or update object + if ($objectId === null) { + $objectId = UUIDUtil::getUUID(); + $this->backend->createCalendarObject( + $calendarId, + $objectId, + $objectData + ); + } elseif ($objectId !== null && $settings->supersede) { + $this->backend->updateCalendarObject( + $calendarId, + $objectId, + $objectData + ); + } } + return $outcome; + } } diff --git a/lib/public/Calendar/CalendarImportSettings.php b/lib/public/Calendar/CalendarImportSettings.php index 26beef13ee9fa..be10a1736d852 100644 --- a/lib/public/Calendar/CalendarImportSettings.php +++ b/lib/public/Calendar/CalendarImportSettings.php @@ -20,6 +20,6 @@ class CalendarImportSettings { public bool $emitEvent = false; public bool $emitITip = false; public int $bulk = 32; - public int $validate = 1; // 0 - no validation, 1 - validate and repair, 2 - validate and skip + public int $validate = 1; // 0 - no validation, 1 - validate and skip on issue, 2 - validate and fail on issue } diff --git a/lib/public/Calendar/ICalendarImport.php b/lib/public/Calendar/ICalendarImport.php index 3cc0278815123..0f28bb4ad4666 100644 --- a/lib/public/Calendar/ICalendarImport.php +++ b/lib/public/Calendar/ICalendarImport.php @@ -25,6 +25,6 @@ interface ICalendarImport { * * @param VCalendar $vObjects */ - public function import(CalendarImportSettings $settings, VCalendar ...$vObjects): void; + public function import(CalendarImportSettings $settings, VCalendar ...$vObjects): array; }