<?php
namespace App\DataFilter;
use ApiPlatform\Core\Bridge\Doctrine\Common\Filter\OrderFilterInterface;
use ApiPlatform\Core\Bridge\Doctrine\Common\Filter\OrderFilterTrait;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\AbstractContextAwareFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use App\Request\OrderRequestRequest;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Serializer\NameConverter\NameConverterInterface;
class OrderRequestOrderDataFilter extends AbstractContextAwareFilter implements OrderFilterInterface
{
use OrderFilterTrait;
public function __construct(
ManagerRegistry $managerRegistry,
?RequestStack $requestStack = null,
string $orderParameterName = 'order',
LoggerInterface $logger = null,
array $properties = null,
NameConverterInterface $nameConverter = null
) {
parent::__construct($managerRegistry, $requestStack, $logger, $properties, $nameConverter);
$this->orderParameterName = $orderParameterName;
}
protected function getProperties(): ?array
{
return [
'createdAt' => ['default_direction' => strtolower(self::DIRECTION_DESC)],
'updatedAt' => ['default_direction' => strtolower(self::DIRECTION_DESC)],
];
}
protected function isPropertyMapped(string $property, string $resourceClass, bool $allowAssociation = false): bool
{
return in_array($property, array_keys($this->getProperties()));
}
/**
* @inheritDoc
*/
protected function filterProperty(
string $property,
$value,
QueryBuilder $queryBuilder,
QueryNameGeneratorInterface $queryNameGenerator,
string $resourceClass,
string $operationName = null
) {
if ($property !== $this->orderParameterName) {
return;
}
if ($resourceClass !== OrderRequestRequest::class) {
return;
}
$properties = array_keys($this->getProperties());
foreach ($value as $property => $direction) {
if (!in_array($property, $properties)) {
continue;
}
$direction = $this->normalizeValue($direction, $property);
if ($direction === null) {
continue;
}
$queryBuilder->addOrderBy(sprintf('p.%s', $property), $direction);
}
}
}