<?php
namespace App\DataFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\AbstractContextAwareFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use App\Request\OrderRequestRequest;
use App\Service\OrderRequestStateHandler;
use Doctrine\ORM\QueryBuilder;
class OrderRequestStateDataFilter extends AbstractContextAwareFilter
{
/**
* @inheritDoc
*/
protected function filterProperty(
string $property,
$value,
QueryBuilder $queryBuilder,
QueryNameGeneratorInterface $queryNameGenerator,
string $resourceClass,
string $operationName = null
) {
if ($property !== 'state') {
return;
}
if ($resourceClass !== OrderRequestRequest::class) {
return;
}
$value = $this->normalizeValue($value);
if ($value === null) {
return;
}
$parameterName = $queryNameGenerator->generateParameterName($property);
$where = sprintf('p.state = :%s', $parameterName);
if (is_array($value)) {
$where = sprintf('p.state IN (:%s)', $parameterName);
}
$queryBuilder
->andWhere($where)
->setParameter($parameterName, $value);
}
private function normalizeValue($value)
{
$value = strtolower($value);
if (strpos($value, '|') !== false) {
$value = explode('|', $value);
}
if (is_array($value)) {
return array_filter(
array_map([$this, 'normalizeValue'], $value),
function ($value) {
return $value !== null;
}
);
}
if (!in_array($value, OrderRequestStateHandler::getStates())) {
return null;
}
return $value;
}
/**
* @inheritDoc
*/
public function getDescription(string $resourceClass): array
{
$description = [
'state' => [
'property' => 'state',
'type' => 'string',
'required' => false,
'schema' => [
'type' => 'string',
'description' => 'Filters by the given state, you can use Pipe symbol for multiple states',
'enum' => OrderRequestStateHandler::getStates(),
],
],
];
return $description;
}
}