src/Subscriber/Messenger/MessengerCacheSubscriber.php line 102

Open in your IDE?
  1. <?php
  2. /*
  3.  * Author: Dominik Piekarski <code@dompie.de>
  4.  * Created at: 2021/10/13 12:08
  5.  */
  6. declare(strict_types=1);
  7. namespace App\Subscriber\Messenger;
  8. use App\Dto\PregenerateMessengerCacheDto;
  9. use App\Entity\ConversationRoute;
  10. use App\Event\Messenger\ConversationDeleteEvent;
  11. use App\Event\Messenger\ConversationRouteChangeEvent;
  12. use App\Event\Messenger\ConversationStartEvent;
  13. use App\Event\Messenger\MessengerEventInterface;
  14. use App\Event\Messenger\NewMessageEvent;
  15. use App\Event\Messenger\RouteReadEvent;
  16. use App\Pure\Builder\PureConversationBuilder;
  17. use App\Service\Messenger\MessengerCacheService;
  18. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  19. use Symfony\Component\HttpKernel\Event\TerminateEvent;
  20. class MessengerCacheSubscriber implements EventSubscriberInterface
  21. {
  22.     protected MessengerCacheService $messengerCache;
  23.     protected PureConversationBuilder $builder;
  24.     protected array $filtersToClear = [
  25.         PureConversationBuilder::FILTER_ALL,
  26.         PureConversationBuilder::FILTER_UNREAD,
  27.         PureConversationBuilder::FILTER_READ,
  28.         PureConversationBuilder::FILTER_UNANSWERED_BY_ME,
  29.         PureConversationBuilder::FILTER_ANSWERED_BY_ME,
  30.         PureConversationBuilder::FILTER_SEARCH,
  31.         PureConversationBuilder::FILTER_TRASH,
  32.     ];
  33.     public function __construct(PureConversationBuilder $builderMessengerCacheService $messengerCache)
  34.     {
  35.         $this->messengerCache $messengerCache;
  36.         $this->builder $builder;
  37.     }
  38.     public static function getSubscribedEvents(): array
  39.     {
  40.         return [
  41.             ConversationStartEvent::class => [['onConversationStartClearCache'0]],
  42.             ConversationRouteChangeEvent::class => [['onConversationRouteHiddenClearCache'0]],
  43.             ConversationDeleteEvent::class => [['onConversationDeleteClearCache'0]],
  44.             RouteReadEvent::class => [['onConversationRouteReadEventClearCache'0]],
  45.             NewMessageEvent::class => [['onMessageEventClearCache'0]],
  46.             TerminateEvent::class => [['onTerminatePregenerateCaches'0]],
  47.         ];
  48.     }
  49.     /**
  50.      * @throws \Psr\Cache\InvalidArgumentException
  51.      */
  52.     public function onConversationRouteReadEventClearCache(RouteReadEvent $event): void
  53.     {
  54.         $route $event->getEntity();
  55.         $recipient $route->getToMember();
  56.         $this->messengerCache->clearConversationsCacheForMemberFilter($recipient->getId(), $this->filtersToClear);
  57.     }
  58.     /**
  59.      * @throws \Psr\Cache\InvalidArgumentException
  60.      */
  61.     public function onConversationRouteHiddenClearCache(ConversationRouteChangeEvent $event): void
  62.     {
  63.         $conversationRoute $event->getEntity();
  64.         $this->messengerCache->clearConversationsCacheForMember($conversationRoute->getToMember()->getId());
  65.         $this->messengerCache->clearConversationsCacheForMember($conversationRoute->getFromMember()->getId());
  66.     }
  67.     /**
  68.      * @throws \Psr\Cache\InvalidArgumentException
  69.      */
  70.     public function onConversationStartClearCache(MessengerEventInterface $event): void
  71.     {
  72.         /** @var ConversationRoute $conversationRoute */
  73.         $conversationRoute $event->getEntity()->getRoutes()->first();
  74.         $this->messengerCache->clearConversationsCacheForMemberFilter($conversationRoute->getToMember()->getId(), $this->filtersToClear);
  75.         $this->messengerCache->clearConversationsCacheForMemberFilter($conversationRoute->getFromMember()->getId(), $this->filtersToClear);
  76.     }
  77.     public function onConversationDeleteClearCache(ConversationDeleteEvent $event): void
  78.     {
  79.         $this->messengerCache->clearMessagesCacheForConversation($event->getId());
  80.     }
  81.     public function onMessageEventClearCache(MessengerEventInterface $event): void
  82.     {
  83.         /** @var ConversationRoute $conversationRoute */
  84.         $conversationRoute $event->getEntity()->getConversation()->getRoutes()->first();
  85.         $this->messengerCache->clearMessagesCacheForConversation($conversationRoute->getConversation()->getId());
  86.         $this->messengerCache->clearConversationsCacheForMemberFilter($conversationRoute->getToMember()->getId(), $this->filtersToClear);
  87.         $this->messengerCache->clearConversationsCacheForMemberFilter($conversationRoute->getFromMember()->getId(), $this->filtersToClear);
  88.     }
  89.     public function onTerminatePregenerateCaches(TerminateEvent $event): void
  90.     {
  91.         $request $event->getRequest();
  92.         $pregenCacheDto $request->attributes->get('pregenerateCache');
  93.         if (!$event->isMainRequest() || 200 !== $event->getResponse()->getStatusCode() || !$pregenCacheDto instanceof PregenerateMessengerCacheDto) {
  94.             return;
  95.         }
  96.         if ($pregenCacheDto->isTypeConversationList()) {
  97.             foreach ($pregenCacheDto->getPages() as $page) {
  98.                 $this->builder->getCachedConversationList($pregenCacheDto->getMember(), $page$pregenCacheDto->getFilter());
  99.             }
  100.             return;
  101.         }
  102.     }
  103. }