From bb30ddc87632b12129bd9c78dfa9cf047946e6c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Sat, 5 Apr 2025 00:08:37 +0200 Subject: [PATCH] Add logging and validation to export generation handler Introduce a logger to track processing steps, durations, and outcomes in `ExportRequestGenerationMessageHandler`. Add validation to prevent reprocessing of already generated export objects, ensuring robust error handling and improved traceability. --- .../ExportRequestGenerationMessageHandler.php | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/Bundle/ChillMainBundle/Export/Messenger/ExportRequestGenerationMessageHandler.php b/src/Bundle/ChillMainBundle/Export/Messenger/ExportRequestGenerationMessageHandler.php index ecb03af82..4d134b902 100644 --- a/src/Bundle/ChillMainBundle/Export/Messenger/ExportRequestGenerationMessageHandler.php +++ b/src/Bundle/ChillMainBundle/Export/Messenger/ExportRequestGenerationMessageHandler.php @@ -17,22 +17,36 @@ use Chill\MainBundle\Export\ExportGenerator; use Chill\MainBundle\Repository\ExportGenerationRepository; use Chill\MainBundle\Repository\UserRepositoryInterface; use Doctrine\ORM\EntityManagerInterface; +use Psr\Log\LoggerInterface; use Symfony\Component\Messenger\Attribute\AsMessageHandler; +use Symfony\Component\Messenger\Exception\UnrecoverableMessageHandlingException; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; #[AsMessageHandler] final readonly class ExportRequestGenerationMessageHandler implements MessageHandlerInterface { + private const LOG_PREFIX = '[export_generation] '; + public function __construct( private ExportGenerationRepository $repository, private UserRepositoryInterface $userRepository, private ExportGenerator $exportGenerator, private StoredObjectManagerInterface $storedObjectManager, private EntityManagerInterface $entityManager, + private LoggerInterface $logger, ) {} public function __invoke(ExportRequestGenerationMessage $exportRequestGenerationMessage) { + $start = microtime(true); + + $this->logger->info( + self::LOG_PREFIX.'Handle generation message', + [ + 'exportId' => $exportRequestGenerationMessage->id, + ] + ); + if (null === $exportGeneration = $this->repository->find($exportRequestGenerationMessage->id)) { throw new \UnexpectedValueException('ExportRequestGenerationMessage not found'); } @@ -41,10 +55,23 @@ final readonly class ExportRequestGenerationMessageHandler implements MessageHan throw new \UnexpectedValueException('User not found'); } + if (StoredObject::STATUS_PENDING !== $exportGeneration->getStatus()) { + throw new UnrecoverableMessageHandlingException('object already generated'); + } + $generated = $this->exportGenerator->generate($exportGeneration->getExportAlias(), $exportGeneration->getOptions(), $user); $this->storedObjectManager->write($exportGeneration->getStoredObject(), $generated->content, $generated->contentType); $exportGeneration->getStoredObject()->setStatus(StoredObject::STATUS_READY); $this->entityManager->flush(); + + $end = microtime(true); + + $this->logger->notice(self::LOG_PREFIX.'Export generation successfully finished', [ + 'exportId' => $exportRequestGenerationMessage->id, + 'exportAlias' => $exportGeneration->getExportAlias(), + 'full_generation_duration' => $end - $exportGeneration->getCreatedAt()->getTimestamp(), + 'message_handler_duration' => $end - $start, + ]); } }