Skip to content

Commit 62af874

Browse files
authored
feat: use openapi array to validate filter parameters (#5114)
* feat: use openapi array to validate filter parameters The filter validators were only using the 'swagger' entry from the filter description. It should also use the 'openapi' entry, as swagger is deprecated. * test(filters): test using openapi for query parameters validation
1 parent 6e2f920 commit 62af874

15 files changed

+710
-14
lines changed

src/Api/QueryParameterValidator/Validator/ArrayItems.php

+8-4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
final class ArrayItems implements ValidatorInterface
1717
{
18+
use CheckFilterDeprecationsTrait;
19+
1820
/**
1921
* {@inheritdoc}
2022
*/
@@ -24,9 +26,11 @@ public function validate(string $name, array $filterDescription, array $queryPar
2426
return [];
2527
}
2628

27-
$maxItems = $filterDescription['swagger']['maxItems'] ?? null;
28-
$minItems = $filterDescription['swagger']['minItems'] ?? null;
29-
$uniqueItems = $filterDescription['swagger']['uniqueItems'] ?? false;
29+
$this->checkFilterDeprecations($filterDescription);
30+
31+
$maxItems = $filterDescription['openapi']['maxItems'] ?? $filterDescription['swagger']['maxItems'] ?? null;
32+
$minItems = $filterDescription['openapi']['minItems'] ?? $filterDescription['swagger']['minItems'] ?? null;
33+
$uniqueItems = $filterDescription['openapi']['uniqueItems'] ?? $filterDescription['swagger']['uniqueItems'] ?? false;
3034

3135
$errorList = [];
3236

@@ -60,7 +64,7 @@ private function getValue(string $name, array $filterDescription, array $queryPa
6064
return $value;
6165
}
6266

63-
$collectionFormat = $filterDescription['swagger']['collectionFormat'] ?? 'csv';
67+
$collectionFormat = $filterDescription['openapi']['collectionFormat'] ?? $filterDescription['swagger']['collectionFormat'] ?? 'csv';
6468

6569
return explode(self::getSeparator($collectionFormat), (string) $value) ?: []; // @phpstan-ignore-line
6670
}

src/Api/QueryParameterValidator/Validator/Bounds.php

+8-4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
final class Bounds implements ValidatorInterface
1717
{
18+
use CheckFilterDeprecationsTrait;
19+
1820
/**
1921
* {@inheritdoc}
2022
*/
@@ -25,21 +27,23 @@ public function validate(string $name, array $filterDescription, array $queryPar
2527
return [];
2628
}
2729

28-
$maximum = $filterDescription['swagger']['maximum'] ?? null;
29-
$minimum = $filterDescription['swagger']['minimum'] ?? null;
30+
$this->checkFilterDeprecations($filterDescription);
31+
32+
$maximum = $filterDescription['openapi']['maximum'] ?? $filterDescription['swagger']['maximum'] ?? null;
33+
$minimum = $filterDescription['openapi']['minimum'] ?? $filterDescription['swagger']['minimum'] ?? null;
3034

3135
$errorList = [];
3236

3337
if (null !== $maximum) {
34-
if (($filterDescription['swagger']['exclusiveMaximum'] ?? false) && $value >= $maximum) {
38+
if (($filterDescription['openapi']['exclusiveMaximum'] ?? $filterDescription['swagger']['exclusiveMaximum'] ?? false) && $value >= $maximum) {
3539
$errorList[] = sprintf('Query parameter "%s" must be less than %s', $name, $maximum);
3640
} elseif ($value > $maximum) {
3741
$errorList[] = sprintf('Query parameter "%s" must be less than or equal to %s', $name, $maximum);
3842
}
3943
}
4044

4145
if (null !== $minimum) {
42-
if (($filterDescription['swagger']['exclusiveMinimum'] ?? false) && $value <= $minimum) {
46+
if (($filterDescription['openapi']['exclusiveMinimum'] ?? $filterDescription['swagger']['exclusiveMinimum'] ?? false) && $value <= $minimum) {
4347
$errorList[] = sprintf('Query parameter "%s" must be greater than %s', $name, $minimum);
4448
} elseif ($value < $minimum) {
4549
$errorList[] = sprintf('Query parameter "%s" must be greater than or equal to %s', $name, $minimum);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the API Platform project.
5+
*
6+
* (c) Kévin Dunglas <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace ApiPlatform\Api\QueryParameterValidator\Validator;
15+
16+
/**
17+
* @internal
18+
*/
19+
trait CheckFilterDeprecationsTrait
20+
{
21+
protected function checkFilterDeprecations(array $filterDescription): void
22+
{
23+
if (\array_key_exists('swagger', $filterDescription)) {
24+
trigger_deprecation(
25+
'api-platform/core',
26+
'3.0',
27+
'Using the "swagger" key in filters description is deprecated, use "openapi" instead.'
28+
);
29+
}
30+
}
31+
}

src/Api/QueryParameterValidator/Validator/Enum.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
final class Enum implements ValidatorInterface
1717
{
18+
use CheckFilterDeprecationsTrait;
19+
1820
/**
1921
* {@inheritdoc}
2022
*/
@@ -25,7 +27,9 @@ public function validate(string $name, array $filterDescription, array $queryPar
2527
return [];
2628
}
2729

28-
$enum = $filterDescription['swagger']['enum'] ?? null;
30+
$this->checkFilterDeprecations($filterDescription);
31+
32+
$enum = $filterDescription['openapi']['enum'] ?? $filterDescription['swagger']['enum'] ?? null;
2933

3034
if (null !== $enum && !\in_array($value, $enum, true)) {
3135
return [

src/Api/QueryParameterValidator/Validator/Length.php

+6-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
final class Length implements ValidatorInterface
1717
{
18+
use CheckFilterDeprecationsTrait;
19+
1820
/**
1921
* {@inheritdoc}
2022
*/
@@ -25,8 +27,10 @@ public function validate(string $name, array $filterDescription, array $queryPar
2527
return [];
2628
}
2729

28-
$maxLength = $filterDescription['swagger']['maxLength'] ?? null;
29-
$minLength = $filterDescription['swagger']['minLength'] ?? null;
30+
$this->checkFilterDeprecations($filterDescription);
31+
32+
$maxLength = $filterDescription['openapi']['maxLength'] ?? $filterDescription['swagger']['maxLength'] ?? null;
33+
$minLength = $filterDescription['openapi']['minLength'] ?? $filterDescription['swagger']['minLength'] ?? null;
3034

3135
$errorList = [];
3236

src/Api/QueryParameterValidator/Validator/MultipleOf.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
final class MultipleOf implements ValidatorInterface
1717
{
18+
use CheckFilterDeprecationsTrait;
19+
1820
/**
1921
* {@inheritdoc}
2022
*/
@@ -25,7 +27,9 @@ public function validate(string $name, array $filterDescription, array $queryPar
2527
return [];
2628
}
2729

28-
$multipleOf = $filterDescription['swagger']['multipleOf'] ?? null;
30+
$this->checkFilterDeprecations($filterDescription);
31+
32+
$multipleOf = $filterDescription['openapi']['multipleOf'] ?? $filterDescription['swagger']['multipleOf'] ?? null;
2933

3034
if (null !== $multipleOf && 0 !== ($value % $multipleOf)) {
3135
return [

src/Api/QueryParameterValidator/Validator/Pattern.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
final class Pattern implements ValidatorInterface
1717
{
18+
use CheckFilterDeprecationsTrait;
19+
1820
/**
1921
* {@inheritdoc}
2022
*/
@@ -25,7 +27,9 @@ public function validate(string $name, array $filterDescription, array $queryPar
2527
return [];
2628
}
2729

28-
$pattern = $filterDescription['swagger']['pattern'] ?? null;
30+
$this->checkFilterDeprecations($filterDescription);
31+
32+
$pattern = $filterDescription['openapi']['pattern'] ?? $filterDescription['swagger']['pattern'] ?? null;
2933

3034
if (null !== $pattern && !preg_match($pattern, $value)) {
3135
return [

src/Api/QueryParameterValidator/Validator/Required.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
final class Required implements ValidatorInterface
1919
{
20+
use CheckFilterDeprecationsTrait;
21+
2022
/**
2123
* {@inheritdoc}
2224
*/
@@ -34,8 +36,10 @@ public function validate(string $name, array $filterDescription, array $queryPar
3436
];
3537
}
3638

39+
$this->checkFilterDeprecations($filterDescription);
40+
3741
// if query param is empty and the configuration does not allow it
38-
if (!($filterDescription['swagger']['allowEmptyValue'] ?? false) && empty($this->requestGetQueryParameter($queryParameters, $name))) {
42+
if (!($filterDescription['openapi']['allowEmptyValue'] ?? $filterDescription['swagger']['allowEmptyValue'] ?? false) && empty($this->requestGetQueryParameter($queryParameters, $name))) {
3943
return [
4044
sprintf('Query parameter "%s" does not allow empty value', $name),
4145
];

0 commit comments

Comments
 (0)