<?php
declare(strict_types=1);
namespace Harmonizely\EventSubscriber;
use Harmonizely\CalendarEvents;
use Harmonizely\Model\EventInterface;
use Harmonizely\Service\Cache\Contract\IClearCalendarCacheService;
use Harmonizely\Service\Cache\Contract\IGetCalendarCacheTagService;
use Psr\Cache\InvalidArgumentException;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
use Symfony\Contracts\Cache\TagAwareCacheInterface;
/**
* Class ClearCalendarCacheSubscriber
* @package Harmonizely\EventSubscriber
*/
final class ClearCalendarCacheSubscriber implements EventSubscriberInterface
{
/**
* @var TagAwareCacheInterface
*/
private TagAwareCacheInterface $cache;
/**
* @var LoggerInterface
*/
private LoggerInterface $logger;
/**
* @var IClearCalendarCacheService
*/
private IClearCalendarCacheService $clearCalendarCacheService;
/**
* @param TagAwareCacheInterface $cache
* @param LoggerInterface $logger
* @param IClearCalendarCacheService $clearCalendarCacheService
*/
public function __construct(
TagAwareCacheInterface $cache,
LoggerInterface $logger,
IClearCalendarCacheService $clearCalendarCacheService
)
{
$this->cache = $cache;
$this->logger = $logger;
$this->clearCalendarCacheService = $clearCalendarCacheService;
}
/**
* @return string[]
*/
public static function getSubscribedEvents(): array
{
return [
CalendarEvents::EVENT_POST_CANCEL => 'clearCache',
CalendarEvents::EVENT_POST_CREATE => 'clearCache',
CalendarEvents::EVENT_POST_RESCHEDULE => 'clearCache',
];
}
/**
* @param GenericEvent $genericEvent
*/
public function clearCache(GenericEvent $genericEvent): void
{
try {
/** @var EventInterface $event */
$event = $genericEvent->getSubject();
$this->clearCalendarCacheService->perform($event->getCalendar()->getCalendarAccount());
} catch (InvalidArgumentException $e) {
$this->logger->critical($e->getMessage());
}
}
}