<?php
namespace App\Subscriber\User\Registration;
use App\Dictionary\MailPriority;
use App\Event\Account\EmailChangedEvent;
use App\Event\Account\PasswordChangedEvent;
use App\Event\Account\PrepareEmailChangeEvent;
use App\Event\Account\PreparePasswordChangeEvent;
use App\Event\User\RegistrationEvent;
use App\Service\Mail\MailService;
use App\Service\Media\MemberMediaService;
use App\Service\User\AccountService;
use App\Service\User\Layer\AmateurLayer;
use App\Subscriber\AbstractMailSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\RouterInterface;
use Twig\Environment;
class EmailSubscriber extends AbstractMailSubscriber implements EventSubscriberInterface
{
public const ID_TOKEN_SEPARATOR = ';';
protected RouterInterface $router;
protected MemberMediaService $mediaService;
protected AmateurLayer $amateurLayer;
public function __construct(RouterInterface $router, MemberMediaService $mediaService, AmateurLayer $amateurLayer,
AccountService $accountService, MailService $mailService, Environment $twig)
{
parent::__construct($accountService, $mailService, $twig);
$this->router = $router;
$this->mediaService = $mediaService;
$this->amateurLayer = $amateurLayer;
}
public static function getSubscribedEvents(): array
{
return [
RegistrationEvent::class => [
['onRegistrationSendEmail', 0],
],
PreparePasswordChangeEvent::class => [
['onPreparePasswordChangeSendConfirmEmail', 0],
],
PrepareEmailChangeEvent::class => [
['onPrepareEmailChangeSendConfirmEmail', 0],
],
EmailChangedEvent::class => [
['onEmailChangedSendInfoEmail', 0],
],
PasswordChangedEvent::class => [
['onPasswordChangedSendInfoEmail', 0],
],
];
}
public function onRegistrationSendEmail(RegistrationEvent $event): bool
{
$account = $event->getAccount();
if (!$event->getSendEmail()) {
return false;
}
$confirmationUrl = $this->router->generate('frivol_account_register_confirm', [
'confirmationToken' => $account->getConfirmationToken(),
], UrlGeneratorInterface::ABSOLUTE_URL);
$params = [
'account' => $account,
'password' => $event->getPassword(),
'amateurs' => array_slice($this->getTopAmateurs(), 0, 4),
'login' => $this->getAccountService()->getAutologinParameter($account),
'confirmationUrl' => $confirmationUrl,
'pin' => $account->getEmailToken(),
];
$mail = new \Swift_Message('Willkommen bei Frivol.com');
$mail->addTo($account->getEmail());
$mail->setFrom('support@frivol.com', 'Frivol.com');
$mail->setBody($this->getTwigEnvironment()->render('emails/user-registration.html.twig', $params), 'text/html');
return $this->getMailService()->queueMessage($mail, MailPriority::HIGHEST);
}
protected function getTopAmateurs(): array
{
$paginator = $this->amateurLayer->getTopAmateurs(1, 30, true, false);
$amateurs = [];
foreach ($paginator as $amateur) {
$amateurs[] = $amateur;
}
shuffle($amateurs);
return $amateurs;
}
public function onPreparePasswordChangeSendConfirmEmail(PreparePasswordChangeEvent $event): bool
{
$account = $event->getAccount();
$confirmationUrl = $this->router->generate('frivol_account_password_change_confirm', [
'confirmationToken' => $account->getConfirmationToken(),
], UrlGeneratorInterface::ABSOLUTE_URL);
$params = [
'confirmationUrl' => $confirmationUrl,
];
$mail = new \Swift_Message('Passwort ändern bei Frivol.com');
$mail->addTo($account->getEmail());
$mail->setFrom('support@frivol.com', 'Frivol.com');
$mail->setBody($this->getTwigEnvironment()->render('emails/password-change.html.twig', $params), 'text/html');
return $this->getMailService()->queueMessage($mail, MailPriority::HIGHEST);
}
public function onPrepareEmailChangeSendConfirmEmail(PrepareEmailChangeEvent $event): bool
{
$account = $event->getAccount();
$confirmationUrl = $this->router->generate('frivol_account_email_change_confirm', [
'confirmationToken' => $account->getConfirmationToken(),
], UrlGeneratorInterface::ABSOLUTE_URL);
$params = [
'confirmationUrl' => $confirmationUrl,
];
$mail = new \Swift_Message('E-Mail Adresse ändern bei Frivol.com');
$mail->addTo($account->getNextEmail());
$mail->setFrom('support@frivol.com', 'Frivol.com');
$mail->setBody($this->getTwigEnvironment()->render('emails/email-change.html.twig', $params), 'text/html');
return $this->getMailService()->queueMessage($mail, MailPriority::HIGHEST);
}
public function onPasswordChangedSendInfoEmail(PasswordChangedEvent $event): bool
{
$account = $event->getAccount();
$mail = new \Swift_Message('Frivol.com Passwort wurde geändert');
$mail->addTo($account->getEmail());
$mail->setFrom('support@frivol.com', 'Frivol.com');
$mail->setBody($this->getTwigEnvironment()->render('emails/password-changed.html.twig', []), 'text/html');
return $this->getMailService()->queueMessage($mail, MailPriority::HIGHEST);
}
public function onEmailChangedSendInfoEmail(EmailChangedEvent $event): bool
{
$account = $event->getAccount();
$mail = new \Swift_Message('Frivol.com E-Mail Adresse wurde geändert');
$mail->addTo($account->getEmail());
$mail->setFrom('support@frivol.com', 'Frivol.com');
$mail->setBody($this->getTwigEnvironment()->render('emails/email-changed.html.twig', []), 'text/html');
return $this->getMailService()->queueMessage($mail, MailPriority::NORMAL);
}
}