From b88c4957badde99d247c247f9901df0362c220ae Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Mon, 29 Sep 2025 15:46:47 -0300 Subject: [PATCH 1/7] feat: Add OpenAPI documentation to "getAll" method --- .../PrivateCloudsApiController.php | 94 ++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php b/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php index ecaa9e41f..51acc966e 100644 --- a/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php +++ b/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php @@ -12,7 +12,9 @@ * limitations under the License. **/ use App\Models\Foundation\Marketplace\IPrivateCloudServiceRepository; +use Illuminate\Http\Response; use models\oauth2\IResourceServerContext; +use OpenApi\Attributes as OA; /** * Class PrivateCloudsApiController @@ -29,8 +31,98 @@ public function __construct(IPrivateCloudServiceRepository $repository, IResourc parent::__construct($repository, $resource_server_context); } + #[OA\Get( + path: "/api/public/v1/marketplace/hosted-private-clouds", + description: "Get all marketplace hosted private cloud services (OpenStack implementations)", + summary: 'Get all hosted private clouds', + operationId: 'getAllHostedPrivateClouds', + tags: ['Private Clouds'], + parameters: [ + new OA\Parameter( + name: 'filter[]', + in: 'query', + required: false, + description: 'Filter expressions in the format fieldvalue. Available fields: name, company. Operators: =@, ==, @@.', + style: 'form', + explode: true, + schema: new OA\Schema( + type: 'array', + items: new OA\Items(type: 'string', example: 'name@@cloud') + ) + ), + new OA\Parameter( + name: 'order', + in: 'query', + required: false, + description: 'Order by field(s)', + schema: new OA\Schema(type: 'string', example: 'name,-id') + ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Comma-separated list of related resources to include. Available relations: company, type, capabilities, guests, hypervisors, supported_regions, data_centers, data_center_regions', + schema: new OA\Schema(type: 'string', example: 'company,data_centers') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Relations to load eagerly', + schema: new OA\Schema(type: 'string', example: 'company,data_centers') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Comma-separated list of fields to return', + schema: new OA\Schema(type: 'string', example: 'id,name,company.name') + ), + ], + responses: [ + new OA\Response( + response: 200, + description: 'Success - Returns paginated list of hosted private clouds', + content: new OA\JsonContent( + properties: [ + 'total' => new OA\Property(property: 'total', type: 'integer', example: 10), + 'per_page' => new OA\Property(property: 'per_page', type: 'integer', example: 10), + 'current_page' => new OA\Property(property: 'current_page', type: 'integer', example: 1), + 'last_page' => new OA\Property(property: 'last_page', type: 'integer', example: 1), + 'data' => new OA\Property( + property: 'data', + type: 'array', + items: new OA\Items( + properties: [ + 'id' => new OA\Property(property: 'id', type: 'integer', example: 1), + 'class_name' => new OA\Property(property: 'class_name', type: 'string', example: 'PrivateCloudService'), + 'name' => new OA\Property(property: 'name', type: 'string', example: 'Enterprise Private Cloud'), + 'overview' => new OA\Property(property: 'overview', type: 'string', example: 'Hosted private OpenStack cloud service'), + 'call_2_action_url' => new OA\Property(property: 'call_2_action_url', type: 'string', example: 'https://example.com/private-cloud'), + 'slug' => new OA\Property(property: 'slug', type: 'string', example: 'enterprise-private-cloud'), + 'company_id' => new OA\Property(property: 'company_id', type: 'integer', example: 1), + 'type_id' => new OA\Property(property: 'type_id', type: 'integer', example: 1), + 'is_compatible_with_storage' => new OA\Property(property: 'is_compatible_with_storage', type: 'boolean', example: true), + 'is_compatible_with_compute' => new OA\Property(property: 'is_compatible_with_compute', type: 'boolean', example: true), + 'is_compatible_with_federated_identity' => new OA\Property(property: 'is_compatible_with_federated_identity', type: 'boolean', example: true), + 'is_compatible_with_platform' => new OA\Property(property: 'is_compatible_with_platform', type: 'boolean', example: true), + 'is_openstack_powered' => new OA\Property(property: 'is_openstack_powered', type: 'boolean', example: true), + 'is_openstack_tested' => new OA\Property(property: 'is_openstack_tested', type: 'boolean', example: true), + 'openstack_tested_info' => new OA\Property(property: 'openstack_tested_info', type: 'string', example: 'Tested with OpenStack Antelope') + ], + type: 'object' + ) + ) + ], + type: 'object' + ) + ), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] public function getAll() { return parent::getAll(); } -} \ No newline at end of file +} From cf4f5c91efff9d4a8eb10bae7b0b1fa087c11009 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 30 Sep 2025 12:08:49 -0300 Subject: [PATCH 2/7] chore: change schema name to reuse the prublic cloud schema response --- .../PrivateCloudsApiController.php | 34 +------------------ 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php b/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php index 51acc966e..e540166c8 100644 --- a/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php +++ b/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php @@ -83,39 +83,7 @@ public function __construct(IPrivateCloudServiceRepository $repository, IResourc new OA\Response( response: 200, description: 'Success - Returns paginated list of hosted private clouds', - content: new OA\JsonContent( - properties: [ - 'total' => new OA\Property(property: 'total', type: 'integer', example: 10), - 'per_page' => new OA\Property(property: 'per_page', type: 'integer', example: 10), - 'current_page' => new OA\Property(property: 'current_page', type: 'integer', example: 1), - 'last_page' => new OA\Property(property: 'last_page', type: 'integer', example: 1), - 'data' => new OA\Property( - property: 'data', - type: 'array', - items: new OA\Items( - properties: [ - 'id' => new OA\Property(property: 'id', type: 'integer', example: 1), - 'class_name' => new OA\Property(property: 'class_name', type: 'string', example: 'PrivateCloudService'), - 'name' => new OA\Property(property: 'name', type: 'string', example: 'Enterprise Private Cloud'), - 'overview' => new OA\Property(property: 'overview', type: 'string', example: 'Hosted private OpenStack cloud service'), - 'call_2_action_url' => new OA\Property(property: 'call_2_action_url', type: 'string', example: 'https://example.com/private-cloud'), - 'slug' => new OA\Property(property: 'slug', type: 'string', example: 'enterprise-private-cloud'), - 'company_id' => new OA\Property(property: 'company_id', type: 'integer', example: 1), - 'type_id' => new OA\Property(property: 'type_id', type: 'integer', example: 1), - 'is_compatible_with_storage' => new OA\Property(property: 'is_compatible_with_storage', type: 'boolean', example: true), - 'is_compatible_with_compute' => new OA\Property(property: 'is_compatible_with_compute', type: 'boolean', example: true), - 'is_compatible_with_federated_identity' => new OA\Property(property: 'is_compatible_with_federated_identity', type: 'boolean', example: true), - 'is_compatible_with_platform' => new OA\Property(property: 'is_compatible_with_platform', type: 'boolean', example: true), - 'is_openstack_powered' => new OA\Property(property: 'is_openstack_powered', type: 'boolean', example: true), - 'is_openstack_tested' => new OA\Property(property: 'is_openstack_tested', type: 'boolean', example: true), - 'openstack_tested_info' => new OA\Property(property: 'openstack_tested_info', type: 'string', example: 'Tested with OpenStack Antelope') - ], - type: 'object' - ) - ) - ], - type: 'object' - ) + content: new OA\JsonContent(ref: '#/components/schemas/PaginatedPublicOrPrivateCloudsResponseSchema') ), new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") From a415815e3c05912394894d2ee3abfe6a6296e546 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 7 Oct 2025 18:27:28 -0300 Subject: [PATCH 3/7] fix: fix typo --- .../Controllers/Apis/Marketplace/PrivateCloudsApiController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php b/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php index e540166c8..8279bbf13 100644 --- a/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php +++ b/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php @@ -83,7 +83,7 @@ public function __construct(IPrivateCloudServiceRepository $repository, IResourc new OA\Response( response: 200, description: 'Success - Returns paginated list of hosted private clouds', - content: new OA\JsonContent(ref: '#/components/schemas/PaginatedPublicOrPrivateCloudsResponseSchema') + content: new OA\JsonContent(ref: '#/components/schemas/PaginatedPublicOrPrivateCloudsResponse') ), new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") From 7eee1727760def34791419c9bc70091a85a86979 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 11 Nov 2025 20:51:42 +0000 Subject: [PATCH 4/7] chore: Add missing param in PHPDoc constructor documentation --- .../Apis/Marketplace/PrivateCloudsApiController.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php b/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php index 8279bbf13..1bcf55317 100644 --- a/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php +++ b/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php @@ -1,4 +1,5 @@ - Date: Thu, 20 Nov 2025 20:53:23 +0000 Subject: [PATCH 5/7] chore: add missing parameters --- .../Marketplace/PrivateCloudsApiController.php | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php b/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php index 1bcf55317..33a381c3e 100644 --- a/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php +++ b/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php @@ -37,8 +37,22 @@ public function __construct(IPrivateCloudServiceRepository $repository, IResourc description: "Get all marketplace hosted private cloud services (OpenStack implementations)", summary: 'Get all hosted private clouds', operationId: 'getAllHostedPrivateClouds', - tags: ['Marketplace'], + tags: ['Marketplace', 'Clouds'], parameters: [ + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + description: 'Page number for pagination', + schema: new OA\Schema(type: 'integer', example: 1) + ), + new OA\Parameter( + name: 'per_page', + in: 'query', + required: false, + description: 'Items per page', + schema: new OA\Schema(type: 'integer', example: 10, maximum: 100) + ), new OA\Parameter( name: 'filter[]', in: 'query', From 7fc30ad459471c2c92f4445f52f2888f363a2eaf Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 27 Nov 2025 19:00:06 +0000 Subject: [PATCH 6/7] chore: add requested changes --- .../Apis/Marketplace/PrivateCloudsApiController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php b/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php index 33a381c3e..325ae3b06 100644 --- a/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php +++ b/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php @@ -57,7 +57,7 @@ public function __construct(IPrivateCloudServiceRepository $repository, IResourc name: 'filter[]', in: 'query', required: false, - description: 'Filter expressions in the format fieldvalue. Available fields: name, company. Operators: =@, ==, @@.', + description: 'Filter expressions in the format fieldvalue. Available fields: name, company. Operators: =@ (starts with), == (equals), @@ (contains).', style: 'form', explode: true, schema: new OA\Schema( @@ -69,7 +69,7 @@ public function __construct(IPrivateCloudServiceRepository $repository, IResourc name: 'order', in: 'query', required: false, - description: 'Order by field(s)', + description: 'Order by field(s). Available fields: id, name. Use "-" prefix for descending order.', schema: new OA\Schema(type: 'string', example: 'name,-id') ), new OA\Parameter( @@ -108,4 +108,4 @@ public function getAll() { return parent::getAll(); } -} \ No newline at end of file +} From 1b17cd3b4bfa03496bbd332e3aa9beafcf7a28ce Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 11 Dec 2025 19:51:43 +0000 Subject: [PATCH 7/7] chore: include PR requested changes --- .../Controllers/Apis/Marketplace/PrivateCloudsApiController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php b/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php index 325ae3b06..19eda7785 100644 --- a/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php +++ b/app/Http/Controllers/Apis/Marketplace/PrivateCloudsApiController.php @@ -96,7 +96,7 @@ public function __construct(IPrivateCloudServiceRepository $repository, IResourc ], responses: [ new OA\Response( - response: 200, + response: Response::HTTP_OK, description: 'Success - Returns paginated list of hosted private clouds', content: new OA\JsonContent(ref: '#/components/schemas/PaginatedPublicOrPrivateCloudsResponse') ),