src/Auth/EventListener/AuthenticationSuccessListener.php line 78

Open in your IDE?
  1. <?php
  2. namespace App\Auth\EventListener;
  3. use App\Auth\Repository\AuthUserRepositoryInterface;
  4. use App\Common\UUID;
  5. use App\Driver\Exception\UnauthorizedException;
  6. use App\Driver\Repository\DetailsDriverRepositoryInterface;
  7. use App\Entity\Driver;
  8. use App\Entity\User;
  9. use App\Entity\Warehouseman;
  10. use App\Subscription\Domain\Demo\DemoSubscriptionRepository;
  11. use App\Subscription\Domain\Shared\LeadId;
  12. use App\Subscription\Infrastructure\Db\ViewDemoSubscription;
  13. use App\Warehouseman\Repository\DetailsWarehousemanRepositoryInterface;
  14. use App\Worker\Repository\WorkerRepositoryInterface;
  15. use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationSuccessEvent;
  16. use Ramsey\Uuid\UuidInterface;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\RequestStack;
  19. class AuthenticationSuccessListener
  20. {
  21.     /**
  22.      * @var RequestStack
  23.      */
  24.     private $requestStack;
  25.     /**
  26.      * @var DetailsDriverRepositoryInterface
  27.      */
  28.     private $driverRepository;
  29.     /**
  30.      * @var DetailsWarehousemanRepositoryInterface
  31.      */
  32.     private $warehousemanRepository;
  33.     /**
  34.      * @var AuthUserRepositoryInterface
  35.      */
  36.     private $authRepository;
  37.     /**
  38.      * @var WorkerRepositoryInterface
  39.      */
  40.     private $workerRepository;
  41.     /**
  42.      * @var DemoSubscriptionRepository
  43.      */
  44.     private $demoSubscriptionRepository;
  45.     /**
  46.      * AuthenticationSuccessListener constructor.
  47.      * @param RequestStack $requestStack
  48.      * @param DetailsDriverRepositoryInterface $driverRepository
  49.      * @param DetailsWarehousemanRepositoryInterface $warehousemanRepository
  50.      * @param AuthUserRepositoryInterface $authRepository
  51.      */
  52.     public function __construct(
  53.         RequestStack $requestStack,
  54.         DetailsDriverRepositoryInterface $driverRepository,
  55.         DetailsWarehousemanRepositoryInterface $warehousemanRepository,
  56.         AuthUserRepositoryInterface $authRepository,
  57.         WorkerRepositoryInterface $workerRepository,
  58.         DemoSubscriptionRepository $demoSubscriptionRepository
  59.     )
  60.     {
  61.         $this->requestStack $requestStack;
  62.         $this->driverRepository $driverRepository;
  63.         $this->warehousemanRepository $warehousemanRepository;
  64.         $this->authRepository $authRepository;
  65.         $this->workerRepository $workerRepository;
  66.         $this->demoSubscriptionRepository $demoSubscriptionRepository;
  67.     }
  68.     public function onAuthenticationSuccessResponse(AuthenticationSuccessEvent $event): void
  69.     {
  70.         $request $this->requestStack->getCurrentRequest();
  71.         $data $event->getData();
  72.         $user $event->getUser();
  73.         if (!$user instanceof User) {
  74.             return;
  75.         }
  76.         $this->authRepository->login($user->getId());
  77.         if ($this->isDriverLogin($request)) {
  78.             $response $this->getDriverInfo($user->getId());
  79.             $data['completeDriverProfile'] = $response['completeDriverProfile'];
  80.             $data['assignTruck'] = $response['assignTruck'];
  81.         } elseif ($this->isAppLogin($request)) {
  82.             $responseDriver $this->getDriverInfo($user->getId());
  83.             if (empty($responseDriver['driver'])) {
  84.                 $responseWarehouseman $this->getWarehousemanInfo($user->getId());
  85.             }
  86.             if (!empty($responseDriver['driver'])) {
  87.                 $data['type'] = 'driver';
  88.                 $data['completeProfile'] = $responseDriver['completeDriverProfile'];
  89.                 $data['assignTruck'] = $responseDriver['assignTruck'];
  90.             } elseif (!empty($responseWarehouseman['warehouseman'])) {
  91.                 $data['type'] = 'warehouseman';
  92.                 $data['completeProfile'] = $responseWarehouseman['completeWarehousemanProfile'];
  93.                 $data['assignWarehouse'] = $responseWarehouseman['assignWarehouse'];
  94.             } else {
  95.                 $data['type'] = 'techSupport';
  96.                 $data['completeProfile'] = true;
  97.             }
  98.         } else {
  99.             try {
  100.                 $worker $this->workerRepository->findOneByUuid($user->getId());
  101.                 if ($worker->isOwner() && $worker->getOrganizationId()->equals($user->getOrganizationId())) {
  102.                     /** @var ViewDemoSubscription $subscription */
  103.                     $subscription $this->demoSubscriptionRepository->subscriptionForOrganization(new LeadId(new UUID((string)$user->getOrganizationId())))->getOrNull();
  104.                     if ($subscription) {
  105.                         $data['subscriptionExpiryDate'] = $subscription->expiryDate()->format(DATE_ATOM);
  106.                         $data['subscriptionDaysToExpires'] = $subscription->expiryDate()->diff(new \DateTimeImmutable())->days;
  107.                     }
  108.                 }
  109.             } catch (\Exception $exception) {
  110.             }
  111.         }
  112.         $event->setData($data);
  113.     }
  114.     /**
  115.      * @param Request $request
  116.      * @return string
  117.      * @deprecated
  118.      */
  119.     private function isDriverLogin(Request $request): string
  120.     {
  121.         return strstr($request->getPathInfo(), 'auth/driver/login');
  122.     }
  123.     /**
  124.      * @param Request $request
  125.      * @return string
  126.      */
  127.     private function isAppLogin(Request $request): string
  128.     {
  129.         return strstr($request->getPathInfo(), 'auth/app/login');
  130.     }
  131.     /**
  132.      * @param UuidInterface $id
  133.      * @return array
  134.      * @throws UnauthorizedException
  135.      */
  136.     private function getDriverInfo(UuidInterface $id): array
  137.     {
  138.         $response = [
  139.             'completeDriverProfile' => false,
  140.             'assignTruck' => false
  141.         ];
  142.         try {
  143.             $driver $this->driverRepository->findOneById($id);
  144.             if ($driver instanceof Driver) {
  145.                 $response['driver'] = $driver->getId()->toString();
  146.                 if ($driver->isCompleteProfile()) {
  147.                     $response['completeDriverProfile'] = true;
  148.                 }
  149.                 if ($driver->isAssignedTruck()) {
  150.                     $response['assignTruck'] = $driver->getTruckId()->toString();
  151.                 }
  152.             }
  153.             return $response;
  154.         } catch (\Exception $e) {
  155.             throw new UnauthorizedException();
  156.         }
  157.         return $response;
  158.     }
  159.     /**
  160.      * @param UuidInterface $id
  161.      * @return array
  162.      * @throws UnauthorizedException
  163.      */
  164.     private function getWarehousemanInfo(UuidInterface $id): array
  165.     {
  166.         $response = [
  167.             'completeWarehousemanProfile' => false,
  168.             'assignWarehouse' => false
  169.         ];
  170.         try {
  171.             $warehouseman $this->warehousemanRepository->findOneById($id);
  172.             if ($warehouseman instanceof Warehouseman) {
  173.                 $response['warehouseman'] = $warehouseman->getId()->toString();
  174.                 if ($warehouseman->isCompleteProfile()) {
  175.                     $response['completeWarehousemanProfile'] = true;
  176.                 }
  177.                 if ($warehouseman->isAssignedWarehouse()) {
  178.                     $response['assignWarehouse'] = $warehouseman->getWarehouseId()->toString();
  179.                 }
  180.             }
  181.             return $response;
  182.         } catch (\Exception $e) {
  183.             var_dump($e->getMessage());
  184.             throw new UnauthorizedException();
  185.         }
  186.     }
  187. }