<?php
namespace App\EventListener;
use App\EntityCompany\EmailTemplate;
use App\Enum\EventTypes\UserEventTypes;
use App\Enum\Location\LocationIdEnum;
use App\Service\DatabaseService;
use App\Service\MailerService;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\RouterInterface;
class UserEventsSubscriber implements EventSubscriberInterface
{
/** @var EntityManagerInterface */
protected $entityManager;
/** @var LoggerInterface $logger */
protected $logger;
/** @var MailerService $mailerService */
protected $mailerService;
/** @var RouterInterface $router */
protected $router;
/** @var DatabaseService $databaseService */
protected $databaseService;
public function __construct(
LoggerInterface $userSubscriberLogger,
MailerService $mailerService,
RouterInterface $router,
EntityManagerInterface $entityManager,
DatabaseService $databaseService
) {
$this->logger = $userSubscriberLogger;
$this->mailerService = $mailerService;
$this->router = $router;
$this->entityManager = $entityManager;
$this->databaseService = $databaseService;
}
/**
* @inheritDoc
*/
public static function getSubscribedEvents(): array
{
return [
UserEventTypes::USER_CREATED => 'onUserCreated'
];
}
public function onUserCreated($event): void
{
$userData = null;
$password = '';
//Fetch the current active email template
//If there's more than one active, it'll fetch the most recent
/** @var EmailTemplate */
$htmlTemplate = $this->databaseService
->getManagerByCompany($event->getCompany())
->getRepository(EmailTemplate::class)
->findOneBy(['isActive' => true], ['id' => 'DESC']);
$user = $event->getUser();
if ($request = $event->getRequest()) {
if ($request->request->has('user_company_role_client_new')) {
$userData = $request->request->get('user_company_role_client_new');
} elseif ($request->request->has('user_company_role_admin')) {
$userData = $request->request->get('user_company_role_admin');
}
if ($request->request->has('password')) {
$userData['plainPassword'] = $request->request->get('password');
}
if (!empty($event->getUser()->getPlainPassword())){
$userData['plainPassword'] = $event->getUser()->getPlainPassword();
}
if ($userData) {
$password = $userData['plainPassword'];
}
}
$loginUrl = $this->router->generate('app_login');
$templateData = [
'login_url' => $loginUrl,
'password' => $password
];
//If there's no email template for the company, the current hatch default will be applied
if ($htmlTemplate) {
$templateData['content'] = $htmlTemplate->getContent();
}
$this->logger->info('User created: '.$user->getUsername());
//Get Location From Request
$refer = $request->headers->get('referer');
$refer = explode("/",$refer);
if (isset($refer[4])) {
if ($refer[3] == "admin") {
$locationId = LocationIdEnum::LOCATION_ID_ADMINISTRATION_OFFICE;
} elseif ($refer[3] == "company") {
$companyId = $refer[4];
} else {
$locationId = is_numeric($refer[4]) ? $refer[4] : 1;
}
} else {
$activeLocations = $user->getActiveLocations();
$locationId = $activeLocations->isEmpty() ? 1 : $activeLocations->first()->getId();
}
$this->mailerService
->setSubject('Kipu Compliance: New User Created')
->setTo($user->getEmail(), $user->getUsername())
->setContext($templateData)
->setHtmlTemplate('emails/signup.html.twig')
->setLocationId($locationId ?? null)
->setCompanyId($companyId ?? null)
->setEmailRecipient($user)
->send();
}
public function onResetSuccess($event): void
{
$event->setResponse(new RedirectResponse($this->router->generate('app_index')));
}
}