diff --git a/phpstan.neon b/phpstan.neon index 98b5a4b7..b4b691f6 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -37,3 +37,5 @@ parameters: # Ignore bad php internal functions behavior - '#^Parameter \#1 \$haystack of static method Nette\\Utils\\Strings\:\:contains\(\) expects string, string\|false given\.$#' + - message: '#^Method Apitte\\Core\\Annotation\\Controller\\OpenApi\:\:purifyDocblock\(\) should return string but returns string\|null\.$#' + path: %currentWorkingDirectory%/src/Annotation/Controller/OpenApi.php diff --git a/src/Annotation/Controller/OpenApi.php b/src/Annotation/Controller/OpenApi.php index b44d8514..aa988577 100644 --- a/src/Annotation/Controller/OpenApi.php +++ b/src/Annotation/Controller/OpenApi.php @@ -11,7 +11,7 @@ final class OpenApi { - /** @var mixed[] */ + /** @var string */ private $data; /** @@ -19,15 +19,18 @@ final class OpenApi */ public function __construct(array $data) { - $this->data = $data; + $this->data = $this->purifyDocblock($data['value']); } - /** - * @return mixed[] - */ - public function getData(): array + public function getData(): string { return $this->data; } + private function purifyDocblock(string $docblock): string + { + // Removes useless whitespace and * from start of every line + return preg_replace('#\s*\*\/$|^\s*\*\s{0,1}|^\/\*{1,2}#m', '', $docblock); + } + } diff --git a/src/DI/Loader/DoctrineAnnotationLoader.php b/src/DI/Loader/DoctrineAnnotationLoader.php index e4c16752..c58d1a81 100644 --- a/src/DI/Loader/DoctrineAnnotationLoader.php +++ b/src/DI/Loader/DoctrineAnnotationLoader.php @@ -24,6 +24,7 @@ use Apitte\Core\Schema\Builder\SchemaBuilder; use Doctrine\Common\Annotations\AnnotationReader; use Doctrine\Common\Annotations\AnnotationRegistry; +use Nette\Neon\Neon; use Nette\Reflection\ClassType; final class DoctrineAnnotationLoader extends AbstractContainerLoader @@ -294,7 +295,7 @@ protected function parseControllerMethodsAnnotations(Controller $controller, Cla // Parse @OpenApi ================ if (get_class($annotation) === OpenApi::class) { /** @var OpenApi $annotation */ - $schemaMethod->setOpenApi($annotation->getData()); + $schemaMethod->setOpenApi(Neon::decode($annotation->getData()) ?? []); continue; } diff --git a/tests/cases/DI/ApiExtension.phpt b/tests/cases/DI/ApiExtension.phpt index 57f74a87..18ee137b 100644 --- a/tests/cases/DI/ApiExtension.phpt +++ b/tests/cases/DI/ApiExtension.phpt @@ -56,7 +56,7 @@ test(function (): void { /** @var Schema $schema */ $schema = $container->getService('api.core.schema'); - Assert::count(3, $schema->getEndpoints()); + Assert::count(4, $schema->getEndpoints()); Assert::equal(['GET'], $schema->getEndpoints()[0]->getMethods()); Assert::equal('/api/v1/foobar/baz1', $schema->getEndpoints()[0]->getMask()); Assert::equal('#/api/v1/foobar/baz1$#', $schema->getEndpoints()[0]->getPattern()); diff --git a/tests/cases/DI/Loader/DoctrineAnnotationLoader.phpt b/tests/cases/DI/Loader/DoctrineAnnotationLoader.phpt index fa453455..42a4b51a 100644 --- a/tests/cases/DI/Loader/DoctrineAnnotationLoader.phpt +++ b/tests/cases/DI/Loader/DoctrineAnnotationLoader.phpt @@ -58,7 +58,7 @@ test(function (): void { Assert::equal(FoobarController::class, $controller->getClass()); Assert::equal('/foobar', $controller->getPath()); - Assert::count(3, $controller->getMethods()); + Assert::count(4, $controller->getMethods()); Assert::equal('baz1', $controller->getMethods()['baz1']->getName()); Assert::equal('/baz1', $controller->getMethods()['baz1']->getPath()); @@ -68,6 +68,14 @@ test(function (): void { Assert::equal('/baz2', $controller->getMethods()['baz2']->getPath()); Assert::equal(['GET', 'POST'], $controller->getMethods()['baz2']->getMethods()); + Assert::equal( + [ + 'foo' => ['bar' => 'baz'], + 'lorem' => ['ipsum', 'dolor', 'sit', 'amet'], + ], + $controller->getMethods()['openapi']->getOpenApi() + ); + Assert::equal(['testapi'], $controller->getGroupIds()); Assert::equal(['/api', '/v1'], $controller->getGroupPaths()); }); diff --git a/tests/fixtures/Controllers/FoobarController.php b/tests/fixtures/Controllers/FoobarController.php index aa177e15..95ee68c3 100644 --- a/tests/fixtures/Controllers/FoobarController.php +++ b/tests/fixtures/Controllers/FoobarController.php @@ -4,6 +4,7 @@ use Apitte\Core\Annotation\Controller\ControllerPath; use Apitte\Core\Annotation\Controller\Method; +use Apitte\Core\Annotation\Controller\OpenApi; use Apitte\Core\Annotation\Controller\Path; use Apitte\Core\Http\ApiRequest; use Apitte\Core\Http\ApiResponse; @@ -38,6 +39,23 @@ public function baz3(ApiRequest $request, ApiResponse $response): void { } + /** + * @Path("/openapi") + * @Method({"PUT"}) + * @OpenApi(" + * foo: + * bar: baz + * lorem: + * - ipsum + * - dolor + * - sit + * - amet + * ") + */ + public function openapi(ApiRequest $request, ApiResponse $response): void + { + } + public function getData1(): void { // Skip this method