src/EventSubscriber/Validation/UserSubscriber.php line 111

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Validation;
  3. use ApiPlatform\Core\EventListener\EventPriorities;
  4. use App\Entity\Company\Company;
  5. use App\Entity\User\Address\Delivery;
  6. use App\Entity\User\Address\Home;
  7. use App\Entity\User\User;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpKernel\Event\ViewEvent;
  12. use Symfony\Component\HttpKernel\KernelEvents;
  13. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  14. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  15. final class UserSubscriber implements EventSubscriberInterface
  16. {
  17.     private $user;
  18.     private AuthorizationCheckerInterface $authChecker;
  19.     /**
  20.      * @var EntityManagerInterface
  21.      */
  22.     private EntityManagerInterface $em;
  23.     /**
  24.      * UserSubscriber constructor.
  25.      * @param TokenStorageInterface $tokenStorage
  26.      * @param AuthorizationCheckerInterface $authChecker
  27.      * @param EntityManagerInterface $em
  28.      */
  29.     public function __construct(
  30.         TokenStorageInterface $tokenStorage,
  31.         AuthorizationCheckerInterface $authChecker,
  32.         EntityManagerInterface $em)
  33.     {
  34.         if (!$tokenStorage->getToken()) {
  35.             return;
  36.         }
  37.         $this->user $tokenStorage->getToken()->getUser();
  38.         $this->authChecker $authChecker;
  39.         $this->em $em;
  40.     }
  41.     public static function getSubscribedEvents(): array
  42.     {
  43.         return [
  44.             KernelEvents::VIEW => [
  45.                 ['removeRoles'EventPriorities::PRE_VALIDATE],
  46.                 ['addCompany'EventPriorities::PRE_VALIDATE],
  47.                 ['addAddress'EventPriorities::PRE_VALIDATE],
  48.             ],
  49.         ];
  50.     }
  51.     // set default company
  52.     public function addAddress(ViewEvent $event)
  53.     {
  54.         $userEntity $event->getControllerResult();
  55.         $method $event->getRequest()->getMethod();
  56.         if (!$userEntity instanceof User || !in_array($method, [Request::METHOD_POSTRequest::METHOD_PUT])) {
  57.             return;
  58.         }
  59.         $this->setHome($event$userEntity);
  60.         $this->setDelivery($event$userEntity);
  61.     }
  62.     // set default company
  63.     public function addCompany(ViewEvent $event)
  64.     {
  65.         $userEntity $event->getControllerResult();
  66.         $method $event->getRequest()->getMethod();
  67.         if (!$userEntity instanceof User || !in_array($method, [Request::METHOD_POSTRequest::METHOD_PUT])) {
  68.             return;
  69.         }
  70.         // no restrictions for admin
  71.         if ($this->authChecker->isGranted('ROLE_ADMIN'$this->user)) {
  72.             return;
  73.         }
  74.         if ($userEntity->getCompany() instanceof Company) {
  75.             return;
  76.         }
  77.         if (!isset($_ENV['DEFAULT_COMPANY_UUID']) || !$_ENV['DEFAULT_COMPANY_UUID']) {
  78.             throw new \Exception('DEFAULT_COMPANY_UUID env var is missing'500);
  79.         }
  80.         // set default company if not provided
  81.         $company $this->em->getRepository(Company::class)->find($_ENV['DEFAULT_COMPANY_UUID']);
  82.         if (!$company instanceof Company) {
  83.             throw new \Exception(
  84.                 sprintf(
  85.                     'Default Company %s set in env var DEFAULT_COMPANY_UUID not found',
  86.                     $_ENV['DEFAULT_COMPANY_UUID']
  87.                 ),
  88.                 500
  89.             );
  90.         }
  91.         $userEntity->setCompany($company);
  92.     }
  93.     // set default roles on account creation without ROLE_ADMIN
  94.     public function removeRoles(ViewEvent $event)
  95.     {
  96.         $userEntity $event->getControllerResult();
  97.         $method $event->getRequest()->getMethod();
  98.         if (!$userEntity instanceof User || !in_array($method, [Request::METHOD_POSTRequest::METHOD_PUT])) {
  99.             return;
  100.         }
  101.         // no restrictions for admin
  102.         if ($this->authChecker->isGranted('ROLE_ADMIN'$this->user)) {
  103.             return;
  104.         }
  105.         //do something before validate user
  106.     }
  107.     private function setHome(ViewEvent $eventUser $userEntity)
  108.     {
  109.         $addresses json_decode($event->getRequest()->getContent(), true)['addressesHome'] ?? [];
  110.         foreach ($addresses as $address) {
  111.             $newAddress = new Home();
  112.             $newAddress
  113.                 ->setStreet($address['street'] ?? '')
  114.                 ->setComplement($address['complement'] ?? '')
  115.                 ->setPostalCode($address['postalCode'] ?? '')
  116.                 ->setCity($address['city'] ?? '')
  117.                 ->setFavorite($address['favorite'] ?? false)
  118.                 ->setUser($userEntity)
  119.             ;
  120.             $userEntity->addAddressHome($newAddress);
  121.         }
  122.     }
  123.     private function setDelivery(ViewEvent $eventUser $userEntity)
  124.     {
  125.         $addresses json_decode($event->getRequest()->getContent(), true)['addressesDelivery'] ?? [];
  126.         foreach ($addresses as $address) {
  127.             $newAddress = new Delivery();
  128.             $newAddress
  129.                 ->setFirstName($address['firstName'] ?? '')
  130.                 ->setLastName($address['lastName'] ?? '')
  131.                 ->setStreet($address['street'] ?? '')
  132.                 ->setComplement($address['complement'] ?? '')
  133.                 ->setPostalCode($address['postalCode'] ?? '')
  134.                 ->setCity($address['city'] ?? '')
  135.                 ->setPhoneNumber($address['phoneNumber'] ?? null)
  136.                 ->setFavorite($address['favorite'] ?? false)
  137.                 ->setExtraInformation($address['extraInformation'] ?? '')
  138.                 ->setUser($userEntity)
  139.             ;
  140.             $userEntity->addAddressDelivery($newAddress);
  141.         }
  142.     }
  143. }