src/BusApi/TripController.php line 45

Open in your IDE?
  1. <?php
  2. namespace App\BusApi;
  3. use App\Entity\Bus\Route;
  4. use App\Entity\Bus\RouteFareRule;
  5. use App\Entity\Bus\Seat;
  6. use App\Entity\Bus\Stop;
  7. use App\Entity\Bus\Trip;
  8. use App\Entity\Station;
  9. use App\Entity\Vehicle;
  10. use DateTime;
  11. use DateTimeImmutable;
  12. use Doctrine\Persistence\ManagerRegistry;
  13. use Doctrine\Persistence\ObjectManager;
  14. use FOS\RestBundle\Controller\AbstractFOSRestController;
  15. use JMS\Serializer\SerializationContext;
  16. use JMS\Serializer\SerializerBuilder;
  17. use Mpdf\Output\Destination;
  18. use Mpdf\Tag\Tr;
  19. use PhpOffice\PhpSpreadsheet\Calculation\Financial\Securities\Price;
  20. use Symfony\Component\HttpFoundation\JsonResponse;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\HttpFoundation\RequestStack;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use FOS\RestBundle\Controller\Annotations as Rest;
  25. class TripController extends AbstractFOSRestController
  26. {
  27. private ManagerRegistry $registry;
  28. private ObjectManager $entityManager;
  29. private RequestStack $requestStack;
  30. public function __construct(ManagerRegistry $registry, RequestStack $requestStack)
  31. {
  32. $this->entityManager = $registry->getManager();
  33. $this->requestStack = $requestStack;
  34. }
  35. /**
  36. * @Rest\Get("/", name="passengerTrips")
  37. */
  38. public function tripsHome(Request $request)
  39. {
  40. $em = $this->entityManager;
  41. $date = $request->get('trip_date');
  42. $today = new DateTimeImmutable();
  43. if (!$date) {
  44. $date = $today->format('Y-m-d');
  45. }
  46. /** @var Trip[] $trips */
  47. $trips = $em->getRepository(Trip::class)->findTrips($date, 'MAIN');
  48. $data = [
  49. "trips" => $trips
  50. ];
  51. return new JsonResponse($data, Response::HTTP_OK);
  52. }
  53. /**
  54. * @Rest\Get("/trips", name="tripSearch")
  55. */
  56. public function tripsSearch(Request $request): Response
  57. {
  58. $em = $this->entityManager;
  59. $serializer = SerializerBuilder::create()->build();
  60. $context = new SerializationContext();
  61. $context->setSerializeNull(true)->enableMaxDepthChecks();
  62. $date = $request->get('date');
  63. $origin = $request->get('from');
  64. $destination = $request->get('to');
  65. $originDestination = $em->getRepository(Station::class)->findStops($origin, $destination);
  66. $requestedRoute = $em->getRepository(Stop::class)->findRouteByOriginAndDestination($origin, $destination);
  67. $route = $em->getRepository(Route::class)->findOneBy([
  68. 'id' => $requestedRoute['route_id']
  69. ]);
  70. $em->beginTransaction();
  71. try {
  72. $trips = $em->getRepository(Trip::class)->findTripsByDate($date, $destination, $origin);
  73. if (!$trips) {
  74. $fromStation = $em->getRepository(Stop::class)->findOneBy([
  75. 'station' => $origin,
  76. 'route' => $route
  77. ]);
  78. $toStation = $em->getRepository(Stop::class)->findOneBy([
  79. 'station' => $destination,
  80. 'route' => $route
  81. ]);
  82. $pricing = $em->getRepository(RouteFareRule::class)->findOneBy([
  83. 'route' => $route,
  84. ]);
  85. $vehicle = $em->getRepository(Vehicle::class)->findOneBy([
  86. 'id' => 2112
  87. ]);
  88. $trips = null;
  89. // $tDate = new \DateTime($date);
  90. try {
  91. $dateB = new \DateTime($date);
  92. } catch (\Exception $e) {
  93. return $this->json(['error' => 'Invalid date format'], 400);
  94. }
  95. $trip = new Trip();
  96. $trip->setOrigin($route->getOrigin());
  97. $trip->setDestination($route->getDestination());
  98. $trip->setRoute($route);
  99. $trip->setCreatedAt(new \DateTime());
  100. $trip->setTripDate($dateB);
  101. $trip->setFare($pricing->getNormalFare());
  102. $trip->setTripIndex(0);
  103. $trip->setEta($toStation->getEta());
  104. $trip->setVehicleIsApproved(false);
  105. $trip->setDepartureTime($fromStation->getDepartureTime());
  106. $trip->setVehicle($vehicle);
  107. $seat = [];
  108. for ($i = 1; $i <= $vehicle->getPassengerCapacity(); $i++) {
  109. $seat = new Seat();
  110. $seat->setStatus('AVAILABLE');
  111. $seat->setSeatNumber($i);
  112. $seat->setTrip($trip);
  113. $seat->setIsBooked(false);
  114. $seat->setCreatedAt(new DateTime());
  115. $em->persist($seat);
  116. }
  117. $em->persist($trip);
  118. $em->flush();
  119. $trips = $em->getRepository(Trip::class)->findTripsByDate($date, $destination, $origin);
  120. }
  121. $em->commit();
  122. } catch (\Throwable $e) {
  123. $em->rollback();
  124. throw $e;
  125. }
  126. $data = [
  127. "from_to" => $originDestination,
  128. "trips" => $trips
  129. ];
  130. $data = $serializer->serialize($data, 'json', $context);
  131. // dump($trips);die;
  132. return new Response($data, Response::HTTP_OK);
  133. }
  134. /**
  135. * @Rest\Get("/trips/{trip}", name="oneTripSearch")
  136. */
  137. public function trip(Request $request, $trip)
  138. {
  139. $em = $this->entityManager;
  140. $trip = $em->getRepository(Trip::class)->findOneBy([
  141. 'id' => $trip
  142. ]);
  143. $serializer = SerializerBuilder::create()->build();
  144. $context = new SerializationContext();
  145. $context->setSerializeNull(true)
  146. ->enableMaxDepthChecks();
  147. $data = $serializer->serialize($trip, 'json', $context);
  148. return new Response($data, Response::HTTP_OK);
  149. }
  150. }