<?php
namespace App\EventSubscriber;
use App\Event\CreateIndustrialSiteEvent;
use App\Event\DeleteOrganizationEvent;
use App\Event\IndustrialSiteEventInterface;
use App\Event\OrganizationEventInterface;
use App\Event\UpdateIndustrialSiteEvent;
use App\Event\UpdateOrganizationEvent;
use App\Event\UpdateContractEvent;
use Lexik\Bundle\JWTAuthenticationBundle\Events;
use Psr\Cache\InvalidArgumentException;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Contracts\Cache\TagAwareCacheInterface;
class InvalidateCacheSubscriber implements EventSubscriberInterface
{
private TagAwareCacheInterface $portailCachePool;
private LoggerInterface $logger;
public function __construct(TagAwareCacheInterface $portailCachePool, LoggerInterface $logger)
{
$this->portailCachePool = $portailCachePool;
$this->logger = $logger;
}
public static function getSubscribedEvents()
{
return [
UpdateOrganizationEvent::NAME => 'onUpdateOrganization',
DeleteOrganizationEvent::NAME => 'onDeleteOrganization',
UpdateContractEvent::NAME => 'onUpdateContract',
Events::JWT_CREATED => 'onUserLogin',
];
}
public function onUpdateOrganization(OrganizationEventInterface $event): void
{
$organizationId = $event->getOrganization()->getId();
$this->invalidateTag($organizationId, "organization '$organizationId'");
}
public function onUpdateContract(UpdateContractEvent $event): void
{
$contractId = $event->getContract()->getId();
$this->invalidateTag($contractId, "contract '$contractId'");
}
public function onDeleteOrganization(OrganizationEventInterface $event): void
{
$organizationId = $event->getOrganization()->getId();
$this->invalidateTag($organizationId, "organization '$organizationId'");
}
public function onUserLogin($event): void
{
$userId = $event->getData()['heimdallId'] ?? null;
if (null !== $userId) {
$this->invalidateTag($userId, "user '$userId'");
}
}
private function invalidateTag(string $tagName, string $message): void
{
try {
$this->portailCachePool->invalidateTags([$tagName]);
} catch (InvalidArgumentException $e) {
$this->logger->error(sprintf('Cannot invalidate cache for %s on tag "%s"', $message, $tagName));
}
}
}