src/EventSubscriber/UserServicePromoSubscriber.php line 46

Open in your IDE?
  1. <?php
  2. // api/src/EventSubscriber/BookMailSubscriber.php
  3. namespace App\EventSubscriber;
  4. use ApiPlatform\Symfony\EventListener\EventPriorities;
  5. use App\Entity\User;
  6. use App\Entity\UserServicePromo;
  7. use App\Repository\ServicePromoRepository;
  8. use App\Repository\UserServicePromoRepository;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\HttpFoundation\JsonResponse;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  14. use Symfony\Component\HttpKernel\Event\ViewEvent;
  15. use Symfony\Component\HttpKernel\KernelEvents;
  16. use Symfony\Component\Security\Core\Security;
  17. final class UserServicePromoSubscriber implements EventSubscriberInterface
  18. {
  19.     /**
  20.      * @var Security
  21.      */
  22.     private $security;
  23.     /**
  24.      * @var UserServicePromoRepository
  25.      */
  26.     private $userServicePromoRepository;
  27.     public function __construct(Security $securityUserServicePromoRepository $userServicePromoRepository)
  28.     {
  29.         $this->security $security;
  30.         $this->userServicePromoRepository $userServicePromoRepository;
  31.     }
  32.     public static function getSubscribedEvents(): array
  33.     {
  34.         return [
  35.             KernelEvents::VIEW => ['validationCode'EventPriorities::PRE_WRITE],
  36.         ];
  37.     }
  38.     public function validationCode(ViewEvent $event): void
  39.     {
  40.         $userServicePromo $event->getControllerResult();
  41.         $method $event->getRequest()->getMethod();
  42.         if (!$userServicePromo instanceof UserServicePromo || Request::METHOD_POST !== $method) {
  43.             return;
  44.         }
  45.         $servicePromo $userServicePromo->getServicePromo();
  46.         /*if (!$servicePromo instanceof \App\Entity\ServicePromo) {
  47.             $response = new JsonResponse(['message' => "Le code promo que vous avez saisi n'existe pas."], Response::HTTP_BAD_REQUEST);
  48.             $event->setResponse($response);
  49.             return;
  50.         }*/
  51.         $today = new \DateTime();
  52.         if ($today $servicePromo->getDateStart()) {
  53.             $response = new JsonResponse(['message' => "Le code promo n'a pas encore commencé."], Response::HTTP_BAD_REQUEST);
  54.             $event->setResponse($response);
  55.             return;
  56.         }
  57.         if ($today $servicePromo->getDateEnd()) {
  58.             $response = new JsonResponse(['message' => 'Le code promo est expiré.'], Response::HTTP_BAD_REQUEST);
  59.             $event->setResponse($response);
  60.             return;
  61.         }
  62.         if ($servicePromo->getMaxUse() === 0) {
  63.             $response = new JsonResponse(
  64.                 [
  65.                     'message' => "Le code promo est invalide car le nombre d'utilisations maximales a été atteint.",
  66.                 ],
  67.                 Response::HTTP_BAD_REQUEST
  68.             );
  69.             $event->setResponse($response);
  70.             return;
  71.         }
  72.         /** @var User $user */
  73.         $user $this->security->getUser();
  74.         $checkedUserServicePromo $this->userServicePromoRepository->findOneBy([
  75.             'user' => $user,
  76.             'servicePromo' => $servicePromo,
  77.         ]);
  78.         if ($checkedUserServicePromo instanceof \App\Entity\UserServicePromo) {
  79.             $response = new JsonResponse(['message' => 'Vous avez déjà utilise ce code promo. Veuillez consulter votre promotions dans votre profil!'], Response::HTTP_BAD_REQUEST);
  80.             $event->setResponse($response);
  81.             return;
  82.         }
  83.         $servicePromo->decrementMaxUse();
  84.         $userServicePromo
  85.             ->setUser($user)
  86.             ->setServicePromo($servicePromo)
  87.             ->setIsConsumed(false)
  88.         ;
  89.     }
  90. }