<?php
declare(strict_types=1);
namespace App\Point\EventSubscriber;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Point\Doctrine\Entity\Transaction;
use App\Point\Doctrine\Entity\Wallet;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\KernelEvents;
final class CollectionByAccountReadSubscriber implements EventSubscriberInterface
{
/**
* @return array<string, array<int, array<int, int|string>>>
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::CONTROLLER => [
['hasFilter', EventPriorities::PRE_READ],
],
];
}
public function hasFilter(ControllerEvent $event): void
{
$resource = $event->getRequest()->attributes->get('_api_resource_class');
if (!in_array($resource, [Wallet::class, Transaction::class], true)) {
return;
}
$controller = $event->getRequest()->attributes->get('_controller');
if ('api_platform.action.get_collection' !== $controller) {
return;
}
if (
!$event->getRequest()->query->has('account')
|| '' === $event->getRequest()->query->get('account')
) {
throw new BadRequestHttpException('Filter `account` is required');
}
}
}