src/Controller/ApplicationController.php line 196

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Event;
  4. use App\Entity\Invitee;
  5. use App\Entity\Lineup;
  6. use App\Entity\News;
  7. use App\Entity\Purchase;
  8. use App\Entity\Sponsor;
  9. use App\Entity\Stage;
  10. use App\Form\InviteeType;
  11. use App\Form\PurchaseEmailType;
  12. use App\Form\PurchaseLoginType;
  13. use App\Repository\ArtistRepository;
  14. use App\Repository\ContentRepository;
  15. use App\Repository\FaqRepository;
  16. use App\Repository\FoodRepository;
  17. use App\Repository\InviteeRepository;
  18. use App\Repository\LineupRepository;
  19. use App\Repository\NewsRepository;
  20. use App\Repository\PurchaseRepository;
  21. use App\Repository\SponsorRepository;
  22. use App\Repository\StageRepository;
  23. use App\Service\PurchaseHelper;
  24. use App\Service\TicketTailorApi;
  25. use Doctrine\Persistence\ManagerRegistry;
  26. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  27. use Symfony\Component\Form\FormInterface;
  28. use Symfony\Component\HttpFoundation\Cookie;
  29. use Symfony\Component\HttpFoundation\RedirectResponse;
  30. use Symfony\Component\HttpFoundation\Request;
  31. use Symfony\Component\HttpFoundation\Response;
  32. use Symfony\Component\Routing\Annotation\Route;
  33. class ApplicationController extends AbstractController
  34. {
  35.     private array $orders = [];
  36.     private ManagerRegistry $doctrine;
  37.     private ?Event $currentEvantevent;
  38.     private ?FormInterface $shareForm null;
  39.     private PurchaseHelper $purchaseHelper;
  40.     public function __construct(ManagerRegistry $doctrinePurchaseHelper $purchaseHelper)
  41.     {
  42.         $this->doctrine $doctrine;
  43.         $this->purchaseHelper $purchaseHelper;
  44.         $this->currentEvantevent $this->doctrine->getRepository(Event::class)->findOneBy(['state'=>Event::STATE_ACTIVE]);
  45.     }
  46.     /**
  47.      * @Route("/", name="feapp_landing")
  48.      * @Route("/ticket_login", name="feapp_landing_login")
  49.      */
  50.     public function landing(
  51.         Request $request,
  52.         PurchaseHelper $helper,
  53.         PurchaseRepository $repository,
  54.         InviteeRepository $inviteeRepository,
  55.         TicketTailorApi $api,
  56.         Purchase $purchase=null
  57.     ): Response
  58.     {
  59.         if ($request->get('_route')=='feapp_landing_login') {
  60.             $request->getSession()->set('login_session',true);
  61.             $request->cookies->remove('no_ticket');
  62.         } else {
  63.             if ($this->validSession($requesttrue)) {
  64.                 return $this->redirectToRouteClearNoTicket($request'feapp_home');
  65.             } else {
  66.                 return $this->anonymousLogin($request);
  67.             }
  68.         }
  69.         $new false;
  70.         if (!$purchase) {
  71.             $purchase = new Purchase();
  72.             $new true;
  73.         } elseif ($request->get('_route')=='upgrade_landing_email') {
  74.             $purchase->setCampaignClickedAt(new \DateTimeImmutable());
  75.             $this->doctrine->getManager()->persist($purchase);
  76.             $this->doctrine->getManager()->flush();
  77.         }
  78.         $form $this->createForm(PurchaseEmailType::class, $purchase);
  79.         $form->handleRequest($request);
  80.         if ($form->isSubmitted() && $form->isValid()) {
  81.             $_email $purchase->getEmail();
  82.             if (!$new) {
  83.                 $this->doctrine->getManager()->refresh($purchase);
  84.             }
  85.             unset($purchase);
  86.             $_purchase $repository->findOneBy([
  87.                 'email'=>$_email,
  88.                 'event'=>$this->currentEvantevent
  89.             ]);
  90.             if (!$_purchase) {
  91.                 $_purchase $api->getOrderByEmail($form->get('email')->getData());
  92.             }
  93.             if ($_purchase) {
  94.                 $helper->generateLoginCode($_purchase);
  95.                 $this->doctrine->getManager()->persist($_purchase);
  96.                 $this->doctrine->getManager()->flush();
  97.                 $helper->sendAppLoginCode($_purchase);
  98.                 $this->addFlash('info''Please check your '.$_purchase->getEmail().' email for security code.');
  99.                 return $this->redirectToRouteClearNoTicket($request'feapp_login',['id'=>$_purchase->getId()]);
  100.             }
  101.             // No purchases. Look for invitations
  102.             $_invitation $inviteeRepository->findOneBy(['email'=>$form->get('email')->getData()]);
  103.             if ($_invitation) {
  104.                 $helper->generateLoginCode($_invitation);
  105.                 $this->doctrine->getManager()->persist($_invitation);
  106.                 $this->doctrine->getManager()->flush();
  107.                 $helper->sendAppLoginCode($_invitation);
  108.                 $this->addFlash('info''Please check your '.$form->get('email')->getData().' email for security code.');
  109.                 return $this->redirectToRouteClearNoTicket($request'feapp_login',['id'=>$_invitation->getPurchase()->getId()]);
  110.             }
  111.             $this->addFlash('warning''We were not able to find your order. Please check information you provided.');
  112.         }
  113.         if (!$request->cookies->has('no_ticket')) {
  114.             $response = new Response();
  115.             $response->headers->clearCookie('no_ticket');
  116.         } else {
  117.             $response null;
  118.         }
  119.         return $this->render(
  120.             'feSecurity/landing.html.twig',
  121.             [
  122.                 'form'=>$form->createView(),
  123.             ],
  124.             $response
  125.         );
  126.     }
  127.     /**
  128.      * @Route("/app/anonymous-login", name="feapp_login_anonymously", methods={"POST"})
  129.      */
  130.     public function anonymousLogin(Request $request): Response
  131.     {
  132.         $request->getSession()->remove('order');
  133.         $request->getSession()->remove('login_session');
  134.         $request->cookies->remove('anonymos-visitor');
  135.         $cookie Cookie::create('no_ticket')
  136.             ->withValue('lowdefest')
  137.             ->withExpires(new \DateTime('+3 hours'))
  138.             ->withSecure(true);
  139.         $response = new RedirectResponse($this->generateUrl('feapp_home', [],Response::HTTP_SEE_OTHER));
  140.         $response->headers->setCookie($cookie);
  141.         return $response;
  142.     }
  143.     /**
  144.      * @Route("/app/{id}/login", name="feapp_login")
  145.      * @Route("/app/{id}/login/{code}", name="feapp_login_code")
  146.      */
  147.     public function login(Request $requestPurchase $purchase$code ''): Response
  148.     {
  149.         if ( !$purchase->isValidInviteeLoginCode() ) {
  150.             $this->addFlash('warning''You login request has been expired. Please request the new login code.');
  151.             return $this->redirectToRoute('feapp_landing_login');
  152.         }
  153.         $formPurchase = clone $purchase;
  154.         $formPurchase->setLoginCode($code);
  155.         $form $this->createForm(PurchaseLoginType::class, $formPurchase);
  156.         $form->handleRequest($request);
  157.         if ($form->isSubmitted() && $form->isValid()) {
  158.             if ( $loginObject $purchase->checkLoginCode($formPurchase->getLoginCode()) ) {
  159.                 $request->getSession()->set('order', [
  160.                     'email'=>$loginObject->getEmail(),
  161.                     'event'=>($loginObject instanceof Purchase)?$loginObject->getEvent()->getId():$loginObject->getPurchase()->getEvent()->getId()
  162.                 ]);
  163.                 $request->getSession()->remove('login_session');
  164.                 $loginObject->setLoginCodeExpireAt(null);
  165.                 $this->doctrine->getManager()->persist($loginObject);
  166.                 $this->doctrine->getManager()->flush();
  167.                 return $this->redirectToRoute('feapp_home');
  168.             }  else {
  169.                 $this->addFlash('danger''Invalid login code. Please check your email for a valid login code.');
  170.             }
  171.         }
  172.         return $this->render('feSecurity/login.html.twig', [
  173.             'form'=>$form->createView(),
  174.         ]);
  175.     }
  176.     /**
  177.      * @Route("/app", name="feapp_home")
  178.      */
  179.     public function home(
  180.         Request $request,
  181.         ArtistRepository $repository
  182.     ): Response
  183.     {
  184.         if (!$this->validSession($request)) {
  185.             $this->addFlash('warning','You session expired. Please login once more.');
  186.             return $this->redirectToRoute('feapp_landing');
  187.         }
  188.         return $this->render('feHome.html.twig', [
  189.             //'artists' => $repository->getRandom(3),
  190.             'artists' => $repository->getRandom(25$this->currentEvantevent),
  191.         ]);
  192.     }
  193.     /**
  194.      * @Route("/app/news", name="feapp_news")
  195.      */
  196.     public function news(Request $requestNewsRepository $newsRepository): Response
  197.     {
  198.         if (!$this->validSession($request)) {
  199.             $this->addFlash('warning','You session expired. Please login once more.');
  200.             return $this->redirectToRoute('feapp_landing');
  201.         }
  202.         return $this->render('news.html.twig', [
  203.             'news' => $newsRepository->findCurrentNews(new \DateTimeImmutable(),  $this->currentEvantevent),
  204.         ]);
  205.     }
  206.     /**
  207.      * @Route("/app/news/{id}", name="feapp_news_details")
  208.      */
  209.     public function newsDetails(Request $requestNews $article): Response
  210.     {
  211.         if (!$this->validSession($request)) {
  212.             $this->addFlash('warning','You session expired. Please login once more.');
  213.             return $this->redirectToRoute('feapp_landing');
  214.         }
  215.         return $this->render('newsDetails.html.twig', [
  216.             'article' => $article,
  217.         ]);
  218.     }
  219.     /**
  220.      * @Route("/app/artists", name="feapp_artists")
  221.      */
  222.     public function artists(Request $requestArtistRepository $repository): Response
  223.     {
  224.         if (!$this->validSession($request)) {
  225.             $this->addFlash('warning','You session expired. Please login once more.');
  226.             return $this->redirectToRoute('feapp_landing');
  227.         }
  228.         return $this->render('artists.html.twig', [
  229.             'artists' => $repository->findByEvent($this->currentEvantevent),
  230.         ]);
  231.     }
  232.     /**
  233.      * @Route("/app/stages", name="feapp_stages")
  234.      */
  235.     public function stages(Request $requestStageRepository $repository): Response
  236.     {
  237.         if (!$this->validSession($request)) {
  238.             $this->addFlash('warning','You session expired. Please login once more.');
  239.             return $this->redirectToRoute('feapp_landing');
  240.         }
  241.         return $this->render('stages.html.twig', [
  242.             'stages' => $repository->findByEvent($this->currentEvantevent),
  243.         ]);
  244.     }
  245.     /**
  246.      * @Route("/app/lineup", name="feapp_lineup")
  247.      * @Route("/app/lineup/{id}", name="feapp_lineup_stage")
  248.      */
  249.     public function lineup(
  250.         Request $request,
  251.         StageRepository $repository,
  252.         LineupRepository $luRepository,
  253.         Stage $stage=null
  254.     ): Response
  255.     {
  256.         if (!$this->validSession($request)) {
  257.             $this->addFlash('warning','You session expired. Please login once more.');
  258.             return $this->redirectToRoute('feapp_landing');
  259.         }
  260.         return $this->render('lineup.html.twig', [
  261.             'stages' => $repository->findByEvent($this->currentEvantevent),
  262.             'stage' => $stage,
  263.             'lineups' => $luRepository->getRecordsByStage($stage$this->currentEvantevent),
  264.         ]);
  265.     }
  266.     /**
  267.      * @Route("/app/faqs", name="feapp_faqs")
  268.      */
  269.     public function faqs(
  270.         Request $request,
  271.         FaqRepository $repository
  272.     ): Response
  273.     {
  274.         if (!$this->validSession($request)) {
  275.             $this->addFlash('warning','You session expired. Please login once more.');
  276.             return $this->redirectToRoute('feapp_landing');
  277.         }
  278.         return $this->render('faqs.html.twig', [
  279.             'faqs'=>$repository->findAll(),
  280.         ]);
  281.     }
  282.     /**
  283.      * @Route("/app/sponsors", name="feapp_sponsors")
  284.      */
  285.     public function sponsors(
  286.         Request $request,
  287.         SponsorRepository $repository
  288.     ): Response
  289.     {
  290.         if (!$this->validSession($request)) {
  291.             $this->addFlash('warning','You session expired. Please login once more.');
  292.             return $this->redirectToRoute('feapp_landing');
  293.         }
  294.         return $this->render('sponsors.html.twig', [
  295.             'sponsors'=>$repository->findAllSponsors($this->currentEvantevent),
  296.         ]);
  297.     }
  298.     /**
  299.      * @Route("/app/local_busines_partners", name="feapp_partners")
  300.      */
  301.     public function businessPartners(
  302.         Request $request,
  303.         SponsorRepository $repository
  304.     ): Response
  305.     {
  306.         if (!$this->validSession($request)) {
  307.             $this->addFlash('warning','You session expired. Please login once more.');
  308.             return $this->redirectToRoute('feapp_landing');
  309.         }
  310.         return $this->render('partners.html.twig', [
  311.             'sponsors'=>$repository->findAllPartners($this->currentEvantevent),
  312.         ]);
  313.     }
  314.     /**
  315.      * @Route("/app/sponsors/{id}", name="feapp_sponsors_details")
  316.      */
  317.     public function sponsorDetails(
  318.         Request $request,
  319.         Sponsor $sponsor
  320.     ): Response
  321.     {
  322.         if (!$this->validSession($request)) {
  323.             $this->addFlash('warning','You session expired. Please login once more.');
  324.             return $this->redirectToRoute('feapp_landing');
  325.         }
  326.         return $this->render('sponsorDetails.html.twig', [
  327.             'sponsor' => $sponsor,
  328.         ]);
  329.     }
  330.     protected function getUpcoming()
  331.     {
  332.         if ((new \DateTimeImmutable())>$this->currentEvantevent->getStartAt()) {
  333.             return $this->getDoctrine()->getRepository(Lineup::class)->getGlobalUpcoming(new \DateTimeImmutable('+1 hour'));
  334.         }
  335.         return [];
  336.     }
  337.     protected function getOnAir()
  338.     {
  339.         if ((new \DateTimeImmutable())>$this->currentEvantevent->getStartAt()) {
  340.             return $this->getDoctrine()->getRepository(Lineup::class)->getGlobalOnAir();
  341.         }
  342.         return [];
  343.     }
  344.     protected function validSession(Request $requestbool $noGuests false): bool
  345.     {
  346.         $template = [
  347.             'purchased'=>[],
  348.             'invited'=>[],
  349.         ];
  350.         if (
  351.             $request->getSession()->has('order')
  352.         ) {
  353.             $s $request->getSession()->get('order');
  354.             if (isset($s['email']) && isset($s['event'])) {
  355.                 $event $this->doctrine->getRepository(Event::class)->find($s['event']);
  356.                 $this->orders $this->purchaseHelper->getAllAvailablePurchases($s['email'], $event);
  357.                 if (count($this->orders['purchased']) || count($this->orders['invited'])) {
  358.                     return true;
  359.                 }
  360.             }
  361.         } elseif ($request->cookies->has('no_ticket') && !$noGuests) {
  362.             $this->orders $template;
  363.             return true;
  364.         }
  365.         $this->orders $template;
  366.         return false;
  367.     }
  368.     /**
  369.      * @Route("/app/directions", name="feapp_directions")
  370.      */
  371.     public function directionsMap(
  372.         Request $request
  373.     ): Response
  374.     {
  375.         if (!$this->validSession($request)) {
  376.             $this->addFlash('warning','You session expired. Please login once more.');
  377.             return $this->redirectToRoute('feapp_landing');
  378.         }
  379.         return $this->render('sponsors.html.twig', []);
  380.     }
  381.     /**
  382.      * @Route("/app/taxi", name="feapp_taxi")
  383.      */
  384.     public function bookTaxi(
  385.         Request $request,
  386.         ContentRepository $repository
  387.     ): Response
  388.     {
  389.         if (!$this->validSession($request)) {
  390.             $this->addFlash('warning','You session expired. Please login once more.');
  391.             return $this->redirectToRoute('feapp_landing');
  392.         }
  393.         return $this->render('taxi.html.twig', [
  394.             'content'=>$repository->get('taxi'),
  395.         ]);
  396.     }
  397.     /**
  398.      * @Route("/app/directions", name="feapp_directions")
  399.      */
  400.     public function directions(
  401.         Request $request,
  402.         ContentRepository $repository
  403.     ): Response
  404.     {
  405.         if (!$this->validSession($request)) {
  406.             $this->addFlash('warning','You session expired. Please login once more.');
  407.             return $this->redirectToRoute('feapp_landing');
  408.         }
  409.         return $this->render('directions.html.twig', [
  410.             'content'=>$repository->get('directions'),
  411.         ]);
  412.     }
  413.     /**
  414.      * @Route("/app/about-lowdefest", name="feapp_about")
  415.      */
  416.     public function adout(
  417.         Request $request,
  418.         ContentRepository $repository
  419.     ): Response
  420.     {
  421.         if (!$this->validSession($request)) {
  422.             $this->addFlash('warning','You session expired. Please login once more.');
  423.             return $this->redirectToRoute('feapp_landing');
  424.         }
  425.         return $this->render('cms.html.twig', [
  426.             'content'=>$repository->get('about'),
  427.         ]);
  428.     }
  429.     /**
  430.      * @Route("/app/about-lowde-music-trust", name="feapp_about_trust")
  431.      */
  432.     public function aboutTrust(
  433.         Request $request,
  434.         ContentRepository $repository
  435.     ): Response
  436.     {
  437.         if (!$this->validSession($request)) {
  438.             $this->addFlash('warning','You session expired. Please login once more.');
  439.             return $this->redirectToRoute('feapp_landing');
  440.         }
  441.         return $this->render('cms.html.twig', [
  442.             'content'=>$repository->get('about-trust'),
  443.         ]);
  444.     }
  445.     /**
  446.      * @Route("/app/food-and-bars", name="feapp_food")
  447.      */
  448.     public function foodAndBars(
  449.         Request $request,
  450.         FoodRepository $repository
  451.     ): Response
  452.     {
  453.         if (!$this->validSession($request)) {
  454.             $this->addFlash('warning','You session expired. Please login once more.');
  455.             return $this->redirectToRoute('feapp_landing');
  456.         }
  457.         return $this->render('food.html.twig', [
  458.             'content'=>$repository->findByEvent($this->currentEvantevent),
  459.         ]);
  460.     }
  461.     protected function render(string $view, array $parameters = [], Response $response null): Response
  462.     {
  463.         if (!$this->shareForm) {
  464.             $invitee = new Invitee();
  465.             $this->shareForm $this->createForm(InviteeType::class, $invitee);
  466.         }
  467.         $shared = [
  468.             'orders'=>$this->orders,
  469.             'upcoming' => $this->getUpcoming(),
  470.             'onAir' => $this->getOnAir(),
  471.             'shareForm' => $this->shareForm->createView(),
  472.             'currentEvent' => $this->currentEvantevent,
  473.         ];
  474.         return parent::render($viewarray_merge($shared$parameters), $response);
  475.     }
  476.     /**
  477.      * @Route("/app/share/{id}", name="feapp_share_ticket", methods={"POST"})
  478.      */
  479.     public function addInvitation(Request $requestPurchase $purchaseManagerRegistry $doctrine): Response
  480.     {
  481.         if (!$this->validSession($request)) {
  482.             $this->addFlash('warning','You session expired. Please login once more.');
  483.             return $this->redirectToRoute('feapp_landing');
  484.         }
  485.         foreach ($this->orders['invited'] as $order) {
  486.             if ($order->getId()==$purchase->getId()) {
  487.                 $this->addFlash(
  488.                     'danger',
  489.                     'You can share only your own tickets',
  490.                 );
  491.                 return $this->redirectToRoute('feapp_home');
  492.             }
  493.         }
  494.         $invitee = new Invitee();
  495.         $this->shareForm $this->createForm(InviteeType::class, $invitee);
  496.         $this->shareForm->handleRequest($request);
  497.         if ($this->shareForm->isSubmitted() && $this->shareForm->isValid()) {
  498.             $purchase->addInvitee($invitee);
  499.             $doctrine->getManager()
  500.                 ->persist($purchase);
  501.             $doctrine->getManager()->flush();
  502.             $this->addFlash(
  503.                 'success',
  504.                 'You shared your ticket with '.$invitee->getEmail()
  505.             );
  506.             $this->purchaseHelper->sendSharedTickets($invitee);
  507.         }
  508.         return $this->redirectToRoute('feapp_home');
  509.     }
  510.     /**
  511.      * Returns a RedirectResponse to the given route with the given parameters.
  512.      */
  513.     protected function redirectToRouteClearNoTicket(Request $requeststring $route, array $parameters = [], int $status 302): RedirectResponse
  514.     {
  515.         $response = new RedirectResponse($this->generateUrl($route$parameters), $status);
  516.         if (!$request->cookies->has('no_ticket')) {
  517.             $response->headers->clearCookie('no_ticket');
  518.         }
  519.         return $response;
  520.     }
  521. }