<?php
namespace App\EventSubscriber;
use App\Entity\ClientProfile;
use App\Entity\SiteStatus;
use App\Event\SiteCreatedEvent;
use App\Event\TrackerInstalledEvent;
use App\Repository\SiteStatusRepository;
use App\Service\SiteNotificationSender;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class SiteSubscriber implements EventSubscriberInterface
{
/**
* @var SiteStatusRepository
*/
private $siteStatusRepository;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var TranslatorInterface
*/
private $translator;
/**
* @var SiteNotificationSender
*/
private $notificationSender;
public function __construct(
SiteStatusRepository $siteStatusRepository,
EntityManagerInterface $entityManager,
TranslatorInterface $translator,
SiteNotificationSender $notificationSender
)
{
$this->siteStatusRepository = $siteStatusRepository;
$this->entityManager = $entityManager;
$this->translator = $translator;
$this->notificationSender = $notificationSender;
}
public static function getSubscribedEvents()
{
return [
SiteCreatedEvent::class => 'onSiteCreated',
TrackerInstalledEvent::class => 'onTrackerInstalled',
];
}
public function onSiteCreated(SiteCreatedEvent $event)
{
$site = $event->getSite();
$siteStatuses = [];
foreach (SiteStatus::TYPES as $type) {
$siteStatus = $this->siteStatusRepository->findByTypeAndSiteId($type, $site->getId());
if (null === $siteStatus) {
$siteStatuses[] = SiteStatus::create(
$site,
$this->translator->trans('site_status.name.'.$type),
$type
);
}
}
if (!empty($siteStatuses)) {
foreach ($siteStatuses as $siteStatus) {
$this->entityManager->persist($siteStatus);
}
$this->entityManager->flush();
}
}
public function onTrackerInstalled(TrackerInstalledEvent $event)
{
$site = $event->getSite();
$this->notificationSender->sendTrackerInstalledEmail($site);
$clientProfiles = $this->profileRepository->findAllBySitePermissions($site);
/** @var ClientProfile $clientProfile */
foreach ($clientProfiles as $clientProfile) {
$clientProfile->setOnboard(false);
}
$this->entityManager->flush();
}
}