<?php
namespace App\EventSubscribers\Main;
use App\Entity\Main\Cart;
use App\Entity\Main\User;
use App\Events\Main\User\UserAnonymizedEvent;
use App\Events\Main\User\UserCreatedEvent;
use App\Events\Main\User\UserMadeChargebackEvent;
use App\Events\Main\User\UserMadeRefundEvent;
use App\Events\Main\User\UserRegisteredEvent;
use App\Services\CartManager;
use App\Services\EmailManager;
use App\Services\Setup;
use App\Services\ReferralProgramManager;
use App\Services\UserManager;
use App\Services\UserStorage;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\NonUniqueResultException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
/**
* Class UserSubscriber
* @package App\EventSubscribers\Main
*/
class UserSubscriber implements EventSubscriberInterface
{
const
REWARD_APPLYING = 'reward.applying',
SECURITY_INTERACTIVE_LOGIN = 'security.interactive_login',
USER_MAKE_REFUND = 'user.make.refund',
USER_MAKE_CHARGEBACK = 'user.make.chargeback',
USER_ANONYMIZED = 'user.anonymized',
USER_CREATED = 'user.created'
;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var CartManager
*/
private $cartFactory;
private $setup;
/**
* @var ReferralProgramManager
*/
private $referralProgramManager;
/**
* @var EmailManager
*/
private $emailFactory;
private KernelInterface $kernel;
private UserStorage $userStorage;
/**
* UserSubscriber constructor.
* @param EntityManagerInterface $entityManager
* @param CartManager $cartFactory
* @param ReferralProgramManager $referralProgramManager
* @param EmailManager $emailFactory
* @param KernelInterface $kernel
* @param UserStorage $userStorage
*/
public function __construct(
EntityManagerInterface $entityManager,
CartManager $cartFactory,
ReferralProgramManager $referralProgramManager,
EmailManager $emailFactory,
KernelInterface $kernel,
UserStorage $userStorage,
private UserManager $userManager
) {
$this->entityManager = $entityManager;
$this->cartFactory = $cartFactory;
$this->referralProgramManager = $referralProgramManager;
$this->emailFactory = $emailFactory;
$this->kernel = $kernel;
$this->userStorage = $userStorage;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return array(
self::SECURITY_INTERACTIVE_LOGIN => "userLoggedIn",
self::REWARD_APPLYING => "rewardApplying",
self::USER_MAKE_REFUND => "userMakeRefund",
self::USER_MAKE_CHARGEBACK => "userMakeChargeBack",
self::USER_ANONYMIZED => "userAnonymizedEmail",
self::USER_CREATED => "userCreated",
);
}
/**
* @param InteractiveLoginEvent $event
*/
public function userLoggedIn(InteractiveLoginEvent $event)
{
$this->setup = Setup::createFromEnvironment($this->cartFactory);
$cart = $this->setup->getCart();
if (!$cart instanceof Cart) {
return;
}
// If we are in a reset password procedure, we assign the user to the cart.
if (null === $cart->getUser()) {
$cart->setUser($this->setup->getUser());
$this->entityManager->flush();
}
}
/**
* @param UserRegisteredEvent $event
* @throws NonUniqueResultException
*/
public function rewardApplying(UserRegisteredEvent $event)
{
$tracking = $event->getTracking();
$user = $event->getUser();
$this->referralProgramManager->applyForReward($tracking, $user, $event->getSite());
}
/**
* @param UserMadeRefundEvent $event
*/
public function userMakeRefund(UserMadeRefundEvent $event)
{
$user = $event->getUser();
// Disable all promo codes for the user who make refund.
$this->referralProgramManager->disableUserPromoCodes($user);
}
/**
* @param UserMadeChargebackEvent $event
*/
public function userMakeChargeBack(UserMadeChargebackEvent $event)
{
$user = $event->getUser();
// Disable all promo codes for the user who make charge back.
$this->referralProgramManager->disableUserPromoCodes($user);
}
/**
* @param UserAnonymizedEvent $event
* @throws \Twig\Error\LoaderError
* @throws \Twig\Error\RuntimeError
* @throws \Twig\Error\SyntaxError
*/
public function userAnonymizedEmail(UserAnonymizedEvent $event)
{
$user = $event->getUser();
$this->emailFactory->sendUserAnonymizedEmail($user);
}
/**
* @param UserCreatedEvent $event
*/
public function userCreated(UserCreatedEvent $event)
{
$user = $event->getUser();
$this->userManager->updateUser($user);
$this->userStorage->setUser($user);
}
}