<?php
namespace App\Auth\EventListener;
use App\Auth\Repository\AuthUserRepositoryInterface;
use App\Common\UUID;
use App\Driver\Exception\UnauthorizedException;
use App\Driver\Repository\DetailsDriverRepositoryInterface;
use App\Entity\Driver;
use App\Entity\User;
use App\Entity\Warehouseman;
use App\Subscription\Domain\Demo\DemoSubscriptionRepository;
use App\Subscription\Domain\Shared\LeadId;
use App\Subscription\Infrastructure\Db\ViewDemoSubscription;
use App\Warehouseman\Repository\DetailsWarehousemanRepositoryInterface;
use App\Worker\Repository\WorkerRepositoryInterface;
use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationSuccessEvent;
use Ramsey\Uuid\UuidInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
class AuthenticationSuccessListener
{
/**
* @var RequestStack
*/
private $requestStack;
/**
* @var DetailsDriverRepositoryInterface
*/
private $driverRepository;
/**
* @var DetailsWarehousemanRepositoryInterface
*/
private $warehousemanRepository;
/**
* @var AuthUserRepositoryInterface
*/
private $authRepository;
/**
* @var WorkerRepositoryInterface
*/
private $workerRepository;
/**
* @var DemoSubscriptionRepository
*/
private $demoSubscriptionRepository;
/**
* AuthenticationSuccessListener constructor.
* @param RequestStack $requestStack
* @param DetailsDriverRepositoryInterface $driverRepository
* @param DetailsWarehousemanRepositoryInterface $warehousemanRepository
* @param AuthUserRepositoryInterface $authRepository
*/
public function __construct(
RequestStack $requestStack,
DetailsDriverRepositoryInterface $driverRepository,
DetailsWarehousemanRepositoryInterface $warehousemanRepository,
AuthUserRepositoryInterface $authRepository,
WorkerRepositoryInterface $workerRepository,
DemoSubscriptionRepository $demoSubscriptionRepository
)
{
$this->requestStack = $requestStack;
$this->driverRepository = $driverRepository;
$this->warehousemanRepository = $warehousemanRepository;
$this->authRepository = $authRepository;
$this->workerRepository = $workerRepository;
$this->demoSubscriptionRepository = $demoSubscriptionRepository;
}
public function onAuthenticationSuccessResponse(AuthenticationSuccessEvent $event): void
{
$request = $this->requestStack->getCurrentRequest();
$data = $event->getData();
$user = $event->getUser();
if (!$user instanceof User) {
return;
}
$this->authRepository->login($user->getId());
if ($this->isDriverLogin($request)) {
$response = $this->getDriverInfo($user->getId());
$data['completeDriverProfile'] = $response['completeDriverProfile'];
$data['assignTruck'] = $response['assignTruck'];
} elseif ($this->isAppLogin($request)) {
$responseDriver = $this->getDriverInfo($user->getId());
if (empty($responseDriver['driver'])) {
$responseWarehouseman = $this->getWarehousemanInfo($user->getId());
}
if (!empty($responseDriver['driver'])) {
$data['type'] = 'driver';
$data['completeProfile'] = $responseDriver['completeDriverProfile'];
$data['assignTruck'] = $responseDriver['assignTruck'];
} elseif (!empty($responseWarehouseman['warehouseman'])) {
$data['type'] = 'warehouseman';
$data['completeProfile'] = $responseWarehouseman['completeWarehousemanProfile'];
$data['assignWarehouse'] = $responseWarehouseman['assignWarehouse'];
} else {
$data['type'] = 'techSupport';
$data['completeProfile'] = true;
}
} else {
try {
$worker = $this->workerRepository->findOneByUuid($user->getId());
if ($worker->isOwner() && $worker->getOrganizationId()->equals($user->getOrganizationId())) {
/** @var ViewDemoSubscription $subscription */
$subscription = $this->demoSubscriptionRepository->subscriptionForOrganization(new LeadId(new UUID((string)$user->getOrganizationId())))->getOrNull();
if ($subscription) {
$data['subscriptionExpiryDate'] = $subscription->expiryDate()->format(DATE_ATOM);
$data['subscriptionDaysToExpires'] = $subscription->expiryDate()->diff(new \DateTimeImmutable())->days;
}
}
} catch (\Exception $exception) {
}
}
$event->setData($data);
}
/**
* @param Request $request
* @return string
* @deprecated
*/
private function isDriverLogin(Request $request): string
{
return strstr($request->getPathInfo(), 'auth/driver/login');
}
/**
* @param Request $request
* @return string
*/
private function isAppLogin(Request $request): string
{
return strstr($request->getPathInfo(), 'auth/app/login');
}
/**
* @param UuidInterface $id
* @return array
* @throws UnauthorizedException
*/
private function getDriverInfo(UuidInterface $id): array
{
$response = [
'completeDriverProfile' => false,
'assignTruck' => false
];
try {
$driver = $this->driverRepository->findOneById($id);
if ($driver instanceof Driver) {
$response['driver'] = $driver->getId()->toString();
if ($driver->isCompleteProfile()) {
$response['completeDriverProfile'] = true;
}
if ($driver->isAssignedTruck()) {
$response['assignTruck'] = $driver->getTruckId()->toString();
}
}
return $response;
} catch (\Exception $e) {
throw new UnauthorizedException();
}
return $response;
}
/**
* @param UuidInterface $id
* @return array
* @throws UnauthorizedException
*/
private function getWarehousemanInfo(UuidInterface $id): array
{
$response = [
'completeWarehousemanProfile' => false,
'assignWarehouse' => false
];
try {
$warehouseman = $this->warehousemanRepository->findOneById($id);
if ($warehouseman instanceof Warehouseman) {
$response['warehouseman'] = $warehouseman->getId()->toString();
if ($warehouseman->isCompleteProfile()) {
$response['completeWarehousemanProfile'] = true;
}
if ($warehouseman->isAssignedWarehouse()) {
$response['assignWarehouse'] = $warehouseman->getWarehouseId()->toString();
}
}
return $response;
} catch (\Exception $e) {
var_dump($e->getMessage());
throw new UnauthorizedException();
}
}
}