src/EventSubscriber/UserEventSubscriber.php line 36

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Notification;
  4. use App\Entity\UserTransaction;
  5. use App\Entity\UserWallet;
  6. use App\Event\CashTransferredEvent;
  7. use App\Service\NotificationService;
  8. use App\Service\UserTransactionManager;
  9. use App\Service\UserWalletManager;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Symfony\Component\Config\Definition\Exception\Exception;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. class UserEventSubscriber implements EventSubscriberInterface
  14. {
  15.   private $notificationService;
  16.   private $userWalletManager;
  17.   private $userTransactionManager;
  18.   private $em;
  19.   public function __construct(
  20.     NotificationService $notificationService,
  21.     EntityManagerInterface $entityManager,
  22.     UserWalletManager $userWalletManager,
  23.     UserTransactionManager $userTransactionManager
  24.   )
  25.   {
  26.     $this->notificationService $notificationService;
  27.     $this->em $entityManager;
  28.     $this->userWalletManager $userWalletManager;
  29.     $this->userTransactionManager $userTransactionManager;
  30.   }
  31.   public function onCashTransferred(CashTransferredEvent $event)
  32.   {
  33.     try {
  34.       $this->em->getConnection()->beginTransaction();
  35.       $this->userTransactionManager->create($event->getUserFrom(), $event->getUserTo(), UserTransaction::TYPE_CASH_TRANSFERRED$event->getValue());
  36.       $userFromWallet $this->userWalletManager->getWallet($event->getUserFrom());
  37.       $userToWallet $this->userWalletManager->getWallet($event->getUserTo());
  38.       if(!$userFromWallet || $userFromWallet->getValue() < $event->getValue()){
  39.         throw new Exception('Not enough money');
  40.       }
  41.       $userFromWallet->substractValue($event->getValue());
  42.       if(!$userToWallet){
  43.         $userToWallet = new UserWallet();
  44.         $userToWallet->setUser($event->getUserTo());
  45.       }
  46.       $userToWallet->addValue($event->getValue());
  47.       $this->em->persist($userFromWallet);
  48.       $this->em->persist($userToWallet);
  49.       $this->em->flush();
  50.       $this->em->getConnection()->commit();
  51.     } catch (\Exception $e) {
  52.       $this->em->getConnection()->rollBack();
  53.       throw new Exception($e->getMessage());
  54.     }
  55.     $this->notificationService->create(
  56.       $event->getUserTo(),
  57.       Notification::TYPE_CASH_FROM_PARENT_ACCOUNT,
  58.       [
  59.         'user_id' => $event->getUserFrom()->getId(),
  60.         'user_name' => $event->getUserFrom()->getName(),
  61.         'user_avatar_url' => $event->getUserFrom()->getAvatarUrl(),
  62.         'amount' => $event->getValue()
  63.       ]
  64.     );
  65.   }
  66.   public static function getSubscribedEvents()
  67.   {
  68.     return [
  69.       CashTransferredEvent::NAME => 'onCashTransferred'
  70.     ];
  71.   }
  72. }