Emit an interaction event for calendar event user attendees
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
This commit is contained in:
parent
b5fd6950a1
commit
f8a87f8cdc
|
@ -53,6 +53,8 @@ use OCA\DAV\CardDAV\CardDavBackend;
|
||||||
use OCA\DAV\CardDAV\ContactsManager;
|
use OCA\DAV\CardDAV\ContactsManager;
|
||||||
use OCA\DAV\CardDAV\PhotoCache;
|
use OCA\DAV\CardDAV\PhotoCache;
|
||||||
use OCA\DAV\CardDAV\SyncService;
|
use OCA\DAV\CardDAV\SyncService;
|
||||||
|
use OCA\DAV\Events\CalendarObjectCreatedEvent;
|
||||||
|
use OCA\DAV\Events\CalendarObjectUpdatedEvent;
|
||||||
use OCA\DAV\Events\CalendarShareUpdatedEvent;
|
use OCA\DAV\Events\CalendarShareUpdatedEvent;
|
||||||
use OCA\DAV\HookManager;
|
use OCA\DAV\HookManager;
|
||||||
use OCA\DAV\Listener\CalendarContactInteractionListener;
|
use OCA\DAV\Listener\CalendarContactInteractionListener;
|
||||||
|
@ -112,6 +114,8 @@ class Application extends App implements IBootstrap {
|
||||||
/**
|
/**
|
||||||
* Register event listeners
|
* Register event listeners
|
||||||
*/
|
*/
|
||||||
|
$context->registerEventListener(CalendarObjectCreatedEvent::class, CalendarContactInteractionListener::class);
|
||||||
|
$context->registerEventListener(CalendarObjectUpdatedEvent::class, CalendarContactInteractionListener::class);
|
||||||
$context->registerEventListener(CalendarShareUpdatedEvent::class, CalendarContactInteractionListener::class);
|
$context->registerEventListener(CalendarShareUpdatedEvent::class, CalendarContactInteractionListener::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,11 +26,14 @@ declare(strict_types=1);
|
||||||
namespace OCA\DAV\Listener;
|
namespace OCA\DAV\Listener;
|
||||||
|
|
||||||
use OCA\DAV\Connector\Sabre\Principal;
|
use OCA\DAV\Connector\Sabre\Principal;
|
||||||
|
use OCA\DAV\Events\CalendarObjectCreatedEvent;
|
||||||
|
use OCA\DAV\Events\CalendarObjectUpdatedEvent;
|
||||||
use OCA\DAV\Events\CalendarShareUpdatedEvent;
|
use OCA\DAV\Events\CalendarShareUpdatedEvent;
|
||||||
use OCP\Contacts\Events\ContactInteractedWithEvent;
|
use OCP\Contacts\Events\ContactInteractedWithEvent;
|
||||||
use OCP\EventDispatcher\Event;
|
use OCP\EventDispatcher\Event;
|
||||||
use OCP\EventDispatcher\IEventDispatcher;
|
use OCP\EventDispatcher\IEventDispatcher;
|
||||||
use OCP\EventDispatcher\IEventListener;
|
use OCP\EventDispatcher\IEventListener;
|
||||||
|
use OCP\IUser;
|
||||||
use OCP\IUserSession;
|
use OCP\IUserSession;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
use function strlen;
|
use function strlen;
|
||||||
|
@ -68,6 +71,17 @@ class CalendarContactInteractionListener implements IEventListener {
|
||||||
return;
|
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())) {
|
if ($event instanceof CalendarShareUpdatedEvent && !empty($event->getAdded())) {
|
||||||
// group: href => principal:principals/groups/admin
|
// group: href => principal:principals/groups/admin
|
||||||
// users: href => principal:principals/users/admin
|
// users: href => principal:principals/users/admin
|
||||||
|
@ -76,21 +90,28 @@ class CalendarContactInteractionListener implements IEventListener {
|
||||||
// Nothing to work with
|
// Nothing to work with
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$principal = $this->principalConnector->findByUri(
|
$this->emitFromUri($added['href'], $user);
|
||||||
$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)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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…
Reference in New Issue