<?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 Doctrine\ORM\QueryBuilder;
class OrderRequestSingleFieldDataFilter extends AbstractContextAwareFilter
{
const ALLOWED_FIELDS = [
'token' => 'authToken',
'galab_number' => 'articleNumber',
];
/**
* @inheritDoc
*/
protected function filterProperty(
string $property,
$value,
QueryBuilder $queryBuilder,
QueryNameGeneratorInterface $queryNameGenerator,
string $resourceClass,
string $operationName = null
) {
$fields = array_keys(self::ALLOWED_FIELDS);
if (!in_array($property, $fields)) {
return;
}
if ($resourceClass !== OrderRequestRequest::class) {
return;
}
$value = $this->normalizeValue($value);
if ($value === null) {
return;
}
$parameterName = $queryNameGenerator->generateParameterName($property);
$where = sprintf('p.%s = :%s', self::ALLOWED_FIELDS[$property], $parameterName);
$queryBuilder
->andWhere($where)
->setParameter($parameterName, $value);
}
private function normalizeValue($value)
{
return strval($value);
}
/**
* @inheritDoc
*/
public function getDescription(string $resourceClass): array
{
$description = [];
foreach (self::ALLOWED_FIELDS as $field => $propery) {
$description[$field] = [
'property' => $field,
'type' => 'string',
'required' => false,
'schema' => [
'type' => $field,
'description' => sprintf('Filters by the given property %s', $propery),
],
];
}
return $description;
}
}