<?php
namespace App\Timeline\EventSubscriber;
use App\Timeline\Event\TimelinePostDeletedEvent;
use App\Timeline\Event\TimelinePostEditedEvent;
use App\Timeline\Event\TimelinePostEvents;
use App\Timeline\Event\TimelinePostLikedEvent;
use App\Timeline\Event\TimelinePostPublishedEvent;
use App\Timeline\Event\TimelinePostSharedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Mercure\HubInterface;
use Symfony\Component\Mercure\Update;
class TimelineMercureSubscriber implements EventSubscriberInterface
{
public function __construct(
protected HubInterface $hub,
protected \Twig\Environment $twig,
protected RequestStack $requestStack
) {
}
public static function getSubscribedEvents()
{
return [
TimelinePostEvents::PUBLISHED => 'postPublished',
TimelinePostEvents::EDITED => 'postEdited',
TimelinePostEvents::DELETED => 'postDeleted',
TimelinePostEvents::LIKED => 'postLiked',
TimelinePostEvents::DISLIKED => 'postLiked',
];
}
public function postPublished(TimelinePostPublishedEvent $event)
{
$post = $event->post;
$html = $this->twig->render('network/event/timeline-post/published.stream.twig', [
'post' => $post,
]);
$targets = [$post->getProfile(), ...$post->getShowPostAt()];
foreach ($targets as $target) {
$this->hub->publish(new Update(sprintf('timeline-posts-%s', $target->getId()), $html));
}
}
public function postEdited(TimelinePostEditedEvent $event)
{
$post = $event->post;
$html = $this->twig->render('network/event/timeline-post/edited.stream.twig', [
'post' => $post,
]);
$this->hub->publish(new Update($event->getTopic(), $html));
}
public function postDeleted(TimelinePostDeletedEvent $event)
{
$postId = $event->postId;
$html = $this->twig->render('network/event/timeline-post/deleted.stream.twig', [
'postId' => $postId,
]);
$this->hub->publish(new Update($event->getTopic(), $html));
}
public function postLiked(TimelinePostLikedEvent $event)
{
$post = $event->post;
$html = $this->twig->render('network/event/timeline-post/liked.stream.twig', [
'post' => $post,
]);
$this->hub->publish(new Update($event->getTopic(), $html));
}
}