diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..5087f9a7 --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +#!make + +.PHONY: tests + +COMPOSE_IMAGE = composer:2 +PHP_IMAGE=php:8 + +composer: + docker pull $(DOCKER_COMPOSE) + docker run --rm --interactive --tty --user $(id -u):$(id -g) -w /app --volume `pwd`:/app $(COMPOSE_IMAGE) composer $(P) + +composer_install: + make composer P="install" + +phpunit: + docker pull $(PHP_IMAGE) + docker run --rm -it --user $(id -u):$(id -g) -w /app --volume `pwd`:/app $(PHP_IMAGE) ./vendor/bin/phpunit $(P) + +# run all php unit tests +tests: + make phpunit P=tests \ No newline at end of file diff --git a/composer.json b/composer.json index da3e7ef9..423b384a 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "vyuldashev/laravel-openapi", + "name": "ogsoft/laravel-openapi", "description": "Generate OpenAPI Specification for Laravel Applications", "keywords": [ "laravel", diff --git a/examples/petstore/OpenApi/Parameters/ListPetsParameters.php b/examples/petstore/OpenApi/Parameters/ListPetsParameters.php index ff220f23..c3be644b 100644 --- a/examples/petstore/OpenApi/Parameters/ListPetsParameters.php +++ b/examples/petstore/OpenApi/Parameters/ListPetsParameters.php @@ -17,7 +17,7 @@ public function build(): array Parameter::query() ->name('limit') - ->description('How many items to return at one time (max 100)') + ->description('How many items to return at one time (max 100) '.$this->data) ->required(false) ->schema( Schema::integer()->format(Schema::FORMAT_INT32) diff --git a/examples/petstore/OpenApi/RequestBodies/CreatePetRequestBody.php b/examples/petstore/OpenApi/RequestBodies/CreatePetRequestBody.php new file mode 100644 index 00000000..17799f69 --- /dev/null +++ b/examples/petstore/OpenApi/RequestBodies/CreatePetRequestBody.php @@ -0,0 +1,23 @@ +description($this->data['custom']) + ->content( + MediaType::json()->schema(PetSchema::ref()) + ); + } +} diff --git a/examples/petstore/OpenApi/Responses/ErrorValidationResponse.php b/examples/petstore/OpenApi/Responses/ErrorValidationResponse.php index 2b282872..96040949 100644 --- a/examples/petstore/OpenApi/Responses/ErrorValidationResponse.php +++ b/examples/petstore/OpenApi/Responses/ErrorValidationResponse.php @@ -13,7 +13,7 @@ class ErrorValidationResponse extends ResponseFactory implements Reusable public function build(): Response { $response = Schema::object()->properties( - Schema::string('message')->example('The given data was invalid.'), + Schema::string('message')->example('The given data was invalid. '.$this->data), Schema::object('errors') ->additionalProperties( Schema::array()->items(Schema::string()) diff --git a/examples/petstore/PetController.php b/examples/petstore/PetController.php index 918b8c52..7ce92bac 100644 --- a/examples/petstore/PetController.php +++ b/examples/petstore/PetController.php @@ -3,6 +3,7 @@ namespace Examples\Petstore; use Examples\Petstore\OpenApi\Parameters\ListPetsParameters; +use Examples\Petstore\OpenApi\RequestBodies\CreatePetRequestBody; use Examples\Petstore\OpenApi\Responses\ErrorValidationResponse; use Vyuldashev\LaravelOpenApi\Attributes as OpenApi; @@ -13,9 +14,18 @@ class PetController * List all pets. */ #[OpenApi\Operation('listPets')] - #[OpenApi\Parameters(ListPetsParameters::class)] - #[OpenApi\Response(ErrorValidationResponse::class, 422)] + #[OpenApi\Parameters(ListPetsParameters::class, 'Parameters custom data')] + #[OpenApi\Response(ErrorValidationResponse::class, 422, '', 'Response custom data')] public function index() { } + + /** + * Create pet. + */ + #[OpenApi\Operation('createPet')] + #[OpenApi\RequestBody(CreatePetRequestBody::class, ['custom' => 'My custom data'])] + public function create() + { + } } diff --git a/src/Attributes/Callback.php b/src/Attributes/Callback.php index 6f1a848f..c3149da7 100644 --- a/src/Attributes/Callback.php +++ b/src/Attributes/Callback.php @@ -4,7 +4,7 @@ use Attribute; use InvalidArgumentException; -use Vyuldashev\LaravelOpenApi\Factories\CallbackFactory; +use Vyuldashev\LaravelOpenApi\Contracts\CallbackFactoryInterface; #[Attribute] class Callback @@ -15,8 +15,8 @@ public function __construct(string $factory) { $this->factory = class_exists($factory) ? $factory : app()->getNamespace().'OpenApi\\Callbacks\\'.$factory; - if (! is_a($this->factory, CallbackFactory::class, true)) { - throw new InvalidArgumentException('Factory class must be instance of CallbackFactory'); + if (! is_a($this->factory, CallbackFactoryInterface::class, true)) { + throw new InvalidArgumentException('Factory class must be instance of CallbackFactoryInterface'); } } } diff --git a/src/Attributes/Extension.php b/src/Attributes/Extension.php index 24fc19f0..2de21dbd 100644 --- a/src/Attributes/Extension.php +++ b/src/Attributes/Extension.php @@ -4,7 +4,7 @@ use Attribute; use InvalidArgumentException; -use Vyuldashev\LaravelOpenApi\Factories\ExtensionFactory; +use Vyuldashev\LaravelOpenApi\Contracts\ExtensionFactoryInterface; #[Attribute(Attribute::IS_REPEATABLE | Attribute::TARGET_METHOD)] class Extension @@ -18,8 +18,8 @@ public function __construct(string $factory = null, string $key = null, string $ if ($factory) { $this->factory = class_exists($factory) ? $factory : app()->getNamespace().'OpenApi\\Extensions\\'.$factory; - if (! is_a($this->factory, ExtensionFactory::class, true)) { - throw new InvalidArgumentException('Factory class must be instance of ExtensionFactory'); + if (! is_a($this->factory, ExtensionFactoryInterface::class, true)) { + throw new InvalidArgumentException('Factory class must be instance of ExtensionFactoryInterface'); } } diff --git a/src/Attributes/Operation.php b/src/Attributes/Operation.php index e69efcff..7e06e166 100644 --- a/src/Attributes/Operation.php +++ b/src/Attributes/Operation.php @@ -49,4 +49,4 @@ public function __construct(string $id = null, array $tags = [], string $securit } } } -} +} \ No newline at end of file diff --git a/src/Attributes/Parameters.php b/src/Attributes/Parameters.php index 3f30d514..776a9804 100644 --- a/src/Attributes/Parameters.php +++ b/src/Attributes/Parameters.php @@ -4,19 +4,21 @@ use Attribute; use InvalidArgumentException; -use Vyuldashev\LaravelOpenApi\Factories\ParametersFactory; +use Vyuldashev\LaravelOpenApi\Contracts\ParametersFactoryInterface; #[Attribute(Attribute::TARGET_METHOD)] class Parameters { public string $factory; + public $data; - public function __construct(string $factory) + public function __construct(string $factory, $data = null) { $this->factory = class_exists($factory) ? $factory : app()->getNamespace().'OpenApi\\Parameters\\'.$factory; + $this->data = $data; - if (! is_a($this->factory, ParametersFactory::class, true)) { - throw new InvalidArgumentException('Factory class must be instance of ParametersFactory'); + if (! is_a($this->factory, ParametersFactoryInterface::class, true)) { + throw new InvalidArgumentException('Factory class must be instance of ParametersFactoryInterface'); } } } diff --git a/src/Attributes/RequestBody.php b/src/Attributes/RequestBody.php index a8645fb0..cb01f8f9 100644 --- a/src/Attributes/RequestBody.php +++ b/src/Attributes/RequestBody.php @@ -4,19 +4,21 @@ use Attribute; use InvalidArgumentException; -use Vyuldashev\LaravelOpenApi\Factories\RequestBodyFactory; +use Vyuldashev\LaravelOpenApi\Contracts\RequestBodyFactoryInterface; #[Attribute(Attribute::TARGET_METHOD)] class RequestBody { public string $factory; + public $data; - public function __construct(string $factory) + public function __construct(string $factory, $data = null) { $this->factory = class_exists($factory) ? $factory : app()->getNamespace().'OpenApi\\RequestBodies\\'.$factory; + $this->data = $data; - if (! is_a($this->factory, RequestBodyFactory::class, true)) { - throw new InvalidArgumentException('Factory class must be instance of RequestBodyFactory'); + if (! is_a($this->factory, RequestBodyFactoryInterface::class, true)) { + throw new InvalidArgumentException('Factory class must be instance of RequestBodyFactoryInterface'); } } } diff --git a/src/Attributes/Response.php b/src/Attributes/Response.php index a5f82d23..b5de7ad3 100644 --- a/src/Attributes/Response.php +++ b/src/Attributes/Response.php @@ -4,7 +4,7 @@ use Attribute; use InvalidArgumentException; -use Vyuldashev\LaravelOpenApi\Factories\ResponseFactory; +use Vyuldashev\LaravelOpenApi\Contracts\ResponseFactoryInterface; #[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)] class Response @@ -15,12 +15,15 @@ class Response public ?string $description; - public function __construct(string $factory, int $statusCode = null, string $description = null) + public $data; + + public function __construct(string $factory, int $statusCode = null, string $description = null, $data = null) { $this->factory = class_exists($factory) ? $factory : app()->getNamespace().'OpenApi\\Responses\\'.$factory; + $this->data = $data; - if (! is_a($this->factory, ResponseFactory::class, true)) { - throw new InvalidArgumentException('Factory class must be instance of ResponseFactory'); + if (! is_a($this->factory, ResponseFactoryInterface::class, true)) { + throw new InvalidArgumentException('Factory class must be instance of ResponseFactoryInterface'); } $this->statusCode = $statusCode; diff --git a/src/Builders/Components/CallbacksBuilder.php b/src/Builders/Components/CallbacksBuilder.php index 0e0e79ea..9fb63a64 100644 --- a/src/Builders/Components/CallbacksBuilder.php +++ b/src/Builders/Components/CallbacksBuilder.php @@ -2,8 +2,8 @@ namespace Vyuldashev\LaravelOpenApi\Builders\Components; +use Vyuldashev\LaravelOpenApi\Contracts\CallbackFactoryInterface; use Vyuldashev\LaravelOpenApi\Contracts\Reusable; -use Vyuldashev\LaravelOpenApi\Factories\CallbackFactory; use Vyuldashev\LaravelOpenApi\Generator; class CallbacksBuilder extends Builder @@ -13,11 +13,11 @@ public function build(string $collection = Generator::COLLECTION_DEFAULT): array return $this->getAllClasses($collection) ->filter(static function ($class) { return - is_a($class, CallbackFactory::class, true) && + is_a($class, CallbackFactoryInterface::class, true) && is_a($class, Reusable::class, true); }) ->map(static function ($class) { - /** @var CallbackFactory $instance */ + /** @var CallbackFactoryInterface $instance */ $instance = app($class); return $instance->build(); diff --git a/src/Builders/Components/RequestBodiesBuilder.php b/src/Builders/Components/RequestBodiesBuilder.php index be6fe439..255e9045 100644 --- a/src/Builders/Components/RequestBodiesBuilder.php +++ b/src/Builders/Components/RequestBodiesBuilder.php @@ -2,8 +2,8 @@ namespace Vyuldashev\LaravelOpenApi\Builders\Components; +use Vyuldashev\LaravelOpenApi\Contracts\RequestBodyFactoryInterface; use Vyuldashev\LaravelOpenApi\Contracts\Reusable; -use Vyuldashev\LaravelOpenApi\Factories\RequestBodyFactory; use Vyuldashev\LaravelOpenApi\Generator; class RequestBodiesBuilder extends Builder @@ -13,11 +13,11 @@ public function build(string $collection = Generator::COLLECTION_DEFAULT): array return $this->getAllClasses($collection) ->filter(static function ($class) { return - is_a($class, RequestBodyFactory::class, true) && + is_a($class, RequestBodyFactoryInterface::class, true) && is_a($class, Reusable::class, true); }) ->map(static function ($class) { - /** @var RequestBodyFactory $instance */ + /** @var RequestBodyFactoryInterface $instance */ $instance = app($class); return $instance->build(); diff --git a/src/Builders/Components/ResponsesBuilder.php b/src/Builders/Components/ResponsesBuilder.php index 86ee4582..fa738649 100644 --- a/src/Builders/Components/ResponsesBuilder.php +++ b/src/Builders/Components/ResponsesBuilder.php @@ -2,8 +2,8 @@ namespace Vyuldashev\LaravelOpenApi\Builders\Components; +use Vyuldashev\LaravelOpenApi\Contracts\ResponseFactoryInterface; use Vyuldashev\LaravelOpenApi\Contracts\Reusable; -use Vyuldashev\LaravelOpenApi\Factories\ResponseFactory; use Vyuldashev\LaravelOpenApi\Generator; class ResponsesBuilder extends Builder @@ -13,11 +13,11 @@ public function build(string $collection = Generator::COLLECTION_DEFAULT): array return $this->getAllClasses($collection) ->filter(static function ($class) { return - is_a($class, ResponseFactory::class, true) && + is_a($class, ResponseFactoryInterface::class, true) && is_a($class, Reusable::class, true); }) ->map(static function ($class) { - /** @var ResponseFactory $instance */ + /** @var ResponseFactoryInterface $instance */ $instance = app($class); return $instance->build(); diff --git a/src/Builders/Components/SchemasBuilder.php b/src/Builders/Components/SchemasBuilder.php index 7c1df5f0..6081b6bd 100644 --- a/src/Builders/Components/SchemasBuilder.php +++ b/src/Builders/Components/SchemasBuilder.php @@ -3,7 +3,7 @@ namespace Vyuldashev\LaravelOpenApi\Builders\Components; use Vyuldashev\LaravelOpenApi\Contracts\Reusable; -use Vyuldashev\LaravelOpenApi\Factories\SchemaFactory; +use Vyuldashev\LaravelOpenApi\Contracts\SchemaFactoryInterface; use Vyuldashev\LaravelOpenApi\Generator; class SchemasBuilder extends Builder @@ -13,11 +13,11 @@ public function build(string $collection = Generator::COLLECTION_DEFAULT): array return $this->getAllClasses($collection) ->filter(static function ($class) { return - is_a($class, SchemaFactory::class, true) && + is_a($class, SchemaFactoryInterface::class, true) && is_a($class, Reusable::class, true); }) ->map(static function ($class) { - /** @var SchemaFactory $instance */ + /** @var SchemaFactoryInterface $instance */ $instance = app($class); return $instance->build(); diff --git a/src/Builders/Components/SecuritySchemesBuilder.php b/src/Builders/Components/SecuritySchemesBuilder.php index b7a18fed..7b451471 100644 --- a/src/Builders/Components/SecuritySchemesBuilder.php +++ b/src/Builders/Components/SecuritySchemesBuilder.php @@ -2,7 +2,7 @@ namespace Vyuldashev\LaravelOpenApi\Builders\Components; -use Vyuldashev\LaravelOpenApi\Factories\SecuritySchemeFactory; +use Vyuldashev\LaravelOpenApi\Contracts\SecuritySchemeFactoryInterface; use Vyuldashev\LaravelOpenApi\Generator; class SecuritySchemesBuilder extends Builder @@ -11,10 +11,10 @@ public function build(string $collection = Generator::COLLECTION_DEFAULT): array { return $this->getAllClasses($collection) ->filter(static function ($class) { - return is_a($class, SecuritySchemeFactory::class, true); + return is_a($class, SecuritySchemeFactoryInterface::class, true); }) ->map(static function ($class) { - /** @var SecuritySchemeFactory $instance */ + /** @var SecuritySchemeFactoryInterface $instance */ $instance = app($class); return $instance->build(); diff --git a/src/Builders/ExtensionsBuilder.php b/src/Builders/ExtensionsBuilder.php index 5fa295a1..8329ce5d 100644 --- a/src/Builders/ExtensionsBuilder.php +++ b/src/Builders/ExtensionsBuilder.php @@ -5,7 +5,7 @@ use GoldSpecDigital\ObjectOrientedOAS\Objects\BaseObject; use Illuminate\Support\Collection; use Vyuldashev\LaravelOpenApi\Attributes\Extension as ExtensionAttribute; -use Vyuldashev\LaravelOpenApi\Factories\ExtensionFactory; +use Vyuldashev\LaravelOpenApi\Contracts\ExtensionFactoryInterface; class ExtensionsBuilder { @@ -15,7 +15,7 @@ public function build(BaseObject $object, Collection $attributes): void ->filter(static fn (object $attribute) => $attribute instanceof ExtensionAttribute) ->each(static function (ExtensionAttribute $attribute) use ($object): void { if ($attribute->factory) { - /** @var ExtensionFactory $factory */ + /** @var ExtensionFactoryInterface $factory */ $factory = app($attribute->factory); $key = $factory->key(); $value = $factory->value(); diff --git a/src/Builders/Paths/Operation/ParametersBuilder.php b/src/Builders/Paths/Operation/ParametersBuilder.php index 2333690b..f6528772 100644 --- a/src/Builders/Paths/Operation/ParametersBuilder.php +++ b/src/Builders/Paths/Operation/ParametersBuilder.php @@ -9,7 +9,7 @@ use phpDocumentor\Reflection\DocBlock\Tags\Param; use ReflectionParameter; use Vyuldashev\LaravelOpenApi\Attributes\Parameters; -use Vyuldashev\LaravelOpenApi\Factories\ParametersFactory; +use Vyuldashev\LaravelOpenApi\Contracts\ParametersFactoryInterface; use Vyuldashev\LaravelOpenApi\RouteInformation; use Vyuldashev\LaravelOpenApi\SchemaHelpers; @@ -60,9 +60,10 @@ protected function buildAttribute(RouteInformation $route): Collection $parameters = $route->actionAttributes->first(static fn ($attribute) => $attribute instanceof Parameters, []); if ($parameters) { - /** @var ParametersFactory $parametersFactory */ + /** @var ParametersFactoryInterface $parametersFactory */ $parametersFactory = app($parameters->factory); - + // little bit magic, add custom data into factory + $parametersFactory->data = $parameters->data; $parameters = $parametersFactory->build(); } diff --git a/src/Builders/Paths/Operation/RequestBodyBuilder.php b/src/Builders/Paths/Operation/RequestBodyBuilder.php index da558795..1b4a5ffd 100644 --- a/src/Builders/Paths/Operation/RequestBodyBuilder.php +++ b/src/Builders/Paths/Operation/RequestBodyBuilder.php @@ -4,8 +4,8 @@ use GoldSpecDigital\ObjectOrientedOAS\Objects\RequestBody; use Vyuldashev\LaravelOpenApi\Attributes\RequestBody as RequestBodyAttribute; +use Vyuldashev\LaravelOpenApi\Contracts\RequestBodyFactoryInterface; use Vyuldashev\LaravelOpenApi\Contracts\Reusable; -use Vyuldashev\LaravelOpenApi\Factories\RequestBodyFactory; use Vyuldashev\LaravelOpenApi\RouteInformation; class RequestBodyBuilder @@ -16,9 +16,10 @@ public function build(RouteInformation $route): ?RequestBody $requestBody = $route->actionAttributes->first(static fn (object $attribute) => $attribute instanceof RequestBodyAttribute); if ($requestBody) { - /** @var RequestBodyFactory $requestBodyFactory */ + /** @var RequestBodyFactoryInterface $requestBodyFactory */ $requestBodyFactory = app($requestBody->factory); - + // little bit magic, add custom data into factory + $requestBodyFactory->data = $requestBody->data; $requestBody = $requestBodyFactory->build(); if ($requestBodyFactory instanceof Reusable) { diff --git a/src/Builders/Paths/Operation/ResponsesBuilder.php b/src/Builders/Paths/Operation/ResponsesBuilder.php index f43d3745..b6aeb113 100644 --- a/src/Builders/Paths/Operation/ResponsesBuilder.php +++ b/src/Builders/Paths/Operation/ResponsesBuilder.php @@ -15,6 +15,8 @@ public function build(RouteInformation $route): array ->filter(static fn (object $attribute) => $attribute instanceof ResponseAttribute) ->map(static function (ResponseAttribute $attribute) { $factory = app($attribute->factory); + // little bit magic, add custom data into factory + $factory->data = $attribute->data; $response = $factory->build(); if ($factory instanceof Reusable) { diff --git a/src/Builders/Paths/Operation/SecurityBuilder.php b/src/Builders/Paths/Operation/SecurityBuilder.php index 2a02a279..aa78184f 100644 --- a/src/Builders/Paths/Operation/SecurityBuilder.php +++ b/src/Builders/Paths/Operation/SecurityBuilder.php @@ -26,4 +26,4 @@ public function build(RouteInformation $route): array ->values() ->toArray(); } -} +} \ No newline at end of file diff --git a/src/Builders/Paths/OperationsBuilder.php b/src/Builders/Paths/OperationsBuilder.php index 6b6d0b61..e1516520 100644 --- a/src/Builders/Paths/OperationsBuilder.php +++ b/src/Builders/Paths/OperationsBuilder.php @@ -4,15 +4,18 @@ use GoldSpecDigital\ObjectOrientedOAS\Exceptions\InvalidArgumentException; use GoldSpecDigital\ObjectOrientedOAS\Objects\Operation; +use GoldSpecDigital\ObjectOrientedOAS\Objects\SecurityRequirement; use Illuminate\Support\Collection; use Illuminate\Support\Str; use Vyuldashev\LaravelOpenApi\Attributes\Operation as OperationAttribute; +use Vyuldashev\LaravelOpenApi\Builders\Components\SecuritySchemesBuilder; use Vyuldashev\LaravelOpenApi\Builders\ExtensionsBuilder; use Vyuldashev\LaravelOpenApi\Builders\Paths\Operation\CallbacksBuilder; use Vyuldashev\LaravelOpenApi\Builders\Paths\Operation\ParametersBuilder; use Vyuldashev\LaravelOpenApi\Builders\Paths\Operation\RequestBodyBuilder; use Vyuldashev\LaravelOpenApi\Builders\Paths\Operation\ResponsesBuilder; use Vyuldashev\LaravelOpenApi\Builders\Paths\Operation\SecurityBuilder; +use Vyuldashev\LaravelOpenApi\Factories\SecuritySchemeFactory; use Vyuldashev\LaravelOpenApi\RouteInformation; class OperationsBuilder @@ -46,7 +49,7 @@ public function __construct( * * @throws InvalidArgumentException */ - public function build(array|Collection $routes): array + public function build(array | Collection $routes): array { $operations = []; @@ -74,7 +77,8 @@ public function build(array|Collection $routes): array ->parameters(...$parameters) ->requestBody($requestBody) ->responses(...$responses) - ->callbacks(...$callbacks); + ->callbacks(...$callbacks) + ->security(...$security); /** Not the cleanest code, we need to call notSecurity instead of security when our security has been turned off */ if (count($security) === 1 && $security[0]->securityScheme === null) { diff --git a/src/Concerns/Referencable.php b/src/Concerns/Referencable.php index fd36525a..fdf4209e 100644 --- a/src/Concerns/Referencable.php +++ b/src/Concerns/Referencable.php @@ -4,13 +4,13 @@ use GoldSpecDigital\ObjectOrientedOAS\Objects\Schema; use InvalidArgumentException; +use Vyuldashev\LaravelOpenApi\Contracts\CallbackFactoryInterface; +use Vyuldashev\LaravelOpenApi\Contracts\ParametersFactoryInterface; +use Vyuldashev\LaravelOpenApi\Contracts\RequestBodyFactoryInterface; +use Vyuldashev\LaravelOpenApi\Contracts\ResponseFactoryInterface; use Vyuldashev\LaravelOpenApi\Contracts\Reusable; -use Vyuldashev\LaravelOpenApi\Factories\CallbackFactory; -use Vyuldashev\LaravelOpenApi\Factories\ParametersFactory; -use Vyuldashev\LaravelOpenApi\Factories\RequestBodyFactory; -use Vyuldashev\LaravelOpenApi\Factories\ResponseFactory; -use Vyuldashev\LaravelOpenApi\Factories\SchemaFactory; -use Vyuldashev\LaravelOpenApi\Factories\SecuritySchemeFactory; +use Vyuldashev\LaravelOpenApi\Contracts\SchemaFactoryInterface; +use Vyuldashev\LaravelOpenApi\Contracts\SecuritySchemeFactoryInterface; trait Referencable { @@ -24,17 +24,17 @@ public static function ref(?string $objectId = null): Schema $baseRef = null; - if ($instance instanceof CallbackFactory) { + if ($instance instanceof CallbackFactoryInterface) { $baseRef = '#/components/callbacks/'; - } elseif ($instance instanceof ParametersFactory) { + } elseif ($instance instanceof ParametersFactoryInterface) { $baseRef = '#/components/parameters/'; - } elseif ($instance instanceof RequestBodyFactory) { + } elseif ($instance instanceof RequestBodyFactoryInterface) { $baseRef = '#/components/requestBodies/'; - } elseif ($instance instanceof ResponseFactory) { + } elseif ($instance instanceof ResponseFactoryInterface) { $baseRef = '#/components/responses/'; - } elseif ($instance instanceof SchemaFactory) { + } elseif ($instance instanceof SchemaFactoryInterface) { $baseRef = '#/components/schemas/'; - } elseif ($instance instanceof SecuritySchemeFactory) { + } elseif ($instance instanceof SecuritySchemeFactoryInterface) { $baseRef = '#/components/securitySchemes/'; } diff --git a/src/Contracts/CallbackFactoryInterface.php b/src/Contracts/CallbackFactoryInterface.php new file mode 100644 index 00000000..df142049 --- /dev/null +++ b/src/Contracts/CallbackFactoryInterface.php @@ -0,0 +1,10 @@ + 'limit', 'in' => 'query', - 'description' => 'How many items to return at one time (max 100)', + 'description' => 'How many items to return at one time (max 100) Parameters custom data', 'required' => false, 'schema' => [ 'format' => 'int32', @@ -80,5 +81,20 @@ public function testGenerate(): void ], ], ], $spec['components']['schemas']['Pet']); + + self::assertEquals([ + 'summary' => 'Create pet.', + 'operationId' => 'createPet', + 'requestBody' => [ + 'description' => 'My custom data', + 'content' => [ + 'application/json' => [ + 'schema' => [ + '$ref' => '#/components/schemas/Pet', + ], + ], + ], + ], + ], $spec['paths']['/pet']['post']); } }