From ba99eb4468d0f69f464cc49b9cf25147796813ed Mon Sep 17 00:00:00 2001 From: Lars Vierbergen Date: Sun, 15 Sep 2019 16:35:26 +0200 Subject: [PATCH] Add caching for TOS version of a user --- EventListener/TosListener.php | 31 ++++++++++++++++++++++++++++--- Resources/config/services.xml | 6 ++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/EventListener/TosListener.php b/EventListener/TosListener.php index 3b844b7..41e5d25 100644 --- a/EventListener/TosListener.php +++ b/EventListener/TosListener.php @@ -19,6 +19,7 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use vierbergenlars\AuthserverTosBundle\Entity\UserTos; use vierbergenlars\AuthserverTosBundle\Form\AcceptTosType; +use Psr\Cache\CacheItemPoolInterface; class TosListener implements EventSubscriberInterface { @@ -33,6 +34,11 @@ class TosListener implements EventSubscriberInterface */ private $em; + /** + * @var CacheItemPoolInterface + */ + private $cache; + /** * * @var TokenStorageInterface @@ -76,10 +82,11 @@ class TosListener implements EventSubscriberInterface return $handlers; } - public function __construct($terms, $tosVersion, EntityManagerInterface $em, TokenStorageInterface $tokenStorage, UrlGeneratorInterface $urlGenerator) + public function __construct($terms, $tosVersion, CacheItemPoolInterface $cache, EntityManagerInterface $em, TokenStorageInterface $tokenStorage, UrlGeneratorInterface $urlGenerator) { $this->terms = $terms; $this->tosVersion = $tosVersion; + $this->cache = $cache; $this->em = $em; $this->tokenStorage = $tokenStorage; $this->urlGenerator = $urlGenerator; @@ -103,9 +110,28 @@ class TosListener implements EventSubscriberInterface $tosUser = new UserTos($user); $tosUser->setAcceptedVersion($this->tosVersion); $this->em->persist($tosUser); + $this->cache->deleteItem('version_u_'.$user->getId()); } } + private function getAcceptedTosVersion(User $user, $force = false) { + $cacheItem = $this->cache->getItem('version_u_'.$user->getId()); + if(!$cacheItem->isHit() || $force) { + $userTos = $this->em->find(UserTos::class, $user); + + if($userTos) { + $cacheItem->set($userTos->getAcceptedVersion()); + } else { + $cacheItem->set(null); + } + + $cacheItem->expiresAfter(24*60*60); // One day + $this->cache->saveDeferred($cacheItem); + } + + return $cacheItem->get(); + } + public function onKernelRequest(GetResponseEvent $event) { if (!$event->isMasterRequest()) @@ -118,9 +144,8 @@ class TosListener implements EventSubscriberInterface return; if ($token->hasAttribute('vl_tos_accept_ok')) return; - $userTos = $this->em->find(UserTos::class, $user); - if ($userTos && $userTos->getAcceptedVersion() >= $this->tosVersion) { + if ($this->getAcceptedTosVersion($user) >= $this->tosVersion) { $token->setAttribute('vl_tos_accept_ok', true); return; } diff --git a/Resources/config/services.xml b/Resources/config/services.xml index 5146c42..79bc6e7 100644 --- a/Resources/config/services.xml +++ b/Resources/config/services.xml @@ -22,6 +22,12 @@ %vierbergenlars_tos.terms% %vierbergenlars_tos.tos_version% + + + + vierbergenlars_tos_accept_ + +