<?php
namespace App\Subscriber\Guestbook;
use App\Entity\Member;
use App\Event\Guestbook\GuestbookEntryAcceptedEvent;
use App\Event\Guestbook\GuestbookEntryCreatedEvent;
use App\Event\RedisEventManager;
use App\Event\User\RegistrationEvent;
use App\Service\Media\MemberMediaService;
use App\Subscriber\AbstractRedisEventManagerSubscriber;
use Frivol\Common\Service\Notification\Activity\NewRegistrationActivity;
use Frivol\Common\Service\Notification\GuestbookAcceptedNotification;
use Frivol\Common\Service\Notification\GuestbookCreatedNotification;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\RouterInterface;
class NotificationSubscriber extends AbstractRedisEventManagerSubscriber implements EventSubscriberInterface
{
/**
* @var MemberMediaService
*/
protected $memberMediaService;
/**
* NotificationSubscriber constructor.
*/
public function __construct(MemberMediaService $memberMediaService, RedisEventManager $redisEventManager,
RouterInterface $router)
{
$this->memberMediaService = $memberMediaService;
parent::__construct($redisEventManager, $router);
}
public static function getSubscribedEvents(): array
{
return [
GuestbookEntryCreatedEvent::class => [
['onNewGuestbookEntryCreateNotification', 0],
],
GuestbookEntryAcceptedEvent::class => [
['onAcceptedCreateNotification', 0],
],
RegistrationEvent::class => [
['onRegistrationSendActivityNotification', 0],
],
];
}
public function onAcceptedCreateNotification(GuestbookEntryAcceptedEvent $event)
{
$sender = $event->getEntry()->getSender();
$recipient = $event->getEntry()->getRecipient();
$notification = new GuestbookAcceptedNotification();
$notification->setData([
'username' => $recipient->getUsername(),
'image' => $this->getMediaUrl($recipient),
'url' => $this->getGuestbookRoute($recipient),
]);
$this->getRedisEventManager()->publishToMemberWithFrom($sender, $recipient, $notification);
}
/**
* @throws \Exception
*/
public function onNewGuestbookEntryCreateNotification(GuestbookEntryCreatedEvent $event)
{
$sender = $event->getEntry()->getSender();
$recipient = $event->getEntry()->getRecipient();
$notification = new GuestbookCreatedNotification();
$notification->setData([
'username' => $sender->getUsername(),
'image' => $this->getMediaUrl($sender),
'toUsername' => $recipient->getUsername(),
]);
$this->getRedisEventManager()->publishToMemberWithFrom($sender, $recipient, $notification);
}
public function getMediaUrl(Member $sender): ?string
{
if (!$sender->getMainPhoto()) {
return null;
}
return $this->memberMediaService->getUrlForMemberMedia($sender->getMainPhoto(), false, '100x100');
}
public function getGuestbookRoute(Member $member): string
{
return $this->getRouter()->generate('frivol_frontend_profile_user', [
'username' => $member->getUsername(),
]).'/gaestebuch';
}
public function onRegistrationSendActivityNotification(RegistrationEvent $event): void
{
if (!$event->getAccount() || !$event->getAccount()->getMember()) {
return;
}
$notification = new NewRegistrationActivity();
$notification->setFromMemberId($event->getAccount()->getMember()->getId());
$notification->setFromUsername($event->getAccount()->getMember()->getUsername());
$this->getRedisEventManager()->publishToHomepage($notification);
}
}