<?php
declare(strict_types=1);
namespace App\Domain\Common\EventSubscribers;
use App\Domain\Common\Lock\EditionConsultationLockHandler;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
class UnlockConsultationOnNewRequestSubscriber implements EventSubscriberInterface
{
const ROUTES_WITH_LOCK = [
'consultation_examen',
'patient_consultation_detail_edition',
'patient_consultation_detail_edition_json',
'patient_consultation_detail_edition_part_dto',
'patient_consultation_detail_edition_fields_update',
'patient_consultation_detail_editing_by',
'consultation_check_import_version',
'interconnexion',
'interconnexion_launch_import',
'machine_export_manuel'
];
/**
* @var EditionConsultationLockHandler
*/
private EditionConsultationLockHandler $lockHandler;
public function __construct(
EditionConsultationLockHandler $lockHandler
) {
$this->lockHandler = $lockHandler;
}
public function unlockConsultation(ControllerArgumentsEvent $event): void
{
if ($event->getRequest()->isXmlHttpRequest()) {
// pas d'unlock en ajax
return;
}
if (!\in_array($event->getRequest()->get('_route'), self::ROUTES_WITH_LOCK, true)) {
try {
// si on est pas sur une route concernée par la consultation, on peut considérer qu'on unlock
$this->lockHandler->releaseUserLock();
} catch (AccessDeniedException $e) {
//si on est pas connecté, il n'y a rien a faire
}
}
}
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER_ARGUMENTS => 'unlockConsultation'
];
}
}