From 0e99bb0fd23fbda1779e4703aff3d0adb7b6b165 Mon Sep 17 00:00:00 2001 From: Sebastian Krupinski Date: Sun, 9 Aug 2026 22:37:56 -0400 Subject: [PATCH] feat: listen to user life cycle events Signed-off-by: Sebastian Krupinski --- lib/Listeners/UserEventListener.php | 36 +++++++++++++++++++++++++++++ lib/Module.php | 10 ++++++++ lib/Stores/ServiceStore.php | 11 +++++++++ 3 files changed, 57 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..c657859 --- /dev/null +++ b/lib/Listeners/UserEventListener.php @@ -0,0 +1,36 @@ +tenantIdentifier(); + $userId = $event->userIdentifier(); + + foreach (array_keys($this->serviceStore->list($tenantId, $userId)) as $serviceId) { + $this->messageStore->deleteByServiceId((string) $serviceId); + } + + $this->serviceStore->deleteByUser($tenantId, $userId); + } +} diff --git a/lib/Module.php b/lib/Module.php index 7384e1a..521d84b 100644 --- a/lib/Module.php +++ b/lib/Module.php @@ -10,6 +10,10 @@ declare(strict_types=1); namespace KTXM\ProviderImap; 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\ModuleConsoleInterface; use KTXF\Module\ModuleInstanceAbstract; @@ -18,6 +22,7 @@ use KTXM\ProviderImap\Console\ConnectCommand; use KTXM\ProviderImap\Console\DiscoverCommand; use KTXM\ProviderImap\Console\DisconnectCommand; use KTXM\ProviderImap\Console\TestCommand; +use KTXM\ProviderImap\Listeners\UserEventListener; use KTXM\ProviderImap\Providers\Provider as MailProvider; /** @@ -29,6 +34,7 @@ class Module extends ModuleInstanceAbstract implements ModuleConsoleInterface, M { public function __construct( private readonly ProviderManager $providerManager, + private readonly EventListenerRegistrarInterface $events, ) {} public function handle(): string @@ -69,6 +75,10 @@ class Module extends ModuleInstanceAbstract implements ModuleConsoleInterface, M 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 providers $this->providerManager->register(ProviderInterface::TYPE_MAIL, 'imap', MailProvider::class); } diff --git a/lib/Stores/ServiceStore.php b/lib/Stores/ServiceStore.php index 7c75027..6350cef 100644 --- a/lib/Stores/ServiceStore.php +++ b/lib/Stores/ServiceStore.php @@ -177,4 +177,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, + ]); + } + }