<?php
namespace App\EventListener;
use App\Entity\Company;
use App\Messaging\TranslationService;
use Doctrine\ORM\EntityManagerInterface;
use Gedmo\Translatable\Entity\Repository\TranslationRepository;
use Gedmo\Translatable\Entity\Translation;
use Hashids\Hashids;
use Roothirsch\CoreBundle\Entity\User;
use Roothirsch\CoreBundle\Messaging\MessagingService;
use Roothirsch\CoreBundle\Repository\CompanyRepository;
use Roothirsch\CoreBundle\Security\Event\RegistrationCompletedEvent;
use Roothirsch\CoreBundle\Security\Event\RegistrationTokenCreatedEvent;
use Roothirsch\CoreBundle\Site\Repository\SiteRepository;
use Roothirsch\CoreBundle\Site\SiteProvider;
use Roothirsch\CoreBundle\Site\SiteSetting\Resolver;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\RouterInterface;
class RegistrationListener implements EventSubscriberInterface
{
/** @var CompanyRepository */
private $companyRepository;
/** @var MessagingService */
private $messaging;
/** @var RequestStack */
private $requestStack;
/** @var \Roothirsch\CoreBundle\Site\Entity\Site */
private $site;
/** @var SiteProvider */
private $siteProvider;
private $entityManager;
private $translationService;
/** @var Resolver Resolver */
private $resolver;
/**
* @param CompanyRepository $companyRepository
*/
public function __construct(
EntityManagerInterface $entityManager,
CompanyRepository $companyRepository,
MessagingService $messaging,
RequestStack $requestStack,
SiteProvider $siteProvider,
TranslationService $translationService,
Resolver $resolver
)
{
$this->entityManager = $entityManager;
$this->translationService = $translationService;
$this->site = $siteProvider->getSite();
$this->siteProvider = $siteProvider;
$this->companyRepository = $companyRepository;
$this->messaging = $messaging;
$this->requestStack = $requestStack;
$this->resolver = $resolver;
}
public static function getSubscribedEvents()
{
return [
RegistrationTokenCreatedEvent::EVENT => "onTokenCreatedEvent",
RegistrationCompletedEvent::EVENT => "onRegistrationCompletedEvent"
];
}
public function onTokenCreatedEvent(RegistrationTokenCreatedEvent $event)
{
$email = $event->getEmail('user_token');
$context = $email->getContext();
$context['siteTitle'] = $this->siteProvider->getTitle();
$email
->subject(
$this->translationService->translate('email.registration.user_email', 'Ihre Registrierung bei {siteTitle}', $context)
)
->context($context);
$event->setEmail("user_token", $email);
}
public function onRegistrationCompletedEvent(RegistrationCompletedEvent $event)
{
$user = $event->getUser();
$recipients = $this->getRecipients($user);
$message = new TemplatedEmail();
$message->from($this->site->getSetting('[mailer][from]') ?? 'noreply@brunex.de');
$message->subject(
$this->translationService->translate('email.registration.contact_person', '{siteTitle} Registrierung', ['siteTitle' => $this->siteProvider->getTitle()])
);
foreach ($recipients as $recipient) {
if($this->resolver->canResolve($recipient)){
$recipient = $this->resolver->resolve($recipient);
if(!$recipient) {
continue;
}
}
try {
$message->addTo($recipient);
} catch (\Exception $exception){
// ignoring invalid emails.
continue;
}
}
$message->htmlTemplate('security/registration/email_registration_confirm.html.twig');
$message->context([
'user' => $user,
'distributor' => $this->distributor($event->getRequest())
]);
$event->addEmail('contactperson_notify', $message);
}
private function getRecipients(User $user)
{
$recipients = explode(',', $_ENV['REGISTRATION_RECIPIENTS']);
$key = "[registration][recipients]";
if($this->site->hasSetting($key)) {
$recipients = array_values($this->site->getSetting($key));
}
$index = array_search('#CONTACT_PERSON', $recipients);
if($index !== FALSE){
if ($user->getContact()) {
$recipients[$index] = $user->getContact()->getEmail();
}
}
return array_filter($recipients, function ($email) {
return !!$email;
});
}
private function distributor(Request $request){
if ($request->cookies->has('_d')) {
$hashids = new Hashids();
$distributorId = current($hashids->decode($request->cookies->get('_d')));
$distributor = $this->companyRepository->find($distributorId);
if ($distributor) {
return $distributor;
}
}
return NULL;
}
}