<?php
namespace App\Subscriber\Payment\Purchase;
use App\Event\Payment\PurchaseCreatedEvent;
use App\Lib\Purchase\ContentPurchasable;
use App\Lib\Purchase\ImageContentPurchasable;
use App\Service\Amateur\BalanceAmateurService;
use App\Service\Content\ContentService;
use App\Service\Content\MemberContentService;
use App\Service\User\MemberRankingService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class PurchaseMemberContentSubscriber implements EventSubscriberInterface
{
protected MemberContentService $service;
protected ContentService $contentService;
protected MemberRankingService $memberRankingService;
protected BalanceAmateurService $balanceAmateurService;
/**
* PurchaseMemberContentSubscriber constructor.
*/
public function __construct(MemberContentService $service, ContentService $contentService,
MemberRankingService $rankingService, BalanceAmateurService $balanceAmateurService)
{
$this->service = $service;
$this->contentService = $contentService;
$this->memberRankingService = $rankingService;
$this->balanceAmateurService = $balanceAmateurService;
}
public static function getSubscribedEvents(): array
{
return [
PurchaseCreatedEvent::class => [
['onContentPurchaseCreateMemberContent', 0],
['onContentPurchaseUpdateSellersMemberRanking', 1],
],
];
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function onContentPurchaseCreateMemberContent(PurchaseCreatedEvent $event)
{
if (!$event->getPurchasable() instanceof ContentPurchasable) {
return;
}
$purchase = $event->getPurchase();
$purchasable = $event->getPurchasable();
$content = $this->contentService->getContentById($purchase->getReferenceId());
if ($purchasable instanceof ImageContentPurchasable) {
$memberContent = $this->service->createByMemberAndContent($purchase->getBuyer(), $content, $purchasable->getImagesetImageId());
} else {
$memberContent = $this->service->createByMemberAndContent($purchase->getBuyer(), $content);
}
$memberContent->setPurchase($purchase);
$memberContent->setCoins($event->getPurchasable()->getCoinAmount());
$this->service->storeMemberContent($memberContent);
}
/**
* @throws \Doctrine\ORM\ORMException
* @throws \Doctrine\ORM\OptimisticLockException
*/
public function onContentPurchaseUpdateSellersMemberRanking(PurchaseCreatedEvent $event)
{
if (!$event->getPurchasable() instanceof ContentPurchasable) {
return;
}
$purchase = $event->getPurchase();
$amateur = $purchase->getSeller();
if (!$amateur->getIsAmateur()) {
return;
}
$ranking = $this->memberRankingService->getRankingByMember($amateur);
$ranking->setAmateurScore($this->balanceAmateurService->getSumBalancesForMemberSinceNumberOfDays($amateur, 30));
$this->memberRankingService->storeRanking($ranking);
}
}