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, + ]); + } + }