<?php
namespace App\Subscriber\User;
use App\Event\Content\ContentDeleteEvent;
use App\Event\Content\ContentImagesetDeleteEvent;
use App\Event\Content\ContentPublishedEvent;
use App\Event\Content\ContentVideoDeleteEvent;
use App\Service\Content\ContentService;
use App\Service\MemberService;
use App\Service\User\MemberRankingService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class MemberRankingSubscriber implements EventSubscriberInterface
{
/**
* @var MemberService
*/
protected $rankingService;
/**
* @var ContentService
*/
protected $contentService;
/**
* MemberRankingSubscriber constructor.
*/
public function __construct(MemberRankingService $rankingService, ContentService $contentService)
{
$this->rankingService = $rankingService;
$this->contentService = $contentService;
}
public static function getSubscribedEvents(): array
{
return [
ContentPublishedEvent::class => [
['onContentPublishCalculateMemberRankingContentCount', 0],
],
ContentVideoDeleteEvent::class => [
['onContentDeleteCalculateMemberRankingContentCount', 0],
],
ContentImagesetDeleteEvent::class => [
['onContentDeleteCalculateMemberRankingContentCount', 0],
],
];
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function onContentDeleteCalculateMemberRankingContentCount(ContentDeleteEvent $event)
{
$member = $event->getEntity()->getContent()->getMember();
$ranking = $this->rankingService->getRankingByMember($member);
$ranking->setImagesetCount($this->contentService->getImagesetCountByMember($member));
$ranking->setVideosCount($this->contentService->getVideoCountByMember($member));
$this->rankingService->storeRanking($ranking);
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function onContentPublishCalculateMemberRankingContentCount(ContentPublishedEvent $event)
{
$member = $event->getAuthor();
$ranking = $this->rankingService->getRankingByMember($member);
$ranking->setImagesetCount($this->contentService->getImagesetCountByMember($member));
$ranking->setVideosCount($this->contentService->getVideoCountByMember($member));
$this->rankingService->storeRanking($ranking);
}
}