src/EventListener/Stock/StockSubscriber.php line 43

Open in your IDE?
  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 $bookingResponsestring $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 $orderIdResponseWrapper $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. }