<?php
namespace App\EventSubscriber;
use ApiPlatform\Symfony\EventListener\EventPriorities as EventPrioritiesAlias;
use App\Enum\ActivityLogCategoryEnum;
use App\Enum\ActivityLogMethodEnum;
use App\Traits\SentryNotifyTrait;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\ORMException;
use Evo\Infrastructure\MappingORM\ActivityLog;
use Evo\Infrastructure\MappingORM\Organization;
use Evo\Infrastructure\MappingORM\User;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
use Symfony\Component\Security\Core\Security;
class UserSubscriber implements EventSubscriberInterface
{
use SentryNotifyTrait;
private const ROUTE_NAME = 'api_users_put_item';
private Security $security;
private EntityManagerInterface $em;
public function __construct(Security $security, EntityManagerInterface $em)
{
$this->security = $security;
$this->em = $em;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::VIEW => ['onWrite', EventPrioritiesAlias::POST_WRITE],
];
}
/**
* @throws \JsonException
* @throws ORMException
*/
public function onWrite(ViewEvent $event)
{
$entity = $event->getControllerResult();
$request = $event->getRequest();
if (!$request instanceof Request) {
return;
}
if (!$entity instanceof User) {
return;
}
$routeName = $event->getRequest()->attributes->get('_route');
if (self::ROUTE_NAME !== $routeName) {
return;
}
$requestData = json_decode($event->getRequest()->getContent(), true, 512, JSON_THROW_ON_ERROR);
if (isset($requestData['organizations']) && isset($requestData['addedOrganizations'])) {
$token = $this->security->getToken();
if ($token instanceof SwitchUserToken) {
$user = $token->getOriginalToken()->getUser();
} else {
$user = $this->security->getUser();
}
foreach ($requestData['addedOrganizations'] as $orga) {
if ('string' !== gettype($orga)) {
continue;
}
$orgaId = explode('/', $orga);
$orgaId = end($orgaId);
$organization = $this->em->getReference(Organization::class, $orgaId);
$activityLog = ActivityLog::create(
$user,
ActivityLogMethodEnum::CREATE,
'AJOUT USER ID: '.$entity->getId(),
ActivityLogCategoryEnum::USER,
[],
$organization,
null,
$entity->getFullName()
);
$this->em->persist($activityLog);
}
try {
$this->em->flush();
} catch (\Exception $e) {
$this->captureSentryException($e);
}
}
}
}