<?php
namespace App\EventSubscriber;
use App\Entity\UserTransaction;
use App\Event\BoxPurchasedEvent;
use App\Event\CreditsAddedEvent;
use App\Event\CreditsPurchasedEvent;
use App\Event\ItemDuplicateEvent;
use App\Event\ItemPurchasedEvent;
use App\Service\NotificationService;
use App\Service\UserTransactionManager;
use App\Service\UserWalletManager;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ShopEventSubscriber implements EventSubscriberInterface
{
private $notificationService;
private $em;
private $userWalletManager;
private $userTransactionManager;
public function __construct(
NotificationService $notificationService,
EntityManagerInterface $entityManager,
UserWalletManager $userWalletManager,
UserTransactionManager $userTransactionManager
)
{
$this->notificationService = $notificationService;
$this->em = $entityManager;
$this->userWalletManager = $userWalletManager;
$this->userTransactionManager = $userTransactionManager;
}
public function onItemPurchased(ItemPurchasedEvent $event)
{
$this->userWalletManager->substractValue(
$event->getUserItem()->getItem()->getPrice(),
$event->getUserItem()->getUser()
);
$this->userTransactionManager->create(
null,
$event->getUserItem()->getUser(),
(-1)*$event->getUserItem()->getItem()->getPrice(),
UserTransaction::TYPE_ITEM_PURCHASED
);
}
public function onItemDuplicate(ItemDuplicateEvent $event)
{
$this->userWalletManager->addValue(
$event->getItem()->getPrice(),
$event->getUser()
);
$this->userTransactionManager->create(
null,
$event->getUser(),
$event->getItem()->getPrice(),
UserTransaction::TYPE_ITEM_DUPLICATED
);
}
public function onBoxPurchased(BoxPurchasedEvent $event)
{
$this->userWalletManager->substractValue(
$event->getBox()->getPrice(),
$event->getUser()
);
$this->userTransactionManager->create(
null,
$event->getUser(),
(-1)*$event->getBox()->getPrice(),
UserTransaction::TYPE_BOX_PURCHASED
);
}
public function onCreditsPurchased(CreditsPurchasedEvent $event)
{
$this->userWalletManager->addValue(
$event->getValue(),
$event->getUser()
);
$this->userTransactionManager->create(
null,
$event->getUser(),
$event->getValue(),
UserTransaction::TYPE_CREDITS_PURCHASED
);
}
public function onCreditsAdded(CreditsAddedEvent $event)
{
$this->userWalletManager->addValue(
$event->getValue(),
$event->getUser()
);
$this->userTransactionManager->create(
null,
$event->getUser(),
$event->getValue(),
UserTransaction::TYPE_CREDITS_ADDED
);
}
public static function getSubscribedEvents()
{
return [
ItemPurchasedEvent::NAME => 'onItemPurchased',
ItemDuplicateEvent::NAME => 'onItemDuplicate',
BoxPurchasedEvent::NAME => 'onBoxPurchased',
CreditsPurchasedEvent::NAME => 'onCreditsPurchased',
CreditsAddedEvent::NAME => 'onCreditsAdded',
];
}
}