src/Controller/V1/SeatPlanController.php line 29

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller\V1;
  4. use App\Entity\Local\Response\SeatPlanResponse;
  5. use App\Entity\Local\SeatPlanJson;
  6. use App\Entity\Vista\SeatPlan;
  7. use App\Manager\SeatPlanManager;
  8. use App\Repository\OrderRepositoryInterface;
  9. use FOS\RestBundle\Controller\Annotations as Rest;
  10. use FOS\RestBundle\Controller\Annotations\Route;
  11. use FOS\RestBundle\Controller\Annotations\View;
  12. use Nelmio\ApiDocBundle\Annotation\Model;
  13. use Swagger\Annotations as SWG;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use App\Repository\SeatPlanRepository;
  17. use App\Repository\SeatPlanLocalRepository;
  18. use App\Repository\CinemaRepository;
  19. use App\Repository\LocationRepository;
  20. use App\Repository\SessionRepositoryInterface as SessionLocalRepository;
  21. use Symfony\Component\Serializer\SerializerInterface;
  22. /**
  23.  * @Route("/seat-plan")
  24.  * @SWG\Tag(name="Order_v1")
  25.  */
  26. class SeatPlanController
  27. {
  28.     /**
  29.      * @var SeatPlanManager
  30.      */
  31.     protected $seatPlanManager;
  32.     /**
  33.      * @var OrderRepositoryInterface
  34.      */
  35.     protected $orderRepository;
  36.     /** @var SeatPlanRepository */
  37.     protected $seatPlanRepository;
  38.     /** @var SeatPlanLocalRepository */
  39.     protected $seatPlanLocalRepository;
  40.     /** @var CinemaRepository */
  41.     protected $cinemaRepository;
  42.     /** @var LocationRepository */
  43.     protected $locationRepository;
  44.     /** @var SessionLocalRepository */
  45.     private $sessionLocalRepository;
  46.     /** @var SerializerInterface $serializer */
  47.     protected $serializer;
  48.     /**
  49.      * SeatPlanController constructor.
  50.      *
  51.      * @param SeatPlanManager          $seatPlanManager
  52.      * @param OrderRepositoryInterface $orderRepository
  53.      */
  54.     public function __construct(SeatPlanManager $seatPlanManagerOrderRepositoryInterface $orderRepositorySeatPlanRepository $seatPlanRepository,
  55.             SeatPlanLocalRepository $seatPlanLocalRepositoryCinemaRepository $cinemaRepositoryLocationRepository $locationRepositorySessionLocalRepository $sessionLocalRepository,
  56.             SerializerInterface $serializer) {
  57.         $this->seatPlanManager $seatPlanManager;
  58.         $this->orderRepository $orderRepository;
  59.         $this->seatPlanRepository $seatPlanRepository;
  60.         $this->seatPlanLocalRepository $seatPlanLocalRepository;
  61.         $this->cinemaRepository $cinemaRepository;
  62.         $this->locationRepository $locationRepository;
  63.         $this->sessionLocalRepository $sessionLocalRepository;
  64.         $this->serializer $serializer;
  65.     }
  66.     /**
  67.      * @Route("/{cinemaId}/{sessionId}", methods="GET")
  68.      * @Rest\QueryParam(name="orderId", allowBlank=true)
  69.      * @View()
  70.      *
  71.      * @SWG\Response(
  72.      *     response=200,
  73.      *     description="A seatPlan",
  74.      *     @Model(type=\App\Entity\Local\Response\SeatPlanResponse::class))
  75.      *
  76.      * @param string      $cinemaId
  77.      * @param string      $sessionId
  78.      * @param string|null $orderId
  79.      * @return object
  80.      */
  81.     public function getAction(string $cinemaIdstring $sessionId, ?string $orderId null) {
  82.         // http://10.15.20.177:8080/api/v1/seat-plan/1007/49019
  83.         // http://10.15.20.177:8080/api/v1/seat-plan/raw/processed/1007/1
  84.         $order $orderId $this->orderRepository->findBySessionId($orderId) : null;
  85.         $selection $order ? ($order->getSelection() ?: []) : [];
  86.         $result $this->seatPlanManager->getSeatPlan($cinemaId$sessionIdnull);
  87.         // if($result->getRows() && $result->getRows()[0]->getSeats())error_log(sprintf("%s %s(%s) cinemaId $cinemaId sessionId $sessionId ", date('Y-m-d H:i:s'), __METHOD__, __LINE__) . var_export($result->getRows()[0]->getSeats()[0]->getPosition(), true));
  88.         $this->seatPlanManager->getNormalized($result->getRows(), null$selection);
  89.         //$this->seatPlanManager->setColumnRender($result->getRows());
  90.         return $result;
  91.     }
  92.     /**
  93.      * @Route("/raw/{cinemaId}/{screenNumber}", methods="GET")
  94.      * @View()
  95.      *
  96.      * @SWG\Response(response=200,
  97.      *     description="Success")
  98.      *
  99.      * @param string      $cinemaId
  100.      * @param string      $screenNumber
  101.      * @return Response
  102.      */
  103.     public function getRaw(string $cinemaIdstring $screenNumber) {
  104.         $session $this->sessionLocalRepository->findByScreenNumber($cinemaId$screenNumber);
  105.         $seatPlanOutput '{}';
  106.         if ($session != null) {
  107.             $sessionId $session['sessionId'];
  108.             $seatPlanInput $this->seatPlanRepository->getSeatPlanRaw($cinemaId$sessionId);
  109.             //error_log(sprintf("%s %s(%s) cinemaId $cinemaId screenNumber $screenNumber sessionId $sessionId ", date('Y-m-d H:i:s'), __METHOD__, __LINE__));
  110.             /** @var string $seatPlanExists */
  111.             $seatPlanExists $this->seatPlanLocalRepository->findBy(['cinemaId' => $cinemaId'screenNumber' => $screenNumber]) != null "1" "";
  112.             $seatPlanOutput $this->seatPlanManager->processRaw($seatPlanInput$cinemaId$screenNumber$seatPlanExists$sessionId);
  113.         }
  114.         $response = new Response($seatPlanOutput);
  115.         $response->headers->set('Content-Type''application/json; charset=UTF-8');
  116.         return $response;
  117.     }
  118.     /**
  119.      * @Route("/raw/processed/{cinemaId}/{screenNumber}", methods="GET")
  120.      * @View()
  121.      *
  122.      * @SWG\Response(response=200,
  123.      *     description="Success")
  124.      *
  125.      * @param string      $cinemaId
  126.      * @param string      $screenNumber
  127.      * @return object
  128.      */
  129.     public function getRawProcessed(string $cinemaIdstring $screenNumber) {
  130.         $seatPlanJson $this->seatPlanLocalRepository->findOneBy(['cinemaId' => $cinemaId'screenNumber' => $screenNumber]);
  131.         $seatPlanInputObj null;
  132.         $seatPlanOutput null;
  133.         if ($seatPlanExists $seatPlanJson "1" "") {
  134.             $seatPlanInput $seatPlanJson->getSeatPlanJson();
  135.             $seatPlanInputObj json_decode($seatPlanInput);
  136.             $seatPlanInputObj->seatPlanSaved '1';
  137.             //error_log(sprintf("%s %s(%s) ", date('Y-m-d H:i:s'), __METHOD__, __LINE__) . var_export($seatPlanInputObj, true));
  138.             foreach($seatPlanInputObj->rows as &$row) {
  139.                 if (isset($row->seats)) {
  140.                     foreach($row->seats as &$seat) {
  141.                         $seat->position->columnIndex $seat->position->columnIndexRender;
  142.                     }
  143.                 }
  144.             }
  145.             $seatPlanOutput json_encode($seatPlanInputObj);
  146.             //$response = new Response($seatPlanOutput);
  147.             //$response->headers->set('Content-Type', 'application/json; charset=UTF-8');
  148.             //return $response;
  149.         }
  150.         if (($session $this->sessionLocalRepository->findByScreenNumber($cinemaId$screenNumber)) != null || $seatPlanOutput) {
  151.             $sessionId $session $session['sessionId'] : null;
  152.             $seatPlanInputObj $this->seatPlanManager->getSeatPlan($cinemaId$sessionId$seatPlanOutput);
  153.                 $this->seatPlanManager->getNormalized($seatPlanInputObj->getRows(), null, []);
  154.             } else {
  155.                 $seatPlanInputObj = new SeatPlanResponse();
  156.             }
  157.             $seatPlanInputObj->setSeatPlanSaved($seatPlanExists);
  158.             return $seatPlanInputObj;
  159.         }
  160.     /**
  161.      * @Route("/edited/{cinemaId}/{screenNumber}", methods="GET")
  162.      * @View()
  163.      *
  164.      * @SWG\Response(
  165.      *     response=200,
  166.      *     description="A seatPlan",
  167.      *     @Model(type=\App\Entity\Local\SeatPlanJson::class))
  168.      *
  169.      * @param string      $cinemaId
  170.      * @param string      $screenNumber
  171.      * @return Response
  172.      */
  173.     public function getEdited(string $cinemaIdstring $screenNumber) {
  174.         
  175.         $seatPlanJson $this->seatPlanLocalRepository->findBy(['cinemaId' => $cinemaId'screenNumber' => $screenNumber]);
  176.         $seatPlanJson $seatPlanJson $seatPlanJson[0]->getSeatPlanJson() : '{}';
  177.         $response = new Response($seatPlanJson);
  178.         $response->headers->set('Content-Type''application/json; charset=UTF-8');
  179.         return $response;
  180.     }
  181.     
  182.     /**
  183.      * @Route("/save/processed/{cinemaId}/{screenNumber}", methods="POST")
  184.      * @View()
  185.      *
  186.      * @SWG\Response(response=200,
  187.      *     description="Success")
  188.      *
  189.      *
  190.      * @param string      $cinemaId
  191.      * @param int         $screenNumber
  192.      * @param Request     $request
  193.      * @return Response
  194.      */
  195.     public function saveSeatPlan(string $cinemaIdint $screenNumberRequest $request) {
  196.         $seatPlanJsons $this->seatPlanLocalRepository->findBy(['cinemaId' => $cinemaId'screenNumber' => $screenNumber]);
  197.         if ($seatPlanJsons == null) {
  198.             $seatPlanJson = new SeatPlanJson();
  199.             $seatPlanJson->setCinemaId($cinemaId);
  200.             $seatPlanJson->setScreenNumber($screenNumber);
  201.             $seatPlanJson->setCreatedAt(new \DateTimeImmutable());
  202.             $seatPlanJson->setModifiedAt(new \DateTimeImmutable());
  203.         } else {
  204.             $seatPlanJson $seatPlanJsons[0];
  205.             $seatPlanJson->setModifiedAt(new \DateTimeImmutable());
  206.         }
  207.         $seatPlanInput $request->request->get('seatPlan');
  208.         $responseJsonObj json_decode($seatPlanInput);
  209.         foreach($responseJsonObj->rows as &$row) {
  210.             if (isset($row->seats)) {
  211.                 foreach($row->seats as &$seat) {
  212.                     $seat->position->columnIndexRender $seat->position->columnIndex;
  213.                 }
  214.             }
  215.         }
  216.         $seatPlanOutput json_encode($responseJsonObj);
  217.         $seatPlanJson->setSeatPlanJson($seatPlanOutput);
  218.         $this->seatPlanLocalRepository->save($seatPlanJson);
  219.         return new Response();
  220.     }
  221.     /**
  222.      * @Route("/delete/{cinemaId}/{screenNumber}", methods="DELETE")
  223.      * @View()
  224.      *
  225.      * @SWG\Response(response=200,
  226.      *     description="Success")
  227.      *
  228.      * @param string      $cinemaId
  229.      * @param int         $screenNumber
  230.      * @return Response
  231.      */
  232.     public function deleteSeatPlan(string $cinemaIdint $screenNumber) {
  233.         if ($seatPlanJsons $this->seatPlanLocalRepository->findBy(['cinemaId' => $cinemaId'screenNumber' => $screenNumber])) {
  234.             $this->seatPlanLocalRepository->delete($seatPlanJsons[0]);
  235.         }
  236.         return new Response();
  237.     }
  238.     /**
  239.      * @Route("/cinemas", methods="GET")
  240.      * @View()
  241.      *
  242.      * @SWG\Response(response=200,
  243.      *     description="Success")
  244.      *
  245.      * @return Response
  246.      */
  247.     public function getSavedCinemas() {
  248.         $seatPlanCinemaIds = [];
  249.         $seatPlanCinemas $this->seatPlanLocalRepository->getCinemasSaved();
  250.         foreach ($seatPlanCinemas as $seatPlanCinema) {
  251.             $seatPlanCinemaIds[$seatPlanCinema['cinemaId']] = null;
  252.         }
  253.         
  254.         $json '';
  255.         if ($seatPlanCinemaIds) {
  256.             $filter = ['id' => $this->locationRepository->findLocationIds()];
  257.             $cinemas $this->cinemaRepository->findBy($filter, ['name' => 'ASC']);
  258.             foreach ($cinemas as $cinema) {
  259.                 if (array_key_exists($cinema->getId(), $seatPlanCinemaIds)) {
  260.                     if ($json) { $json .= ','; }
  261.                     $json .= "{\"id\":\"{$cinema->getId()}\",\"name\":\"{$cinema->getName()}\"}";
  262.                 }
  263.             }
  264.         }
  265.         
  266.         //error_log(sprintf("%s %s(%s) ", date('Y-m-d H:i:s'), __METHOD__, __LINE__) . ' seatPlanCinemaIds ' . var_export($seatPlanCinemaIds, true) . ' cinemas ' . var_export($cinemas, true));
  267.         $response = new Response("[$json]");
  268.         $response->headers->set('Content-Type''application/json; charset=UTF-8');
  269.         return $response;
  270.     }
  271.     /**
  272.      * @Route("/cinemas/{cinemaId}/halls", methods="GET")
  273.      * @View()
  274.      *
  275.      * @SWG\Response(response=200,
  276.      *     description="Success")
  277.      *
  278.      * @param string      $cinemaId
  279.      * @return Response
  280.      */
  281.     public function getSavedCinemaHalls(string $cinemaId) {
  282.         $seatPlanCinemaHalls $this->seatPlanLocalRepository->findBy(['cinemaId' => $cinemaId], ['screenNumber' => 'ASC']);
  283.         $json '';
  284.         if ($seatPlanCinemaHalls) {
  285.             $screensAll $this->sessionLocalRepository->findScreens($cinemaId);
  286.             $screens = [];
  287.             if ($screensAll) {
  288.                 foreach ($screensAll as $screen) {
  289.                     $screens[intval($screen['screenNumber'])] = $screen['screenName'];
  290.                 }
  291.             }
  292.             //error_log(sprintf("%s %s(%s) ", date('Y-m-d H:i:s'), __METHOD__, __LINE__) . ' screens ' . var_export($screens, true) . ' screensAll ' . var_export($screensAll, true));
  293.             foreach ($seatPlanCinemaHalls as $seatPlanCinemaHall) {
  294.                 if ($json) { $json .= ','; }
  295.                 $screenName array_key_exists(intval($seatPlanCinemaHall->getScreenNumber()), $screens) ? $screens[intval($seatPlanCinemaHall->getScreenNumber())]: null;
  296.                 $json .= "{\"cinemaId\":\"{$seatPlanCinemaHall->getCinemaId()}\",\"screenNumber\":\"{$seatPlanCinemaHall->getScreenNumber()}\",\"screenName\":\"{$screenName}\"}";
  297.             }
  298.         }
  299.         $response = new Response("[$json]");
  300.         $response->headers->set('Content-Type''application/json; charset=UTF-8');
  301.         return $response;
  302.     }
  303. }