src/EventSubscriber/DailyActivitySubscriber.php line 34

Open in your IDE?
  1. <?php
  2. // src/EventSubscriber/DailyActivitySubscriber.php
  3. namespace App\EventSubscriber;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Component\Security\Core\Security;
  8. use App\Entity\UserDailyActivity;
  9. use Symfony\Contracts\Cache\CacheInterface;
  10. use Symfony\Contracts\Cache\ItemInterface;
  11. class DailyActivitySubscriber implements EventSubscriberInterface
  12. {
  13. private EntityManagerInterface $em;
  14. private Security $security;
  15. private CacheInterface $cache;
  16. public function __construct(EntityManagerInterface $em, Security $security,CacheInterface $cache)
  17. {
  18. $this->em = $em;
  19. $this->security = $security;
  20. $this->cache = $cache;
  21. }
  22. public static function getSubscribedEvents(): array
  23. {
  24. return [
  25. RequestEvent::class => 'onRequest',
  26. ];
  27. }
  28. public function onRequest(RequestEvent $event)
  29. {
  30. if (!$event->isMainRequest()) {
  31. return;
  32. }
  33. $user = $this->security->getUser();
  34. if (!$user) {
  35. return;
  36. }
  37. $userId = $user->getId();
  38. $userType = (new \ReflectionClass($user))->getShortName();
  39. $cacheKey = "daily_log_{$userType}_{$userId}";
  40. $request = $event->getRequest();
  41. $ipAddress = $request->getClientIp();
  42. $alreadyLogged = $this->cache->get($cacheKey, function (ItemInterface $item) use ($userId, $userType,$ipAddress) {
  43. $now = new \DateTimeImmutable();
  44. $midnight = $now->modify('tomorrow')->setTime(0, 0);
  45. $item->expiresAt($midnight);
  46. $today = new \DateTimeImmutable('now');
  47. $repo = $this->em->getRepository(UserDailyActivity::class);
  48. $existing = $repo->findOneBy([
  49. 'userId' => $userId,
  50. 'userType' => $userType,
  51. 'date' => $today,
  52. ]);
  53. if (!$existing) {
  54. $log = new UserDailyActivity();
  55. $log->setUserId($userId);
  56. $log->setUserType($userType);
  57. $log->setDate($today);
  58. $log->setInfo($ipAddress);
  59. $this->em->persist($log);
  60. $this->em->flush();
  61. }
  62. return true; // Flag it as "logged"
  63. });
  64. }
  65. }