<?php
// src/EventSubscriber/DailyActivitySubscriber.php
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Security;
use App\Entity\UserDailyActivity;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Contracts\Cache\ItemInterface;
class DailyActivitySubscriber implements EventSubscriberInterface
{
private EntityManagerInterface $em;
private Security $security;
private CacheInterface $cache;
public function __construct(EntityManagerInterface $em, Security $security,CacheInterface $cache)
{
$this->em = $em;
$this->security = $security;
$this->cache = $cache;
}
public static function getSubscribedEvents(): array
{
return [
RequestEvent::class => 'onRequest',
];
}
public function onRequest(RequestEvent $event)
{
if (!$event->isMainRequest()) {
return;
}
$user = $this->security->getUser();
if (!$user) {
return;
}
$userId = $user->getId();
$userType = (new \ReflectionClass($user))->getShortName();
$cacheKey = "daily_log_{$userType}_{$userId}";
$request = $event->getRequest();
$ipAddress = $request->getClientIp();
$alreadyLogged = $this->cache->get($cacheKey, function (ItemInterface $item) use ($userId, $userType,$ipAddress) {
$now = new \DateTimeImmutable();
$midnight = $now->modify('tomorrow')->setTime(0, 0);
$item->expiresAt($midnight);
$today = new \DateTimeImmutable('now');
$repo = $this->em->getRepository(UserDailyActivity::class);
$existing = $repo->findOneBy([
'userId' => $userId,
'userType' => $userType,
'date' => $today,
]);
if (!$existing) {
$log = new UserDailyActivity();
$log->setUserId($userId);
$log->setUserType($userType);
$log->setDate($today);
$log->setInfo($ipAddress);
$this->em->persist($log);
$this->em->flush();
}
return true; // Flag it as "logged"
});
}
}