feat(mail) : MailSyncRequested message + handler + messenger.yaml transport async Doctrine
- App\Message\MailSyncRequested (optionnel folderPath) - App\MessageHandler\MailSyncRequestedHandler delegue a MailSyncService::syncFolder ou syncAll - messenger.yaml : transport async via Doctrine DSN, retry 3x exponentiel, failure transport - en test : transport in-memory (sync immediat) - migration Version20260519220000 : cree messenger_messages table (idempotente, IF NOT EXISTS) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
12
src/Message/MailSyncRequested.php
Normal file
12
src/Message/MailSyncRequested.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Message;
|
||||
|
||||
final readonly class MailSyncRequested
|
||||
{
|
||||
public function __construct(
|
||||
public ?string $folderPath = null,
|
||||
) {}
|
||||
}
|
||||
54
src/MessageHandler/MailSyncRequestedHandler.php
Normal file
54
src/MessageHandler/MailSyncRequestedHandler.php
Normal file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\MessageHandler;
|
||||
|
||||
use App\Message\MailSyncRequested;
|
||||
use App\Repository\MailFolderRepository;
|
||||
use App\Service\MailSyncService;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
|
||||
use Throwable;
|
||||
|
||||
#[AsMessageHandler]
|
||||
final readonly class MailSyncRequestedHandler
|
||||
{
|
||||
public function __construct(
|
||||
private MailSyncService $mailSyncService,
|
||||
private MailFolderRepository $folderRepository,
|
||||
private LoggerInterface $logger,
|
||||
) {}
|
||||
|
||||
public function __invoke(MailSyncRequested $message): void
|
||||
{
|
||||
try {
|
||||
if (null !== $message->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());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user