diff --git a/src/Bundle/ChillMainBundle/Export/Messenger/OnExportGenerationFails.php b/src/Bundle/ChillMainBundle/Export/Messenger/OnExportGenerationFails.php new file mode 100644 index 000000000..43caaac54 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Export/Messenger/OnExportGenerationFails.php @@ -0,0 +1,74 @@ + 'onMessageFailed', + ]; + } + + public function onMessageFailed(WorkerMessageFailedEvent $event): void + { + if ($event->willRetry()) { + return; + } + + $message = $event->getEnvelope()->getMessage(); + + if (!$message instanceof ExportRequestGenerationMessage) { + return; + } + + if (null === $exportGeneration = $this->repository->find($message->id)) { + throw new \UnexpectedValueException('ExportRequestGenerationMessage not found'); + } + + $this->logger->error(self::LOG_PREFIX.'ExportRequestGenerationMessage failed to execute generation', [ + 'exportId' => $message->id, + 'userId' => $message->userId, + 'alias' => $exportGeneration->getExportAlias(), + 'throwable_message' => $event->getThrowable()->getMessage(), + 'throwable_trace' => $event->getThrowable()->getTraceAsString(), + 'throwable' => get_class($event->getThrowable()), + 'full_generation_duration_failure' => microtime(true) - $exportGeneration->getCreatedAt()->getTimestamp(), + ]); + + $this->markObjectAsFailed($event, $exportGeneration); + $this->entityManager->flush(); + } + + private function markObjectAsFailed(WorkerMessageFailedEvent $event, ExportGeneration $exportGeneration): void + { + $exportGeneration->getStoredObject()->addGenerationErrors($event->getThrowable()->getMessage()); + $exportGeneration->getStoredObject()->setStatus(StoredObject::STATUS_FAILURE); + } +} diff --git a/src/Bundle/ChillMainBundle/Tests/Export/Messenger/OnExportGenerationFailsTest.php b/src/Bundle/ChillMainBundle/Tests/Export/Messenger/OnExportGenerationFailsTest.php new file mode 100644 index 000000000..ef19ccaaa --- /dev/null +++ b/src/Bundle/ChillMainBundle/Tests/Export/Messenger/OnExportGenerationFailsTest.php @@ -0,0 +1,62 @@ +setCreatedAt(new \DateTimeImmutable('10 seconds ago')); + + $repository = $this->prophesize(ExportGenerationRepository::class); + $repository->find($exportGeneration->getId())->willReturn($exportGeneration); + + $entityManager = $this->prophesize(EntityManagerInterface::class); + $entityManager->flush()->shouldBeCalled(); + + $user = $this->prophesize(User::class); + $user->getId()->willReturn(1); + + $subscriber = new OnExportGenerationFails(new NullLogger(), $repository->reveal(), $entityManager->reveal()); + + $subscriber->onMessageFailed(new WorkerMessageFailedEvent( + new Envelope(new ExportRequestGenerationMessage($exportGeneration, $user->reveal())), + 'dummyReceiver', + new ExportGenerationException('dummy_exception'), + )); + + self::assertEquals(StoredObject::STATUS_FAILURE, $exportGeneration->getStoredObject()->getStatus()); + self::assertStringContainsString('dummy_exception', $exportGeneration->getStoredObject()->getGenerationErrors()); + } +} diff --git a/src/Bundle/ChillMainBundle/config/services/export.yaml b/src/Bundle/ChillMainBundle/config/services/export.yaml index 2e508ca7d..b0f34a159 100644 --- a/src/Bundle/ChillMainBundle/config/services/export.yaml +++ b/src/Bundle/ChillMainBundle/config/services/export.yaml @@ -8,6 +8,8 @@ services: Chill\MainBundle\Export\Messenger\ExportRequestGenerationMessageHandler: ~ + Chill\MainBundle\Export\Messenger\OnExportGenerationFails: ~ + Chill\MainBundle\Export\ExportFormHelper: ~ Chill\MainBundle\Export\ExportGenerator: ~