Skip to content

Commit

Permalink
xml, yaml, priority parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
soyuka committed Mar 21, 2024
1 parent be23af4 commit ed7a9e6
Show file tree
Hide file tree
Showing 28 changed files with 423 additions and 59 deletions.
76 changes: 76 additions & 0 deletions src/Doctrine/Orm/Extension/ParameterExtension.php
@@ -0,0 +1,76 @@
<?php

/*
* This file is part of the API Platform project.
*
* (c) Kévin Dunglas <dunglas@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace ApiPlatform\Doctrine\Orm\Extension;

use ApiPlatform\Doctrine\Orm\Filter\FilterInterface;
use ApiPlatform\Doctrine\Orm\Filter\OrderFilter;
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use ApiPlatform\Exception\InvalidArgumentException;
use ApiPlatform\Metadata\HeaderParameterInterface;
use ApiPlatform\Metadata\Operation;
use Doctrine\ORM\QueryBuilder;
use Psr\Container\ContainerInterface;

/**
* @author Antoine Bluchet <soyuka@gmail.com>
*/
final class ParameterExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
{
public function __construct(private readonly ContainerInterface $filterLocator)
{
}

private function applyFilter(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, ?string $resourceClass = null, ?Operation $operation = null, array $context = []) {
if (!($request = $context['request'] ?? null)) {
return;
}

if (null === $resourceClass) {
throw new InvalidArgumentException('The "$resourceClass" parameter must not be null');
}

foreach ($operation->getParameters() ?? [] as $parameter) {
$key = $parameter->getKey();
if (null === ($filterId = $parameter->getFilter())) {
continue;
}

$parameters = $parameter instanceof HeaderParameterInterface ? $request->attributes->get('_api_header_parameters') : $request->attributes->get('_api_query_parameters');
if (!isset($parameters[$key])) {
continue;
}

$filter = $this->filterLocator->has($filterId) ? $this->filterLocator->get($filterId) : null;
if ($filter instanceof FilterInterface) {
$filter->apply($queryBuilder, $queryNameGenerator, $resourceClass, $operation, ['filters' => [$parameter->getProperty() ?? $key => $parameters[$key]]] + $context);
}
}
}

/**
* {@inheritdoc}
*/
public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, ?string $resourceClass = null, ?Operation $operation = null, array $context = []): void
{
$this->applyFilter($queryBuilder, $queryNameGenerator, $resourceClass, $operation, $context);
}

/**
* {@inheritdoc}
*/
public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, ?Operation $operation = null, array $context = []): void
{
$this->applyFilter($queryBuilder, $queryNameGenerator, $resourceClass, $operation, $context);
}
}
3 changes: 2 additions & 1 deletion src/Hydra/Serializer/CollectionFiltersNormalizer.php
Expand Up @@ -19,6 +19,7 @@
use ApiPlatform\Doctrine\Orm\State\Options;
use ApiPlatform\Metadata\FilterInterface;
use ApiPlatform\Metadata\Parameter;
use ApiPlatform\Metadata\Parameters;
use ApiPlatform\Metadata\QueryParameterInterface;
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
use ApiPlatform\Metadata\ResourceClassResolverInterface;
Expand Down Expand Up @@ -150,7 +151,7 @@ public function setNormalizer(NormalizerInterface $normalizer): void
* @param LegacyFilterInterface[]|FilterInterface[] $filters
* @param array<string, Parameter> $parameters
*/
private function getSearch(string $resourceClass, array $parts, array $filters, ?array $parameters): array
private function getSearch(string $resourceClass, array $parts, array $filters, null|array|Parameters $parameters): array
{
$variables = [];
$mapping = [];
Expand Down
2 changes: 1 addition & 1 deletion src/Metadata/ApiResource.php
Expand Up @@ -960,7 +960,7 @@ public function __construct(
$provider = null,
$processor = null,
protected ?OptionsInterface $stateOptions = null,
protected ?array $parameters = null,
protected null|array|Parameters $parameters = null,
protected array $extraProperties = [],
) {
parent::__construct(
Expand Down
2 changes: 2 additions & 0 deletions src/Metadata/Delete.php
Expand Up @@ -94,6 +94,7 @@ public function __construct(
$provider = null,
$processor = null,
?OptionsInterface $stateOptions = null,
null|array|Parameters $parameters = null,
array $extraProperties = [],
) {
parent::__construct(
Expand Down Expand Up @@ -170,6 +171,7 @@ class: $class,
processor: $processor,
extraProperties: $extraProperties,
collectDenormalizationErrors: $collectDenormalizationErrors,
parameters: $parameters,
stateOptions: $stateOptions,
);
}
Expand Down
21 changes: 21 additions & 0 deletions src/Metadata/Extractor/XmlResourceExtractor.php
Expand Up @@ -515,6 +515,27 @@ private function buildParameters(\SimpleXMLElement $resource): ?array
key: $key,
required: $this->phpize($parameter, 'required', 'bool'),
schema: isset($parameter->schema->values) ? $this->buildValues($parameter->schema->values) : null,
openApi: isset($parameter->openapi) ? new OpenApiParameter(
name: $this->phpize($parameter->openapi, 'name', 'string'),
in: $this->phpize($parameter->openapi, 'in', 'string'),
description: $this->phpize($parameter->openapi, 'description', 'string'),
required: $this->phpize($parameter->openapi, 'required', 'bool'),
deprecated: $this->phpize($parameter->openapi, 'deprecated', 'bool'),
allowEmptyValue: $this->phpize($parameter->openapi, 'allowEmptyValue', 'bool'),
schema: isset($parameter->openapi->schema->values) ? $this->buildValues($parameter->openapi->schema->values) : null,
style: $this->phpize($parameter->openapi, 'style', 'string'),
explode: $this->phpize($parameter->openapi, 'explode', 'bool'),
allowReserved: $this->phpize($parameter->openapi, 'allowReserved', 'bool'),
example: $this->phpize($parameter->openapi, 'example', 'string'),
examples: isset($parameter->openapi->examples->values) ? new \ArrayObject($this->buildValues($parameter->openapi->examples->values)) : null,
content: isset($parameter->openapi->content->values) ? new \ArrayObject($this->buildValues($parameter->openapi->content->values)) : null,
) : null,
provider: $this->phpize($parameter, 'provider', 'string'),
filter: $this->phpize($parameter, 'filter', 'string'),
property: $this->phpize($parameter, 'property', 'string'),
description: $this->phpize($parameter, 'description', 'string'),
priority: $this->phpize($parameter, 'priority', 'integer'),
extraProperties: $this->buildExtraProperties($parameter, 'extraProperties'),
);
}

Expand Down
23 changes: 22 additions & 1 deletion src/Metadata/Extractor/YamlResourceExtractor.php
Expand Up @@ -469,7 +469,28 @@ private function buildParameters(array $resource): ?array
$parameters[$key] = new $cl(
key: $key,
required: $this->phpize($parameter, 'required', 'bool'),
schema: $parameter['schema']
schema: $parameter['schema'],
openapi: ($parameter['openapi'] ?? null) ? new Parameter(
name: $parameter['openapi']['name'],
in: $parameter['in'] ?? 'query',
description: $parameter['openapi']['description'] ?? '',
required: $parameter['openapi']['required'] ?? $parameter['required'] ?? false,
deprecated: $parameter['openapi']['deprecated'] ?? false,
allowEmptyValue: $parameter['openapi']['allowEmptyValue'] ?? false,
schema: $parameter['openapi']['schema'] ?? $parameter['schema'] ?? [],
style: $parameter['openapi']['style'] ?? null,
explode: $parameter['openapi']['explode'] ?? false,
allowReserved: $parameter['openapi']['allowReserved '] ?? false,
example: $parameter['openapi']['example'] ?? null,
examples: isset($parameter['openapi']['examples']) ? new \ArrayObject($parameter['openapi']['examples']) : null,
content: isset($parameter['openapi']['content']) ? new \ArrayObject($parameter['openapi']['content']) : null
) : null,
provider: $this->phpize($parameter, 'provider', 'string'),
filter: $this->phpize($parameter, 'filter', 'string'),
property: $this->phpize($parameter, 'property', 'string'),
description: $this->phpize($parameter, 'description', 'string'),
priority: $this->phpize($parameter, 'priority', 'integer'),
extraProperties: $this->buildArrayValue($resource, 'extraProperties'),
);
}

Expand Down
2 changes: 1 addition & 1 deletion src/Metadata/Get.php
Expand Up @@ -94,7 +94,7 @@ public function __construct(
$provider = null,
$processor = null,
?OptionsInterface $stateOptions = null,
?array $parameters = null,
null|array|Parameters $parameters = null,
array $extraProperties = [],
) {
parent::__construct(
Expand Down
2 changes: 1 addition & 1 deletion src/Metadata/GetCollection.php
Expand Up @@ -94,7 +94,7 @@ public function __construct(
$provider = null,
$processor = null,
?OptionsInterface $stateOptions = null,
?array $parameters = null,
null|array|Parameters $parameters = null,
array $extraProperties = [],
private ?string $itemUriTemplate = null,
) {
Expand Down
3 changes: 2 additions & 1 deletion src/Metadata/GraphQl/Operation.php
Expand Up @@ -15,6 +15,7 @@

use ApiPlatform\Metadata\Link;
use ApiPlatform\Metadata\Operation as AbstractOperation;
use ApiPlatform\Metadata\Parameters;
use ApiPlatform\State\OptionsInterface;

class Operation extends AbstractOperation
Expand Down Expand Up @@ -84,7 +85,7 @@ public function __construct(
$provider = null,
$processor = null,
?OptionsInterface $stateOptions = null,
?array $parameters = null,
null|array|Parameters $parameters = null,
array $extraProperties = []
) {
parent::__construct(
Expand Down
3 changes: 2 additions & 1 deletion src/Metadata/GraphQl/Query.php
Expand Up @@ -13,6 +13,7 @@

namespace ApiPlatform\Metadata\GraphQl;

use ApiPlatform\Metadata\Parameters;
use ApiPlatform\State\OptionsInterface;

#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::IS_REPEATABLE)]
Expand Down Expand Up @@ -68,7 +69,7 @@ public function __construct(
$provider = null,
$processor = null,
?OptionsInterface $stateOptions = null,
?array $parameters = null,
null|array|Parameters $parameters = null,
array $extraProperties = [],

protected ?bool $nested = null,
Expand Down
3 changes: 2 additions & 1 deletion src/Metadata/GraphQl/QueryCollection.php
Expand Up @@ -14,6 +14,7 @@
namespace ApiPlatform\Metadata\GraphQl;

use ApiPlatform\Metadata\CollectionOperationInterface;
use ApiPlatform\Metadata\Parameters;
use ApiPlatform\State\OptionsInterface;

#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::IS_REPEATABLE)]
Expand Down Expand Up @@ -69,7 +70,7 @@ public function __construct(
$provider = null,
$processor = null,
protected ?OptionsInterface $stateOptions = null,
?array $parameters = null,
null|array|Parameters $parameters = null,
array $extraProperties = [],

?bool $nested = null,
Expand Down
3 changes: 2 additions & 1 deletion src/Metadata/GraphQl/Subscription.php
Expand Up @@ -13,6 +13,7 @@

namespace ApiPlatform\Metadata\GraphQl;

use ApiPlatform\Metadata\Parameters;
use ApiPlatform\State\OptionsInterface;

#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::IS_REPEATABLE)]
Expand Down Expand Up @@ -68,7 +69,7 @@ public function __construct(
$provider = null,
$processor = null,
?OptionsInterface $stateOptions = null,
?array $parameters = null,
null|array|Parameters $parameters = null,
array $extraProperties = [],
) {
parent::__construct(
Expand Down
2 changes: 1 addition & 1 deletion src/Metadata/HttpOperation.php
Expand Up @@ -200,7 +200,7 @@ public function __construct(
$provider = null,
$processor = null,
?OptionsInterface $stateOptions = null,
?array $parameters = null,
null|array|Parameters $parameters = null,
array $extraProperties = [],
) {
parent::__construct(
Expand Down
8 changes: 4 additions & 4 deletions src/Metadata/Metadata.php
Expand Up @@ -30,7 +30,7 @@ abstract class Metadata
* @param mixed|null $output
* @param mixed|null $provider
* @param mixed|null $processor
* @param array<string, Parameter> $parameters
* @param Parameters|array<string, Parameter> $parameters
*/
public function __construct(
protected ?string $shortName = null,
Expand Down Expand Up @@ -73,7 +73,7 @@ public function __construct(
/**
* @experimental
*/
protected ?array $parameters = [],
protected null|array|Parameters $parameters = [],
protected array $extraProperties = []
) {
}
Expand Down Expand Up @@ -574,12 +574,12 @@ public function withStateOptions(?OptionsInterface $stateOptions): static
/**
* @return array<string, Parameter>
*/
public function getParameters(): ?array
public function getParameters(): null|array|Parameters
{
return $this->parameters;
}

public function withParameters(array $parameters): static
public function withParameters(array|Parameters $parameters): static
{
$self = clone $this;
$self->parameters = $parameters;
Expand Down
2 changes: 1 addition & 1 deletion src/Metadata/Operation.php
Expand Up @@ -806,7 +806,7 @@ public function __construct(
protected $provider = null,
protected $processor = null,
protected ?OptionsInterface $stateOptions = null,
protected ?array $parameters = [],
protected null|array|Parameters $parameters = [],
protected array $extraProperties = [],
) {
parent::__construct(
Expand Down
14 changes: 14 additions & 0 deletions src/Metadata/Parameter.php
Expand Up @@ -36,6 +36,7 @@ public function __construct(
protected ?string $property = null,
protected ?string $description = null,
protected ?bool $required = null,
protected ?int $priority = null,
protected array $extraProperties = [],
) {
}
Expand Down Expand Up @@ -83,6 +84,11 @@ public function getRequired(): ?bool
return $this->required;
}

public function getPriority(): ?int
{
return $this->priority;
}

/**
* @return array<string, mixed>
*/
Expand All @@ -99,6 +105,14 @@ public function withKey(string $key): static
return $self;
}

public function withPriority(int $priority): static
{
$self = clone $this;
$self->priority = $priority;

return $self;
}

/**
* @param array{type?: string} $schema
*/
Expand Down

0 comments on commit ed7a9e6

Please sign in to comment.