src/EventSubscriber/User/UserPostValidateSubscriber.php line 104

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\User;
  3. use App\Exception\NotFoundException;
  4. use Symfony\Contracts\Translation\TranslatorInterface;
  5. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  6. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  7. use Symfony\Component\HttpKernel\Event\ViewEvent;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use ApiPlatform\Core\EventListener\EventPriorities;
  10. use Symfony\Component\Validator\Validator\ValidatorInterface;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpKernel\KernelEvents;
  13. use Symfony\Component\Form\FormFactoryInterface;
  14. use App\Repository\App\VendorRepository;
  15. use App\Repository\App\ScheduleRepository;
  16. use App\Repository\App\RoleRepository;
  17. use App\Repository\App\LocationRepository;
  18. use App\Repository\App\CompanyRepository;
  19. use App\Repository\App\UserRepository;
  20. use App\Repository\App\CategoryRepository;
  21. use App\Repository\App\Task\WorkerBudgetRepository;
  22. use App\Entity\App\Category;
  23. use App\Exception\InvalidArgumentException;
  24. use App\Exception\UserException;
  25. use App\Services\VendorService;
  26. use App\Services\UserService;
  27. use App\Entity\App\User;
  28. use App\Entity\App\Role;
  29. use App\Entity\App\Schedule;
  30. use App\Entity\App\Location;
  31. use App\Entity\App\Company;
  32. use App\Form\ScheduleType;
  33. final class UserPostValidateSubscriber implements EventSubscriberInterface
  34. {
  35.     private $tokenStorage;
  36.     private $authorizationChecker;
  37.     private $factory;
  38.     private $validator;
  39.     private $userService;
  40.     private $vendorService;
  41.     private $roleRepository;
  42.     private $vendorRepository;
  43.     private $scheduleRepository;
  44.     private $locationRepository;
  45.     private $companyRepository;
  46.     private $categoryRepository;
  47.     private $userRepository;
  48.     private $workerBudgetRepository;
  49.     private $translator;
  50.     public function __construct(
  51.         TokenStorageInterface $tokenStorage,
  52.         AuthorizationCheckerInterface $checker,
  53.         FormFactoryInterface $factory,
  54.         ValidatorInterface $validator,
  55.         UserService $userService,
  56.         VendorService $vendorService,
  57.         VendorRepository $vendorRepository,
  58.         RoleRepository $roleRepository,
  59.         ScheduleRepository $scheduleRepository,
  60.         LocationRepository $locationRepository,
  61.         CompanyRepository $companyRepository,
  62.         CategoryRepository $categoryRepository,
  63.         UserRepository $userRepository,
  64.         WorkerBudgetRepository $workerBudgetRepository,
  65.         TranslatorInterface $translator
  66.     ) {
  67.         $this->tokenStorage $tokenStorage;
  68.         $this->authorizationChecker $checker;
  69.         $this->factory $factory;
  70.         $this->validator $validator;
  71.         $this->userService $userService;
  72.         $this->vendorService $vendorService;
  73.         $this->roleRepository $roleRepository;
  74.         $this->vendorRepository $vendorRepository;
  75.         $this->scheduleRepository $scheduleRepository;
  76.         $this->locationRepository $locationRepository;
  77.         $this->companyRepository $companyRepository;
  78.         $this->categoryRepository $categoryRepository;
  79.         $this->userRepository $userRepository;
  80.         $this->workerBudgetRepository $workerBudgetRepository;
  81.         $this->translator $translator;
  82.     }
  83.     /**
  84.      * {@inheritdoc}
  85.      */
  86.     public static function getSubscribedEvents() {
  87.         return [
  88.             KernelEvents::VIEW => ['prepareUserData'EventPriorities::POST_VALIDATE]
  89.         ];
  90.     }
  91.     /**
  92.      * @param ViewEvent $event
  93.      * @throws InvalidArgumentException
  94.      * @throws NotFoundException
  95.      * @throws UserException
  96.      */
  97.     public function prepareUserData(ViewEvent $event) {
  98.         $user $event->getControllerResult();
  99.         $method $event->getRequest()->getMethod();
  100.         $request $event->getRequest();
  101.         if (!($user instanceof User) ||
  102.             (Request::METHOD_POST !== $method && Request::METHOD_PUT !== $method))
  103.             return;
  104.         $mediaContent $user->getMediaContent();
  105.         if ($mediaContent !== null && $mediaContent !== 0)
  106.             $this->userService->addMediaContent($user$mediaContent);
  107.         $content $request->getContent();
  108.         $data json_decode($contenttrue);
  109.         $vendor null;
  110.         if (isset($data['vendor'])) {
  111.             $vendor $this->vendorRepository->find($data['vendor']);
  112.         }
  113.         if ($vendor && isset($data['company']) && !is_null($data['company'])) {
  114.             $company $this->companyRepository->find($data['company']);
  115.             if (!$company instanceof Company) {
  116.                 throw new UserException(
  117.                     $this->translator->trans(
  118.                         'entity not found',
  119.                         ['%entity%' => 'company''%entityId%' => $data['company']]
  120.                     )
  121.                 );
  122.             }
  123.             if ($company->getVendor() !== $vendor) {
  124.                 throw new InvalidArgumentException(
  125.                     $this->translator->trans('vendor.validate.does_not_belongs',
  126.                         [
  127.                             '%entity%' => $this->translator->trans('company'),
  128.                             '%vendorName%' => $vendor->getName()
  129.                         ]
  130.                     )
  131.                 );
  132.             }
  133.         }
  134.         if (isset($data['email']) && isset($data['phoneNumber']) && empty($user->getEmail()) && empty($user->getPhoneNumber())) {
  135.             throw new InvalidArgumentException(
  136.                 $this->translator->trans(
  137.                     'field not must be null',
  138.                     ['%field%' => 'email & phoneNumber']
  139.                 )
  140.             );
  141.         }
  142.         $this->userRepository->disableSoftDeleteable();
  143.         if (isset($data['phoneNumber']) && !is_null($data['phoneNumber'])) {
  144.             $phone $data['phoneNumber'];
  145.             if (isset($data['phonePrefix']) && !is_null($data['phonePrefix'])) {
  146.                 $phone str_replace([' ''+''-''('')''-'], ''$data['phonePrefix'].$data['phoneNumber']);
  147.             }
  148.             $getUser $this->userRepository->findOneBy(['username' => $phone]);
  149.             if ($getUser instanceof User && $user !== $getUser) {
  150.                 throw new UserException(
  151.                     $this->translator->trans(
  152.                         'field already taken with value',
  153.                         [
  154.                             '%field1%' => 'phoneNumber',
  155.                             '%field2%' => 'username',
  156.                             '%value%' => $data['phoneNumber']
  157.                         ]
  158.                     )
  159.                 );
  160.             }
  161.             $getUser $this->userRepository->findOneBy(['email' => $phone]);
  162.             if ($getUser instanceof User && $user !== $getUser) {
  163.                 throw new UserException(
  164.                     $this->translator->trans(
  165.                         'field already taken with value',
  166.                         [
  167.                             '%field1%' => 'phoneNumber',
  168.                             '%field2%' => 'email',
  169.                             '%value%' => $data['phoneNumber']
  170.                         ]
  171.                     )
  172.                 );
  173.             }
  174.         }
  175.         if (isset($data['email']) && !is_null($data['email'])) {
  176.             $getUser $this->userRepository->findOneBy(['username' => $data['email']]);
  177.             if ($getUser instanceof User && $user !== $getUser) {
  178.                 throw new UserException(
  179.                     $this->translator->trans(
  180.                         'field already taken with value',
  181.                         [
  182.                             '%field1%' => 'email',
  183.                             '%field2%' => ' username',
  184.                             '%value%' => $data['email']
  185.                         ]
  186.                     )
  187.                 );
  188.             }
  189.             $getUser $this->userRepository->findOneBy(['phoneNumber' => $data['email']]);
  190.             if ($getUser instanceof User && $user !== $getUser) {
  191.                 throw new UserException(
  192.                     $this->translator->trans(
  193.                         'field already taken with value',
  194.                         [
  195.                             '%field1%' => 'email',
  196.                             '%field2%' => 'phoneNumber',
  197.                             '%value%' => $data['email']
  198.                         ]
  199.                     )
  200.                 );
  201.             }
  202.             $getUser $this->userRepository->findOneBy(['phonePrefixAndPhone' => $data['email']]);
  203.             if ($getUser instanceof User && $user !== $getUser) {
  204.                 throw new UserException(
  205.                     $this->translator->trans(
  206.                         'field already taken with value',
  207.                         [
  208.                             '%field1%' => 'email',
  209.                             '%field2%' => 'phonePrefixAndPhone',
  210.                             '%value%' => $data['email']
  211.                         ]
  212.                     )
  213.                 );
  214.             }
  215.         }
  216.         if (isset($data['username']) && !is_null($data['username'])) {
  217.             $getUser $this->userRepository->findOneBy(['phoneNumber' => $data['username']]);
  218.             if ($getUser instanceof User && $user !== $getUser) {
  219.                 throw new UserException(
  220.                     $this->translator->trans(
  221.                         'field already taken with value',
  222.                         [
  223.                             '%field1%' => 'username',
  224.                             '%field2%' => 'phoneNumber',
  225.                             '%value%' => $data['username']
  226.                         ]
  227.                     )
  228.                 );
  229.             }
  230.             $getUser $this->userRepository->findOneBy(['phonePrefixAndPhone' => $data['username']]);
  231.             if ($getUser instanceof User && $user !== $getUser) {
  232.                 throw new UserException(
  233.                     $this->translator->trans(
  234.                         'field already taken with value',
  235.                         [
  236.                             '%field1%' => 'username',
  237.                             '%field2%' => 'phonePrefixAndPhone',
  238.                             '%value%' => $data['email']
  239.                         ]
  240.                     )
  241.                 );
  242.             }
  243.             $getUser $this->userRepository->findOneBy(['email' => $data['username']]);
  244.             if ($getUser instanceof User && $user !== $getUser) {
  245.                 throw new UserException(
  246.                     $this->translator->trans(
  247.                         'field already taken with value',
  248.                         [
  249.                             '%field1%' => 'username',
  250.                             '%field2%' => 'email',
  251.                             '%value%' => $data['username']
  252.                         ]
  253.                     )
  254.                 );
  255.             }
  256.         }
  257.         if ($vendor && isset($data['roles'])) {
  258.             $rolesObject = [];
  259.             $rolesName = [];
  260.             foreach ($data['roles'] as $role) {
  261.                 $entityId null;
  262.                 if (is_string($role)) {
  263.                     $entityId $role;
  264.                     $role $this->roleRepository->findOneBy(['name' => $role]);
  265.                 } else if(is_array($role) && isset($role['id'])) {
  266.                     $entityId $role['id'];
  267.                     $role $this->roleRepository->find($role['id']);
  268.                 }
  269.                 if (!$role instanceof Role) {
  270.                     throw new NotFoundException(
  271.                         $this->translator->trans('general.validate.not_exists',
  272.                             [
  273.                                 '%entityName%' => $this->translator->trans('role.title'),
  274.                                 '%entityId%' => $entityId
  275.                             ]
  276.                         )
  277.                     );
  278.                 }
  279.                 if ($role->getName() == Role::ROLE_SUPERADMIN) {
  280.                     throw new UserException(
  281.                         $this->translator->trans('role not allowed', ['%role%' => $role->getName()])
  282.                     );
  283.                 }
  284.                 $rolesObject[] = $role;
  285.                 $rolesName[] = $role->getName();
  286.             }
  287.             if (Request::METHOD_PUT === $method) {
  288.                 $vendorStaff $this->vendorService->getVendorStaff(null$user$vendor);
  289.                 $oldRoles $vendorStaff->getRoles();
  290.                 $roleOperator $this->roleRepository->findOneBy(['name' => Role::ROLE_OPERATOR]);
  291.                 $roleTaskmaster $this->roleRepository->findOneBy(['name' => Role::ROLE_TASKMASTER]);
  292.                 if (in_array($roleOperator$oldRoles) &&
  293.                     !in_array(Role::ROLE_OPERATOR$rolesName)
  294.                 ) {
  295.                     $workerBudgets $this->workerBudgetRepository->findBy(
  296.                         [
  297.                             'vendorStaff' => $vendorStaff,
  298.                             'role' => $roleOperator
  299.                         ]
  300.                     );
  301.                     if (count($workerBudgets) > 0) {
  302.                         throw new InvalidArgumentException(
  303.                             $this->translator->trans(
  304.                                 'user is active as an role',
  305.                                 [
  306.                                     '%role%' =>  $this->translator->trans(Role::ROLE_OPERATOR)
  307.                                 ]
  308.                             )
  309.                         );
  310.                     }
  311.                 }
  312.                 if (in_array($roleTaskmaster$oldRoles) &&
  313.                     !in_array(Role::ROLE_TASKMASTER$rolesName)
  314.                 ) {
  315.                     $workerBudgets $this->workerBudgetRepository->findBy(
  316.                         [
  317.                             'vendorStaff' => $vendorStaff,
  318.                             'role' => $roleTaskmaster
  319.                         ]
  320.                     );
  321.                     if (count($workerBudgets) > 0) {
  322.                         throw new InvalidArgumentException(
  323.                             $this->translator->trans(
  324.                                 'user is active as an role',
  325.                                 [
  326.                                     '%role%' =>  $this->translator->trans(Role::ROLE_TASKMASTER)
  327.                                 ]
  328.                             )
  329.                         );
  330.                     }
  331.                 }
  332.             }
  333.         } else {
  334.             if (Request::METHOD_POST === $method) {
  335.                 throw new InvalidArgumentException(
  336.                     $this->translator->trans('role.field_validate.required')
  337.                 );
  338.             }
  339.         }
  340.         if ($vendor && isset($data['locations'])) {
  341.             foreach ($data['locations'] as $locationId) {
  342.                 $location $this->locationRepository->find($locationId);
  343.                 if (!$location instanceof Location) {
  344.                     throw new NotFoundException(
  345.                         $this->translator->trans('general.validate.not_exists',
  346.                             [
  347.                                 '%entityName%' => $this->translator->trans('location.title'),
  348.                                 '%entityId%' => $locationId
  349.                             ]
  350.                         )
  351.                     );
  352.                 }
  353.                 if ($location->getVendor() !== $vendor) {
  354.                     throw new InvalidArgumentException(
  355.                         $this->translator->trans('vendor.validate.does_not_belongs',
  356.                             [
  357.                                 '%entity%' => $this->translator->trans('location.title'),
  358.                                 '%vendorName%' => $vendor->getName()
  359.                             ]
  360.                         )
  361.                     );
  362.                 }
  363.             }
  364.         }
  365.         if ($vendor && isset($data['categories'])) {
  366.             foreach ($data['categories'] as $categoryId) {
  367.                 $category $this->categoryRepository->find($categoryId);
  368.                 if (!$category instanceof Category) {
  369.                     throw new NotFoundException(
  370.                         $this->translator->trans('general.validate.not_exists',
  371.                             [
  372.                                 '%entityName%' => $this->translator->trans('category.title'),
  373.                                 '%entityId%' => $categoryId
  374.                             ]
  375.                         )
  376.                     );
  377.                 }
  378.                 if ($category->getVendor() !== $vendor) {
  379.                     throw new InvalidArgumentException(
  380.                         $this->translator->trans('vendor.validate.does_not_belongs',
  381.                             [
  382.                                 '%entity%' => $this->translator->trans('category.title'),
  383.                                 '%vendorName%' => $vendor->getName()
  384.                             ]
  385.                         )
  386.                     );
  387.                 }
  388.                 if ($category->getType() !== Category::TYPE_USER) {
  389.                     throw new InvalidArgumentException(
  390.                         $this->translator->trans('category.validate.type_not_allowed',
  391.                             [
  392.                                 '%type%' => $category->getType(),
  393.                                 '%typeAllowed%' => Category::TYPE_USER
  394.                             ]
  395.                         )
  396.                     );
  397.                 }
  398.             }
  399.         }
  400.         if ($vendor && isset($data['costPerHour'])) {
  401.             if (is_null($data['costPerHour'])) {
  402.                 throw new InvalidArgumentException(
  403.                     $this->translator->trans(
  404.                         'field not must be null',
  405.                         ['%field%' => 'costPerHour']
  406.                     )
  407.                 );
  408.             }
  409.             if (!is_numeric($data['costPerHour'])) {
  410.                 throw new InvalidArgumentException(
  411.                     $this->translator->trans(
  412.                         'field must be numeric',
  413.                         ['%field%' => 'costPerHour']
  414.                     )
  415.                 );
  416.             }
  417.         }
  418.         /*
  419.  if ($vendor && isset($data['schedules']) && is_array($data['schedules'])) {
  420.      foreach ($data['schedules'] as $scheduleRequest) {
  421.          $schedule = new Schedule();
  422.          $form = $this->factory->create(ScheduleType::class, $schedule);
  423.          $request->request->replace($scheduleRequest);
  424.          $form->handleRequest($request);
  425.          if($form->isSubmitted() && !$form->isValid())
  426.              throw new ValidationException($this->validator->validate($schedule));
  427.          if (isset($scheduleRequest['id']) && is_integer($scheduleRequest['id'])) {
  428.              $getSchedule = $this->scheduleRepository->find($scheduleRequest['id']);
  429.              if ($getSchedule == null) {
  430.                  throw new UserException(
  431.                      $this->translator->trans(
  432.                          'entity not found',
  433.                          [
  434.                              '%entity%' => $this->translator->trans('schedule'),
  435.                              '%entityId%' => $scheduleRequest['id']
  436.                          ]
  437.                      )
  438.                  );
  439.              }
  440.              $vendorStaff = $this->vendorService->findOrCreateVendorStaff($vendor, $user);
  441.              if ($getSchedule->getVendorStaff() !== $vendorStaff) {
  442.                  throw new InvalidArgumentException(
  443.                      $this->translator->trans(
  444.                          'entity does not belong to the user',
  445.                          [
  446.                              '%entity%' => $this->translator->trans('schedule'),
  447.                              '%entityId%' => $scheduleRequest['id']
  448.                          ]
  449.                      )
  450.                  );
  451.              }
  452.          }
  453.      }
  454.  }
  455.  */
  456.     }
  457. }