]> source.dussan.org Git - nextcloud-server.git/commitdiff
Emit an interaction event for calendar event user attendees 25462/head
authorChristoph Wurst <christoph@winzerhof-wurst.at>
Tue, 2 Feb 2021 09:38:22 +0000 (10:38 +0100)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Wed, 3 Feb 2021 11:53:20 +0000 (11:53 +0000)
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
apps/dav/lib/AppInfo/Application.php
apps/dav/lib/Listener/CalendarContactInteractionListener.php

index 0908140314079252056a9918fd0ac373a0b414c0..f1bf77c32856589db4382ea57e95708a11f153c3 100644 (file)
@@ -53,6 +53,8 @@ use OCA\DAV\CardDAV\CardDavBackend;
 use OCA\DAV\CardDAV\ContactsManager;
 use OCA\DAV\CardDAV\PhotoCache;
 use OCA\DAV\CardDAV\SyncService;
+use OCA\DAV\Events\CalendarObjectCreatedEvent;
+use OCA\DAV\Events\CalendarObjectUpdatedEvent;
 use OCA\DAV\Events\CalendarShareUpdatedEvent;
 use OCA\DAV\HookManager;
 use OCA\DAV\Listener\CalendarContactInteractionListener;
@@ -112,6 +114,8 @@ class Application extends App implements IBootstrap {
                /**
                 * Register event listeners
                 */
+               $context->registerEventListener(CalendarObjectCreatedEvent::class, CalendarContactInteractionListener::class);
+               $context->registerEventListener(CalendarObjectUpdatedEvent::class, CalendarContactInteractionListener::class);
                $context->registerEventListener(CalendarShareUpdatedEvent::class, CalendarContactInteractionListener::class);
        }
 
index a0b94c34f1f9fc31d7b9787abc4399ff3aa826a7..62bddd500e4bc5a4a30186202665624cf422d49a 100644 (file)
@@ -26,11 +26,14 @@ declare(strict_types=1);
 namespace OCA\DAV\Listener;
 
 use OCA\DAV\Connector\Sabre\Principal;
+use OCA\DAV\Events\CalendarObjectCreatedEvent;
+use OCA\DAV\Events\CalendarObjectUpdatedEvent;
 use OCA\DAV\Events\CalendarShareUpdatedEvent;
 use OCP\Contacts\Events\ContactInteractedWithEvent;
 use OCP\EventDispatcher\Event;
 use OCP\EventDispatcher\IEventDispatcher;
 use OCP\EventDispatcher\IEventListener;
+use OCP\IUser;
 use OCP\IUserSession;
 use Psr\Log\LoggerInterface;
 use function strlen;
@@ -68,6 +71,17 @@ class CalendarContactInteractionListener implements IEventListener {
                        return;
                }
 
+               if ($event instanceof CalendarObjectCreatedEvent || $event instanceof CalendarObjectUpdatedEvent) {
+                       // users: href => principal:principals/users/admin
+                       // TODO: parse (email) attendees from the VCARD
+                       foreach ($event->getShares() as $share) {
+                               if (!isset($share['href'])) {
+                                       continue;
+                               }
+                               $this->emitFromUri($share['href'], $user);
+                       }
+               }
+
                if ($event instanceof CalendarShareUpdatedEvent && !empty($event->getAdded())) {
                        // group: href => principal:principals/groups/admin
                        // users: href => principal:principals/users/admin
@@ -76,21 +90,28 @@ class CalendarContactInteractionListener implements IEventListener {
                                        // Nothing to work with
                                        continue;
                                }
-                               $principal = $this->principalConnector->findByUri(
-                                       $added['href'],
-                                       $this->principalConnector->getPrincipalPrefix()
-                               );
-                               if ($principal === null) {
-                                       // Invalid principal
-                                       continue;
-                               }
-                               if (strpos($principal, self::URI_USERS) === 0) {
-                                       $uid = substr($principal, strlen(self::URI_USERS));
-                                       $this->dispatcher->dispatchTyped(
-                                               (new ContactInteractedWithEvent($user))->setUid($uid)
-                                       );
-                               }
+                               $this->emitFromUri($added['href'], $user);
                        }
                }
        }
+
+       private function emitFromUri(string $uri, IUser $user): void {
+               $principal = $this->principalConnector->findByUri(
+                       $uri,
+                       $this->principalConnector->getPrincipalPrefix()
+               );
+               if ($principal === null) {
+                       // Invalid principal
+                       return;
+               }
+               if (strpos($principal, self::URI_USERS) !== 0) {
+                       // Not a user principal
+                       return;
+               }
+
+               $uid = substr($principal, strlen(self::URI_USERS));
+               $this->dispatcher->dispatchTyped(
+                       (new ContactInteractedWithEvent($user))->setUid($uid)
+               );
+       }
 }