src/EventSubscriber/JourneySubscriber.php line 75

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Event\JourneyEvent;
  4. use App\Event\ModeEvent;
  5. use App\Model\Mode;
  6. use App\Normalizer\DisruptionNormalizer;
  7. use App\Normalizer\JourneyGroupNormalizer;
  8. use App\Service\Internal\DisruptionService;
  9. use App\Service\Internal\JourneyService;
  10. use App\Service\Internal\LogService;
  11. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. class JourneySubscriber implements EventSubscriberInterface
  14. {
  15. /**
  16. * @var EventDispatcherInterface
  17. */
  18. protected $eventDispatcher;
  19. /**
  20. * @var JourneyService
  21. */
  22. protected $journeyService;
  23. /** @var DisruptionService */
  24. protected $disruptionService;
  25. /**
  26. * @var LogService
  27. */
  28. protected $logService;
  29. /**
  30. * @var string
  31. */
  32. protected $networkId;
  33. /**
  34. * @var JourneyGroupNormalizer
  35. */
  36. protected $journeyGroupNormalizer;
  37. protected DisruptionNormalizer $disruptionNormalizer;
  38. public function __construct(
  39. EventDispatcherInterface $eventDispatcher,
  40. JourneyService $journeyService,
  41. DisruptionService $disruptionService,
  42. LogService $logService,
  43. string $networkId,
  44. JourneyGroupNormalizer $journeyGroupNormalizer,
  45. DisruptionNormalizer $disruptionNormalizer
  46. ) {
  47. $this->eventDispatcher = $eventDispatcher;
  48. $this->journeyService = $journeyService;
  49. $this->disruptionService = $disruptionService;
  50. $this->logService = $logService;
  51. $this->networkId = $networkId;
  52. $this->journeyGroupNormalizer = $journeyGroupNormalizer;
  53. $this->disruptionNormalizer = $disruptionNormalizer;
  54. }
  55. public static function getSubscribedEvents(): array
  56. {
  57. return [
  58. JourneyEvent::NAME => [
  59. ['journeyCalculation', 0]
  60. ]
  61. ];
  62. }
  63. public function journeyCalculation(JourneyEvent $event)
  64. {
  65. $bodyRequest = $event->getBodyRequest();
  66. $userModes = [];
  67. if (isset($bodyRequest['modes'])) {
  68. $userModes = $bodyRequest['modes'];
  69. unset($bodyRequest['modes']);
  70. }
  71. $modeEvent = new ModeEvent($userModes);
  72. $this->eventDispatcher->dispatch($modeEvent, ModeEvent::NAME);
  73. $bodyRequest['excludedModes'] = $modeEvent->getExcludedModes();
  74. $totalNumberJourneys = 0;
  75. $journeys = [];
  76. $layoutModes = isset ($bodyRequest['layoutMode']) ? [$bodyRequest['layoutMode']] : $modeEvent->getLayoutModes();
  77. $isSubNetworks = '';
  78. $departureDateTime = $bodyRequest['departureDateTime'] ?? null;
  79. $atDateTimeFormated = $this->disruptionNormalizer->setAtDateTime($departureDateTime);
  80. $currentDisruptions = $this->disruptionService->getDisruptions($isSubNetworks, DisruptionNormalizer::STATUS_ONGOING, $atDateTimeFormated);
  81. $disruptions = $currentDisruptions['disruptions'] ?? [];
  82. foreach ($layoutModes as $layout) {
  83. $layoutTotalJourneys = 0;
  84. $journeys[$layout] = $this->journeyService->getJourneysByLayoutMode($layout, $bodyRequest);
  85. if (isset($journeys[$layout]['groups'])) {
  86. $layoutTotalJourneys = $this->getTotalNumberJourneysByLayoutMode($journeys[$layout]['groups']);
  87. $totalNumberJourneys += $layoutTotalJourneys;
  88. $journeys[$layout] = $this->journeyGroupNormalizer->normalize($layout, $journeys[$layout], $disruptions);
  89. }
  90. if (Mode::TAB_TRANSPORT === $layout && 0 === $layoutTotalJourneys) {
  91. $wsUrl = preg_replace(
  92. ['/%1/', '/%2/'],
  93. [$this->networkId, $layout],
  94. JourneyService::PATH_JOURNEYS_BY_LAYOUT_MODE
  95. );
  96. $this->logService->sendLog($wsUrl, JourneyService::LOG_NO_JOURNEYS_FOUND);
  97. }
  98. }
  99. $event->setJourneyResults($journeys);
  100. $event->setTotalNumberJourneys($totalNumberJourneys);
  101. }
  102. public function getTotalNumberJourneysByLayoutMode(array $journeysGroup): int
  103. {
  104. $total = 0;
  105. foreach ($journeysGroup as $group) {
  106. if (isset($group['results']['journeycount'])) {
  107. $total += $group['results']['journeycount'];
  108. }
  109. }
  110. return $total;
  111. }
  112. }