<?php
namespace App\EventListener;
use App\Enum\Location\LocationIdEnum;
use App\Service\UserActivityService;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Http\Event\SwitchUserEvent;
use Symfony\Component\Security\Http\SecurityEvents;
class SwitchUserSubscriber implements EventSubscriberInterface
{
/** @var UserActivityService */
private $userActivityService;
/**
* @param UserActivityService $userActivityService
*/
public function __construct(UserActivityService $userActivityService){
$this->userActivityService = $userActivityService;
}
/**
* @param SwitchUserEvent $event
* @return void
*/
public function onSwitchUser(SwitchUserEvent $event): void
{
$request = $event->getRequest();
$refer = $request->headers->get('referer');
$refer = explode("/", $refer);
if($refer[3] === 'admin'){
$locationId = LocationIdEnum::LOCATION_ID_ADMINISTRATION_OFFICE;
}
if($refer[3] === 'company'){
// currently not supported. no way to auto choose a location
$companyId = $refer[4];
$locationId = LocationIdEnum::LOCATION_ID_ADMINISTRATION_OFFICE;
}
if($refer[3] === 'client'){
$locationId = $refer[4];
}
if($request->get('_switch_user') != '_exit') {
$this->userActivityService->logUserActivity(LoggableListener::ACTION_IMPERSONATE, $event->getTargetUser(), $locationId, $event->getToken()->getOriginalToken()->getUser());
}
}
public static function getSubscribedEvents(): array
{
return [
// constant for security.switch_user
SecurityEvents::SWITCH_USER => 'onSwitchUser',
];
}
}