<?php
namespace App\Subscriber\User;
use App\Event\User\MemberDislikedEvent;
use App\Event\User\MemberLikedEvent;
use App\Service\MemberService;
use App\Service\User\LikeService;
use App\Service\User\MemberRankingService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class LikeSubscriber implements EventSubscriberInterface
{
/**
* @var MemberService
*/
protected $rankingService;
/**
* @var LikeService
*/
protected $likeService;
/**
* LikeSubscriber constructor.
*/
public function __construct(MemberRankingService $rankingService, LikeService $likeService)
{
$this->rankingService = $rankingService;
$this->likeService = $likeService;
}
public static function getSubscribedEvents(): array
{
return [
MemberLikedEvent::class => [
['onMemberLikeUpdateGlobalLikeCount', 0],
],
MemberDislikedEvent::class => [
['onMemberDislikeLikeUpdateGlobalLikeCount', 0],
],
];
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function onMemberDislikeLikeUpdateGlobalLikeCount(MemberDislikedEvent $event)
{
$member = $event->getTarget();
$globalLike = $this->likeService->getOrCreateGlobalMemberLike($member);
$globalLike->setCounter($globalLike->getCounter() - 1);
$this->likeService->storeEntity($globalLike);
$ranking = $this->rankingService->getRankingByMember($member);
$ranking->setLikeCount($globalLike->getCounter());
$this->rankingService->storeRanking($ranking);
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function onMemberLikeUpdateGlobalLikeCount(MemberLikedEvent $event)
{
$member = $event->getTarget();
$globalLike = $this->likeService->getOrCreateGlobalMemberLike($member);
$globalLike->setCounter($globalLike->getCounter() + 1);
$this->likeService->storeEntity($globalLike);
$ranking = $this->rankingService->getRankingByMember($member);
$ranking->setLikeCount($globalLike->getCounter());
$this->rankingService->storeRanking($ranking);
}
}