From f901f13953b19256089b5a5f4d383d39be2817fd Mon Sep 17 00:00:00 2001 From: Sebastian Krupinski Date: Sun, 9 Aug 2026 22:36:41 -0400 Subject: [PATCH] feat: listen to user life cycle events Signed-off-by: Sebastian Krupinski --- lib/Listeners/UserEventListener.php | 27 +++++++++++++++++++++++++++ lib/Module.php | 9 +++++++++ lib/Stores/ServiceStore.php | 11 +++++++++++ 3 files changed, 47 insertions(+) create mode 100644 lib/Listeners/UserEventListener.php diff --git a/lib/Listeners/UserEventListener.php b/lib/Listeners/UserEventListener.php new file mode 100644 index 0000000..d3b554d --- /dev/null +++ b/lib/Listeners/UserEventListener.php @@ -0,0 +1,27 @@ +serviceStore->deleteByUser($event->tenantIdentifier(), $event->userIdentifier()); + } +} diff --git a/lib/Module.php b/lib/Module.php index bc20d0b..536c1db 100644 --- a/lib/Module.php +++ b/lib/Module.php @@ -10,9 +10,14 @@ declare(strict_types=1); namespace KTXM\ProviderJmapc; use KTXC\Resource\ProviderManager; +use KTXC\User\Event\UserCreatedEvent; +use KTXC\User\Event\UserDeletingEvent; +use KTXF\Event\DeliveryMode; +use KTXF\Event\EventListenerRegistrarInterface; use KTXF\Module\ModuleBrowserInterface; use KTXF\Module\ModuleInstanceAbstract; use KTXF\Resource\Provider\ProviderInterface; +use KTXM\ProviderJmapc\Listeners\UserEventListener; use KTXM\ProviderJmapc\Providers\Mail\Provider as MailProvider; use KTXM\ProviderJmapc\Providers\Chrono\Provider as ChronoProvider; use KTXM\ProviderJmapc\Providers\People\Provider as PeopleProvider; @@ -27,6 +32,7 @@ class Module extends ModuleInstanceAbstract implements ModuleBrowserInterface { public function __construct( private readonly ProviderManager $providerManager, + private readonly EventListenerRegistrarInterface $events, ) {} public function handle(): string @@ -67,6 +73,9 @@ class Module extends ModuleInstanceAbstract implements ModuleBrowserInterface public function boot(): void { + // Register listeners + $this->events->listen($this->handle(), UserCreatedEvent::class, UserEventListener::class, 'onUserCreated', DeliveryMode::Deferred); + $this->events->listen($this->handle(), UserDeletingEvent::class, UserEventListener::class, 'onUserDeleting', DeliveryMode::Deferred); // Register JMAP providers - all three share the same service store $this->providerManager->register(ProviderInterface::TYPE_MAIL, 'jmap', MailProvider::class); //$this->providerManager->register(ProviderInterface::TYPE_CHRONO, 'jmap', ChronoProvider::class); diff --git a/lib/Stores/ServiceStore.php b/lib/Stores/ServiceStore.php index 5d478de..70d1416 100644 --- a/lib/Stores/ServiceStore.php +++ b/lib/Stores/ServiceStore.php @@ -176,4 +176,15 @@ class ServiceStore return $result->getDeletedCount() > 0; } + /** + * Delete every service owned by a user. + */ + public function deleteByUser(string $tenantId, string $userId): void + { + $this->dataStore->selectCollection(self::COLLECTION_NAME)->deleteMany([ + 'tid' => $tenantId, + 'uid' => $userId, + ]); + } + }