<?php
declare(strict_types=1);
namespace App\EventSubscriber;
use App\Client\Qoodos\QoodosClient;
use App\Entity\Security\Customer;
use App\Entity\Security\Manager;
use App\Entity\Security\ShopManager;
use App\Entity\Security\UserInterface;
use App\Helper\Image\ImageHelper;
use App\Helper\Response\ResponseInterface as CustomResponseInterface;
use App\Repository\Franchise\CustomerFranchiseRepository;
use App\Repository\Franchise\FranchiseRepository;
use App\Service\Security\CustomerService;
use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTCreatedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
class JWTSubscriber implements EventSubscriberInterface
{
private $request;
public function __construct(
private ImageHelper $imageHelper,
private FranchiseRepository $franchiseRepository,
private QoodosClient $qoodosClient,
private CustomerService $customerService,
private CustomerFranchiseRepository $customerFranchiseRepository,
RequestStack $requestStack,
) {
$this->request = $requestStack->getCurrentRequest();
}
public function onLexikJwtAuthenticationOnJwtCreated(JWTCreatedEvent $event): void
{
$user = $event->getUser();
$payload = array_merge($event->getData(), [
'exp' => time() + UserInterface::TOKEN_LIFE_TIME,
'ip' => $this->request->getClientIp(),
]);
if ($user instanceof Customer) {
$franchiseToken = $this->request->headers->get('franchise-token');
if (null === $franchiseToken) {
throw new BadRequestHttpException(Response::$statusTexts[Response::HTTP_BAD_REQUEST]);
}
$franchise = $this->franchiseRepository->findOneBy(['token' => $franchiseToken]);
if (null === $franchise) {
throw new BadRequestHttpException(CustomResponseInterface::FRANCHISE_NOT_FOUND);
}
if (false === $this->customerService->customerHasFranchise($user, $franchise)) {
throw new BadRequestHttpException(CustomResponseInterface::CUSTOMER_NOT_FOUND_IN_FRANCHISE);
}
$payload = array_merge($payload, [
'franchise' => $franchise->getId(),
'name' => $user->getFullName(),
'id' => $user->getId(),
'imageUrl' => $this->imageHelper->getAbsolutePath($user),
'askForSubscriptionToQoodos' => $this->customerFranchiseRepository->canAskForSubscriptionToQoodos($user, $franchise),
]);
if (true === $franchise->hasQoodos()) {
try {
$this->qoodosClient->init($franchise);
$result = $this->qoodosClient->getFranchise();
$payload = array_merge($payload, [
'canUseCashback' => $result['can_use_cashback'],
'canUsePoints' => $result['can_use_points'],
]);
} catch (\Exception $e) {
}
}
}
if ($user instanceof ShopManager) {
$payload['shop'] = $user->getShop()->getId();
}
if ($user instanceof Manager) {
$payload['franchise'] = $user->getFranchise()->getId();
}
$event->setData($payload);
$header = $event->getHeader();
$header['cty'] = 'JWT';
$event->setHeader($header);
}
public static function getSubscribedEvents()
{
return [
'lexik_jwt_authentication.on_jwt_created' => 'onLexikJwtAuthenticationOnJwtCreated',
];
}
}