Skip to content

Commit 6425ce5

Browse files
author
tchapi
committed
chore
1 parent d3abefb commit 6425ce5

4 files changed

Lines changed: 54 additions & 59 deletions

File tree

src/Controller/DAVController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,7 @@ private function initServer(string $authMethod, string $authRealm = User::DEFAUL
282282
}
283283

284284
if ($this->cardDAVEnabled && $this->calDAVEnabled) {
285-
$this->server->addPlugin(new BirthdayCalendarPlugin($this->birthdayService));
285+
$this->server->addPlugin(new BirthdayCalendarPlugin($this->birthdayService, $calendarBackend));
286286
}
287287

288288
// WebDAV plugins

src/Entity/CalendarChange.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class CalendarChange
2424
private $calendar;
2525

2626
#[ORM\Column(type: 'smallint')]
27-
private $operation;
27+
private $operation; // 1 = create, 2 = update, 3 = delete
2828

2929
public function getId(): ?int
3030
{

src/Plugins/BirthdayCalendarPlugin.php

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,48 +39,56 @@ public function initialize(DAV\Server $server)
3939
$server->on('beforeUnbind', [$this, 'beforeCardDelete']);
4040
}
4141

42-
private function resyncCurrentPrincipal()
42+
public function afterCardCreate(string $path, DAV\ICollection $parentNode): void
4343
{
44-
$authPlugin = $this->server->getPlugin('auth');
45-
46-
if (!$authPlugin) {
47-
return null;
48-
}
49-
50-
$principal = $authPlugin->getCurrentPrincipal();
51-
52-
if ($principal) {
53-
$this->birthdayService->syncPrincipal($principal);
44+
if (!$parentNode instanceof CardDAV\AddressBook) {
45+
return;
5446
}
47+
$this->handleCardChange($path, $parentNode);
5548
}
5649

57-
public function afterCardCreate($path, DAV\ICollection $parentNode)
50+
public function afterCardUpdate(string $path, DAV\IFile $node): void
5851
{
59-
if (!$parentNode instanceof CardDAV\IAddressBook) {
52+
if (!$node instanceof CardDAV\ICard) {
6053
return;
6154
}
55+
$parentPath = dirname($path);
56+
$parentNode = $this->server->tree->getNodeForPath($parentPath);
6257

63-
$principal = $this->resyncCurrentPrincipal();
64-
}
65-
66-
public function afterCardUpdate($path, DAV\IFile $node)
67-
{
68-
if (!$node instanceof CardDAV\ICard) {
58+
if (!$parentNode instanceof CardDAV\AddressBook) {
6959
return;
7060
}
7161

72-
$principal = $this->resyncCurrentPrincipal();
62+
$this->handleCardChange($path, $parentNode);
7363
}
7464

75-
public function beforeCardDelete($path)
65+
public function beforeCardDelete(string $path): void
7666
{
7767
$node = $this->server->tree->getNodeForPath($path);
7868

7969
if (!$node instanceof CardDAV\ICard) {
8070
return;
8171
}
8272

83-
$principal = $this->resyncCurrentPrincipal();
73+
$parentPath = dirname($path);
74+
$parentNode = $this->server->tree->getNodeForPath($parentPath);
75+
76+
if (!$parentNode instanceof CardDAV\AddressBook) {
77+
return;
78+
}
79+
80+
$addressBookId = $parentNode->getProperties(['id'])['id'];
81+
82+
$this->birthdayService->onCardDeleted($addressBookId, basename($path));
83+
}
84+
85+
private function handleCardChange(string $path, CardDAV\AddressBook $parentNode): void
86+
{
87+
$cardUri = basename($path);
88+
$addressBookId = $parentNode->getProperties(['id'])['id'];
89+
$cardNode = $this->server->tree->getNodeForPath($path);
90+
91+
$this->birthdayService->onCardChanged($addressBookId, $cardUri, $cardNode->get());
8492
}
8593

8694
public function getPluginName(): string

src/Services/BirthdayService.php

Lines changed: 22 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use App\Entity\Principal;
2121
use Doctrine\Persistence\ManagerRegistry;
2222
use Sabre\DAV\Sharing\Plugin as SharingPlugin;
23+
use Sabre\CalDAV\Backend\PDO as CalendarBackend;
2324
use Sabre\VObject\Component\VCalendar;
2425
use Sabre\VObject\Component\VCard;
2526
use Sabre\VObject\DateTimeParser;
@@ -33,6 +34,7 @@ class BirthdayService
3334
public function __construct(
3435
private ManagerRegistry $doctrine,
3536
private string $birthdayReminderOffset,
37+
private CalendarBackend $calendarBackend,
3638
) {
3739
}
3840

@@ -62,11 +64,11 @@ public function onCardDeleted(int $addressBookId, string $cardUri): void
6264
$calendar = $this->ensureBirthdayCalendarExists($principalUri);
6365

6466
$objectUri = $book->getUri().'-'.$cardUri.'.ics';
65-
$calendarObject = $this->doctrine->getRepository(CalendarObject::class)->findOneBy(['calendar' => $calendar, 'uri' => $objectUri]);
6667

67-
$em = $this->doctrine->getManager();
68-
$em->remove($calendarObject);
69-
$em->flush();
68+
$this->calendarBackend->deleteCalendarObject(
69+
$calendar->getCalendar()->getId(),
70+
$objectUri
71+
);
7072
}
7173

7274
public function shouldBirthdayCalendarExist(string $principalUri): bool
@@ -290,7 +292,7 @@ public function syncPrincipal(string $principal): void
290292
}
291293
}
292294

293-
public function birthdayEvenChanged(string $existingCalendarData, VCalendar $newCalendarData): bool
295+
public function birthdayEventChanged(string $existingCalendarData, VCalendar $newCalendarData): bool
294296
{
295297
try {
296298
$existingBirthday = Reader::read($existingCalendarData);
@@ -315,44 +317,29 @@ private function updateCalendar(string $cardUri, string $cardData, AddressBook $
315317

316318
$existing = $this->doctrine->getRepository(CalendarObject::class)->findOneBy(['calendar' => $calendar, 'uri' => $objectUri]);
317319

318-
$em = $this->doctrine->getManager();
319-
320320
if (null === $calendarData) {
321321
if (null !== $existing) {
322-
$em->remove($existing);
322+
$this->calendarBackend->deleteCalendarObject(
323+
$calendar->getId(),
324+
$objectUri
325+
);
323326
}
324327
} else {
325-
$serializedCalendarData = $calendarData->serialize();
326-
$vEvent = $calendarData->getComponents()[0];
327-
$maxDate = new \DateTime(Constants::MAX_DATE);
328-
329328
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);
329+
$this->calendarBackend->createCalendarObject(
330+
$calendar->getId(),
331+
$objectUri,
332+
$calendarData
333+
);
343334
} 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);
335+
if ($this->birthdayEventChanged($existing->getCalendarData(), $calendarData)) {
336+
$this->calendarBackend->updateCalendarObject(
337+
$calendar->getId(),
338+
$objectUri,
339+
$calendarData
340+
);
352341
}
353342
}
354343
}
355-
356-
$em->flush();
357344
}
358345
}

0 commit comments

Comments
 (0)