Add caching for TOS version of a user

master v0.3.0
Lars Vierbergen 5 years ago
parent 358b21624e
commit ba99eb4468
  1. 31
      EventListener/TosListener.php
  2. 6
      Resources/config/services.xml

@ -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;
}

@ -22,6 +22,12 @@
<service class="vierbergenlars\AuthserverTosBundle\EventListener\TosListener">
<argument>%vierbergenlars_tos.terms%</argument>
<argument>%vierbergenlars_tos.tos_version%</argument>
<argument type="service">
<service class="Symfony\Component\Cache\Adapter\ProxyAdapter">
<argument type="service" id="cache.app" />
<argument>vierbergenlars_tos_accept_</argument>
</service>
</argument>
<argument type="service" id="doctrine.orm.entity_manager" />
<argument type="service" id="security.token_storage" />
<argument type="service" id="router" />