Skip to content

Commit 3608a73

Browse files
Feature | Extend Swagger Coverage for controller OAuth2SummitSponsorshipTypeApiController (#393)
* feat: Extend Swagger Coverage for controller `OAuth2SummitSponsorshipTypeApiController` * fix: Change "namespace" word positioning * feat: Extend Swagger Coverage for controller `OAuth2SummitPresentationActionTypeApiController` * chore: add operationId and fix namespace in security schema * fix: merge conflicts and repeated operationId Signed-off-by: Matias Perrone <github@matiasperrone.com> * chore: remove trait methods and add "use" for new used classes Signed-off-by: Matias Perrone <github@matiasperrone.com> --------- Signed-off-by: Matias Perrone <github@matiasperrone.com> Co-authored-by: Matias Perrone <github@matiasperrone.com>
1 parent cde76ee commit 3608a73

4 files changed

Lines changed: 382 additions & 38 deletions

File tree

app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSponsorshipTypeApiController.php

Lines changed: 309 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
<?php namespace App\Http\Controllers;
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
25
/*
36
* Copyright 2022 OpenStack Foundation
47
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,22 +15,25 @@
1215
* limitations under the License.
1316
**/
1417

18+
use App\Models\Foundation\Main\IGroup;
1519
use App\Models\Foundation\Summit\Repositories\ISummitSponsorshipTypeRepository;
1620
use App\ModelSerializers\SerializerUtils;
21+
use App\Security\SummitScopes;
1722
use App\Services\Model\ISummitSponsorshipTypeService;
1823
use Illuminate\Http\Request as LaravelRequest;
24+
use Illuminate\Http\Response;
1925
use models\oauth2\IResourceServerContext;
2026
use models\summit\ISummitRepository;
2127
use models\summit\Summit;
2228
use models\utils\IEntity;
2329
use ModelSerializers\SerializerRegistry;
30+
use OpenApi\Attributes as OA;
2431

2532
/**
2633
* Class OAuth2SummitSponsorshipTypeApiController
2734
* @package App\Http\Controllers
2835
*/
29-
final class OAuth2SummitSponsorshipTypeApiController
30-
extends OAuth2ProtectedController
36+
final class OAuth2SummitSponsorshipTypeApiController extends OAuth2ProtectedController
3137
{
3238
/**
3339
* @var ISummitRepository
@@ -51,8 +57,7 @@ public function __construct
5157
ISummitSponsorshipTypeRepository $repository,
5258
ISummitSponsorshipTypeService $service,
5359
IResourceServerContext $resource_server_context
54-
)
55-
{
60+
) {
5661
$this->service = $service;
5762
$this->repository = $repository;
5863
$this->summit_repository = $summit_repository;
@@ -69,6 +74,207 @@ public function __construct
6974

7075
use DeleteSummitChildElement;
7176

77+
#[OA\Get(
78+
path: '/api/v1/summits/{id}/sponsorships-types',
79+
summary: 'Get all sponsorship types for a summit',
80+
operationId: 'getSummitAllSponsorshipTypes',
81+
x: [
82+
'required-groups' => [
83+
IGroup::SuperAdmins,
84+
IGroup::Administrators,
85+
IGroup::SummitAdministrators,
86+
]
87+
],
88+
security: [
89+
[
90+
'sponsorship_types_oauth2' => [
91+
SummitScopes::ReadSummitData,
92+
SummitScopes::ReadAllSummitData,
93+
]
94+
]
95+
],
96+
tags: ['Summits Sponsorship Types'],
97+
parameters: [
98+
new OA\Parameter(name: 'page', in: 'query', required: false, description: 'Page number', schema: new OA\Schema(type: 'integer', default: 1)),
99+
new OA\Parameter(name: 'per_page', in: 'query', required: false, description: 'Items per page', schema: new OA\Schema(type: 'integer', default: 10, maximum: 100)),
100+
new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'integer')),
101+
new OA\Parameter(name: 'filter', in: 'query', description: 'Filter by name, label, or size (name=@value, label==value, size=@value)', schema: new OA\Schema(type: 'string')),
102+
new OA\Parameter(name: 'order', in: 'query', description: 'Order by: +/-id, +/-name, +/-order, +/-label, +/-size', schema: new OA\Schema(type: 'string')),
103+
new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')),
104+
new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return (comma-separated)', schema: new OA\Schema(type: 'string')),
105+
new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Related entities to include (comma-separated)', schema: new OA\Schema(type: 'string')),
106+
],
107+
responses: [
108+
new OA\Response(
109+
response: Response::HTTP_OK,
110+
description: 'Successful response',
111+
content: new OA\JsonContent(ref: '#/components/schemas/PaginatedSummitSponsorshipTypesResponse')
112+
),
113+
new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"),
114+
new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"),
115+
new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"),
116+
new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"),
117+
new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"),
118+
]
119+
)]
120+
121+
#[OA\Post(
122+
path: '/api/v1/summits/{id}/sponsorships-types',
123+
summary: 'Create a new sponsorship type',
124+
operationId: 'createSummitSponsorshipType',
125+
x: [
126+
'required-groups' => [
127+
IGroup::SuperAdmins,
128+
IGroup::Administrators,
129+
IGroup::SummitAdministrators,
130+
]
131+
],
132+
security: [
133+
[
134+
'sponsorship_types_oauth2' => [
135+
SummitScopes::WriteSummitData,
136+
]
137+
]
138+
],
139+
tags: ['Summits Sponsorship Types'],
140+
parameters: [
141+
new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'integer')),
142+
],
143+
requestBody: new OA\RequestBody(
144+
required: true,
145+
content: new OA\JsonContent(ref: '#/components/schemas/SummitSponsorshipTypeCreateRequest')
146+
),
147+
responses: [
148+
new OA\Response(
149+
response: Response::HTTP_CREATED,
150+
description: 'Sponsorship type created',
151+
content: new OA\JsonContent(ref: '#/components/schemas/SummitSponsorshipType')
152+
),
153+
new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"),
154+
new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"),
155+
new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"),
156+
new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"),
157+
new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"),
158+
new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"),
159+
]
160+
)]
161+
162+
#[OA\Get(
163+
path: '/api/v1/summits/{id}/sponsorships-types/{type_id}',
164+
summary: 'Get a sponsorship type by ID',
165+
operationId: 'getSummitSponsorshipType',
166+
x: [
167+
'required-groups' => [
168+
IGroup::SuperAdmins,
169+
IGroup::Administrators,
170+
IGroup::SummitAdministrators,
171+
]
172+
],
173+
security: [
174+
[
175+
'sponsorship_types_oauth2' => [
176+
SummitScopes::ReadSummitData,
177+
SummitScopes::ReadAllSummitData,
178+
]
179+
]
180+
],
181+
tags: ['Summits Sponsorship Types'],
182+
parameters: [
183+
new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'integer')),
184+
new OA\Parameter(name: 'type_id', in: 'path', required: true, description: 'Sponsorship Type ID', schema: new OA\Schema(type: 'integer')),
185+
new OA\Parameter(name: 'expand', in: 'query', required: false, description: 'Expand related entities', schema: new OA\Schema(type: 'string')),
186+
new OA\Parameter(name: 'fields', in: 'query', required: false, description: 'Fields to return (comma-separated)', schema: new OA\Schema(type: 'string')),
187+
new OA\Parameter(name: 'relations', in: 'query', required: false, description: 'Related entities to include (comma-separated)', schema: new OA\Schema(type: 'string')),
188+
],
189+
responses: [
190+
new OA\Response(
191+
response: Response::HTTP_OK,
192+
description: 'Successful response',
193+
content: new OA\JsonContent(ref: '#/components/schemas/SummitSponsorshipType')
194+
),
195+
new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"),
196+
new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"),
197+
new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"),
198+
new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"),
199+
new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"),
200+
]
201+
)]
202+
203+
#[OA\Put(
204+
path: '/api/v1/summits/{id}/sponsorships-types/{type_id}',
205+
summary: 'Update a sponsorship type',
206+
operationId: 'updateSummitSponsorshipType',
207+
x: [
208+
'required-groups' => [
209+
IGroup::SuperAdmins,
210+
IGroup::Administrators,
211+
IGroup::SummitAdministrators,
212+
]
213+
],
214+
security: [
215+
[
216+
'sponsorship_types_oauth2' => [
217+
SummitScopes::WriteSummitData,
218+
]
219+
]
220+
],
221+
tags: ['Summits Sponsorship Types'],
222+
parameters: [
223+
new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'integer')),
224+
new OA\Parameter(name: 'type_id', in: 'path', required: true, description: 'Sponsorship Type ID', schema: new OA\Schema(type: 'integer')),
225+
],
226+
requestBody: new OA\RequestBody(
227+
required: true,
228+
content: new OA\JsonContent(ref: '#/components/schemas/SummitSponsorshipTypeUpdateRequest')
229+
),
230+
responses: [
231+
new OA\Response(
232+
response: Response::HTTP_OK,
233+
description: 'Sponsorship type updated',
234+
content: new OA\JsonContent(ref: '#/components/schemas/SummitSponsorshipType')
235+
),
236+
new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"),
237+
new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"),
238+
new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"),
239+
new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"),
240+
new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"),
241+
new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"),
242+
]
243+
)]
244+
245+
#[OA\Delete(
246+
path: '/api/v1/summits/{id}/sponsorships-types/{type_id}',
247+
summary: 'Delete a sponsorship type',
248+
operationId: 'deleteSummitSponsorshipType',
249+
x: [
250+
'required-groups' => [
251+
IGroup::SuperAdmins,
252+
IGroup::Administrators,
253+
IGroup::SummitAdministrators,
254+
]
255+
],
256+
security: [
257+
[
258+
'sponsorship_types_oauth2' => [
259+
SummitScopes::WriteSummitData,
260+
]
261+
]
262+
],
263+
tags: ['Summits Sponsorship Types'],
264+
parameters: [
265+
new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'integer')),
266+
new OA\Parameter(name: 'type_id', in: 'path', required: true, description: 'Sponsorship Type ID', schema: new OA\Schema(type: 'integer')),
267+
],
268+
responses: [
269+
new OA\Response(response: Response::HTTP_NO_CONTENT, description: "No Content"),
270+
new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"),
271+
new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"),
272+
new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"),
273+
new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"),
274+
new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"),
275+
]
276+
)]
277+
72278
/**
73279
* @return array
74280
*/
@@ -151,7 +357,7 @@ protected function deleteChild(Summit $summit, $child_id): void
151357
*/
152358
protected function getChildFromSummit(Summit $summit, $child_id): ?IEntity
153359
{
154-
return $summit->getSummitSponsorshipTypeById(intval($child_id));
360+
return $summit->getSummitSponsorshipTypeById(intval($child_id));
155361
}
156362

157363
/**
@@ -171,7 +377,7 @@ function getUpdateValidationRules(array $payload): array
171377
*/
172378
protected function updateChild(Summit $summit, int $child_id, array $payload): IEntity
173379
{
174-
return $this->service->update($summit,$child_id, $payload);
380+
return $this->service->update($summit, $child_id, $payload);
175381
}
176382

177383
use RequestProcessor;
@@ -184,11 +390,68 @@ protected function updateChild(Summit $summit, int $child_id, array $payload): I
184390
* @throws \models\exceptions\EntityNotFoundException
185391
* @throws \models\exceptions\ValidationException
186392
*/
187-
public function addBadgeImage(LaravelRequest $request, $summit_id, $type_id){
393+
#[OA\Post(
394+
path: '/api/v1/summits/{id}/sponsorships-types/{type_id}/badge-image',
395+
summary: 'Upload a badge image for a sponsorship type',
396+
operationId: 'addSummitSponsorshipTypeBadgeImage',
397+
x: [
398+
'required-groups' => [
399+
IGroup::SuperAdmins,
400+
IGroup::Administrators,
401+
IGroup::SummitAdministrators,
402+
]
403+
],
404+
security: [
405+
[
406+
'sponsorship_types_oauth2' => [
407+
SummitScopes::WriteSummitData,
408+
]
409+
]
410+
],
411+
tags: ['Summits Sponsorship Types'],
412+
parameters: [
413+
new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'integer')),
414+
new OA\Parameter(name: 'type_id', in: 'path', required: true, description: 'Sponsorship Type ID', schema: new OA\Schema(type: 'integer')),
415+
],
416+
requestBody: new OA\RequestBody(
417+
required: true,
418+
content: new OA\MediaType(
419+
mediaType: 'multipart/form-data',
420+
schema: new OA\Schema(
421+
required: ['file'],
422+
properties: [
423+
new OA\Property(property: 'file', type: 'string', format: 'binary', description: 'Image file to upload')
424+
]
425+
)
426+
)
427+
),
428+
responses: [
429+
new OA\Response(
430+
response: Response::HTTP_CREATED,
431+
description: 'Badge image uploaded successfully',
432+
content: new OA\JsonContent(
433+
properties: [
434+
new OA\Property(property: 'id', type: 'integer', example: 123),
435+
new OA\Property(property: 'url', type: 'string', example: 'https://example.com/badge.png'),
436+
new OA\Property(property: 'filename', type: 'string', example: 'badge.png'),
437+
]
438+
)
439+
),
440+
new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"),
441+
new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"),
442+
new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"),
443+
new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"),
444+
new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"),
445+
new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"),
446+
]
447+
)]
448+
public function addBadgeImage(LaravelRequest $request, $summit_id, $type_id)
449+
{
188450
return $this->processRequest(function () use ($request, $summit_id, $type_id) {
189451

190452
$summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id);
191-
if (is_null($summit)) return $this->error404();
453+
if (is_null($summit))
454+
return $this->error404();
192455

193456
$file = $request->file('file');
194457
if (is_null($file)) {
@@ -214,16 +477,50 @@ public function addBadgeImage(LaravelRequest $request, $summit_id, $type_id){
214477
* @throws \models\exceptions\EntityNotFoundException
215478
* @throws \models\exceptions\ValidationException
216479
*/
217-
public function removeBadgeImage($summit_id, $type_id){
480+
#[OA\Delete(
481+
path: '/api/v1/summits/{id}/sponsorships-types/{type_id}/badge-image',
482+
summary: 'Remove the badge image from a sponsorship type',
483+
operationId: 'deleteSummitSponsorshipTypeBadgeImage',
484+
x: [
485+
'required-groups' => [
486+
IGroup::SuperAdmins,
487+
IGroup::Administrators,
488+
IGroup::SummitAdministrators,
489+
]
490+
],
491+
security: [
492+
[
493+
'sponsorship_types_oauth2' => [
494+
SummitScopes::WriteSummitData,
495+
]
496+
]
497+
],
498+
tags: ['Summits Sponsorship Types'],
499+
parameters: [
500+
new OA\Parameter(name: 'id', in: 'path', required: true, description: 'Summit ID', schema: new OA\Schema(type: 'integer')),
501+
new OA\Parameter(name: 'type_id', in: 'path', required: true, description: 'Sponsorship Type ID', schema: new OA\Schema(type: 'integer')),
502+
],
503+
responses: [
504+
new OA\Response(response: Response::HTTP_NO_CONTENT, description: "No Content"),
505+
new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"),
506+
new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"),
507+
new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"),
508+
new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"),
509+
new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"),
510+
]
511+
)]
512+
public function removeBadgeImage($summit_id, $type_id)
513+
{
218514
return $this->processRequest(function () use ($summit_id, $type_id) {
219515

220516
$summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id);
221-
if (is_null($summit)) return $this->error404();
517+
if (is_null($summit))
518+
return $this->error404();
222519

223520
$this->service->deleteBadgeImage($summit, $type_id);
224521

225522
return $this->deleted();
226523

227524
});
228525
}
229-
}
526+
}

0 commit comments

Comments
 (0)