<?php
namespace App\Auth\EventListener;
use App\Auth\Repository\AuthUserRepositoryInterface;
use App\Organization\Repository\OrganizationRepositoryInterface;
use App\Worker\Repository\WorkerRepositoryInterface;
use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTCreatedEvent;
use Symfony\Component\HttpFoundation\RequestStack;
class JWTCreatedListener
{
/**
* @var RequestStack
*/
protected $requestStack;
/**
* @var AuthUserRepositoryInterface
*/
protected $repository;
private OrganizationRepositoryInterface $organizationRepository;
private WorkerRepositoryInterface $workerRepository;
/**
* JWTCreatedListener constructor.
* @param RequestStack $requestStack
* @param AuthUserRepositoryInterface $repository
*/
public function __construct(
RequestStack $requestStack,
AuthUserRepositoryInterface $repository,
OrganizationRepositoryInterface $organizationRepository,
WorkerRepositoryInterface $workerRepository
) {
$this->requestStack = $requestStack;
$this->repository = $repository;
$this->organizationRepository = $organizationRepository;
$this->workerRepository = $workerRepository;
}
public function onJWTCreated(JWTCreatedEvent $event)
{
$request = $this->requestStack->getCurrentRequest();
$user = $event->getUser();
$user = $this->repository->findActiveUserByEmail($user->getUsername());
$payload = $event->getData();
$payload['user_id'] = (string) $user->getId();
$payload['fullName'] = $user->getFirstName(). ' ' . $user->getLastName();
$payload['firstName'] = $user->getFirstName();
$payload['lastName'] = $user->getLastName();
$payload['organizationId'] = $user->getOrganizationId() ? $user->getOrganizationId()->toString() : null;
$payload['avatar'] = $user->getAvatar() ?
sprintf(
'https://%s.s3.%s.amazonaws.com/avatars/%s',
$_SERVER['AWS_S3_BUCKET'],
$_SERVER['AWS_S3_REGION'],
$user->getAvatar()
)
: null;
$payload['uiTour'] = $user->getUITour();
if ($this->workerRepository->isOwner($user->getId())) {
$payload['roles'][] = 'ROLE_WORKER_OWNER';
}
if ($user->isTrackingFeature()) {
$payload['options'] = [
'trackingFeatures' => true
];
}
try {
if (null !== $user->getOrganizationId()) {
$organization = $this->organizationRepository->findOneById($user->getOrganizationId());
if (null !== $organization && $organization->getStripeCustomerId() && $organization->isOverduePayment()) {
$payload['overduePayment'] = true;
} else {
$payload['overduePayment'] = false;
}
} else {
$payload['overduePayment'] = false;
}
} catch (\Exception $exception) {
$payload['overduePayment'] = false;
}
$event->setData($payload);
}
}