<?php
// api/src/EventSubscriber/BookMailSubscriber.php
namespace App\EventSubscriber;
use ApiPlatform\Symfony\EventListener\EventPriorities;
use App\Entity\User;
use App\Entity\UserServicePromo;
use App\Repository\ServicePromoRepository;
use App\Repository\UserServicePromoRepository;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Security;
final class UserServicePromoSubscriber implements EventSubscriberInterface
{
/**
* @var Security
*/
private $security;
/**
* @var UserServicePromoRepository
*/
private $userServicePromoRepository;
public function __construct(Security $security, UserServicePromoRepository $userServicePromoRepository)
{
$this->security = $security;
$this->userServicePromoRepository = $userServicePromoRepository;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::VIEW => ['validationCode', EventPriorities::PRE_WRITE],
];
}
public function validationCode(ViewEvent $event): void
{
$userServicePromo = $event->getControllerResult();
$method = $event->getRequest()->getMethod();
if (!$userServicePromo instanceof UserServicePromo || Request::METHOD_POST !== $method) {
return;
}
$servicePromo = $userServicePromo->getServicePromo();
/*if (!$servicePromo instanceof \App\Entity\ServicePromo) {
$response = new JsonResponse(['message' => "Le code promo que vous avez saisi n'existe pas."], Response::HTTP_BAD_REQUEST);
$event->setResponse($response);
return;
}*/
$today = new \DateTime();
if ($today < $servicePromo->getDateStart()) {
$response = new JsonResponse(['message' => "Le code promo n'a pas encore commencé."], Response::HTTP_BAD_REQUEST);
$event->setResponse($response);
return;
}
if ($today > $servicePromo->getDateEnd()) {
$response = new JsonResponse(['message' => 'Le code promo est expiré.'], Response::HTTP_BAD_REQUEST);
$event->setResponse($response);
return;
}
if ($servicePromo->getMaxUse() === 0) {
$response = new JsonResponse(
[
'message' => "Le code promo est invalide car le nombre d'utilisations maximales a été atteint.",
],
Response::HTTP_BAD_REQUEST
);
$event->setResponse($response);
return;
}
/** @var User $user */
$user = $this->security->getUser();
$checkedUserServicePromo = $this->userServicePromoRepository->findOneBy([
'user' => $user,
'servicePromo' => $servicePromo,
]);
if ($checkedUserServicePromo instanceof \App\Entity\UserServicePromo) {
$response = new JsonResponse(['message' => 'Vous avez déjà utilise ce code promo. Veuillez consulter votre promotions dans votre profil!'], Response::HTTP_BAD_REQUEST);
$event->setResponse($response);
return;
}
$servicePromo->decrementMaxUse();
$userServicePromo
->setUser($user)
->setServicePromo($servicePromo)
->setIsConsumed(false)
;
}
}