<?php
namespace FMT\Domain\Listener;
use Doctrine\ORM\NonUniqueResultException;
use Exception;
use FMT\Data\Repository\UserRepository;
use FMT\Data\Repository\UserSchoolShopperRepository;
use FMT\Domain\Service\Cart\NebookService;
use FMT\Data\Entity\User;
use FMT\Domain\Event\UserEvent;
use FMT\Infrastructure\Helper\NotificationHelper;
use FOS\UserBundle\Model\UserInterface;
use Monolog\Logger;
use Psr\Log\LoggerInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Twig\Environment;
/**
* Class UserListener
* @package FMT\Application\Listener
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
*/
class UserListener
{
/**
* @var Logger
*/
private $logger;
/**
* @var NebookService
*/
private $nebookService;
/**
* @var Environment
*/
private $parser;
/**
* @var TokenStorageInterface
*/
private $tokenStorage;
private UserSchoolShopperRepository $userRepository;
/**
* UserListener constructor.
* @param LoggerInterface $logger
* @param NebookService $nebookService
*/
public function __construct(
LoggerInterface $logger,
NebookService $nebookService,
UserSchoolShopperRepository $userSchoolShopperRepository
) {
$this->logger = $logger;
$this->nebookService = $nebookService;
$this->userRepository = $userSchoolShopperRepository;
}
/**
* @param TokenStorageInterface $tokenStorage
* @required
*/
public function setTokenStorage(TokenStorageInterface $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
}
/**
* @param Environment $engine
* @required
*/
public function setEngine(Environment $engine)
{
$this->parser = $engine;
}
/**
* @param UserEvent $event
* @return bool|null
* @throws NonUniqueResultException
*/
public function onUserProfileUpdated(UserEvent $event)
{
$user = $event->getUser();
if (!$user instanceof User || !$user->isStudent()) {
return false;
}
$shopper = $user->getActiveShopper();
try {
if ($shopper && $shopper->getNebookId()) {
$this->nebookService->updateShopper($user);
} else {
$this->nebookService->createShopper($user);
}
return true;
} catch (Exception $e) {
$this->logger->error($e->getMessage());
$this->logger->debug($user);
}
return false;
}
/**
* @param UserEvent $event
*/
public function onContactSignupInitiated(UserEvent $event)
{
$donor = $event->getUser();
if (!$donor instanceof UserInterface || !$donor->isAnyDonor()) {
return;
}
try {
$message = $this->parser->render('@Public/emails/donor_invitation.email.twig', [
'donor' => $donor,
'student' => $this->tokenStorage->getToken()->getUser(),
]);
$recipient = $donor->getProfile()->getEmail();
NotificationHelper::submitFromTemplate($message, $recipient);
} catch (Exception $exception) {
$this->logger->error($exception->getMessage());
}
}
}