<?php
namespace App\Subscriber\User;
use App\Dictionary\MailPriority;
use App\Event\User\PasswordRequestConfirmedEvent;
use App\Event\User\PasswordRequestedEvent;
use App\Service\Mail\MailService;
use App\Service\User\AccountService;
use App\Service\User\PasswordService;
use App\Subscriber\AbstractMailSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\RouterInterface;
use Twig\Environment;
class PasswordSubscriber extends AbstractMailSubscriber implements EventSubscriberInterface
{
/**
* @var PasswordService
*/
protected $passwordService;
/**
* @var RouterInterface
*/
protected $router;
/**
* PasswordSubscriber constructor.
*/
public function __construct(PasswordService $passwordService, RouterInterface $router,
AccountService $accountService, MailService $mailService, Environment $twig)
{
parent::__construct($accountService, $mailService, $twig);
$this->passwordService = $passwordService;
$this->router = $router;
}
public static function getSubscribedEvents(): array
{
return [
PasswordRequestedEvent::class => [
['sendEmailOnPasswordRequest', 1],
],
PasswordRequestConfirmedEvent::class => [
['sendEmailOnConfirmedPasswordRequest', 1],
],
];
}
public function sendEmailOnPasswordRequest(PasswordRequestedEvent $event)
{
$account = $event->getAccount();
$account->generateEmailToken();
$this->accountService->storeEntity($account);
$confirmationUrl = $this->router->generate('frivol_account_security_confirmpasswordrequest', [
'confirmationToken' => $account->getConfirmationToken(),
], RouterInterface::ABSOLUTE_URL);
$mail = new \Swift_Message('Neues Passwort angefordert');
$mail->addTo($account->getEmail());
$mail->setFrom('support@frivol.com', 'Frivol.com Support');
$mail->setBody($this->getTwigEnvironment()->render('emails/password-request.html.twig', [
'email' => $account->getEmail(),
'confirmationUrl' => $confirmationUrl,
'locale' => $account->getLocale(),
]), 'text/html');
return $this->getMailService()->queueMessage($mail, MailPriority::HIGHEST);
}
public function sendEmailOnConfirmedPasswordRequest(PasswordRequestConfirmedEvent $event)
{
$account = $event->getAccount();
$newPlainPassword = $this->passwordService->generatePassword();
$hashedPassword = $this->passwordService->getEncodedPassword($newPlainPassword, $account->getSalt());
$account->setPassword($hashedPassword);
$account->removeEmailToken();
$this->accountService->storeEntity($account);
$mail = new \Swift_Message('Dein neues Passwort ist da');
$mail->addTo($account->getEmail());
$mail->setFrom('support@frivol.com', 'Frivol.com Support');
$mail->setBody($this->getTwigEnvironment()->render('emails/password-request-confirmed.html.twig', [
'username' => $account->getMember()->getUsername(),
'newPassword' => $newPlainPassword,
'locale' => $account->getLocale(),
]), 'text/html');
return $this->getMailService()->queueMessage($mail, MailPriority::HIGHEST);
}
}