src/EventListener/Stock/StockSubscriber.php line 43

  1. <?php
  2. namespace App\EventListener\Stock;
  3. use App\Atd\Domain\Response\BookingSummary\BookingSummary;
  4. use App\Atd\Domain\Response\ResponseWrapper;
  5. use App\Atd\Supplier\Atd\OrderLog\Event\OrderLogEvent;
  6. use App\Atd\Supplier\Atd\OrderLog\Service\OrderLogService;
  7. use App\Atd\Supplier\Atd\Stock\Service\StockService;
  8. use App\Event\Stock\StockTriggerEvent;
  9. use App\Service\ProviderFactoryService;
  10. use Psr\Log\LoggerInterface;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. class StockSubscriber implements EventSubscriberInterface
  13. {
  14. public const STOCK_SERVICE_TYPE = 'stock';
  15. public const ORDER_SERVICE_TYPE = 'order';
  16. private StockService $stockService;
  17. /**
  18. * @throws \Exception
  19. */
  20. public function __construct(
  21. private readonly LoggerInterface $logger,
  22. private readonly OrderLogService $orderLogService,
  23. private readonly ProviderFactoryService $providerFactory,
  24. ) {
  25. $this->stockService = $this->providerFactory->factory('atd', self::STOCK_SERVICE_TYPE);
  26. }
  27. public static function getSubscribedEvents(): array
  28. {
  29. return [
  30. StockTriggerEvent::class => 'handleTrigger',
  31. ];
  32. }
  33. /**
  34. * @throws \Throwable
  35. */
  36. public function handleTrigger(StockTriggerEvent $event): void
  37. {
  38. $this->doStock($event->getResponseWrapper(), $event->getOrderId());
  39. }
  40. /**
  41. * @throws \Exception
  42. */
  43. private function doStock(ResponseWrapper $bookingResponse, string $orderId): void
  44. {
  45. $orderService = $this->providerFactory->factory('atd', self::ORDER_SERVICE_TYPE);
  46. $order = $orderService->getOrder($orderId);
  47. try {
  48. $stockResponse = $this->stockService->doRequest([
  49. 'order' => $order,
  50. 'bookingResponse' => $bookingResponse,
  51. ], null);
  52. } catch (\Exception $e) {
  53. $this->logBookingSummary($orderId, $bookingResponse);
  54. // Don't re-throw as we don't want the booking response to be blocked
  55. }
  56. if (!empty($stockResponse['errors'])) {
  57. foreach ($stockResponse['errors'] as $error) {
  58. $this->logger->error($error);
  59. }
  60. } else {
  61. $this->logger->info('Stock Updated!');
  62. }
  63. }
  64. /**
  65. * @todo - refactor to an Dispatch / Event
  66. */
  67. private function logBookingSummary(string $orderId, ResponseWrapper $bookingResponse): void
  68. {
  69. try {
  70. $bookingSummary = BookingSummary::create($orderId, $bookingResponse);
  71. $orderLogEvent = new OrderLogEvent($orderId, $bookingSummary->toString());
  72. $this->orderLogService->write($orderLogEvent);
  73. } catch (\Exception $e) {
  74. $this->logger->error('When attempting to write a BookingSummary to the Order Log: '.$e->getMessage());
  75. }
  76. }
  77. }