<?php
namespace App\EventSubscriber;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\Alert;
use App\Repository\AlertRepository;
use App\Utils\ConvertToPolygon;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Security;
class AlertDuplicateSubscriber implements EventSubscriberInterface
{
/**
* @var AlertRepository
*/
private $alertRepository;
/**
* @var Security
*/
private $security;
public function __construct(AlertRepository $alertRepository, Security $security)
{
$this->alertRepository = $alertRepository;
$this->security = $security;
}
public function checkDuplicate(ViewEvent $event): void
{
$object = $event->getControllerResult();
$request = $event->getRequest();
if (!$object instanceof Alert || !$request->isMethod(Request::METHOD_POST)) {
return;
}
$user = $object->getUser() ?: $this->security->getUser();
if ($user === null) {
return;
}
if ($object->getUser() === null) {
$object->setUser($user);
}
if ($object->getCoordinates() !== null && $object->getCoordinates() !== []) {
$object->setPolygon(ConvertToPolygon::run($object->getCoordinates()));
}
$existing = $this->alertRepository->findDuplicateForUser($object, $user);
if ($existing !== null) {
$event->setResponse(
new Response(json_encode([
'message' => 'Alert already exists!',
'code' => Response::HTTP_CONFLICT,
'success' => false,
'data' => []
]), Response::HTTP_BAD_REQUEST));
}
}
/**
* @return array<string, mixed>
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::VIEW => ['checkDuplicate', EventPriorities::PRE_WRITE],
];
}
}