<?php
/*
* Author: Dominik Piekarski <code@dompie.de>
* Created at: 2022/01/28 10:54
*/
declare(strict_types=1);
namespace App\Subscriber;
use App\Dictionary\PaymentType;
use App\Entity\Content;
use App\Event\Amateur\BlogEntryUpdatedEvent;
use App\Event\Content\CommentCreatedEvent;
use App\Event\Content\ContentPublishedEvent;
use App\Event\Guestbook\GuestbookCommentChangedEvent;
use App\Event\Guestbook\GuestbookEntryAcceptedEvent;
use App\Event\Payment\PaymentCreatedEvent;
use App\Event\RedisEventManager;
use App\Event\User\FriendshipConfirmedEvent;
use App\Event\User\LivecamOnlineEvent;
use App\Event\User\LoginCreatedEvent;
use App\Event\User\MemberCreatedEvent;
use App\Event\User\ProfileVisitEvent;
use App\Event\UserGroups\UserGroupPostCreatedEvent;
use App\Service\NotificationActivityFactory;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class HomepageFeedSubscriber implements EventSubscriberInterface
{
private RedisEventManager $redis;
private NotificationActivityFactory $factory;
public function __construct(RedisEventManager $redis, NotificationActivityFactory $factory)
{
$this->redis = $redis;
$this->factory = $factory;
}
public static function getSubscribedEvents(): array
{
return [
ContentPublishedEvent::class => [
['onContentPublishSendHomepageFeed', 0],
],
BlogEntryUpdatedEvent::class => [
['onBlogEntryApproveSendHomepageFeed', 0],
],
LoginCreatedEvent::class => [
['onLoginSendHomepageFeed', 0],
],
ProfileVisitEvent::class => [
['onProfileVisitSendHomepageFeed', 0],
],
PaymentCreatedEvent::class => [
['onBookingDoneSendHomepageFeed', 0],
],
MemberCreatedEvent::class => [
['onRegistrationConfirmSendHomepageFeed', 0],
],
LivecamOnlineEvent::class => [
['onWebcamOnlineSendHomepageFeed', 0],
],
GuestbookEntryAcceptedEvent::class => [
['onNewGuestbookEntrySendHomepageFeed', 0],
],
GuestbookCommentChangedEvent::class => [
['onGuestbookCommentSendHomepageFeed', 0],
],
CommentCreatedEvent::class => [
['onContentCommentSendHomepageFeed', 0],
],
FriendshipConfirmedEvent::class => [
['onFriendshipAcceptSendHomepageFeed', 0],
],
UserGroupPostCreatedEvent::class => [
['onGroupPostSendHomepageFeed', 0],
],
];
}
public function onContentPublishSendHomepageFeed(ContentPublishedEvent $event): void
{
$author = $event->getAuthor();
if (null === $author) {
return;
}
$content = $event->getContent();
if (!$content instanceof Content) {
return;
}
$feedItem = $this->factory->contentPublishActivity($author, $content);
$this->redis->publishToHomepage($feedItem);
}
public function onBlogEntryApproveSendHomepageFeed(BlogEntryUpdatedEvent $event): void
{
$entry = $event->getBlogEntry();
if (!$entry->isPublic()) {
return;
}
$feedItem = $this->factory->blogPostActivity($entry);
$this->redis->publishToHomepage($feedItem);
}
public function onLoginSendHomepageFeed(LoginCreatedEvent $event): void
{
return; // This is already done by ActivityFeedSubscriber->onLoginCreateActivityFeed
}
public function onProfileVisitSendHomepageFeed(ProfileVisitEvent $event): void
{
$feedItem = $this->factory->profileVisitActivity($event->getVisitor(), $event->getProfileOwner());
$this->redis->publishToHomepage($feedItem);
}
public function onBookingDoneSendHomepageFeed(PaymentCreatedEvent $event): void
{
$payment = $event->getPayment();
if (PaymentType::BOOKING !== $payment->getType()) {
return;
}
$feedItem = $this->factory->bookingDoneActivity($payment);
$this->redis->publishToHomepage($feedItem);
}
public function onRegistrationConfirmSendHomepageFeed(MemberCreatedEvent $event): void
{
$member = $event->getMember();
if (!$member) {
return;
}
$feedItem = $this->factory->newRegistrationActivity($member);
$this->redis->publishToHomepage($feedItem);
}
public function onWebcamOnlineSendHomepageFeed(LivecamOnlineEvent $event): void
{
$member = $event->getMember();
if (!$member) {
return;
}
$feedItem = $this->factory->webcamOnlineActivity($member);
$this->redis->publishToHomepage($feedItem);
}
public function onNewGuestbookEntrySendHomepageFeed(GuestbookEntryAcceptedEvent $event): void
{
$feedItem = $this->factory->guestbookEntryActivity($event->getEntry());
$this->redis->publishToHomepage($feedItem);
}
public function onGuestbookCommentSendHomepageFeed(GuestbookCommentChangedEvent $event): void
{
$feedItem = $this->factory->guestbookCommentActivitySendHomepageFeed($event->getEntry());
$this->redis->publishToHomepage($feedItem);
}
public function onContentCommentSendHomepageFeed(CommentCreatedEvent $event): void
{
$feedItem = $this->factory->contentCommentActivity($event->getComment());
$this->redis->publishToHomepage($feedItem);
}
public function onFriendshipAcceptSendHomepageFeed(FriendshipConfirmedEvent $event): void
{
$feedItem = $this->factory->friendshipActivity($event->getFriendship());
$this->redis->publishToHomepage($feedItem);
}
public function onGroupPostSendHomepageFeed(UserGroupPostCreatedEvent $event): void
{
$feedItem = $this->factory->groupActivity($event->getEntity());
$this->redis->publishToHomepage($feedItem);
}
}