src/EventSubscriber/RegistryEntryCreator.php line 52

  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface,
  4.     Symfony\Component\HttpKernel\Event\ViewEvent,
  5.     Symfony\Component\HttpKernel\KernelEvents,
  6.     Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface,
  7.     Symfony\Component\HttpFoundation\Request;
  8. use ApiPlatform\Symfony\EventListener\EventPriorities,
  9.     ApiPlatform\Api\IriConverterInterface;
  10. use App\Entity\Admin,
  11.     App\Entity\RegistryEntry,
  12.     App\Repository\AdminRepository,
  13.     App\Repository\RegistryEntryRepository;
  14. final class RegistryEntryCreator implements EventSubscriberInterface
  15. {
  16.     const ATTRIBUTE_API_RESOURCE_CLASS '_api_resource_class';
  17.     const ATTRIBUTE_API_OPERATION_NAME '_api_operation_name';
  18.     const ATTRIBUTE_API_WRITE_ITEM_IRI '_api_write_item_iri';
  19.     const ATTRIBUTE_UUID 'uuid';
  20.     const ATTRIBUTE_DATA 'data';
  21.     private AdminRepository $adminRepository;
  22.     private RegistryEntryRepository $registryEntryRepository;
  23.     private TokenStorageInterface $tokenStorage;
  24.     private IriConverterInterface $iriConverter;
  25.     public function __construct(
  26.         AdminRepository $adminRepository,
  27.         RegistryEntryRepository $registryEntryRepository,
  28.         TokenStorageInterface $tokenStorage,
  29.         IriConverterInterface $iriConverter
  30.     ) {
  31.         $this->adminRepository $adminRepository;
  32.         $this->registryEntryRepository $registryEntryRepository;
  33.         $this->tokenStorage $tokenStorage;
  34.         $this->iriConverter $iriConverter;
  35.     }
  36.     public static function getSubscribedEvents(): array
  37.     {
  38.         return [
  39.             KernelEvents::VIEW => [
  40.                 ['create'EventPriorities::POST_WRITE]
  41.             ]
  42.         ];
  43.     }
  44.     public function create(ViewEvent $event): void
  45.     {
  46.         if (! $event->isMainRequest()) {
  47.             return;
  48.         }
  49.         $admin $this->tokenStorage->getToken()?->getUser();
  50.         if (! $admin instanceof Admin) {
  51.             return;
  52.         }
  53.         $admin->setLastActivityAt(new \DateTimeImmutable());
  54.         $this->adminRepository->persist($admintrue);
  55.         $request $event->getRequest();
  56.         $resourceClass $request->attributes->get(self::ATTRIBUTE_API_RESOURCE_CLASS);
  57.         if (! $resourceClass || $request->isMethod(Request::METHOD_GET)) {
  58.             return;
  59.         }
  60.         $registryEntry = new RegistryEntry(
  61.             admin$admin,
  62.             username$admin->getUserIdentifier(),
  63.             operationName$request->attributes->get(self::ATTRIBUTE_API_OPERATION_NAME),
  64.             resourceClass$request->attributes->get(self::ATTRIBUTE_API_RESOURCE_CLASS),
  65.             resourceUuid$this->getResourceUuid($request),
  66.             inputData$request->attributes->get(self::ATTRIBUTE_DATA),
  67.             requestMethod$request->getMethod(),
  68.             requestUri$request->getPathInfo(),
  69.             ip$request->getClientIp() ?? 'unknown',
  70.         );
  71.         $this->registryEntryRepository->persist($registryEntrytrue);
  72.         return;
  73.     }
  74.     private function getResourceUuid(Request $request): ?string
  75.     {
  76.         if ($request->attributes->get(self::ATTRIBUTE_UUID)) {
  77.             return $request->attributes->get(self::ATTRIBUTE_UUID);
  78.         }
  79.         $data $request->attributes->get(self::ATTRIBUTE_DATA);
  80.         if (is_object($data) && property_exists($dataself::ATTRIBUTE_UUID)) {
  81.             return $data->{'get' ucfirst(self::ATTRIBUTE_UUID)}()->toString();
  82.         }
  83.         return $this->getIri($request);
  84.     }
  85.     private function getIri(Request $request): ?string
  86.     {
  87.         if (! $iri $request->attributes->get(self::ATTRIBUTE_API_WRITE_ITEM_IRI)) {
  88.             return null;
  89.         }
  90.         try {
  91.             $data $this->iriConverter->getResourceFromIri($iri);
  92.             return $data->getUuid()->toString();
  93.         } catch (\Exception $e) {
  94.             return $iri;
  95.         }
  96.     }
  97. }