diff --git a/config/packages/messenger.yaml b/config/packages/messenger.yaml index e1aa710..3c1eeab 100644 --- a/config/packages/messenger.yaml +++ b/config/packages/messenger.yaml @@ -1,6 +1,28 @@ framework: messenger: + failure_transport: failed + transports: sync: 'sync://' - routing: {} + async: + dsn: '%env(MESSENGER_TRANSPORT_DSN)%' + options: + queue_name: default + retry_strategy: + max_retries: 3 + delay: 1000 + multiplier: 2 + max_delay: 0 + + failed: 'doctrine://default?queue_name=failed&auto_setup=0' + + routing: + 'App\Message\MailSyncRequested': async + +when@test: + framework: + messenger: + transports: + async: 'in-memory://' + failed: 'in-memory://' diff --git a/migrations/Version20260519220000.php b/migrations/Version20260519220000.php new file mode 100644 index 0000000..a8a7feb --- /dev/null +++ b/migrations/Version20260519220000.php @@ -0,0 +1,56 @@ +addSql(<<<'SQL' + CREATE TABLE IF NOT EXISTS messenger_messages ( + id BIGSERIAL PRIMARY KEY, + body TEXT NOT NULL, + headers TEXT NOT NULL, + queue_name VARCHAR(190) NOT NULL, + created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, + available_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, + delivered_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL + ) + SQL); + + $this->addSql('CREATE INDEX IF NOT EXISTS IDX_75EA56E0FB7336F0 ON messenger_messages (queue_name)'); + $this->addSql('CREATE INDEX IF NOT EXISTS IDX_75EA56E0E3BD61CE ON messenger_messages (available_at)'); + $this->addSql('CREATE INDEX IF NOT EXISTS IDX_75EA56E016BA31DB ON messenger_messages (delivered_at)'); + + $this->addSql(<<<'SQL' + CREATE OR REPLACE FUNCTION notify_messenger_messages() RETURNS TRIGGER AS $$ + BEGIN + PERFORM pg_notify('messenger_messages', NEW.queue_name::text); + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + SQL); + + $this->addSql('DROP TRIGGER IF EXISTS notify_trigger ON messenger_messages;'); + $this->addSql('CREATE TRIGGER notify_trigger AFTER INSERT OR UPDATE ON messenger_messages FOR EACH ROW EXECUTE PROCEDURE notify_messenger_messages();'); + } + + public function down(Schema $schema): void + { + $this->addSql('DROP TABLE IF EXISTS messenger_messages'); + $this->addSql('DROP FUNCTION IF EXISTS notify_messenger_messages()'); + } +} diff --git a/src/Message/MailSyncRequested.php b/src/Message/MailSyncRequested.php new file mode 100644 index 0000000..01ecb52 --- /dev/null +++ b/src/Message/MailSyncRequested.php @@ -0,0 +1,12 @@ +folderPath) { + $folder = $this->folderRepository->findByPath($message->folderPath); + if (null !== $folder) { + $report = $this->mailSyncService->syncFolder($folder); + $this->logger->info(sprintf( + 'MailSyncRequested handled for folder "%s": %d created, %d updated, %d deleted', + $message->folderPath, + $report->createdCount, + $report->updatedCount, + $report->deletedCount, + )); + } else { + $this->logger->warning(sprintf('MailSyncRequested: folder "%s" not found in DB', $message->folderPath)); + } + } else { + $report = $this->mailSyncService->syncAll(); + $this->logger->info(sprintf( + 'MailSyncRequested handled (all folders): %d created, %d updated, %d deleted, %d folders scanned', + $report->createdCount, + $report->updatedCount, + $report->deletedCount, + $report->foldersScanned, + )); + } + } catch (Throwable $e) { + $this->logger->error('MailSyncRequestedHandler failed: '.$e->getMessage()); + } + } +}