<?php
namespace App\Subscriber;
use App\Entity\GalleryPic;
use App\Entity\Message;
use App\Entity\Report;
use App\Entity\User;
use App\Entity\UserIpBanned;
use App\EntityManager\UserIpBannedManager;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Security;
use Twig\Environment;
class RequestSubscriber implements EventSubscriberInterface
{
protected $tokenStorage;
protected $entityManager;
protected $twigEnvironment;
protected $security;
protected $router;
protected $userIpBannedManager;
public function __construct(
TokenStorageInterface $tokenStorage,
EntityManagerInterface $entityManager,
Environment $twigEnvironment,
Security $security,
RouterInterface $router,
UserIpBannedManager $userIpBannedManager
) {
$this->tokenStorage = $tokenStorage;
$this->entityManager = $entityManager;
$this->twigEnvironment = $twigEnvironment;
$this->security = $security;
$this->router = $router;
$this->userIpBannedManager = $userIpBannedManager;
}
public function onKernelRequest(RequestEvent $event)
{
$this->updateUserOnlineStatus();
$this->loadUnreadMessages();
$this->loadAdminData();
}
protected function updateUserOnlineStatus()
{
$user = $this->getUser();
if (!$user instanceof User || $this->security->isGranted(User::ROLE_IMPERSONATING)) {
return;
}
$delay = 300;
if (!$user->isOnline($delay)) {
$user->setDateLastOnline(new \DateTime());
$this->entityManager->persist($user);
$this->entityManager->flush();
}
}
protected function loadUnreadMessages()
{
$user = $this->getUser();
if (!$user instanceof User) {
return;
}
$this->twigEnvironment->addGlobal(
'unreadMessagesCounter',
$this->entityManager->getRepository(Message::class)->getUnreadMessagesCounterForUser($user)
);
}
protected function loadAdminData()
{
$user = $this->getUser();
if (!$user instanceof User || !$user->hasRole(User::ROLE_SUPER_ADMIN)) {
return;
}
$data = [
'report' => $this->entityManager->getRepository(Report::class)->getOpenCount(),
'pictureWaitingForValidation' => $this->entityManager
->getRepository(GalleryPic::class)
->getCountPicturesWaitingForModeration(),
];
$this->twigEnvironment->addGlobal(
'adminCounter',
$data
);
}
/**
* @return mixed|null
*/
protected function getUser()
{
if (!is_null($this->tokenStorage->getToken())) {
return $this->tokenStorage->getToken()->getUser();
}
return null;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => 'onKernelRequest',
];
}
}