From d0b617ce5e568c7b66454191b2067d250a953450 Mon Sep 17 00:00:00 2001 From: joris Date: Wed, 22 Mar 2023 16:19:57 +0100 Subject: [PATCH] fix(openapi): yaml parameters extractor --- .../Extractor/YamlResourceExtractor.php | 23 +++++++++++++++++++ .../Tests/Extractor/YamlExtractorTest.php | 18 +++++++++++++++ .../Tests/Extractor/yaml/openapi.yaml | 14 +++++++++++ 3 files changed, 55 insertions(+) create mode 100644 src/Metadata/Tests/Extractor/yaml/openapi.yaml diff --git a/src/Metadata/Extractor/YamlResourceExtractor.php b/src/Metadata/Extractor/YamlResourceExtractor.php index 87ddd83ab9d..8983cfe11c9 100644 --- a/src/Metadata/Extractor/YamlResourceExtractor.php +++ b/src/Metadata/Extractor/YamlResourceExtractor.php @@ -19,6 +19,7 @@ use ApiPlatform\Metadata\Tests\Fixtures\StateOptions; use ApiPlatform\OpenApi\Model\ExternalDocumentation; use ApiPlatform\OpenApi\Model\Operation as OpenApiOperation; +use ApiPlatform\OpenApi\Model\Parameter; use ApiPlatform\OpenApi\Model\RequestBody; use ApiPlatform\State\OptionsInterface; use Symfony\Component\Yaml\Exception\ParseException; @@ -235,6 +236,28 @@ private function buildOpenapi(array $resource): bool|OpenApiOperation|null unset($resource['openapi'][$key]); } + if (\array_key_exists('parameters', $resource['openapi']) && \is_array($openapiParameters = $resource['openapi']['parameters'] ?? [])) { + $parameters = []; + foreach ($openapiParameters as $parameter) { + $parameters[] = new Parameter( + name: $parameter['name'], + in: $parameter['in'], + description: $parameter['description'] ?? '', + required: $parameter['required'] ?? false, + deprecated: $parameter['deprecated'] ?? false, + allowEmptyValue: $parameter['allowEmptyValue'] ?? false, + schema: $parameter['schema'] ?? [], + style: $parameter['style'] ?? null, + explode: $parameter['explode'] ?? false, + allowReserved: $parameter['allowReserved '] ?? false, + example: $parameter['example'] ?? null, + examples: isset($parameter['examples']) ? new \ArrayObject($parameter['examples']) : null, + content: isset($parameter['content']) ? new \ArrayObject($parameter['content']) : null + ); + } + $resource['openapi']['parameters'] = $parameters; + } + return new OpenApiOperation(...$resource['openapi']); } diff --git a/src/Metadata/Tests/Extractor/YamlExtractorTest.php b/src/Metadata/Tests/Extractor/YamlExtractorTest.php index c445262ac06..3f006b6142d 100644 --- a/src/Metadata/Tests/Extractor/YamlExtractorTest.php +++ b/src/Metadata/Tests/Extractor/YamlExtractorTest.php @@ -473,6 +473,24 @@ public function testValidYaml(): void ], $extractor->getResources()); } + public function testOpenApiParameters(): void + { + $extractor = new YamlResourceExtractor([__DIR__.'/yaml/openapi.yaml']); + $resources = $extractor->getResources(); + + $this->assertArrayHasKey(Program::class, $resources); + $this->assertArrayHasKey('openapi', $resources[Program::class][0]); + + $this->assertIsObject($resources[Program::class][0]['operations'][0]['openapi']); + + $operation = $resources[Program::class][0]['operations'][0]['openapi']; + $this->assertIsArray($operation->getParameters()); + + $this->assertEquals('author', $operation->getParameters()[0]->getName()); + $this->assertEquals('path', $operation->getParameters()[0]->getIn()); + $this->assertEquals('john-doe', $operation->getParameters()[0]->getExample()); + } + public function testInputAndOutputAreBooleans(): void { $extractor = new YamlResourceExtractor([__DIR__.'/yaml/input-and-output-are-booleans.yaml']); diff --git a/src/Metadata/Tests/Extractor/yaml/openapi.yaml b/src/Metadata/Tests/Extractor/yaml/openapi.yaml new file mode 100644 index 00000000000..93f5a084981 --- /dev/null +++ b/src/Metadata/Tests/Extractor/yaml/openapi.yaml @@ -0,0 +1,14 @@ +resources: + ApiPlatform\Metadata\Tests\Fixtures\ApiResource\Program: + - uriTemplate: /users/{author}/programs.{_format} + uriVariables: ['author'] + operations: + ApiPlatform\Metadata\Post: + openapi: + parameters: + username: + name: author + in: path + example: "john-doe" + examples: ["John-doe"] + foo: "bar"