src/Controller/Api/EventsApiController.php line 108

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api;
  3. use App\Controller\EventsDirectusController;
  4. use App\Entity\EventsTag;
  5. use App\Entity\Pages\EventsPage;
  6. use Doctrine\Common\Collections\ArrayCollection;
  7. use GuzzleHttp\Exception\RequestException;
  8. use Jamel\CropperBundle\Service\Cropper;
  9. use Kunstmaan\NodeBundle\Entity\NodeTranslation;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Contracts\Translation\TranslatorInterface;
  16. use Welp\IcalBundle\Factory\Factory;
  17. use Welp\IcalBundle\Response\CalendarResponse;
  18. use GuzzleHttp\Client;
  19. class EventsApiController extends AbstractController
  20. {
  21.     /** @var Cropper $cropper */
  22.     private $cropper;
  23.     private $directusApiUrl;
  24.     private $directusUrl;
  25.     private $directusToken;
  26.     private $eventsDirectusController;
  27.     public function __construct(Cropper $cropperTranslatorInterface $translatorEventsDirectusController $eventsDirectusController)
  28.     {
  29.         $this->cropper $cropper;
  30.         $this->directusUrl $translator->trans($_ENV['DIRECTUS_URL']);
  31.         $this->directusApiUrl $translator->trans($_ENV['DIRECTUS_API_URL']);
  32.         $this->directusToken $translator->trans($_ENV['DIRECTUS_API_TOKEN']);
  33.         $this->eventsDirectusController $eventsDirectusController;
  34.     }
  35.     /**
  36.      * @Route("/api/events/ics", name="gcs_api_events_ics", methods={"GET"})
  37.      */
  38.     public function getIcsAction(Request $request)
  39.     {
  40.         $eventId $request->get('event_id');
  41.         if (!$eventId) {
  42.             return new Response('No id provided');
  43.         }
  44.         /** @var EventsPage $events */
  45.         $event $this->getDoctrine()->getRepository(EventsPage::class)->getOneArticle(
  46.             $request->getLocale(),
  47.             null,
  48.             null,
  49.             null,
  50.             null,
  51.             null,
  52.             null,
  53.             null,
  54.             $eventId
  55.         );
  56.         if ($event) {
  57.             $calendar $this->createCalendar($event);
  58.             return new CalendarResponse($calendar200);
  59.         }
  60.         return new Response('Wrong id');
  61.     }
  62.     /**
  63.      * @Route("/api/events", name="gcs_api_events_get", methods={"GET"})
  64.      */
  65.     public function getEvents(Request $request)
  66.     {
  67.         $date $this->getIfSet($request->get('date'));
  68.         $sports $this->getIfSet($request->get('sports'));
  69.         $tags $this->getIfSet($request->get('place'));
  70.         $gp $this->getIfSet(filter_var($request->get('gp'), FILTER_VALIDATE_BOOLEAN));
  71.         $featured $this->getIfSet(filter_var($request->get('featured'), FILTER_VALIDATE_BOOLEAN));
  72.         $sort $this->getIfSet($request->get('sort'));
  73.         if (!$date) {
  74.             return new Response('No date provided');
  75.         }
  76.         /** @var EventsPage $events */
  77.         $events $this->getDoctrine()->getRepository(EventsPage::class)->getFilteredArticles(
  78.             $request->getLocale(),
  79.             null,
  80.             null,
  81.             $sports,
  82.             $tags,
  83.             $gp,
  84.             $featured,
  85.             $date,
  86.             null,
  87.             $sort
  88.         );
  89. ;
  90.         return new JsonResponse(['events' => $this->iterateEvents($events$date$request)]);
  91.     }
  92.     /**
  93.      * @Route("/api/directusevents/ics", name="gcs_api_directus_events_ics", methods={"GET"})
  94.      */
  95.     public function getDirectusIcsAction(Request $request)
  96.     {
  97.         $eventId $request->get('event_id');
  98.         if (!$eventId) {
  99.             return new Response('No id provided');
  100.         }
  101.         $apiUrl $this->directusApiUrl '/gdynia-arena?events=' $eventId;
  102.         $token $this->directusToken;
  103.         $client = new Client();
  104.         $response $client->post($apiUrl, [
  105.             'headers' => [
  106.                 'ga-auth-token' => $token
  107.             ],
  108.         ]);
  109.         $responseData $response->getBody()->getContents();
  110.         $apiData json_decode($responseDatatrue);
  111.         $item $apiData['data'][0];
  112.         if ($item) {
  113.             $calendar $this->createDirectusCalendar($item);
  114.             return new CalendarResponse($calendar200);
  115.         }
  116.         return new Response('Wrong id');
  117.     }
  118.     /**
  119.      * @Route("/api/directusevents/{uri}", name="gcs_api_directus_events_get", methods={"GET"}, requirements={"uri"="[^/]+"})
  120.      */
  121.     public function getDirectusEvents(Request $request$uri)
  122.     {
  123.         $decodedUri urldecode($uri);
  124.         $pathSegments explode('/'$decodedUri);
  125.         $lastSegment end($pathSegments) . '/';
  126.         $url $this->directusUrl;
  127.         $date $this->getIfSet($request->get('date'));
  128.         $req_disciplines $this->getIfSet($request->get('sports'))[0];
  129.         $req_objects $this->getIfSet($request->get('place'))[0];
  130.         $gp $this->getIfSet(filter_var($request->get('gp'), FILTER_VALIDATE_BOOLEAN));
  131.         $featured $this->getIfSet(filter_var($request->get('featured'), FILTER_VALIDATE_BOOLEAN));
  132.         $sort $this->getIfSet($request->get('sort'));
  133.         if ($date) {
  134.             $formatDate = \DateTime::createFromFormat('d-m-Y'$date);
  135.             $date $formatDate->format('Y-m-d');
  136.         }
  137.         $apiUrl $this->directusApiUrl '/gdynia-arena?start_date=' $date;
  138.         if ($req_disciplines) {
  139.             $apiUrl $apiUrl '&disciplines=' $req_disciplines;
  140.         }
  141.         if ($req_objects) {
  142.             $apiUrl $apiUrl '&objects=' $req_objects;
  143.         }
  144.         if ($gp) {
  145.             $apiUrl $apiUrl '&gdynia_motion=true';
  146.         }
  147.         if ($featured) {
  148.             $apiUrl $apiUrl '&highlight=true';
  149.         }
  150.         if ($sort == 'alphabetical') {
  151.             $apiUrl $apiUrl '&sort=title';
  152.         }
  153.         $token $this->directusToken;
  154.         $client = new Client();
  155.         try {
  156.             $response $client->post($apiUrl, [
  157.                 'headers' => [
  158.                     'ga-auth-token' => $token,
  159.                 ]
  160.             ]);
  161.             $responseData $response->getBody()->getContents();
  162.             $apiData json_decode($responseDatatrue);
  163.             $transformedData = [];
  164.             $countApiData count($apiData['data']);
  165.             foreach ($apiData['data'] as $item) {
  166.                 $sports = [];
  167.                 if (isset($item['attributes']['disciplines']["data"]) && is_array($item['attributes']['disciplines']["data"])) {
  168.                     foreach ($item['attributes']['disciplines']["data"] as $discipline) {
  169.                         if (isset($discipline['attributes']['name'])) {
  170.                             $sports[] = ['name' => $discipline['attributes']['name']];
  171.                         }
  172.                     }
  173.                 }
  174.                 $places = [];
  175.                 if (isset($item['attributes']['objects']['data']) && is_array($item['attributes']['objects']['data'])) {
  176.                     foreach ($item['attributes']['objects']['data'] as $object) {
  177.                         if (isset($object['attributes']['name'])) {
  178.                             $places[] = ['name' => $object['attributes']['name'], 'address' => $object['attributes']['address']];
  179.                         }
  180.                     }
  181.                 }
  182.                 $start_date null;
  183.                 $end_date null;
  184.                 if (isset($item['attributes']['dates']) && is_array($item['attributes']['dates'])) {
  185.                     $count count($item['attributes']['dates']);
  186.                     if ($count 0) {
  187.                         $start_timestamp strtotime($item['attributes']['dates'][0]['start_date']);
  188.                         $end_timestamp strtotime($item['attributes']['dates'][$count 1]['end_date']);
  189.                         $start_date date('d.m.Y'$start_timestamp);
  190.                         $end_date date('d.m.Y'$end_timestamp);
  191.                     }
  192.                 }
  193.                 $imageKey = ['background' => 'background''poster' => 'poster'];
  194.                 if ($item['attributes']['publishedAt']) {
  195.                     $imageKey $this->eventsDirectusController->setImageKey($item['attributes']['publishedAt']);
  196.                 }
  197.                 $transformedItem = [
  198.                     'id' => $item['id'],
  199.                     'name' => $item['attributes']['title'],
  200.                     'list_img_url' => $url . ($countApiData ?
  201.                             $item['attributes'][$imageKey['poster']]['data']['attributes']['formats']['gcs-list']['url'] :
  202.                             $item['attributes'][$imageKey['poster']]['data']['attributes']['url']),
  203.                     'path' => $lastSegment $item['attributes']['slug'],
  204.                     'sports' => $sports,
  205.                     'places' => $places,
  206.                     'startDate' => $start_date,
  207.                     'endDate' => $end_date,
  208.                     'list_img_alt' => $item['attributes']['title'],
  209.                     'sort' => $sort
  210.                 ];
  211.                 $transformedData[] = $transformedItem;
  212.             }
  213.             if ($sort == 'date') {
  214.                 $startDates array_column($transformedData"startDate");
  215.                 array_multisort($startDatesSORT_ASC$transformedData);
  216.             }
  217.         } catch (RequestException $e) {
  218.             $transformedData = [];
  219.         }
  220.         return new JsonResponse(['events' => $transformedData]);
  221.     }
  222.     private function createDirectusCalendar($item)
  223.     {
  224.         $atts $item['attributes'];
  225.         $start_date date($atts['dates'][0]['start_date']);
  226.         $start_date = new \DateTime($start_date);
  227.         if (isset($atts['dates']) && is_array($atts['dates'])) {
  228.             $count count($atts['dates']);
  229.             if ($count 0) {
  230.                 $today = new \DateTime('today');
  231.                 foreach ($atts['dates'] as $date) {
  232.                     $row_date = new \DateTime($date["start_date"]);
  233.                     if ($row_date >= $today) {
  234.                         $start_date $row_date;
  235.                         break;
  236.                     }
  237.                 }
  238.             }
  239.         }
  240.         /** @var Factory $icalFactory */
  241.         $icalFactory = new Factory();
  242.         $calendar $icalFactory->createCalendar();
  243.         $calendarEvent $icalFactory->createCalendarEvent();
  244.         $calendarEvent->setStart($start_date)->setSummary($atts['title'])->setUid($item['id']);
  245.         $organizer $icalFactory->createOrganizer();
  246.         $organizer->setName('Gdyńskie centrum sportu')->setLanguage('pl');
  247.         $locations $atts['objects']['data'];
  248.         $locationsArray = [];
  249.         /**
  250.          * @var int $key
  251.          * @var EventsTag $location
  252.          */
  253.         foreach ($locations as $key => $location) {
  254.             $location $icalFactory->createLocation()->setLanguage('pl')->setName(
  255.                 $location['attributes']['name'].', '.$location['attributes']['address']
  256.             );
  257.             $locationsArray[] = $location;
  258.         }
  259.         $calendarEvent->setLocations($locationsArray);
  260.         $calendarEvent->setOrganizer($organizer);
  261.         $calendar->addEvent($calendarEvent);
  262.         return $calendar;
  263.     }
  264.     private function createCalendar(EventsPage $event)
  265.     {
  266.         /** @var Factory $icalFactory */
  267.         $icalFactory = new Factory();
  268.         $calendar $icalFactory->createCalendar();
  269.         $calendarEvent $icalFactory->createCalendarEvent();
  270.         $calendarEvent->setStart($event->getDate())->setSummary($event->getTitle())->setUid($event->getId());
  271.         $organizer $icalFactory->createOrganizer();
  272.         $organizer->setName('Gdyńskie centrum sportu')->setLanguage('pl');
  273.         $locations $event->getTags();
  274.         $locationsArray = [];
  275.         /**
  276.          * @var int $key
  277.          * @var EventsTag $location
  278.          */
  279.         foreach ($locations as $key => $location) {
  280.             $location $icalFactory->createLocation()->setLanguage('pl')->setName(
  281.                 $location->getName().', '.$location->getAddress()
  282.             );
  283.             $locationsArray[] = $location;
  284.         }
  285.         $calendarEvent->setLocations($locationsArray);
  286.         $calendarEvent->setOrganizer($organizer);
  287.         $calendar->addEvent($calendarEvent);
  288.         return $calendar;
  289.     }
  290.     private function iterateEvents($pages,$date$request)
  291.     {
  292.         $array = [];
  293.         /** @var EventsPage $eventsPage */
  294.         foreach ($pages as $eventsPage) {
  295.             if ($eventsPage->getDateFrequency()->== && $eventsPage->getDateFrequency(
  296.                 )->== && $eventsPage->getDateFrequency()->== 0) {
  297.                 $array[] = $this->eventArray($eventsPage$request);
  298.                 continue;
  299.             }
  300.             /** @var \DateTime $dateObject */
  301.             $dateObject = \DateTime::createFromFormat('d-m-Y G:i:s'$date." 00:00:00");
  302.             /** @var \DateTime $eventDate */
  303.             for (
  304.                 $i $eventsPage->getStartDate();
  305.                 $i <= $eventsPage->getEndDate();
  306.                 $i->add($eventsPage->getDateFrequency())
  307.             ) {
  308.                 if ($dateObject->format('d-m-Y') === $i->format('d-m-Y')) {
  309.                     $array[] = $this->eventArray($eventsPage$request);
  310.                 }
  311.             }
  312.         }
  313.         return $array;
  314.     }
  315.     private function eventArray(EventsPage $pageRequest $request)
  316.     {
  317.         $listImage null;
  318.         $places null;
  319.         $sports null;
  320.         $tagObject $page->getTags();
  321.         $sportObject $page->getSports();
  322.         $listAlt null;
  323.         $listImageObject $page->getListImage();
  324.         if (!$listImageObject->isEmpty()) {
  325.             $listImage $listImageObject->first()->getMedia()->getUrl();
  326.             $cropping $listImageObject->first()->getCropping();
  327.             $listImage $this->cropper->getCroppedImageSrc($listImage$cropping, ['w' => 500]);
  328.             $listAlt $listImageObject->first()->getMediaAlt();
  329.         }
  330.         if (!$tagObject->isEmpty()) {
  331.             foreach ($tagObject as $item) {
  332.                 $places[] = [
  333.                     'name' => $item->getName(),
  334.                     'address' => $item->getAddress(),
  335.                 ];
  336.             }
  337.         }
  338.         if (!$sportObject->isEmpty()) {
  339.             foreach ($sportObject as $item) {
  340.                 $sports[] = [
  341.                     'name' => $item->getName(),
  342.                 ];
  343.             }
  344.         }
  345.         $nodeTranslationRepo $this->getDoctrine()->getRepository(NodeTranslation::class);
  346.         /** @var NodeTranslation $nodeTranslation */
  347.         $nodeTranslation $nodeTranslationRepo->getNodeTranslationFor($page);
  348.         return [
  349.             'id' => $page->getId(),
  350.             'name' => $nodeTranslation->getTitle(),
  351.             'list_img_url' => $listImage,
  352.             'path' => $request->getSchemeAndHttpHost().'/'.$request->getLocale().'/'.$nodeTranslation->getUrl(),
  353.             'places' => $places,
  354.             'sports' => $sports,
  355.             'startDate' => $page->getStartDate()->format('d.m.Y'),
  356.             'endDate' => $page->getEndDate()->format('d.m.Y'),
  357.             'list_img_alt' => $listAlt,
  358.         ];
  359.     }
  360.     public function getIfSet($value$default null)
  361.     {
  362.         return $value ?? $default;
  363.     }
  364.     private function getAllDates(EventsPage $eventsPage)
  365.     {
  366.     }
  367. }