<?php
namespace App\Service\App\Merchant\EventListener;
use App\Core\Exception\UnexpectedException;
use App\Core\Security\Authenticator\Contract\IMerchantUser;
use App\Core\Security\Contract\ISecurityHelper;
use App\Entity\Merchant\UserActionLogEntity;
use App\Repository\Merchant\Contract\IUserActionLogRepository;
use App\Service\App\Merchant\Event\MerchantUserActionEvent;
use Symfony\Component\HttpFoundation\RequestStack;
class UserActionLogListener
{
/**
* @var ISecurityHelper
*/
private ISecurityHelper $security;
/**
* @var IUserActionLogRepository
*/
private IUserActionLogRepository $repository;
/**
* @var RequestStack
*/
private RequestStack $requestStack;
/**
* UserActionLogListener constructor.
*
* @param ISecurityHelper $security
* @param IUserActionLogRepository $repository
* @param RequestStack $requestStack
*/
public function __construct(ISecurityHelper $security, IUserActionLogRepository $repository, RequestStack $requestStack)
{
$this->security = $security;
$this->repository = $repository;
$this->requestStack = $requestStack;
}
/**
* Handle merchant user action
*
* @param MerchantUserActionEvent $event
* @throws UnexpectedException
*/
public function onAction(MerchantUserActionEvent $event): void
{
$user = $this->security->getUser();
if ($user instanceof IMerchantUser) {
$request = $this->requestStack->getCurrentRequest();
$ip = 'undefined';
if ($request && $request->getClientIp()) {
$ip = $request->getClientIp();
}
$this->repository->addLog(new UserActionLogEntity(
$event->getActionType(),
$event->getObjectType(),
$event->getObjectId(),
$event->getDescription(),
$ip, $user
));
} else {
throw new UnexpectedException('Invalid user type performed action', 500);
}
}
}