<?php
namespace App\EventListener;
use App\Entity\App\User;
use App\Entity\App\Vendor;
use App\Entity\Chat\Chat;
use App\Exception\NotFoundException;
use Doctrine\ORM\EntityManagerInterface;
use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTCreatedEvent;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Contracts\Translation\TranslatorInterface;
use Psr\Log\LoggerInterface;
class JWTCreatedListener
{
private $requestStack;
private $translator;
private $entityManager;
private $registerLog;
/**
* JWTCreatedListener constructor.
* @param RequestStack $requestStack
* @param TranslatorInterface $translator
* @param EntityManagerInterface $entityManager
* @param LoggerInterface $registerLog
*/
public function __construct(
RequestStack $requestStack,
TranslatorInterface $translator,
EntityManagerInterface $entityManager,
LoggerInterface $registerLog
) {
$this->requestStack = $requestStack;
$this->translator = $translator;
$this->entityManager = $entityManager;
$this->registerLog = $registerLog;
}
/**
* @param JWTCreatedEvent $event
* @throws NotFoundException
*/
public function onJWTCreated(JWTCreatedEvent $event)
{
$user = $event->getUser();
$request = $this->requestStack->getCurrentRequest();
if(!$user instanceof User)
throw new NotFoundException($this->translator->trans('User current not found'));
$user->setLastLogin(new \DateTime('now'));
$this->entityManager->persist($user);
$payload = $event->getData();
$payload['id'] = $user->getId();
$payload['ip'] = $request->getClientIp();
$payload['name'] = $user->getName();
$payload['lastName'] = $user->getLastName();
$payload['email'] = $user->getEmail();
$payload['channelName'] = $user->getChannelName();
$payload['locale'] = $user->getLocale();
$payload['created_at'] = $user->getCreatedAt()->getTimestamp();
$payload['mediaObject'] = $user->getMediaObjectsNormalize();
$payload['notificationChannel'] = [
'channelEvent' => 'NEW_NOTIFICATION',
'channelName' => $user->getChannelName(),
'channelType' => Chat::CHANNEL_TYPE_PRIVATE
];
$vendor = array();
try {
foreach ($user->getVendorStaff() as $staff) {
$rolesStaff = $staff->getRoleStaff();
$vendorRoles = array();
foreach ($rolesStaff as $roleStaff) {
$vendorRoles[] = array(
'id' => $roleStaff->getRole()->getId(),
'name' => $roleStaff->getRole()->getName(),
'weight' => $roleStaff->getRole()->getWeight()
);
}
//ToDo: Refactorizar para colecciones
if ($staff->getVendor() instanceof Vendor) {
$actualVendor = $staff->getVendor();
$modules=[];
foreach ( $actualVendor->getCustomModules() as $module){
$modules[]=["id" => $module->getId(),"name"=>$module->getName()];
}
$vendor[] = array(
'id' => $actualVendor->getId(),
'name' => $actualVendor->getName(),
'nit' => $actualVendor->getNit(),
'primaryColor' => $actualVendor->getPrimaryColor(),
'secundaryColor' => $actualVendor->getSecundaryColor(),
'dateFormat' => $actualVendor->getDateFormat(),
'is12HourFormat' => $actualVendor->getIs12HourFormat(),
'currency' => $actualVendor->getCurrency(),
'locale' => strtolower($actualVendor->getLanguage()),
'logo' => $actualVendor->getMediaObjectsNormalize(),
'timeZone' => $actualVendor->getTimezone(),
'roles' => $vendorRoles,
'modules' =>$modules,
'allowCreateRequestOperator' => $actualVendor->getAllowCreateRequestOperator()
);
}
}
} catch (\Exception $e) {
$this->registerLog->error($e->getMessage());
}
if (!empty($vendor)) {
$payload['vendors'] = $vendor;
}
$event->setData($payload);
}
}