<?php
declare(strict_types=1);
namespace App\Controller\V1;
use App\Entity\Vista\LoyaltyMember;
use App\Manager\SessionDetailsManager;
use App\Helper\SessionHelper;
use App\Helper\UserHelper;
use App\Repository\LocationRepository;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\Annotations\View;
use Nelmio\ApiDocBundle\Annotation\Model;
use Swagger\Annotations as SWG;
use Symfony\Component\Routing\Annotation\Route;
use App\Security\Security;
/**
* @Route("/sessions")
* @SWG\Tag(name="Session_v1")
*/
class SessionController
{
use ResponseTrait;
/**
* @var SessionHelper
*/
protected $sessionHelper;
/**
* @var LocationRepository
*/
protected $locationRepository;
/**
* @var SessionDetailsManager
*/
protected $sessionDetailsHelper;
/**
* @var UserHelper
*/
protected $userHelper;
public function __construct(
SessionHelper $sessionHelper,
LocationRepository $locationRepository,
SessionDetailsManager $sessionDetailsHelper,
UserHelper $userHelper
) {
$this->sessionHelper = $sessionHelper;
$this->locationRepository = $locationRepository;
$this->sessionDetailsHelper = $sessionDetailsHelper;
$this->userHelper = $userHelper;
}
/**
* @Route("/{id}", methods={"GET"})
* @View(serializerGroups={"Default", "session_details"})
*
* @SWG\Response(
* response=200,
* description="A movie",
* @Model(type=\App\Entity\Local\Response\SessionDetails::class))
*
* @param $id
* @param Security $security
* @return \App\Entity\Local\Response\SessionDetails
* @throws \Throwable
*/
public function showSession($id, Security $security)
{
/** @var LoyaltyMember $user */
$user = $security->getUser();
if (null === $user) {
return $this->sessionDetailsHelper->getDetails($id);
}
$user = $this->userHelper->validate($user);
$balance = $this->userHelper->getBalance($user);
return $this->sessionDetailsHelper->getDetailsForUser($id, $user, $balance);
}
/**
* @Route("/filters/dates/list", methods={"GET"})
* @Rest\QueryParam(name="cinemaId", requirements="\d+", allowBlank=true, strict=true, nullable=true)
* @Rest\QueryParam(name="corporateFilmId", allowBlank=true, strict=true, nullable=true)
* @Rest\QueryParam(name="location", allowBlank=true, nullable=true)
* @Rest\QueryParam(name="top", allowBlank=true, strict=true, nullable=true)
* @Rest\QueryParam(name="comingSoon", allowBlank=true, strict=true, nullable=true)
* @View()
*
* @SWG\Response(
* response="200",
* description="Success",
* @SWG\Schema(type="array", items=@SWG\Items(type="string")))
*
* @param string $cinemaId
* @param string $corporateFilmId
* @param int $location
* @param bool $top
* @param bool $comingSoon
*
* @return array
*/
public function filtersDatesListAction(
?string $cinemaId,
?string $corporateFilmId,
$location = null,
?bool $top = null,
?bool $comingSoon = null
) {
if (!is_numeric($location)) {
$location = null;
} else {
$location = (int) $location;
}
return $this->sessionHelper->getFiltersDatesList(
$corporateFilmId,
$cinemaId ? [$cinemaId] : null,
$location,
$top,
$comingSoon
);
}
}