<?php
namespace App\Subscriber\User\ProfileVisit;
use App\Dictionary\ImageFilter;
use App\Entity\MemberMedia;
use App\Event\RedisEventManager;
use App\Event\User\ProfileVisitEvent;
use App\Subscriber\AbstractRedisEventManagerSubscriber;
use Frivol\Common\Service\Notification\ProfileVisitNotification;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\RouterInterface;
class NotificationSubscriber extends AbstractRedisEventManagerSubscriber implements EventSubscriberInterface
{
public function __construct(RedisEventManager $redisEventManager, RouterInterface $router)
{
parent::__construct($redisEventManager, $router);
}
public static function getSubscribedEvents(): array
{
return [
ProfileVisitEvent::class => [
['onProfileVisitCreateNotification', 0],
],
];
}
/**
* @throws \Exception
*/
public function onProfileVisitCreateNotification(ProfileVisitEvent $event)
{
if ($event->getVisitor() === $event->getProfileOwner()) {
// ignore self visits
return;
}
$notification = new ProfileVisitNotification();
$visitor = $event->getVisitor();
$owner = $event->getProfileOwner();
$visitedAt = new \DateTime();
$data = [
'id' => $visitor->getId(),
'username' => $visitor->getUsername(),
'visitedAt' => $visitedAt->format('c'),
'fromUsername' => $visitor->getUsername(),
'fromSex' => $visitor->getSex(),
];
if ($visitor->getMainPhoto() instanceof MemberMedia) {
$data['image'] = $visitor->getMainPhoto()->getUrl(ImageFilter::SIZE_100x100);
}
$notification->setData($data);
$this->getRedisEventManager()->publishToMemberWithFrom($visitor, $owner, $notification);
}
}