Skip to content

Commit 110cbaf

Browse files
committed
Returns open api parameters according to schema
1 parent 42b759e commit 110cbaf

File tree

2 files changed

+166
-7
lines changed

2 files changed

+166
-7
lines changed

src/Doctrine/Orm/Filter/AbstractUuidFilter.php

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -172,16 +172,38 @@ public function getOpenApiParameters(Parameter $parameter): array
172172
{
173173
$in = $parameter instanceof QueryParameter ? 'query' : 'header';
174174
$key = $parameter->getKey();
175+
$schema = $parameter->getSchema();
176+
$addStringParam = false;
177+
$addArrayParam = false;
178+
$openApiParameters = [];
179+
180+
if (null === $schema) {
181+
$addStringParam = true;
182+
$addArrayParam = true;
183+
}
175184

176-
return [
177-
new OpenApiParameter(
185+
foreach ($schema['oneOf'] ?? [$schema] as $item) {
186+
if (!isset($item['type']) || 'string' === $item['type']) {
187+
$addStringParam = true;
188+
}
189+
190+
if (!isset($item['type']) || 'array' === $item['type']) {
191+
$addArrayParam = true;
192+
}
193+
}
194+
195+
if ($addStringParam) {
196+
$openApiParameters[] = new OpenApiParameter(
178197
name: $key,
179198
in: $in,
180199
schema: self::UUID_SCHEMA,
181200
style: 'form',
182201
explode: false
183-
),
184-
new OpenApiParameter(
202+
);
203+
}
204+
205+
if ($addArrayParam) {
206+
$openApiParameters[] = new OpenApiParameter(
185207
name: $key.'[]',
186208
in: $in,
187209
description: 'One or more Uuids',
@@ -191,12 +213,26 @@ public function getOpenApiParameters(Parameter $parameter): array
191213
],
192214
style: 'deepObject',
193215
explode: true
194-
),
195-
];
216+
);
217+
}
218+
219+
return $openApiParameters;
196220
}
197221

198222
public function getSchema(Parameter $parameter): array
199223
{
200-
return self::UUID_SCHEMA;
224+
if (null !== $parameter->getSchema()) {
225+
return $parameter->getSchema();
226+
}
227+
228+
return [
229+
'oneOf' => [
230+
self::UUID_SCHEMA,
231+
[
232+
'type' => 'array',
233+
'items' => self::UUID_SCHEMA,
234+
],
235+
],
236+
];
201237
}
202238
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
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\Doctrine\Orm\Tests\Filter;
15+
16+
use ApiPlatform\Doctrine\Orm\Filter\AbstractUuidFilter;
17+
use ApiPlatform\Metadata\QueryParameter;
18+
use ApiPlatform\OpenApi\Model\Parameter as OpenApiParameter;
19+
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
20+
21+
final class AbstractUuidFilterTest extends KernelTestCase
22+
{
23+
public function testGetOpenApiParameters(): void
24+
{
25+
$uuidFilter = new class extends AbstractUuidFilter {};
26+
$openApiParameters = $uuidFilter->getOpenApiParameters(new QueryParameter(key: 'id'));
27+
28+
self::assertCount(2, $openApiParameters);
29+
self::assertEquals(
30+
$this->expectedStringOpenApiParameter(),
31+
$openApiParameters[0],
32+
);
33+
self::assertEquals(
34+
$this->expectedArrayOpenApiParameter(),
35+
$openApiParameters[1],
36+
);
37+
}
38+
39+
public function testGetOpenApiParametersWhenSchemaIsOnlyString(): void
40+
{
41+
$uuidFilter = new class extends AbstractUuidFilter {};
42+
$openApiParameters = $uuidFilter->getOpenApiParameters(new QueryParameter(key: 'id',
43+
schema: ['type' => 'string', 'format' => 'uuid']
44+
));
45+
46+
self::assertCount(1, $openApiParameters);
47+
self::assertEquals(
48+
$this->expectedStringOpenApiParameter(),
49+
$openApiParameters[0],
50+
);
51+
}
52+
53+
public function testGetOpenApiParametersWhenSchemaIsOnlyArray(): void
54+
{
55+
$uuidFilter = new class extends AbstractUuidFilter {};
56+
$openApiParameters = $uuidFilter->getOpenApiParameters(new QueryParameter(key: 'id',
57+
schema: ['type' => 'array']
58+
));
59+
60+
self::assertCount(1, $openApiParameters);
61+
self::assertEquals(
62+
$this->expectedArrayOpenApiParameter(),
63+
$openApiParameters[0],
64+
);
65+
}
66+
67+
public function testGetOpenApiParametersWhenSchemaIsOneOfArrayOrString(): void
68+
{
69+
$uuidFilter = new class extends AbstractUuidFilter {};
70+
$openApiParameters = $uuidFilter->getOpenApiParameters(new QueryParameter(key: 'id',
71+
schema: [
72+
'oneOf' => [
73+
['type' => 'string'],
74+
[
75+
'type' => 'array',
76+
'items' => ['type' => 'string'],
77+
],
78+
]])
79+
);
80+
81+
self::assertCount(2, $openApiParameters);
82+
self::assertEquals(
83+
$this->expectedStringOpenApiParameter(),
84+
$openApiParameters[0],
85+
);
86+
self::assertEquals(
87+
$this->expectedArrayOpenApiParameter(),
88+
$openApiParameters[1],
89+
);
90+
}
91+
92+
public function expectedStringOpenApiParameter(): OpenApiParameter
93+
{
94+
return new OpenApiParameter(
95+
name: 'id',
96+
in: 'query',
97+
schema: [
98+
'type' => 'string',
99+
'format' => 'uuid',
100+
],
101+
style: 'form',
102+
explode: false
103+
);
104+
}
105+
106+
public function expectedArrayOpenApiParameter(): OpenApiParameter
107+
{
108+
return new OpenApiParameter(
109+
name: 'id[]',
110+
in: 'query',
111+
description: 'One or more Uuids',
112+
schema: [
113+
'type' => 'array',
114+
'items' => [
115+
'type' => 'string',
116+
'format' => 'uuid',
117+
],
118+
],
119+
style: 'deepObject',
120+
explode: true
121+
);
122+
}
123+
}

0 commit comments

Comments
 (0)