From 6d420c86e85ab87a476b70129da63630cb482e6f Mon Sep 17 00:00:00 2001 From: matthieu Date: Wed, 20 May 2026 00:15:25 +0200 Subject: [PATCH] feat(mail) : MailSyncTriggerController - POST /api/mail/sync (202 + Messenger async) - dispatch MailSyncRequested au bus Messenger, retourne 202 immediat - folderPath optionnel via body JSON pour sync ciblee - en test : transport in-memory route le message en sync - securite via MailAccessChecker Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Mail/MailSyncTriggerController.php | 40 +++++++++++++++ .../Mail/MailSyncTriggerControllerTest.php | 50 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 src/Controller/Mail/MailSyncTriggerController.php create mode 100644 tests/Functional/Controller/Mail/MailSyncTriggerControllerTest.php diff --git a/src/Controller/Mail/MailSyncTriggerController.php b/src/Controller/Mail/MailSyncTriggerController.php new file mode 100644 index 0000000..165293b --- /dev/null +++ b/src/Controller/Mail/MailSyncTriggerController.php @@ -0,0 +1,40 @@ +accessChecker->ensureCanAccessMail($this->getUser()); + + $body = json_decode($request->getContent(), true) ?? []; + $folderPath = $body['folderPath'] ?? null; + + $this->bus->dispatch(new MailSyncRequested($folderPath)); + + return $this->json( + ['message' => 'Synchronisation démarrée en arrière-plan'], + Response::HTTP_ACCEPTED + ); + } +} diff --git a/tests/Functional/Controller/Mail/MailSyncTriggerControllerTest.php b/tests/Functional/Controller/Mail/MailSyncTriggerControllerTest.php new file mode 100644 index 0000000..54dbbc1 --- /dev/null +++ b/tests/Functional/Controller/Mail/MailSyncTriggerControllerTest.php @@ -0,0 +1,50 @@ +request('POST', '/api/mail/sync'); + + self::assertResponseStatusCodeSame(401); + } + + public function testSyncTriggerReturns403ForRoleClient(): void + { + $client = static::createClient(); + $container = static::getContainer(); + $em = $container->get('doctrine.orm.entity_manager'); + + $clientUser = $em->getRepository(User::class)->findOneBy(['username' => 'client-liot']); + $client->loginUser($clientUser); + $client->request('POST', '/api/mail/sync'); + + self::assertResponseStatusCodeSame(403); + } + + public function testSyncTriggerReturns202ForRoleUser(): void + { + $client = static::createClient(); + $container = static::getContainer(); + $em = $container->get('doctrine.orm.entity_manager'); + + $user = $em->getRepository(User::class)->findOneBy(['username' => 'alice']); + $client->loginUser($user); + $client->request('POST', '/api/mail/sync'); + + self::assertResponseStatusCodeSame(202); + $data = json_decode($client->getResponse()->getContent(), true); + self::assertArrayHasKey('message', $data); + } +}