src/EventSubscriber/ActivitySubscriber.php line 22

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Application\User;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpKernel\KernelEvents;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Component\Security\Core\Security;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  10. use Symfony\Component\HttpKernel\Event\ControllerEvent;
  11. use Symfony\Component\HttpKernel\Event\TerminateEvent;
  12. use Twig\Environment;
  13. class ActivitySubscriber implements EventSubscriberInterface {
  14.     public function __construct(private EntityManagerInterface $em, private AuthorizationCheckerInterface $authorizationChecker, private Environment $twig, private Security $security)
  15.     {
  16.     }
  17.     public function onController($event) {
  18.         $request $event->getRequest();
  19.         $user $this->security->getUser();
  20.         $userConflict null;
  21.         $this->twig->addGlobal("userConflict"null);
  22.         if ($user && ($this->authorizationChecker->isGranted('IS_AUTHENTICATED_FULLY') || $this->authorizationChecker->isGranted('IS_AUTHENTICATED_REMEMBERED'))) {
  23.             if (!$user->isActiveNow()) {
  24.                 $user->setLastActivityAt(new \DateTime());
  25.                 $this->em->persist($user);
  26.                 $this->em->flush();
  27.             }
  28.             // TODO: temporarly only checking requisition edit & some other routes, adjust preg for every edit/actions
  29.             // TODO: Should we ceate an annotation @UserConflict ??? Or a config to get all routes to handle?
  30.             $isConflictCheckedRoute $this->verifyConflictingRoutes($request->getPathInfo());
  31.             if ($isConflictCheckedRoute) {
  32.                 preg_match("/\/(\d+)$/"$request->getPathInfo(), $matches);
  33.                 $id $matches[1];
  34.                 $routesToValidate $this->matchingRoutes($request->getPathInfo(), $id);
  35.                 $userConflict $this->em->getRepository(User::class)
  36.                     ->findOneWithRoute($routesToValidate$user->getId());
  37.                 if ($userConflict) {
  38.                     $this->twig->addGlobal("userConflict"$userConflict);
  39.                 }
  40.             }
  41.         }
  42.     }
  43.     public function onTerminate($event){
  44.         $request $event->getRequest();
  45.         $user $this->security->getUser();
  46.         if ($user && ($this->authorizationChecker->isGranted('IS_AUTHENTICATED_FULLY') || $this->authorizationChecker->isGranted('IS_AUTHENTICATED_REMEMBERED'))) {
  47.             $user->setLastActivityAt(new \DateTime());
  48.             if(!preg_match("/ajax|error/i"$request->getPathInfo())){
  49.                 $user->setCurrentRoute($request->getPathInfo());
  50.                 if($isConflictCheckedRoute $this->verifyConflictingRoutes($request->getPathInfo())){
  51.                     preg_match("/\/(\d+)$/"$request->getPathInfo(), $matches);
  52.                     $id $matches[1];
  53.                     $routesToValidate $this->matchingRoutes($request->getPathInfo(), $id);
  54.                     $userConflict $this->em->getRepository(User::class)
  55.                         ->findOneWithRoute($routesToValidate$user->getId());
  56.                     if(!$userConflict) { $user->setHasPriority(true); }
  57.                 }
  58.             }
  59.             $this->em->persist($user);
  60.             $this->em->flush();
  61.         }
  62.     }
  63.     private function verifyConflictingRoutes($pathInfo) {
  64.         $routes = [
  65.             "/requisition\/edit/i",
  66.             "/project-requisition\/transfer\/return/i",
  67.             "/project-requisition\/transfer\/release/i",
  68.             "/project\/edit/i",
  69.             "/project\/transfer\/return/i",
  70.             "/project\/transfer\/release/i",
  71.             "/location-requisition\/edit/i",
  72.             "/location-requisition\/transfer\/return/i",
  73.             "/location-requisition\/transfer\/release/i",
  74.         ];
  75.         foreach($routes as $route) {
  76.             if(preg_match($route$pathInfo)) {
  77.                 return true;
  78.             }
  79.         }
  80.         return false;
  81.     }
  82.     private function matchingRoutes($pathInfo$id) {
  83.         if (preg_match("/(project)*-*requisition/"$pathInfo) && !preg_match("/location-requisition/"$pathInfo)) {
  84.             $routesToValidate = [
  85.                 "/requisition/edit/".$id,
  86.                 "/project-requisition/transfer/return/".$id,
  87.                 "/project-requisition/transfer/release/".$id,
  88.             ];
  89.         } else if (preg_match("/location-requisition/"$pathInfo)) {
  90.             $routesToValidate = [
  91.                 "/location-requisition/edit/".$id,
  92.                 "/location-requisition/transfer/return/".$id,
  93.                 "/location-requisition/transfer/release/".$id,
  94.             ];
  95.         } else {
  96.             $routesToValidate = [
  97.                 "/project/edit/".$id,
  98.                 "/project/transfer/return/".$id,
  99.                 "/project/transfer/release/".$id,
  100.             ];
  101.         }
  102.         return $routesToValidate;
  103.     }
  104.     public static function getSubscribedEvents() :?array
  105.     {
  106.         return [
  107.             // must be registered before (i.e. with a higher priority than) the default Locale listener
  108.             KernelEvents::CONTROLLER => [['onController'20]],
  109.             KernelEvents::TERMINATE => [['onTerminate'20]]
  110.         ];
  111.     }
  112. }