diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2016-03-23 12:28:54 +0100 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2016-03-23 12:29:45 +0100 |
commit | e979b9c73561cb28f2be4c783477d8bdc34489b2 (patch) | |
tree | 43fe9e36355aee3baeff827e0f004f63c6371a88 /apps | |
parent | 7800b9dbc82dfcb6f1fe46f89a215d97afec071c (diff) | |
download | nextcloud-server-e979b9c73561cb28f2be4c783477d8bdc34489b2.tar.gz nextcloud-server-e979b9c73561cb28f2be4c783477d8bdc34489b2.zip |
Propagate birthdays of shared addressbooks to the sharee's birthday calendar as well
Diffstat (limited to 'apps')
-rw-r--r-- | apps/dav/appinfo/application.php | 2 | ||||
-rw-r--r-- | apps/dav/lib/caldav/birthdayservice.php | 58 | ||||
-rw-r--r-- | apps/dav/lib/dav/sharing/backend.php | 3 |
3 files changed, 44 insertions, 19 deletions
diff --git a/apps/dav/appinfo/application.php b/apps/dav/appinfo/application.php index d06daf97f54..4ddd23d86b1 100644 --- a/apps/dav/appinfo/application.php +++ b/apps/dav/appinfo/application.php @@ -147,6 +147,7 @@ class Application extends App { $listener = function($event) { if ($event instanceof GenericEvent) { + /** @var BirthdayService $b */ $b = $this->getContainer()->query('BirthdayService'); $b->onCardChanged( $event->getArgument('addressBookId'), @@ -161,6 +162,7 @@ class Application extends App { $dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::updateCard', $listener); $dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', function($event) { if ($event instanceof GenericEvent) { + /** @var BirthdayService $b */ $b = $this->getContainer()->query('BirthdayService'); $b->onCardDeleted( $event->getArgument('addressBookId'), diff --git a/apps/dav/lib/caldav/birthdayservice.php b/apps/dav/lib/caldav/birthdayservice.php index 274341949b3..7fca4dc8c64 100644 --- a/apps/dav/lib/caldav/birthdayservice.php +++ b/apps/dav/lib/caldav/birthdayservice.php @@ -48,22 +48,33 @@ class BirthdayService { */ public function onCardChanged($addressBookId, $cardUri, $cardData) { + $shares = $this->cardDavBackEnd->getShares($addressBookId); + // TODO: resolve group shares + $shares = array_filter($shares, function($share) { + return !$share['{http://owncloud.org/ns}group-share']; + }); + $targetPrincipals = array_map(function($share) { + return $share['{http://owncloud.org/ns}principal']; + }, $shares); + $book = $this->cardDavBackEnd->getAddressBookById($addressBookId); - $principalUri = $book['principaluri']; - $calendar = $this->ensureCalendarExists($principalUri); - $objectUri = $book['uri'] . '-' . $cardUri. '.ics'; - $calendarData = $this->buildBirthdayFromContact($cardData); - $existing = $this->calDavBackEnd->getCalendarObject($calendar['id'], $objectUri); - if (is_null($calendarData)) { - if (!is_null($existing)) { - $this->calDavBackEnd->deleteCalendarObject($calendar['id'], $objectUri); - } - } else { - if (is_null($existing)) { - $this->calDavBackEnd->createCalendarObject($calendar['id'], $objectUri, $calendarData->serialize()); + $targetPrincipals[] = $book['principaluri']; + foreach ($targetPrincipals as $principalUri) { + $calendar = $this->ensureCalendarExists($principalUri); + $objectUri = $book['uri'] . '-' . $cardUri. '.ics'; + $calendarData = $this->buildBirthdayFromContact($cardData); + $existing = $this->calDavBackEnd->getCalendarObject($calendar['id'], $objectUri); + if (is_null($calendarData)) { + if (!is_null($existing)) { + $this->calDavBackEnd->deleteCalendarObject($calendar['id'], $objectUri); + } } else { - if ($this->birthdayEvenChanged($existing['calendardata'], $calendarData)) { - $this->calDavBackEnd->updateCalendarObject($calendar['id'], $objectUri, $calendarData->serialize()); + if (is_null($existing)) { + $this->calDavBackEnd->createCalendarObject($calendar['id'], $objectUri, $calendarData->serialize()); + } else { + if ($this->birthdayEvenChanged($existing['calendardata'], $calendarData)) { + $this->calDavBackEnd->updateCalendarObject($calendar['id'], $objectUri, $calendarData->serialize()); + } } } } @@ -74,11 +85,22 @@ class BirthdayService { * @param string $cardUri */ public function onCardDeleted($addressBookId, $cardUri) { + $shares = $this->cardDavBackEnd->getShares($addressBookId); + // TODO: resolve group shares + $shares = array_filter($shares, function($share) { + return !$share['{http://owncloud.org/ns}group-share']; + }); + $targetPrincipals = array_map(function($share) { + return $share['href']; + }, $shares); + $book = $this->cardDavBackEnd->getAddressBookById($addressBookId); - $principalUri = $book['principaluri']; - $calendar = $this->ensureCalendarExists($principalUri); - $objectUri = $book['uri'] . '-' . $cardUri. '.ics'; - $this->calDavBackEnd->deleteCalendarObject($calendar['id'], $objectUri); + $targetPrincipals[] = $book['principaluri']; + foreach ($targetPrincipals as $principalUri) { + $calendar = $this->ensureCalendarExists($principalUri); + $objectUri = $book['uri'] . '-' . $cardUri . '.ics'; + $this->calDavBackEnd->deleteCalendarObject($calendar['id'], $objectUri); + } } /** diff --git a/apps/dav/lib/dav/sharing/backend.php b/apps/dav/lib/dav/sharing/backend.php index ffc4193e34b..225b773713d 100644 --- a/apps/dav/lib/dav/sharing/backend.php +++ b/apps/dav/lib/dav/sharing/backend.php @@ -161,7 +161,8 @@ class Backend { 'commonName' => isset($p['{DAV:}displayname']) ? $p['{DAV:}displayname'] : '', 'status' => 1, 'readOnly' => ($row['access'] == self::ACCESS_READ), - '{'.\OCA\DAV\DAV\Sharing\Plugin::NS_OWNCLOUD.'}principal' => $row['principaluri'] + '{http://owncloud.org/ns}principal' => $row['principaluri'], + '{http://owncloud.org/ns}group-share' => is_null($p) ]; } |