src/EventSubscriber/PageCacheSubscriber.php line 147

Open in your IDE?
  1. <?php
  2. /*
  3.  * Author: Dominik Piekarski <code@dompie.de>
  4.  * Created at: 2022/08/18 15:14
  5.  */
  6. declare(strict_types=1);
  7. namespace App\EventSubscriber;
  8. use App\Event\Content\BlogEntryChangedEvent;
  9. use App\Event\Content\ContentCommentCreatedEvent;
  10. use App\Event\Content\GuestbookEntryApprovedEvent;
  11. use App\Event\Content\GuestbookEntryCommentedEvent;
  12. use App\Event\Content\GuestbookEntryCreatedEvent;
  13. use App\Event\Content\GuestbookEntryRemovedEvent;
  14. use App\Event\EventUsernameInterface;
  15. use App\Event\Livecam\LivecamEndedEvent;
  16. use App\Event\Livecam\LivecamEventInterface;
  17. use App\Event\Livecam\LivecamJoinedEvent;
  18. use App\Event\Livecam\LivecamStartedEvent;
  19. use App\Event\Livecam\LivecamUnjoinedEvent;
  20. use App\Event\User\MemberProfileUpdatedEvent;
  21. use App\Infrastructure\PageCacheHelper;
  22. use App\Security\ApiUser;
  23. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  24. use Symfony\Component\HttpFoundation\RequestStack;
  25. use Symfony\Component\Routing\RouterInterface;
  26. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  27. use Symfony\Component\Security\Http\Event\LogoutEvent;
  28. use Symfony\Contracts\EventDispatcher\Event;
  29. class PageCacheSubscriber implements EventSubscriberInterface
  30. {
  31.     private PageCacheHelper $pageCache;
  32.     private RequestStack $requestStack;
  33.     private RouterInterface $router;
  34.     public function __construct(PageCacheHelper $pageCacheRequestStack $stackRouterInterface $router)
  35.     {
  36.         $this->pageCache $pageCache;
  37.         $this->requestStack $stack;
  38.         $this->router $router;
  39.     }
  40.     public static function getSubscribedEvents()
  41.     {
  42.         return [
  43.             LivecamStartedEvent::class => ['onLivecamEventEnqueuePageCacheUpdate'],
  44.             LivecamJoinedEvent::class => ['onLivecamEventEnqueuePageCacheUpdate'],
  45.             LivecamUnjoinedEvent::class => ['onLivecamEventEnqueuePageCacheUpdate'],
  46.             LivecamEndedEvent::class => ['onLivecamEventEnqueuePageCacheUpdate'],
  47.             InteractiveLoginEvent::class => ['logInOutPageCacheUpdate', -1],
  48.             LogoutEvent::class => ['logInOutPageCacheUpdate'1],
  49.             ContentCommentCreatedEvent::class => ['onContentCommentCreatedUpdatePageCache'1],
  50.             MemberProfileUpdatedEvent::class => ['onMemberProfileEditUpdatePageCache'1],
  51.             GuestbookEntryCreatedEvent::class => ['onGuestbookEntryChangeUpdatePageCache'1],
  52.             GuestbookEntryCommentedEvent::class => ['onGuestbookEntryChangeUpdatePageCache'1],
  53.             GuestbookEntryApprovedEvent::class => ['onGuestbookEntryChangeUpdatePageCache'1],
  54.             GuestbookEntryRemovedEvent::class => ['onGuestbookEntryChangeUpdatePageCache'1],
  55.             BlogEntryChangedEvent::class => ['onBlogEntryChangeUpdatePageCache'1],
  56.         ];
  57.     }
  58.     public function onLivecamEventEnqueuePageCacheUpdate(LivecamEventInterface $event): void
  59.     {
  60.         $request $this->requestStack->getMainRequest();
  61.         if (null === $request) {
  62.             return;
  63.         }
  64.         $httpHost $request->getHttpHost();
  65.         $paths[] = $this->router->generate('app_livecam_index');
  66.         for ($i 2$i 10$i++) {
  67.             $paths[] = $this->router->generate('app_livecam_index', ['page' => $i]);
  68.         }
  69.         $profileUrl $this->router->generate('app_user_profile_detail', ['username' => $event->getStreamOwnerUsername()]);
  70.         $this->pageCache->enqueueMemberProfileUrls($httpHost, [$profileUrl], true);
  71.         $this->pageCache->enqueuePublicProfileUrls($httpHost, [$profileUrl], true);
  72.         $this->pageCache->enqueueMemberContentUrls($httpHost$pathstrue);
  73.         $this->pageCache->enqueuePublicContentUrls($httpHost$pathstrue);
  74.     }
  75.     public function logInOutPageCacheUpdate(Event $event): void
  76.     {
  77.         if ($event instanceof InteractiveLoginEvent) {
  78.             if (null === $user $event->getAuthenticationToken()->getUser()) {
  79.                 return;
  80.             }
  81.             if (!$user instanceof ApiUser) {
  82.                 return;
  83.             }
  84.             $username $user->getUsername();
  85.             $httpHost $event->getRequest()->getHttpHost();
  86.         }
  87.         if ($event instanceof LogoutEvent) {
  88.             $token $event->getToken();
  89.             if (null === $token || null === $user $token->getUser()) {
  90.                 return;
  91.             }
  92.             if (!$user instanceof ApiUser) {
  93.                 return;
  94.             }
  95.             $username $user->getUsername();
  96.             $httpHost $event->getRequest()->getHttpHost();
  97.         }
  98.         $urls $this->generateProfileUrls($username$user);
  99.         $this->pageCache->enqueueMemberProfileUrls($httpHost$urlstrue);
  100.         $this->pageCache->enqueuePublicProfileUrls($httpHost$urlstrue);
  101.     }
  102.     public function onContentCommentCreatedUpdatePageCache(ContentCommentCreatedEvent $event): void
  103.     {
  104.         $request $this->requestStack->getMainRequest();
  105.         if (null === $request) {
  106.             return;
  107.         }
  108.         $httpHost $request->getHttpHost();
  109.         $urls = [];
  110.         if ($event->isImageset()) {
  111.             $urls[] = $this->router->generate('app_content_imageset_detail', ['slug' => $event->getSlug()]);
  112.         }
  113.         if ($event->isVideo()) {
  114.             $urls[] = $this->router->generate('app_content_video_detail', ['slug' => $event->getSlug()]);
  115.         }
  116.         $this->pageCache->enqueueMemberContentUrls($httpHost$urlstrue);
  117.         $this->pageCache->enqueuePublicContentUrls($httpHost$urlstrue);
  118.     }
  119.     public function onMemberProfileEditUpdatePageCache(EventUsernameInterface $event): void
  120.     {
  121.         $request $this->requestStack->getMainRequest();
  122.         if (null === $request) {
  123.             return;
  124.         }
  125.         $httpHost $request->getHttpHost();
  126.         $urls[] = $this->generateProfileUrls($event->getUsername());
  127.         $this->pageCache->enqueueMemberProfileUrls($httpHost$urlstrue);
  128.         $this->pageCache->enqueuePublicProfileUrls($httpHost$urlstrue);
  129.     }
  130.     public function onGuestbookEntryChangeUpdatePageCache(EventUsernameInterface $event): void
  131.     {
  132.         $request $this->requestStack->getMainRequest();
  133.         if (null === $request) {
  134.             return;
  135.         }
  136.         $httpHost $request->getHttpHost();
  137.         $urls[] = $this->router->generate('app_user_profile_guestbook', ['username' => $event->getUsername()]);
  138.         $this->pageCache->enqueueMemberProfileUrls($httpHost$urlstrue);
  139.         $this->pageCache->enqueuePublicProfileUrls($httpHost$urlstrue);
  140.     }
  141.     public function onBlogEntryChangeUpdatePageCache(BlogEntryChangedEvent $event): void
  142.     {
  143.         $request $this->requestStack->getMainRequest();
  144.         if (null === $request) {
  145.             return;
  146.         }
  147.         $httpHost $request->getHttpHost();
  148.         $route 'app_user_profile_blog';
  149.         $urls[] = $this->router->generate($route, ['username' => $event->getUsername()]);
  150.         $this->pageCache->enqueueMemberProfileUrls($httpHost$urlstrue);
  151.         $this->pageCache->enqueuePublicProfileUrls($httpHost$urlstrue);
  152.     }
  153.     private function generateProfileUrls(string $username, ?ApiUser $user null): array
  154.     {
  155.         //Only append these routes if user is amateur...
  156.         if ($user instanceof ApiUser && $user->hasRole('ROLE_AMATEUR')) {
  157.             $urls[] = $this->router->generate('app_user_profile_videos', ['username' => $username]);
  158.             $urls[] = $this->router->generate('app_user_profile_imagesets', ['username' => $username]);
  159.             $urls[] = $this->router->generate('app_user_profile_blog', ['username' => $username]);
  160.         }
  161.         //...or we do not know if it is a member or an amateur.
  162.         if ($user === null) {
  163.             $urls[] = $this->router->generate('app_user_profile_videos', ['username' => $username]);
  164.             $urls[] = $this->router->generate('app_user_profile_imagesets', ['username' => $username]);
  165.             $urls[] = $this->router->generate('app_user_profile_blog', ['username' => $username]);
  166.         }
  167.         $urls[] = $this->router->generate('app_user_profile_detail', ['username' => $username]);
  168.         $urls[] = $this->router->generate('app_user_profile_about', ['username' => $username]);
  169.         $urls[] = $this->router->generate('app_user_profile_guestbook', ['username' => $username]);
  170.         return $urls;
  171.     }
  172. }