<?php
namespace App\EventSubscriber;
use App\Repository\ExcludedIpRepository;
use App\Service\Visits\VisitsManager;
use JetBrains\PhpStorm\ArrayShape;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Security\Core\Security;
class FrontEventSubscriber implements EventSubscriberInterface
{
private string $method;
private bool $isCandidacy;
public function __construct(private VisitsManager $visitsManager, private Security $security, private ExcludedIpRepository $ipRepository)
{
}
public function onKernelView(RequestEvent $event)
{
if($this->security->getUser()) {
return;
}
if($this->ipRepository->findOneByIp($this->visitsManager->getUserIP())) {
return;
}
$this->method = $event->getRequest()->getMethod();
$route = $event->getRequest()->attributes->get('_route');
$this->isCandidacy = isset($event->getRequest()->request->getIterator()->getArrayCopy()['candidacy']);
switch ($route) {
case 'app_front':
$this->openingFrontView();
break;
case 'app_front_candidate':
$this->candidate();
break;
case 'app_front_spontaneous_candidate':
$this->spontaneous();
break;
default:
break;
}
}
#[ArrayShape([RequestEvent::class => "string"])]
public static function getSubscribedEvents(): array
{
return [
RequestEvent::class => 'onKernelView'
];
}
private function openingFrontView()
{
$this->visitsManager->addVisit();
}
private function candidate()
{
$name = $this->isCandidacy ? 'candidate' : 'open_candidacy_form';
$this->visitsManager->addClick($name);
}
private function spontaneous()
{
$this->addClickFromMethod($this->method, 'spontaneous');
}
private function addClickFromMethod($method, $name)
{
switch ($method) {
case 'GET':
$this->visitsManager->addClick('open_' . $name . '_form');
break;
case 'POST':
$this->visitsManager->addClick($name);
break;
}
}
}