src/EventSubscriber/WorkflowAreaGuardSubscriber.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\DatosUsuario;
  4. use App\Entity\Usuario;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\Security\Core\Security;
  8. use Symfony\Component\Workflow\Event\GuardEvent;
  9. use Symfony\Component\Workflow\TransitionBlocker;
  10. class WorkflowAreaGuardSubscriber implements EventSubscriberInterface
  11. {
  12.     private EntityManagerInterface $em;
  13.     private Security $security;
  14.     public function __construct(EntityManagerInterface $em, Security $security)
  15.     {
  16.         $this->em = $em;
  17.         $this->security = $security;
  18.     }
  19.     public static function getSubscribedEvents(): array
  20.     {
  21.         return [
  22.             'workflow.expedicion_cna.guard' => 'onExpedicionCnaGuard',
  23.         ];
  24.     }
  25.     public function onExpedicionCnaGuard(GuardEvent $event): void
  26.     {
  27.         $allowedAreaIds = $event->getMetadata('allowed_area_ids', $event->getTransition());
  28.         if (empty($allowedAreaIds)) {
  29.             return;
  30.         }
  31.         $user = $this->security->getUser();
  32.         if (!$user instanceof Usuario) {
  33.             $event->addTransitionBlocker(new TransitionBlocker('Usuario no autenticado.', 'workflow_area_guard.unauthenticated'));
  34.             return;
  35.         }
  36.         $datosUsuario = $this->em->getRepository(DatosUsuario::class)->findOneBy([
  37.             'usuario' => $user,
  38.         ]);
  39.         $areaUsuarioId = null;
  40.         if ($datosUsuario !== null && $datosUsuario->getArea() !== null) {
  41.             $areaUsuarioId = (int) $datosUsuario->getArea()->getId();
  42.         }
  43.         if (empty($areaUsuarioId)) {
  44.             $event->addTransitionBlocker(new TransitionBlocker('El usuario no tiene área asignada.', 'workflow_area_guard.missing_area'));
  45.             return;
  46.         }
  47.         $allowedAreaIds = array_map(static function ($areaId): int {
  48.             return (int) $areaId;
  49.         }, (array) $allowedAreaIds);
  50.         if (!in_array($areaUsuarioId, $allowedAreaIds, true)) {
  51.             $event->addTransitionBlocker(new TransitionBlocker('Tu área no tiene permiso para ejecutar esta transición.', 'workflow_area_guard.forbidden_area'));
  52.         }
  53.     }
  54. }