Преглед на файлове

Emit an interaction event for calendar event user attendees

Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
tags/v22.0.0beta1
Christoph Wurst преди 3 години
родител
ревизия
689e2a0838
No account linked to committer's email address
променени са 2 файла, в които са добавени 39 реда и са изтрити 14 реда
  1. 4
    0
      apps/dav/lib/AppInfo/Application.php
  2. 35
    14
      apps/dav/lib/Listener/CalendarContactInteractionListener.php

+ 4
- 0
apps/dav/lib/AppInfo/Application.php Целия файл

@@ -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);
}


+ 35
- 14
apps/dav/lib/Listener/CalendarContactInteractionListener.php Целия файл

@@ -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)
);
}
}

Loading…
Отказ
Запис