From f584ed96faaddd789184f95a169df37ede1b15b5 Mon Sep 17 00:00:00 2001 From: matthieu Date: Wed, 20 May 2026 00:10:06 +0200 Subject: [PATCH] feat(mail) : MailMessageReadController + MailMessageFlagController - POST .../read et .../flag - POST /api/mail/messages/{id}/read body {read: bool} - synchro IMAP + BDD - POST /api/mail/messages/{id}/flag body {flagged: bool} - synchro IMAP + BDD - IMAP-side non bloquant : BDD est mise a jour meme si IMAP fail (resync au prochain cycle) Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Mail/MailMessageFlagController.php | 53 +++++++++++++++++++ .../Mail/MailMessageReadController.php | 53 +++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 src/Controller/Mail/MailMessageFlagController.php create mode 100644 src/Controller/Mail/MailMessageReadController.php diff --git a/src/Controller/Mail/MailMessageFlagController.php b/src/Controller/Mail/MailMessageFlagController.php new file mode 100644 index 0000000..262b13a --- /dev/null +++ b/src/Controller/Mail/MailMessageFlagController.php @@ -0,0 +1,53 @@ + '\d+'])] +#[IsGranted('IS_AUTHENTICATED_FULLY')] +class MailMessageFlagController extends AbstractController +{ + public function __construct( + private readonly MailMessageRepository $messageRepository, + private readonly MailProviderInterface $mailProvider, + private readonly EntityManagerInterface $em, + private readonly MailAccessChecker $accessChecker, + ) {} + + public function __invoke(Request $request, int $id): JsonResponse + { + $this->accessChecker->ensureCanAccessMail($this->getUser()); + + $message = $this->messageRepository->find($id); + if (null === $message) { + throw new NotFoundHttpException('Message not found'); + } + + $body = json_decode($request->getContent(), true); + $flagged = (bool) ($body['flagged'] ?? true); + + try { + $this->mailProvider->markFlagged($message->getFolder()->getPath(), $message->getUid(), $flagged); + } catch (MailProviderException) { + // Non bloquant + } + + $message->setIsFlagged($flagged); + $this->em->flush(); + + return $this->json(['id' => $message->getId(), 'isFlagged' => $message->isFlagged()]); + } +} diff --git a/src/Controller/Mail/MailMessageReadController.php b/src/Controller/Mail/MailMessageReadController.php new file mode 100644 index 0000000..3ec9504 --- /dev/null +++ b/src/Controller/Mail/MailMessageReadController.php @@ -0,0 +1,53 @@ + '\d+'])] +#[IsGranted('IS_AUTHENTICATED_FULLY')] +class MailMessageReadController extends AbstractController +{ + public function __construct( + private readonly MailMessageRepository $messageRepository, + private readonly MailProviderInterface $mailProvider, + private readonly EntityManagerInterface $em, + private readonly MailAccessChecker $accessChecker, + ) {} + + public function __invoke(Request $request, int $id): JsonResponse + { + $this->accessChecker->ensureCanAccessMail($this->getUser()); + + $message = $this->messageRepository->find($id); + if (null === $message) { + throw new NotFoundHttpException('Message not found'); + } + + $body = json_decode($request->getContent(), true); + $read = (bool) ($body['read'] ?? true); + + try { + $this->mailProvider->markRead($message->getFolder()->getPath(), $message->getUid(), $read); + } catch (MailProviderException) { + // Non bloquant : on met quand meme a jour la BDD (sync IMAP au prochain cycle) + } + + $message->setIsRead($read); + $this->em->flush(); + + return $this->json(['id' => $message->getId(), 'isRead' => $message->isRead()]); + } +}