1919use App \Entity \Card ;
2020use App \Entity \Principal ;
2121use Doctrine \Persistence \ManagerRegistry ;
22+ use Sabre \CalDAV \Backend \PDO as CalendarBackend ;
2223use Sabre \DAV \Sharing \Plugin as SharingPlugin ;
2324use Sabre \VObject \Component \VCalendar ;
2425use Sabre \VObject \Component \VCard ;
3031
3132class BirthdayService
3233{
34+ /**
35+ * @var CalendarBackend
36+ */
37+ private $ calendarBackend ;
38+
3339 public function __construct (
3440 private ManagerRegistry $ doctrine ,
3541 private string $ birthdayReminderOffset ,
3642 ) {
3743 }
3844
45+ public function setBackend (CalendarBackend $ calendarBackend )
46+ {
47+ $ this ->calendarBackend = $ calendarBackend ;
48+ }
49+
3950 public function onCardChanged (int $ addressBookId , string $ cardUri , string $ cardData ): void
4051 {
4152 $ book = $ this ->doctrine ->getRepository (AddressBook::class)->findOneById ($ addressBookId );
@@ -45,9 +56,9 @@ public function onCardChanged(int $addressBookId, string $cardUri, string $cardD
4556 }
4657
4758 $ principalUri = $ book ->getPrincipalUri ();
48- $ calendar = $ this ->ensureBirthdayCalendarExists ($ principalUri );
59+ $ calendarInstance = $ this ->ensureBirthdayCalendarExists ($ principalUri );
4960
50- $ this ->updateCalendar ($ cardUri , $ cardData , $ book , $ calendar -> getCalendar () );
61+ $ this ->updateCalendar ($ cardUri , $ cardData , $ book , $ calendarInstance );
5162 }
5263
5364 public function onCardDeleted (int $ addressBookId , string $ cardUri ): void
@@ -59,14 +70,18 @@ public function onCardDeleted(int $addressBookId, string $cardUri): void
5970 }
6071
6172 $ principalUri = $ book ->getPrincipalUri ();
62- $ calendar = $ this ->ensureBirthdayCalendarExists ($ principalUri );
73+ $ calendarInstance = $ this ->ensureBirthdayCalendarExists ($ principalUri );
6374
6475 $ objectUri = $ book ->getUri ().'- ' .$ cardUri .'.ics ' ;
65- $ calendarObject = $ this ->doctrine ->getRepository (CalendarObject::class)->findOneBy (['calendar ' => $ calendar , 'uri ' => $ objectUri ]);
6676
67- $ em = $ this ->doctrine ->getManager ();
68- $ em ->remove ($ calendarObject );
69- $ em ->flush ();
77+ $ calendar = $ calendarInstance ->getCalendar ();
78+ // This is the structure that needs to be passed to the backend methods
79+ $ calendarId = [$ calendar ->getId (), $ calendarInstance ->getId ()];
80+
81+ $ this ->calendarBackend ->deleteCalendarObject (
82+ $ calendarId ,
83+ $ objectUri
84+ );
7085 }
7186
7287 public function shouldBirthdayCalendarExist (string $ principalUri ): bool
@@ -290,7 +305,7 @@ public function syncPrincipal(string $principal): void
290305 }
291306 }
292307
293- public function birthdayEvenChanged (string $ existingCalendarData , VCalendar $ newCalendarData ): bool
308+ public function birthdayEventChanged (string $ existingCalendarData , VCalendar $ newCalendarData ): bool
294309 {
295310 try {
296311 $ existingBirthday = Reader::read ($ existingCalendarData );
@@ -307,52 +322,41 @@ public function birthdayEvenChanged(string $existingCalendarData, VCalendar $new
307322 /**
308323 * @throws InvalidDataException
309324 */
310- private function updateCalendar (string $ cardUri , string $ cardData , AddressBook $ book , Calendar $ calendar ): void
325+ private function updateCalendar (string $ cardUri , string $ cardData , AddressBook $ book , CalendarInstance $ calendarInstance ): void
311326 {
312327 $ objectUid = $ book ->getUri ().'- ' .$ cardUri ;
313328 $ objectUri = $ objectUid .'.ics ' ;
314329 $ calendarData = $ this ->buildDataFromContact ($ cardData );
315330
316- $ existing = $ this ->doctrine ->getRepository (CalendarObject::class)->findOneBy (['calendar ' => $ calendar , 'uri ' => $ objectUri ]);
331+ $ calendar = $ calendarInstance ->getCalendar ();
332+ // This is the structure that needs to be passed to the backend methods
333+ $ calendarId = [$ calendar ->getId (), $ calendarInstance ->getId ()];
317334
318- $ em = $ this ->doctrine ->getManager ( );
335+ $ existing = $ this ->doctrine ->getRepository (CalendarObject::class)-> findOneBy ([ ' calendar ' => $ calendar , ' uri ' => $ objectUri ] );
319336
320337 if (null === $ calendarData ) {
321338 if (null !== $ existing ) {
322- $ em ->remove ($ existing );
339+ $ this ->calendarBackend ->deleteCalendarObject (
340+ [$ calendar ->getId (), $ calendarInstance ->getId ()],
341+ $ objectUri
342+ );
323343 }
324344 } else {
325- $ serializedCalendarData = $ calendarData ->serialize ();
326- $ vEvent = $ calendarData ->getComponents ()[0 ];
327- $ maxDate = new \DateTime (Constants::MAX_DATE );
328-
329345 if (null === $ existing ) {
330- $ calendarObject = (new CalendarObject ())
331- ->setCalendar ($ calendar )
332- ->setUri ($ objectUri )
333- ->setComponentType ('VEVENT ' )
334- ->setUid ($ objectUid )
335- ->setLastModified ((new \DateTime ())->getTimestamp ())
336- ->setFirstOccurence ($ vEvent ->DTSTART ->getDateTime ()->getTimeStamp ())
337- ->setLastOccurence ($ maxDate ->getTimestamp ())
338- ->setEtag (md5 ($ serializedCalendarData ))
339- ->setSize (strlen ($ serializedCalendarData ))
340- ->setCalendarData ($ serializedCalendarData );
341-
342- $ em ->persist ($ calendarObject );
346+ $ this ->calendarBackend ->createCalendarObject (
347+ [$ calendar ->getId (), $ calendarInstance ->getId ()],
348+ $ objectUri ,
349+ $ calendarData ->serialize ()
350+ );
343351 } else {
344- if ($ this ->birthdayEvenChanged ($ existing ->getCalendarData (), $ calendarData )) {
345- $ existing
346- ->setLastModified ((new \DateTime ())->getTimestamp ())
347- ->setFirstOccurence ($ vEvent ->DTSTART ->getDateTime ()->getTimeStamp ())
348- ->setLastOccurence ($ maxDate ->getTimestamp ())
349- ->setEtag (md5 ($ serializedCalendarData ))
350- ->setSize (strlen ($ serializedCalendarData ))
351- ->setCalendarData ($ serializedCalendarData );
352+ if ($ this ->birthdayEventChanged ($ existing ->getCalendarData (), $ calendarData )) {
353+ $ this ->calendarBackend ->updateCalendarObject (
354+ [$ calendar ->getId (), $ calendarInstance ->getId ()],
355+ $ objectUri ,
356+ $ calendarData ->serialize ()
357+ );
352358 }
353359 }
354360 }
355-
356- $ em ->flush ();
357361 }
358362}
0 commit comments