From 74ea2582829f9c4ab5761aece557f7481076bce2 Mon Sep 17 00:00:00 2001 From: romalytvynenko Date: Sun, 7 Jul 2024 18:02:40 +0300 Subject: [PATCH] Fixed issue with custom registered API config wasn't taken into consideration when generating server's URL (#445) * fixed issue with custom api config wont taken into consideration when generating server path * Fix styling --------- Co-authored-by: romalytvynenko --- src/Extensions/OperationExtension.php | 15 ++++------ src/Generator.php | 8 ++--- src/Support/OperationBuilder.php | 4 ++- .../RequestEssentialsExtension.php | 16 ++++------ tests/ScrambleTest.php | 29 +++++++++++++++++++ 5 files changed, 48 insertions(+), 24 deletions(-) diff --git a/src/Extensions/OperationExtension.php b/src/Extensions/OperationExtension.php index 3dd20f14..18e27a3c 100644 --- a/src/Extensions/OperationExtension.php +++ b/src/Extensions/OperationExtension.php @@ -2,6 +2,7 @@ namespace Dedoc\Scramble\Extensions; +use Dedoc\Scramble\GeneratorConfig; use Dedoc\Scramble\Infer; use Dedoc\Scramble\Support\Generator\Operation; use Dedoc\Scramble\Support\Generator\TypeTransformer; @@ -9,15 +10,11 @@ abstract class OperationExtension { - protected Infer $infer; - - protected TypeTransformer $openApiTransformer; - - public function __construct(Infer $infer, TypeTransformer $openApiTransformer) - { - $this->infer = $infer; - $this->openApiTransformer = $openApiTransformer; - } + public function __construct( + protected Infer $infer, + protected TypeTransformer $openApiTransformer, + protected GeneratorConfig $config + ) {} abstract public function handle(Operation $operation, RouteInfo $routeInfo); } diff --git a/src/Generator.php b/src/Generator.php index a7b9e360..4268ed62 100644 --- a/src/Generator.php +++ b/src/Generator.php @@ -52,9 +52,9 @@ public function __invoke(?GeneratorConfig $config = null) $openApi = $this->makeOpenApi($config); $this->getRoutes($config) - ->map(function (Route $route) use ($openApi) { + ->map(function (Route $route) use ($openApi, $config) { try { - return $this->routeToOperation($openApi, $route); + return $this->routeToOperation($openApi, $route, $config); } catch (Throwable $e) { if ($e instanceof RouteAware) { $e->setRoute($route); @@ -149,7 +149,7 @@ private function getRoutes(GeneratorConfig $config): Collection ->values(); } - private function routeToOperation(OpenApi $openApi, Route $route) + private function routeToOperation(OpenApi $openApi, Route $route, GeneratorConfig $config) { $routeInfo = new RouteInfo($route, $this->fileParser, $this->infer); @@ -157,7 +157,7 @@ private function routeToOperation(OpenApi $openApi, Route $route) return null; } - $operation = $this->operationBuilder->build($routeInfo, $openApi); + $operation = $this->operationBuilder->build($routeInfo, $openApi, $config); $this->ensureSchemaTypes($route, $operation); diff --git a/src/Support/OperationBuilder.php b/src/Support/OperationBuilder.php index 51333f38..16a56211 100644 --- a/src/Support/OperationBuilder.php +++ b/src/Support/OperationBuilder.php @@ -3,6 +3,7 @@ namespace Dedoc\Scramble\Support; use Dedoc\Scramble\Extensions\OperationExtension; +use Dedoc\Scramble\GeneratorConfig; use Dedoc\Scramble\Support\Generator\OpenApi; use Dedoc\Scramble\Support\Generator\Operation; @@ -16,13 +17,14 @@ public function __construct(array $extensionsClasses = []) $this->extensionsClasses = $extensionsClasses; } - public function build(RouteInfo $routeInfo, OpenApi $openApi) + public function build(RouteInfo $routeInfo, OpenApi $openApi, GeneratorConfig $config) { $operation = new Operation('get'); foreach ($this->extensionsClasses as $extensionClass) { $extension = app()->make($extensionClass, [ 'openApi' => $openApi, + 'config' => $config, ]); $extension->handle($operation, $routeInfo); diff --git a/src/Support/OperationExtensions/RequestEssentialsExtension.php b/src/Support/OperationExtensions/RequestEssentialsExtension.php index 5517f1ce..f46e3882 100644 --- a/src/Support/OperationExtensions/RequestEssentialsExtension.php +++ b/src/Support/OperationExtensions/RequestEssentialsExtension.php @@ -3,6 +3,7 @@ namespace Dedoc\Scramble\Support\OperationExtensions; use Dedoc\Scramble\Extensions\OperationExtension; +use Dedoc\Scramble\GeneratorConfig; use Dedoc\Scramble\Infer; use Dedoc\Scramble\PhpDoc\PhpDocTypeHelper; use Dedoc\Scramble\Scramble; @@ -37,19 +38,14 @@ class RequestEssentialsExtension extends OperationExtension { - private OpenApi $openApi; - - private ServerFactory $serverFactory; - public function __construct( Infer $infer, TypeTransformer $openApiTransformer, - OpenApi $openApi, - ServerFactory $serverFactory + GeneratorConfig $config, + private OpenApi $openApi, + private ServerFactory $serverFactory ) { - parent::__construct($infer, $openApiTransformer); - $this->openApi = $openApi; - $this->serverFactory = $serverFactory; + parent::__construct($infer, $openApiTransformer, $config); } public function handle(Operation $operation, RouteInfo $routeInfo) @@ -94,7 +90,7 @@ private function getAlternativeServers(Route $route) } [$protocol] = explode('://', url('/')); - $expectedServer = $this->serverFactory->make($protocol.'://'.$route->getDomain().'/'.config('scramble.api_path', 'api')); + $expectedServer = $this->serverFactory->make($protocol.'://'.$route->getDomain().'/'.$this->config->get('api_path', 'api')); if ($this->isServerMatchesAllGivenServers($expectedServer, $this->openApi->servers)) { return []; diff --git a/tests/ScrambleTest.php b/tests/ScrambleTest.php index 584d5e68..5c041778 100644 --- a/tests/ScrambleTest.php +++ b/tests/ScrambleTest.php @@ -63,6 +63,19 @@ public function registers_routes_for_default_api() ->and($routes[1]->methods)->toBe(['GET', 'HEAD']); } + /** @test */ + #[DefineEnvironment('registerCustomPathApi')] + #[DefineRoute('registerCustomNewsletterApiRoutes')] + public function generates_correct_server_url_when_api_config_defines_custom_api_path() + { + $generator = app(Generator::class); + + $doc = $generator(Scramble::getGeneratorConfig('newsletter')); + + $this->assertEquals('http://localhost/newsletter/api', $doc['servers'][0]['url']); + $this->assertEquals(['/a'], array_keys($doc['paths'])); + } + /** @test */ #[DefineRoute('registerTestConsumerRoutes')] public function filters_consumer_routes_with_config_file() @@ -89,6 +102,22 @@ public function filters_consumer_routes_with_redefined_resolver_and_api_path_con $this->assertEquals(['/api/a', '/api/b', '/api/c', '/second-api/a', '/second-api/b', '/second-api/c'], array_keys($doc['paths'])); } + protected function registerCustomPathApi() + { + Scramble::ignoreDefaultRoutes(); + + Scramble::registerApi('newsletter', [ + 'api_path' => 'newsletter/api', + ]); + } + + protected function registerCustomNewsletterApiRoutes(Router $router) + { + $router->group(['prefix' => 'newsletter/api'], function (Router $router) { + $router->get('a', [ScrambleTest_Controller::class, 'test']); + }); + } + protected function withEnforcedUnknownSchemaPrevention() { Scramble::preventSchema(UnknownType::class);