* SPDX-License-Identifier: AGPL-3.0-or-later */ 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\Configuration\BrowserModuleContextInterface; use KTXF\Module\Configuration\ConsoleModuleContextInterface; use KTXF\Module\Configuration\ModuleContextInterface; use KTXF\Module\ModuleInstanceAbstract; use KTXF\Resource\Provider\ProviderInterface; 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; use KTXM\ProviderImap\Stores\MailboxStore; use KTXM\ProviderImap\Stores\MessageStore; /** * IMAP Mail Provider Module * * Registers the IMAP mail provider with the Ktrix provider manager. */ class Module extends ModuleInstanceAbstract { public function __construct( private readonly ProviderManager $providerManager, private readonly EventListenerRegistrarInterface $events, private readonly MailboxStore $mailboxStore, private readonly MessageStore $messageStore, ) {} public function handle(): string { return 'provider_imap'; } public function label(): string { return 'IMAP Mail Provider'; } public function author(): string { return 'Ktrix'; } public function description(): string { return 'IMAP provider module for Ktrix — provides mail services via the IMAP protocol'; } public function version(): string { return '0.0.1'; } public function permissions(): array { return [ 'provider_imap' => [ 'label' => 'Access IMAP Mail Provider', 'description' => 'View and access the IMAP mail provider module', 'group' => 'Providers', ], ]; } public function install(): void { $this->ensureIndexes(); } public function upgrade(): void { $this->ensureIndexes(); } 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); } public function configure(ModuleContextInterface $context): void { if ($context instanceof BrowserModuleContextInterface) { $context->registerModule($this, 'ProviderImap', 'static/module.mjs'); } if ($context instanceof ConsoleModuleContextInterface) { foreach ([ DiscoverCommand::class, ConnectCommand::class, DisconnectCommand::class, TestCommand::class, ] as $command) { $context->registerCommand($command); } } } /** * Create the cache collection indexes (idempotent). */ private function ensureIndexes(): void { $this->mailboxStore->ensureIndexes(); $this->messageStore->ensureIndexes(); } }