src/Listener/UserTrackingListener.php line 44

Open in your IDE?
  1. <?php
  2. namespace App\Listener;
  3. use App\Entity\User;
  4. use App\Entity\UserTracking;
  5. use App\Entity\UserTrackingDetail;
  6. use App\Entity\UserTrackingDuration;
  7. use App\Repository\UserTrackingDurationRepository;
  8. use App\Repository\UserTrackingRepository;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Component\HttpKernel\Event\TerminateEvent;
  12. use Symfony\Component\HttpKernel\KernelEvents;
  13. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  14. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  15. class UserTrackingListener implements EventSubscriberInterface
  16. {
  17.     protected $authChecker;
  18.     protected $tokenStorage;
  19.     protected $entityManager;
  20.     protected $userTrackingRepository;
  21.     protected $userTrackingDurationRepository;
  22.     public function __construct(TokenStorageInterface $tokenStorageAuthorizationCheckerInterface $authChecker,
  23.                                 EntityManagerInterface $entityManagerUserTrackingRepository $userTrackingRepository,
  24.                                 UserTrackingDurationRepository $userTrackingDurationRepository)
  25.     {
  26.         $this->authChecker $authChecker;
  27.         $this->tokenStorage $tokenStorage;
  28.         $this->entityManager $entityManager;
  29.         $this->userTrackingRepository $userTrackingRepository;
  30.         $this->userTrackingDurationRepository $userTrackingDurationRepository;
  31.     }
  32.     public static function getSubscribedEvents()
  33.     {
  34.         return [
  35.             KernelEvents::TERMINATE => 'onKernelTerminate',
  36.         ];
  37.     }
  38.     public function onKernelTerminate(TerminateEvent $event)
  39.     {
  40.         $token $this->tokenStorage->getToken();
  41.         $request $event->getRequest();
  42.         $sessionId null;
  43.         //session could be null (API)
  44.         if($request->hasSession()){
  45.             $sessionId $request->getSession()->getId();
  46.         }
  47.         if ($token != null && $sessionId && $event->isMasterRequest()) {
  48.             $user $token->getUser();
  49.             if ($user instanceof User) {
  50.                 $action $request->attributes->get('_controller');
  51.                 $method $request->getMethod();
  52.                 $ip $request->getClientIp();
  53.                 $statusCode $event->getResponse()->getStatusCode();
  54.                 // Exclude redirections & technical requests (ex: Liip\ImagineBundle)
  55.                 if ($statusCode === 200 && substr($action04) === 'App\\') {
  56.                     // Check if this session is already tracked
  57.                     $userTracking $this->userTrackingRepository->findOneBy(['sessionId' => $sessionId]);
  58.                     $duration 0;
  59.                     if (!$userTracking) {
  60.                         // Create tracking
  61.                         $userTracking = new UserTracking();
  62.                         $userTracking->setUser($user);
  63.                         $userTracking->setUserRole($user->getMainRole());
  64.                         $userTracking->setSessionId($sessionId);
  65.                         $userTracking->setStartedAt(new \Datetime());
  66.                     } else {
  67.                         // Update tracking
  68.                         $userTracking->setEndedAt(new \Datetime());
  69.                         // Calculate duration
  70.                         $duration $userTracking->getEndedAt()->getTimestamp() - $userTracking->getStartedAt()->getTimestamp();
  71.                         $userTracking->setDuration($duration);
  72.                     }
  73.                     // Details tracking
  74.                     $userTrackingDetail = new UserTrackingDetail();
  75.                     $userTrackingDetail->setUserTracking($userTracking);
  76.                     $userTrackingDetail->setDate(new \Datetime());
  77.                     $userTrackingDetail->setPath($request->getPathInfo());
  78.                     $userTrackingDetail->setAction($action);
  79.                     if ($request->request && $method === 'POST') {
  80.                         $userTrackingDetail->setData(json_encode($request->request->all()));
  81.                     }
  82.                     $userTrackingDetail->setMethod($method);
  83.                     $userTrackingDetail->setIp($ip);
  84.                     // Save
  85.                     $this->entityManager->persist($userTracking);
  86.                     $this->entityManager->persist($userTrackingDetail);
  87.                     $this->entityManager->flush();
  88.                     /* Calculate average duration */
  89.                     $averageDuration 0;
  90.                     $nbLogsWithDuration 0;
  91.                     $userTrackingLogs $this->userTrackingRepository->findBy(['user' => $user]);
  92.                     foreach ($userTrackingLogs as $userTrackingLog) {
  93.                         if ($userTrackingLog->getDuration()) {
  94.                             $averageDuration += $userTrackingLog->getDuration();
  95.                             ++$nbLogsWithDuration;
  96.                         }
  97.                     }
  98.                     if ($nbLogsWithDuration) {
  99.                         $averageDuration round($averageDuration $nbLogsWithDuration);
  100.                     }
  101.                     $userTrackingDuration $user->getUserTrackingDuration();
  102.                     if (!$userTrackingDuration) {
  103.                         $userTrackingDuration = new UserTrackingDuration();
  104.                         $userTrackingDuration->setUser($user);
  105.                         $userTrackingDuration->setUserRole($user->getMainRole());
  106.                     }
  107.                     $userTrackingDuration->setAverageDuration($averageDuration);
  108.                     $userTrackingDuration->setUpdatedAt(new \Datetime());
  109.                     // Save
  110.                     $this->entityManager->persist($userTrackingDuration);
  111.                     $this->entityManager->flush();
  112.                 }
  113.             }
  114.         }
  115.     }
  116. }