From 38790cd32e07ad22bb622536194a5a8272cbd14e Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Mon, 13 Oct 2025 12:53:12 -0300 Subject: [PATCH 01/15] feat: Extend Swagger Coverage for controller `OAuth2SummitMediaUploadTypeApiController` --- ...uth2SummitMediaUploadTypeApiController.php | 327 ++++-------------- app/Swagger/SummitSchemas.php | 147 ++++++-- 2 files changed, 202 insertions(+), 272 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php index 6ecbdf140..d2c459bb7 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php @@ -1,5 +1,4 @@ [ - SummitScopes::ReadAllSummitData, - ] - ] - ], - x: [ - 'required-groups' => [ - IGroup::SuperAdmins, - IGroup::Administrators, - IGroup::SummitAdministrators, - ] - ], + security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter( - name: 'id', - in: 'path', - required: true, - schema: new OA\Schema(type: 'integer'), - description: 'The summit ID' - ), - new OA\Parameter( - name: 'page', - in: 'query', - required: false, - schema: new OA\Schema(type: 'integer'), - description: 'The page number' - ), - new OA\Parameter( - name: 'per_page', - in: 'query', - required: false, - schema: new OA\Schema(type: 'integer'), - description: 'The number of items per page', - ), + new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), + new OA\Parameter(ref: "#/components/parameters/page_number_param"), + new OA\Parameter(ref: "#/components/parameters/page_size_param"), new OA\Parameter( name: "filter[]", in: "query", @@ -150,39 +114,25 @@ public function __construct new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit Not Found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit not found"), ] )] - // public function getAllBySummit($summit_id) + public function getAllBySummit($summit_id) + { + $this->summit_id = $summit_id; + $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($this->summit_id); + if (is_null($summit)) return $this->error404(); + return $this->getAll(); + } #[OA\Get( path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}", - operationId: "getMediaUploadType", summary: "Get a specific media upload type", description: "Returns detailed information about a specific media upload type", - security: [ - [ - "summit_media_upload_type_oauth2" => [ - SummitScopes::ReadAllSummitData, - ] - ] - ], - x: [ - 'required-groups' => [ - IGroup::SuperAdmins, - IGroup::Administrators, - IGroup::SummitAdministrators, - ] - ], + security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter( - name: 'id', - in: 'path', - required: true, - schema: new OA\Schema(type: 'integer'), - description: 'The summit ID' - ), + new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), new OA\Parameter( name: "media_upload_type_id", in: "path", @@ -213,39 +163,22 @@ public function __construct ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "not found"), ] )] - // public function get($summit_id, $media_upload_type_id) + public function get($summit_id, $media_upload_type_id) + { + return $this->getById($summit_id, $media_upload_type_id); + } #[OA\Post( path: "/api/v1/summits/{id}/media-upload-types", - operationId: "createMediaUploadType", summary: "Create a new media upload type", description: "Creates a new media upload type for the specified summit", - security: [ - [ - "summit_media_upload_type_oauth2" => [ - SummitScopes::WriteSummitData, - ] - ] - ], - x: [ - 'required-groups' => [ - IGroup::SuperAdmins, - IGroup::Administrators, - IGroup::SummitAdministrators, - ] - ], + security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter( - name: 'id', - in: 'path', - required: true, - schema: new OA\Schema(type: 'integer'), - description: 'The summit ID' - ), + new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), ], requestBody: new OA\RequestBody( required: true, @@ -260,40 +193,23 @@ public function __construct new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit Not Found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit not found"), new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), ] )] - // public function add($summit_id) + public function add($summit_id) + { + return $this->addChild($summit_id); + } #[OA\Put( path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}", - operationId: "updateMediaUploadType", summary: "Update a media upload type", description: "Updates an existing media upload type", - security: [ - [ - "summit_media_upload_type_oauth2" => [ - SummitScopes::WriteSummitData, - ] - ] - ], - x: [ - 'required-groups' => [ - IGroup::SuperAdmins, - IGroup::Administrators, - IGroup::SummitAdministrators, - ] - ], + security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter( - name: 'id', - in: 'path', - required: true, - schema: new OA\Schema(type: 'integer'), - description: 'The summit ID' - ), + new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), new OA\Parameter( name: "media_upload_type_id", in: "path", @@ -315,40 +231,23 @@ public function __construct new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "not found"), new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), ] )] - // public function update($summit_id, $media_upload_type_id) + public function update($summit_id, $media_upload_type_id) + { + return $this->updateChild($summit_id, $media_upload_type_id); + } #[OA\Delete( path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}", - operationId: "deleteMediaUploadType", summary: "Delete a media upload type", description: "Deletes a media upload type from the summit", - security: [ - [ - "summit_media_upload_type_oauth2" => [ - SummitScopes::WriteSummitData, - ] - ] - ], - x: [ - 'required-groups' => [ - IGroup::SuperAdmins, - IGroup::Administrators, - IGroup::SummitAdministrators, - ] - ], + security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter( - name: 'id', - in: 'path', - required: true, - schema: new OA\Schema(type: 'integer'), - description: 'The summit ID' - ), + new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), new OA\Parameter( name: "media_upload_type_id", in: "path", @@ -361,10 +260,13 @@ public function __construct new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Deleted successfully"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "not found"), ] )] - // public function delete($summit_id, $media_upload_type_id) + public function delete($summit_id, $media_upload_type_id) + { + return $this->deleteChild($summit_id, $media_upload_type_id); + } /** * @return array @@ -402,10 +304,10 @@ protected function addChild(Summit $summit, array $payload): IEntity // authz // check that we have a current member ( not service account ) $current_member = $this->getResourceServerContext()->getCurrentUser(); - if (is_null($current_member)) + if(is_null($current_member)) throw new HTTP401UnauthorizedException(); // check summit access - if (!$current_member->isSummitAllowed($summit)) + if(!$current_member->isSummitAllowed($summit)) throw new HTTP403ForbiddenException(); return $this->service->add($summit, $payload); } @@ -434,10 +336,10 @@ protected function deleteChild(Summit $summit, $child_id): void // authz // check that we have a current member ( not service account ) $current_member = $this->getResourceServerContext()->getCurrentUser(); - if (is_null($current_member)) + if(is_null($current_member)) throw new HTTP401UnauthorizedException(); // check summit access - if (!$current_member->isSummitAllowed($summit)) + if(!$current_member->isSummitAllowed($summit)) throw new HTTP403ForbiddenException(); $this->service->delete($summit, $child_id); @@ -451,13 +353,13 @@ protected function getChildFromSummit(Summit $summit, $child_id): ?IEntity // authz // check that we have a current member ( not service account ) $current_member = $this->getResourceServerContext()->getCurrentUser(); - if (is_null($current_member)) + if(is_null($current_member)) throw new HTTP401UnauthorizedException(); // check summit access - if (!$current_member->isSummitAllowed($summit)) + if(!$current_member->isSummitAllowed($summit)) throw new HTTP403ForbiddenException(); - return $summit->getMediaUploadTypeById($child_id); + return $summit->getMediaUploadTypeById($child_id); } /** @@ -476,10 +378,10 @@ protected function updateChild(Summit $summit, int $child_id, array $payload): I // authz // check that we have a current member ( not service account ) $current_member = $this->getResourceServerContext()->getCurrentUser(); - if (is_null($current_member)) + if(is_null($current_member)) throw new HTTP401UnauthorizedException(); // check summit access - if (!$current_member->isSummitAllowed($summit)) + if(!$current_member->isSummitAllowed($summit)) throw new HTTP403ForbiddenException(); return $this->service->update($summit, $child_id, $payload); @@ -487,32 +389,12 @@ protected function updateChild(Summit $summit, int $child_id, array $payload): I #[OA\Put( path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}/presentation-types/{event_type_id}", - operationId: "addMediaUploadTypeToPresentationType", summary: "Add media upload type to presentation type", description: "Associates a media upload type with a specific presentation type", - security: [ - [ - "summit_media_upload_type_oauth2" => [ - SummitScopes::WriteSummitData, - ] - ] - ], - x: [ - 'required-groups' => [ - IGroup::SuperAdmins, - IGroup::Administrators, - IGroup::SummitAdministrators, - ] - ], + security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter( - name: 'id', - in: 'path', - required: true, - schema: new OA\Schema(type: 'integer'), - description: 'The summit ID' - ), + new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), new OA\Parameter( name: "media_upload_type_id", in: "path", @@ -536,28 +418,22 @@ protected function updateChild(Summit $summit, int $child_id, array $payload): I ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "not found"), ] )] - /** - * @param $summit_id - * @param $media_upload_type_id - * @param $presentation_type_id - * @return \Illuminate\Http\JsonResponse|mixed - */ public function addToPresentationType($summit_id, $media_upload_type_id, $presentation_type_id){ - return $this->processRequest(function () use ($summit_id, $media_upload_type_id, $presentation_type_id) { + return $this->processRequest(function() use($summit_id, $media_upload_type_id, $presentation_type_id){ $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($summit_id); if (is_null($summit)) return $this->error404(); - // authz - // check that we have a current member ( not service account ) - $current_member = $this->getResourceServerContext()->getCurrentUser(); - if (is_null($current_member)) - throw new HTTP401UnauthorizedException(); - // check summit access - if (!$current_member->isSummitAllowed($summit)) - throw new HTTP403ForbiddenException(); + // authz + // check that we have a current member ( not service account ) + $current_member = $this->getResourceServerContext()->getCurrentUser(); + if(is_null($current_member)) + throw new HTTP401UnauthorizedException(); + // check summit access + if(!$current_member->isSummitAllowed($summit)) + throw new HTTP403ForbiddenException(); $presentation_type = $this->service->addToPresentationType($summit, intval($media_upload_type_id), intval($presentation_type_id)); @@ -570,32 +446,12 @@ public function addToPresentationType($summit_id, $media_upload_type_id, $presen #[OA\Delete( path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}/presentation-types/{event_type_id}", - operationId: "removeMediaUploadTypeFromPresentationType", summary: "Remove media upload type from presentation type", description: "Removes the association between a media upload type and a presentation type", - security: [ - [ - "summit_media_upload_type_oauth2" => [ - SummitScopes::WriteSummitData, - ] - ] - ], - x: [ - 'required-groups' => [ - IGroup::SuperAdmins, - IGroup::Administrators, - IGroup::SummitAdministrators, - ] - ], + security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter( - name: 'id', - in: 'path', - required: true, - schema: new OA\Schema(type: 'integer'), - description: 'The summit ID' - ), + new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), new OA\Parameter( name: "media_upload_type_id", in: "path", @@ -619,27 +475,21 @@ public function addToPresentationType($summit_id, $media_upload_type_id, $presen ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "not found"), ] )] - /** - * @param $summit_id - * @param $media_upload_type_id - * @param $presentation_type_id - * @return \Illuminate\Http\JsonResponse|mixed - */ public function deleteFromPresentationType($summit_id, $media_upload_type_id, $presentation_type_id){ - return $this->processRequest(function () use ($summit_id, $media_upload_type_id, $presentation_type_id) { + return $this->processRequest(function() use($summit_id, $media_upload_type_id, $presentation_type_id){ $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($summit_id); if (is_null($summit)) return $this->error404(); // authz // check that we have a current member ( not service account ) $current_member = $this->getResourceServerContext()->getCurrentUser(); - if (is_null($current_member)) + if(is_null($current_member)) throw new HTTP401UnauthorizedException(); // check summit access - if (!$current_member->isSummitAllowed($summit)) + if(!$current_member->isSummitAllowed($summit)) throw new HTTP403ForbiddenException(); $presentation_type = $this->service->deleteFromPresentationType($summit, intval($media_upload_type_id), intval($presentation_type_id)); @@ -652,32 +502,12 @@ public function deleteFromPresentationType($summit_id, $media_upload_type_id, $p #[OA\Post( path: "/api/v1/summits/{id}/media-upload-types/all/clone/{to_summit_id}", - operationId: "cloneMediaUploadTypes", summary: "Clone media upload types to another summit", description: "Clones all media upload types from one summit to another summit", - security: [ - [ - "summit_media_upload_type_oauth2" => [ - SummitScopes::WriteSummitData, - ] - ] - ], - x: [ - 'required-groups' => [ - IGroup::SuperAdmins, - IGroup::Administrators, - IGroup::SummitAdministrators, - ] - ], + security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter( - name: 'id', - in: 'path', - required: true, - schema: new OA\Schema(type: 'integer'), - description: 'The summit ID' - ), + new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), new OA\Parameter( name: "to_summit_id", in: "path", @@ -690,20 +520,15 @@ public function deleteFromPresentationType($summit_id, $media_upload_type_id, $p new OA\Response( response: Response::HTTP_CREATED, description: "Success - Returns the target summit with cloned media upload types", - content: new OA\JsonContent(ref: "#/components/schemas/Summit") + content: new OA\JsonContent(type: "object") ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Source or target summit Not Found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Source or target summit not found"), ] )] - /** - * @param $summit_id - * @param $to_summit_id - * @return \Illuminate\Http\JsonResponse|mixed - */ public function cloneMediaUploadTypes($summit_id, $to_summit_id){ - return $this->processRequest(function () use ($summit_id, $to_summit_id) { + return $this->processRequest(function() use($summit_id, $to_summit_id){ $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($summit_id); if (is_null($summit)) return $this->error404(); @@ -713,14 +538,14 @@ public function cloneMediaUploadTypes($summit_id, $to_summit_id){ // authz // check that we have a current member ( not service account ) $current_member = $this->getResourceServerContext()->getCurrentUser(); - if (is_null($current_member)) + if(is_null($current_member)) throw new HTTP401UnauthorizedException(); // check summit access - if (!$current_member->isSummitAllowed($summit)) + if(!$current_member->isSummitAllowed($summit)) throw new HTTP403ForbiddenException(); // check summit access - if (!$current_member->isSummitAllowed($to_summit)) + if(!$current_member->isSummitAllowed($to_summit)) throw new HTTP403ForbiddenException(); $to_summit = $this->service->cloneMediaUploadTypes($summit, $to_summit); diff --git a/app/Swagger/SummitSchemas.php b/app/Swagger/SummitSchemas.php index 72063d23d..e604ceed0 100644 --- a/app/Swagger/SummitSchemas.php +++ b/app/Swagger/SummitSchemas.php @@ -33,7 +33,9 @@ ) ] )] -class SummitScheduleConfigContentSchema {} +class SummitScheduleConfigContentSchema +{ +} #[OA\Schema( @@ -50,7 +52,9 @@ class SummitScheduleConfigContentSchema {} ) ] )] -class SummitScheduleConfigSchema {} +class SummitScheduleConfigSchema +{ +} #[OA\Schema( schema: 'PaginatedSummitScheduleConfigsResponse', @@ -68,7 +72,9 @@ class SummitScheduleConfigSchema {} ) ] )] -class PaginatedSummitScheduleConfigsResponseSchema {} +class PaginatedSummitScheduleConfigsResponseSchema +{ +} #[OA\Schema( schema: 'SummitScheduleFilterElementConfig', @@ -88,7 +94,9 @@ enum: ['DATE', 'TRACK', 'TRACK_GROUPS', 'COMPANY', 'LEVEL', 'SPEAKERS', 'VENUES' ), ] )] -class SummitScheduleFilterElementConfigSchema {} +class SummitScheduleFilterElementConfigSchema +{ +} #[OA\Schema( schema: 'SummitSchedulePreFilterElementConfig', @@ -111,7 +119,9 @@ enum: ['DATE', 'TRACK', 'TRACK_GROUPS', 'COMPANY', 'LEVEL', 'SPEAKERS', 'VENUES' ) ] )] -class SummitSchedulePreFilterElementConfigSchema {} +class SummitSchedulePreFilterElementConfigSchema +{ +} #[OA\Schema( schema: 'SummitScheduleConfigCreateRequest', @@ -153,7 +163,9 @@ class SummitSchedulePreFilterElementConfigSchema {} ) ] )] -class SummitScheduleConfigCreateRequestSchema {} +class SummitScheduleConfigCreateRequestSchema +{ +} #[OA\Schema( schema: 'SummitScheduleConfigUpdateRequest', @@ -194,7 +206,9 @@ class SummitScheduleConfigCreateRequestSchema {} ) ] )] -class SummitScheduleConfigUpdateRequestSchema {} +class SummitScheduleConfigUpdateRequestSchema +{ +} // Summit Documents @@ -222,7 +236,9 @@ class SummitScheduleConfigUpdateRequestSchema {} new OA\Property(property: "summit_id", type: "integer", description: "Summit ID, full object description when ?expand=summit (summit)"), ] )] -class SummitDocumentSchema {} +class SummitDocumentSchema +{ +} #[OA\Schema( schema: "PaginatedSummitDocumentsResponse", @@ -240,7 +256,9 @@ class SummitDocumentSchema {} ) ] )] -class PaginatedSummitDocumentsResponseSchema {} +class PaginatedSummitDocumentsResponseSchema +{ +} #[OA\Schema( schema: "SummitDocumentCreateRequest", @@ -270,7 +288,9 @@ class PaginatedSummitDocumentsResponseSchema {} ), ] )] -class SummitDocumentCreateRequest {} +class SummitDocumentCreateRequest +{ +} #[OA\Schema( schema: "SummitDocumentUpdateRequest", @@ -292,7 +312,9 @@ class SummitDocumentCreateRequest {} ), ] )] -class SummitDocumentUpdateRequest {} +class SummitDocumentUpdateRequest +{ +} // Summit Attendee Badges @@ -341,10 +363,54 @@ class SummitAttendeeBadgeSchema ) ] )] -class PaginatedSummitAttendeeBadgesResponseSchema {} +class PaginatedSummitAttendeeBadgesResponseSchema +{ +} // Summit Media Upload Type Schemas +#[OA\Schema( + schema: "SummitMediaUploadType", + description: "Summit Media Upload Type", + type: "object", + properties: [ + new OA\Property(property: "id", type: "integer", example: 1), + new OA\Property(property: "created", type: "integer", format: "int64", description: "Creation timestamp (epoch)", example: 1234567890), + new OA\Property(property: "last_edited", type: "integer", format: "int64", description: "Last edit timestamp (epoch)", example: 1234567890), + new OA\Property(property: "name", type: "string", maxLength: 255, example: "Speaker Photo"), + new OA\Property(property: "description", type: "string", maxLength: 5120, nullable: true, example: "High resolution photo of the speaker"), + new OA\Property(property: "max_size", type: "integer", description: "Maximum file size in KB", example: 10240), + new OA\Property(property: "is_mandatory", type: "boolean", example: true), + new OA\Property(property: "min_uploads_qty", type: "integer", minimum: 0, example: 1), + new OA\Property(property: "max_uploads_qty", type: "integer", minimum: 0, example: 1), + new OA\Property(property: "use_temporary_links_on_public_storage", type: "boolean", example: false), + new OA\Property(property: "temporary_links_public_storage_ttl", type: "integer", description: "TTL in seconds", nullable: true, example: 3600), + new OA\Property(property: "private_storage_type", type: "string", example: "local"), + new OA\Property(property: "public_storage_type", type: "string", example: "s3"), + new OA\Property(property: "type_id", type: "integer", example: 456), + new OA\Property(property: "is_editable", type: "boolean", example: true), + ], + anyOf: [ + new OA\Property(property: "summit_id", type: "integer", example: 123, description: "Summit ID, only when expand does NOT include 'summit' in it."), + new OA\Property(property: "summit", type: "Summit", description: "Summit expand (only when relations=presentation_types) and expand includes 'summit' in it."), + new OA\Property( + property: "presentation_types", + type: "array", + items: new OA\Items(type: "integer"), + description: "Array of presentation type IDs (only when relations=presentation_types and expand does not include 'presentation_types' in it)", + example: [1, 2, 3] + ), + new OA\Property( + property: "presentation_types", + type: "array", + items: new OA\Items(type: "PresentationType"), + description: "Array of PresentationType (only when relations=presentation_types and expand includes 'presentation_types' in it)", + ), + ], +)] +class SummitMediaUploadTypeSchema +{ +} #[OA\Schema( schema: "PaginatedSummitMediaUploadTypesResponse", @@ -362,7 +428,9 @@ class PaginatedSummitAttendeeBadgesResponseSchema {} ], type: "object" )] -class PaginatedSummitMediaUploadTypesResponseSchema {} +class PaginatedSummitMediaUploadTypesResponseSchema +{ +} #[OA\Schema( schema: "SummitMediaUploadTypeCreateRequest", @@ -392,7 +460,9 @@ class PaginatedSummitMediaUploadTypesResponseSchema {} ], type: "object" )] -class SummitMediaUploadTypeCreateRequestSchema {} +class SummitMediaUploadTypeCreateRequestSchema +{ +} #[OA\Schema( schema: "SummitMediaUploadTypeUpdateRequest", @@ -421,7 +491,9 @@ class SummitMediaUploadTypeCreateRequestSchema {} ], type: "object" )] -class SummitMediaUploadTypeUpdateRequestSchema {} +class SummitMediaUploadTypeUpdateRequestSchema +{ +} #[OA\Schema( @@ -440,7 +512,9 @@ class SummitMediaUploadTypeUpdateRequestSchema {} ) ] )] -class PaginatedSummitSponsorshipTypesResponseSchema {} +class PaginatedSummitSponsorshipTypesResponseSchema +{ +} #[OA\Schema( schema: 'SummitSponsorshipTypeCreateRequest', @@ -452,7 +526,9 @@ class PaginatedSummitSponsorshipTypesResponseSchema {} new OA\Property(property: 'size', type: 'string', example: ISponsorshipTypeConstants::BigSize, enum: ISponsorshipTypeConstants::AllowedSizes), ] )] -class SummitSponsorshipTypeCreateRequestSchema {} +class SummitSponsorshipTypeCreateRequestSchema +{ +} #[OA\Schema( schema: 'SummitSponsorshipTypeUpdateRequest', @@ -464,8 +540,31 @@ class SummitSponsorshipTypeCreateRequestSchema {} new OA\Property(property: 'order', type: 'integer', example: 1, minimum: 1), ] )] -class SummitSponsorshipTypeUpdateRequestSchema {} +class SummitSponsorshipTypeUpdateRequestSchema +{ +} +#[OA\Schema( + schema: 'SummitMediaFileType', + type: 'object', + properties: [ + new OA\Property(property: 'id', type: 'integer', example: 1), + new OA\Property(property: 'created', type: 'integer', format: 'int64', example: 1633024800), + new OA\Property(property: 'last_edited', type: 'integer', format: 'int64', example: 1633024800), + new OA\Property(property: 'name', type: 'string', example: 'Presentation'), + new OA\Property(property: 'description', type: 'string', example: 'Presentation files for events'), + new OA\Property(property: 'is_system_defined', type: 'boolean', example: false), + new OA\Property( + property: 'allowed_extensions', + type: 'array', + items: new OA\Items(type: 'string'), + example: ['pdf', 'ppt', 'pptx'] + ), + ] +)] +class SummitMediaFileTypeSchema +{ +} #[OA\Schema( schema: 'PaginatedSummitMediaFileTypesResponse', @@ -483,7 +582,9 @@ class SummitSponsorshipTypeUpdateRequestSchema {} ) ] )] -class PaginatedSummitMediaFileTypesResponseSchema {} +class PaginatedSummitMediaFileTypesResponseSchema +{ +} #[OA\Schema( schema: 'SummitMediaFileTypeCreateRequest', @@ -501,7 +602,9 @@ class PaginatedSummitMediaFileTypesResponseSchema {} ), ] )] -class SummitMediaFileTypeCreateRequestSchema {} +class SummitMediaFileTypeCreateRequestSchema +{ +} #[OA\Schema( schema: 'SummitMediaFileTypeUpdateRequest', @@ -519,4 +622,6 @@ class SummitMediaFileTypeCreateRequestSchema {} ), ] )] -class SummitMediaFileTypeUpdateRequestSchema {} +class SummitMediaFileTypeUpdateRequestSchema +{ +} From e494410ea29eef27288cdede1718107f7ce308ff Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Mon, 13 Oct 2025 15:38:07 -0300 Subject: [PATCH 02/15] fix: Add missing type expand for SummitMediaFileType --- app/Swagger/SummitSchemas.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Swagger/SummitSchemas.php b/app/Swagger/SummitSchemas.php index e604ceed0..062cb7d29 100644 --- a/app/Swagger/SummitSchemas.php +++ b/app/Swagger/SummitSchemas.php @@ -387,10 +387,11 @@ class PaginatedSummitAttendeeBadgesResponseSchema new OA\Property(property: "temporary_links_public_storage_ttl", type: "integer", description: "TTL in seconds", nullable: true, example: 3600), new OA\Property(property: "private_storage_type", type: "string", example: "local"), new OA\Property(property: "public_storage_type", type: "string", example: "s3"), - new OA\Property(property: "type_id", type: "integer", example: 456), new OA\Property(property: "is_editable", type: "boolean", example: true), ], anyOf: [ + new OA\Property(property: "type_id", type: "integer", example: 456), + new OA\Property(property: "type", type: "SummitMediaFileType", description: "Only present when relations=presentation_types and expand includes 'type' in it."), new OA\Property(property: "summit_id", type: "integer", example: 123, description: "Summit ID, only when expand does NOT include 'summit' in it."), new OA\Property(property: "summit", type: "Summit", description: "Summit expand (only when relations=presentation_types) and expand includes 'summit' in it."), new OA\Property( From e9a89dcf66ba31c6b8b6fd1d8f5572ffbcf119cb Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Mon, 13 Oct 2025 17:42:28 -0300 Subject: [PATCH 03/15] fix: param definition --- ...uth2SummitMediaUploadTypeApiController.php | 80 ++++++++++++++++--- 1 file changed, 70 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php index d2c459bb7..65d535d32 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php @@ -72,9 +72,27 @@ public function __construct security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), - new OA\Parameter(ref: "#/components/parameters/page_number_param"), - new OA\Parameter(ref: "#/components/parameters/page_size_param"), + new OA\Parameter( + name: 'summit_id', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer'), + description: 'The summit ID' + ), + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer'), + description: 'The page number' + ), + new OA\Parameter( + name: 'page_size', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer'), + description: 'The number of pages in each page', + ), new OA\Parameter( name: "filter[]", in: "query", @@ -132,7 +150,13 @@ public function getAllBySummit($summit_id) security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), + new OA\Parameter( + name: 'summit_id', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer'), + description: 'The summit ID' + ), new OA\Parameter( name: "media_upload_type_id", in: "path", @@ -178,7 +202,13 @@ public function get($summit_id, $media_upload_type_id) security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), + new OA\Parameter( + name: 'summit_id', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer'), + description: 'The summit ID' + ), ], requestBody: new OA\RequestBody( required: true, @@ -209,7 +239,13 @@ public function add($summit_id) security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), + new OA\Parameter( + name: 'summit_id', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer'), + description: 'The summit ID' + ), new OA\Parameter( name: "media_upload_type_id", in: "path", @@ -247,7 +283,13 @@ public function update($summit_id, $media_upload_type_id) security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), + new OA\Parameter( + name: 'summit_id', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer'), + description: 'The summit ID' + ), new OA\Parameter( name: "media_upload_type_id", in: "path", @@ -394,7 +436,13 @@ protected function updateChild(Summit $summit, int $child_id, array $payload): I security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), + new OA\Parameter( + name: 'summit_id', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer'), + description: 'The summit ID' + ), new OA\Parameter( name: "media_upload_type_id", in: "path", @@ -451,7 +499,13 @@ public function addToPresentationType($summit_id, $media_upload_type_id, $presen security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), + new OA\Parameter( + name: 'summit_id', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer'), + description: 'The summit ID' + ), new OA\Parameter( name: "media_upload_type_id", in: "path", @@ -507,7 +561,13 @@ public function deleteFromPresentationType($summit_id, $media_upload_type_id, $p security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], tags: ["Summit Media Upload Types"], parameters: [ - new OA\Parameter(ref: "#/components/parameters/summit_id_path_param"), + new OA\Parameter( + name: 'summit_id', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer'), + description: 'The summit ID' + ), new OA\Parameter( name: "to_summit_id", in: "path", From 6ae53dfb16dc62542e4c4f678ac41d435394ca87 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Mon, 13 Oct 2025 18:38:12 -0300 Subject: [PATCH 04/15] fix: param definition --- .../Summit/OAuth2SummitMediaUploadTypeApiController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php index 65d535d32..52506313c 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php @@ -87,11 +87,11 @@ public function __construct description: 'The page number' ), new OA\Parameter( - name: 'page_size', + name: 'per_page', in: 'query', required: false, schema: new OA\Schema(type: 'integer'), - description: 'The number of pages in each page', + description: 'The number of items per page', ), new OA\Parameter( name: "filter[]", From f0745f0a8222866dd15f56ac1bf714cab2d5dcea Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 14 Oct 2025 14:53:40 -0300 Subject: [PATCH 05/15] fix: Change "namespace" word positioning --- .../Summit/OAuth2SummitMediaUploadTypeApiController.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php index 52506313c..fc3544ebf 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php @@ -1,4 +1,7 @@ - Date: Mon, 10 Nov 2025 22:09:57 +0000 Subject: [PATCH 06/15] fix: Add security schema --- ...uth2SummitMediaUploadTypeApiController.php | 175 +++++++++++++----- 1 file changed, 127 insertions(+), 48 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php index fc3544ebf..e8a97746f 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php @@ -26,6 +26,28 @@ use ModelSerializers\SerializerRegistry; use OpenApi\Attributes as OA; + + +#[OA\SecurityScheme( + type: 'oauth2', + securityScheme: 'OAuth2SummitMediaUploadTypeApiControllerSecurity', + flows: [ + new OA\Flow( + authorizationUrl: L5_SWAGGER_CONST_AUTH_URL, + tokenUrl: L5_SWAGGER_CONST_TOKEN_URL, + flow: 'authorizationCode', + scopes: [ + SummitScopes::ReadAllSummitData => 'Read All Summit Data', + SummitScopes::WriteSummitData => 'Write Summit Data', + ], + ), + ], +) +] +class RSVPAuthSchema +{ +} + /** * Class OAuth2SummitMediaUploadTypeApiController * @package App\Http\Controllers @@ -58,10 +80,9 @@ public function __construct ( ISummitMediaUploadTypeRepository $repository, ISummitRepository $summit_repository, - ISummitMediaUploadTypeService $service, + ISummitMediaUploadTypeService $service, IResourceServerContext $resource_server_context - ) - { + ) { parent::__construct($resource_server_context); $this->service = $service; $this->summit_repository = $summit_repository; @@ -72,7 +93,13 @@ public function __construct path: "/api/v1/summits/{id}/media-upload-types", summary: "Get all media upload types for a summit", description: "Returns a paginated list of media upload types configured for a specific summit. Allows ordering, filtering and pagination.", - security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], + security: [ + [ + "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + SummitScopes::ReadAllSummitData, + ] + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -142,7 +169,8 @@ public function getAllBySummit($summit_id) { $this->summit_id = $summit_id; $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($this->summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); return $this->getAll(); } @@ -150,7 +178,13 @@ public function getAllBySummit($summit_id) path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}", summary: "Get a specific media upload type", description: "Returns detailed information about a specific media upload type", - security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], + security: [ + [ + "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + SummitScopes::ReadAllSummitData, + ] + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -202,7 +236,13 @@ public function get($summit_id, $media_upload_type_id) path: "/api/v1/summits/{id}/media-upload-types", summary: "Create a new media upload type", description: "Creates a new media upload type for the specified summit", - security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], + security: [ + [ + "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + SummitScopes::WriteSummitData, + ] + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -239,7 +279,13 @@ public function add($summit_id) path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}", summary: "Update a media upload type", description: "Updates an existing media upload type", - security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], + security: [ + [ + "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + SummitScopes::WriteSummitData, + ] + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -283,7 +329,13 @@ public function update($summit_id, $media_upload_type_id) path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}", summary: "Delete a media upload type", description: "Deletes a media upload type from the summit", - security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], + security: [ + [ + "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + SummitScopes::WriteSummitData, + ] + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -316,7 +368,7 @@ public function delete($summit_id, $media_upload_type_id) /** * @return array */ - protected function getFilterRules():array + protected function getFilterRules(): array { return [ 'name' => ['=@', '=='], @@ -326,7 +378,8 @@ protected function getFilterRules():array /** * @return array */ - protected function getFilterValidatorRules():array{ + protected function getFilterValidatorRules(): array + { return [ 'name' => 'sometimes|required|string', ]; @@ -334,7 +387,8 @@ protected function getFilterValidatorRules():array{ /** * @return array */ - protected function getOrderRules():array{ + protected function getOrderRules(): array + { return [ 'id', 'name', @@ -349,10 +403,10 @@ protected function addChild(Summit $summit, array $payload): IEntity // authz // check that we have a current member ( not service account ) $current_member = $this->getResourceServerContext()->getCurrentUser(); - if(is_null($current_member)) + if (is_null($current_member)) throw new HTTP401UnauthorizedException(); // check summit access - if(!$current_member->isSummitAllowed($summit)) + if (!$current_member->isSummitAllowed($summit)) throw new HTTP403ForbiddenException(); return $this->service->add($summit, $payload); } @@ -381,10 +435,10 @@ protected function deleteChild(Summit $summit, $child_id): void // authz // check that we have a current member ( not service account ) $current_member = $this->getResourceServerContext()->getCurrentUser(); - if(is_null($current_member)) + if (is_null($current_member)) throw new HTTP401UnauthorizedException(); // check summit access - if(!$current_member->isSummitAllowed($summit)) + if (!$current_member->isSummitAllowed($summit)) throw new HTTP403ForbiddenException(); $this->service->delete($summit, $child_id); @@ -398,13 +452,13 @@ protected function getChildFromSummit(Summit $summit, $child_id): ?IEntity // authz // check that we have a current member ( not service account ) $current_member = $this->getResourceServerContext()->getCurrentUser(); - if(is_null($current_member)) + if (is_null($current_member)) throw new HTTP401UnauthorizedException(); // check summit access - if(!$current_member->isSummitAllowed($summit)) + if (!$current_member->isSummitAllowed($summit)) throw new HTTP403ForbiddenException(); - return $summit->getMediaUploadTypeById($child_id); + return $summit->getMediaUploadTypeById($child_id); } /** @@ -423,10 +477,10 @@ protected function updateChild(Summit $summit, int $child_id, array $payload): I // authz // check that we have a current member ( not service account ) $current_member = $this->getResourceServerContext()->getCurrentUser(); - if(is_null($current_member)) + if (is_null($current_member)) throw new HTTP401UnauthorizedException(); // check summit access - if(!$current_member->isSummitAllowed($summit)) + if (!$current_member->isSummitAllowed($summit)) throw new HTTP403ForbiddenException(); return $this->service->update($summit, $child_id, $payload); @@ -436,7 +490,13 @@ protected function updateChild(Summit $summit, int $child_id, array $payload): I path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}/presentation-types/{event_type_id}", summary: "Add media upload type to presentation type", description: "Associates a media upload type with a specific presentation type", - security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], + security: [ + [ + "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + SummitScopes::WriteSummitData, + ] + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -472,19 +532,21 @@ protected function updateChild(Summit $summit, int $child_id, array $payload): I new OA\Response(response: Response::HTTP_NOT_FOUND, description: "not found"), ] )] - public function addToPresentationType($summit_id, $media_upload_type_id, $presentation_type_id){ - return $this->processRequest(function() use($summit_id, $media_upload_type_id, $presentation_type_id){ + public function addToPresentationType($summit_id, $media_upload_type_id, $presentation_type_id) + { + return $this->processRequest(function () use ($summit_id, $media_upload_type_id, $presentation_type_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); - // authz - // check that we have a current member ( not service account ) - $current_member = $this->getResourceServerContext()->getCurrentUser(); - if(is_null($current_member)) - throw new HTTP401UnauthorizedException(); - // check summit access - if(!$current_member->isSummitAllowed($summit)) - throw new HTTP403ForbiddenException(); + // authz + // check that we have a current member ( not service account ) + $current_member = $this->getResourceServerContext()->getCurrentUser(); + if (is_null($current_member)) + throw new HTTP401UnauthorizedException(); + // check summit access + if (!$current_member->isSummitAllowed($summit)) + throw new HTTP403ForbiddenException(); $presentation_type = $this->service->addToPresentationType($summit, intval($media_upload_type_id), intval($presentation_type_id)); @@ -499,7 +561,13 @@ public function addToPresentationType($summit_id, $media_upload_type_id, $presen path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}/presentation-types/{event_type_id}", summary: "Remove media upload type from presentation type", description: "Removes the association between a media upload type and a presentation type", - security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], + security: [ + [ + "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + SummitScopes::WriteSummitData, + ] + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -535,18 +603,20 @@ public function addToPresentationType($summit_id, $media_upload_type_id, $presen new OA\Response(response: Response::HTTP_NOT_FOUND, description: "not found"), ] )] - public function deleteFromPresentationType($summit_id, $media_upload_type_id, $presentation_type_id){ - return $this->processRequest(function() use($summit_id, $media_upload_type_id, $presentation_type_id){ + public function deleteFromPresentationType($summit_id, $media_upload_type_id, $presentation_type_id) + { + return $this->processRequest(function () use ($summit_id, $media_upload_type_id, $presentation_type_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); // authz // check that we have a current member ( not service account ) $current_member = $this->getResourceServerContext()->getCurrentUser(); - if(is_null($current_member)) + if (is_null($current_member)) throw new HTTP401UnauthorizedException(); // check summit access - if(!$current_member->isSummitAllowed($summit)) + if (!$current_member->isSummitAllowed($summit)) throw new HTTP403ForbiddenException(); $presentation_type = $this->service->deleteFromPresentationType($summit, intval($media_upload_type_id), intval($presentation_type_id)); @@ -561,7 +631,13 @@ public function deleteFromPresentationType($summit_id, $media_upload_type_id, $p path: "/api/v1/summits/{id}/media-upload-types/all/clone/{to_summit_id}", summary: "Clone media upload types to another summit", description: "Clones all media upload types from one summit to another summit", - security: [["oauth2_security_scope" => ["openid", "profile", "email"]]], + security: [ + [ + "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + SummitScopes::WriteSummitData, + ] + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -590,25 +666,28 @@ public function deleteFromPresentationType($summit_id, $media_upload_type_id, $p new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Source or target summit not found"), ] )] - public function cloneMediaUploadTypes($summit_id, $to_summit_id){ - return $this->processRequest(function() use($summit_id, $to_summit_id){ + public function cloneMediaUploadTypes($summit_id, $to_summit_id) + { + return $this->processRequest(function () use ($summit_id, $to_summit_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $to_summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($to_summit_id); - if (is_null($to_summit)) return $this->error404(); + if (is_null($to_summit)) + return $this->error404(); // authz // check that we have a current member ( not service account ) $current_member = $this->getResourceServerContext()->getCurrentUser(); - if(is_null($current_member)) + if (is_null($current_member)) throw new HTTP401UnauthorizedException(); // check summit access - if(!$current_member->isSummitAllowed($summit)) + if (!$current_member->isSummitAllowed($summit)) throw new HTTP403ForbiddenException(); // check summit access - if(!$current_member->isSummitAllowed($to_summit)) + if (!$current_member->isSummitAllowed($to_summit)) throw new HTTP403ForbiddenException(); $to_summit = $this->service->cloneMediaUploadTypes($summit, $to_summit); @@ -622,4 +701,4 @@ public function cloneMediaUploadTypes($summit_id, $to_summit_id){ }); } -} \ No newline at end of file +} From 9259084a8d6d45012c1921a927d601991d732fd8 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 13 Nov 2025 21:37:39 +0000 Subject: [PATCH 07/15] chore: Move the security schema for the controller to its own file --- ...uth2SummitMediaUploadTypeApiController.php | 95 +++++++++++++------ 1 file changed, 66 insertions(+), 29 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php index e8a97746f..a82b08718 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php @@ -16,7 +16,9 @@ **/ use HTTP401UnauthorizedException; use App\Http\Exceptions\HTTP403ForbiddenException; +use App\Models\Foundation\Main\IGroup; use App\Models\Foundation\Summit\Repositories\ISummitMediaUploadTypeRepository; +use App\Security\SummitScopes; use App\Services\Model\ISummitMediaUploadTypeService; use Illuminate\Http\Response; use models\oauth2\IResourceServerContext; @@ -27,27 +29,6 @@ use OpenApi\Attributes as OA; - -#[OA\SecurityScheme( - type: 'oauth2', - securityScheme: 'OAuth2SummitMediaUploadTypeApiControllerSecurity', - flows: [ - new OA\Flow( - authorizationUrl: L5_SWAGGER_CONST_AUTH_URL, - tokenUrl: L5_SWAGGER_CONST_TOKEN_URL, - flow: 'authorizationCode', - scopes: [ - SummitScopes::ReadAllSummitData => 'Read All Summit Data', - SummitScopes::WriteSummitData => 'Write Summit Data', - ], - ), - ], -) -] -class RSVPAuthSchema -{ -} - /** * Class OAuth2SummitMediaUploadTypeApiController * @package App\Http\Controllers @@ -95,11 +76,18 @@ public function __construct description: "Returns a paginated list of media upload types configured for a specific summit. Allows ordering, filtering and pagination.", security: [ [ - "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + "summit_media_upload_type_oauth2" => [ SummitScopes::ReadAllSummitData, ] ] ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -180,11 +168,18 @@ public function getAllBySummit($summit_id) description: "Returns detailed information about a specific media upload type", security: [ [ - "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + "summit_media_upload_type_oauth2" => [ SummitScopes::ReadAllSummitData, ] ] ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -238,11 +233,18 @@ public function get($summit_id, $media_upload_type_id) description: "Creates a new media upload type for the specified summit", security: [ [ - "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + "summit_media_upload_type_oauth2" => [ SummitScopes::WriteSummitData, ] ] ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -281,11 +283,18 @@ public function add($summit_id) description: "Updates an existing media upload type", security: [ [ - "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + "summit_media_upload_type_oauth2" => [ SummitScopes::WriteSummitData, ] ] ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -331,11 +340,18 @@ public function update($summit_id, $media_upload_type_id) description: "Deletes a media upload type from the summit", security: [ [ - "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + "summit_media_upload_type_oauth2" => [ SummitScopes::WriteSummitData, ] ] ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -492,11 +508,18 @@ protected function updateChild(Summit $summit, int $child_id, array $payload): I description: "Associates a media upload type with a specific presentation type", security: [ [ - "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + "summit_media_upload_type_oauth2" => [ SummitScopes::WriteSummitData, ] ] ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -563,11 +586,18 @@ public function addToPresentationType($summit_id, $media_upload_type_id, $presen description: "Removes the association between a media upload type and a presentation type", security: [ [ - "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + "summit_media_upload_type_oauth2" => [ SummitScopes::WriteSummitData, ] ] ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( @@ -633,11 +663,18 @@ public function deleteFromPresentationType($summit_id, $media_upload_type_id, $p description: "Clones all media upload types from one summit to another summit", security: [ [ - "OAuth2SummitMediaUploadTypeApiControllerSecurity" => [ + "summit_media_upload_type_oauth2" => [ SummitScopes::WriteSummitData, ] ] ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( From ed2d22ecb5c41cde4e8c4f71ea6257fe1aee9d04 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Fri, 23 Jan 2026 19:44:29 +0000 Subject: [PATCH 08/15] fix: add requested changes and remove incorrectly added code and restore original linting Signed-off-by: Matias Perrone --- ...uth2SummitMediaUploadTypeApiController.php | 156 +++++++++--------- app/Swagger/SummitSchemas.php | 148 +++-------------- 2 files changed, 97 insertions(+), 207 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php index a82b08718..6ecbdf140 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitMediaUploadTypeApiController.php @@ -1,6 +1,4 @@ -service = $service; $this->summit_repository = $summit_repository; @@ -72,6 +71,7 @@ public function __construct #[OA\Get( path: "/api/v1/summits/{id}/media-upload-types", + operationId: "getAllMediaUploadTypes", summary: "Get all media upload types for a summit", description: "Returns a paginated list of media upload types configured for a specific summit. Allows ordering, filtering and pagination.", security: [ @@ -91,9 +91,9 @@ public function __construct tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( - name: 'summit_id', - in: 'query', - required: false, + name: 'id', + in: 'path', + required: true, schema: new OA\Schema(type: 'integer'), description: 'The summit ID' ), @@ -150,20 +150,14 @@ public function __construct new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit not found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit Not Found"), ] )] - public function getAllBySummit($summit_id) - { - $this->summit_id = $summit_id; - $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($this->summit_id); - if (is_null($summit)) - return $this->error404(); - return $this->getAll(); - } + // public function getAllBySummit($summit_id) #[OA\Get( path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}", + operationId: "getMediaUploadType", summary: "Get a specific media upload type", description: "Returns detailed information about a specific media upload type", security: [ @@ -183,9 +177,9 @@ public function getAllBySummit($summit_id) tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( - name: 'summit_id', - in: 'query', - required: false, + name: 'id', + in: 'path', + required: true, schema: new OA\Schema(type: 'integer'), description: 'The summit ID' ), @@ -219,16 +213,14 @@ public function getAllBySummit($summit_id) ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "not found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), ] )] - public function get($summit_id, $media_upload_type_id) - { - return $this->getById($summit_id, $media_upload_type_id); - } + // public function get($summit_id, $media_upload_type_id) #[OA\Post( path: "/api/v1/summits/{id}/media-upload-types", + operationId: "createMediaUploadType", summary: "Create a new media upload type", description: "Creates a new media upload type for the specified summit", security: [ @@ -248,9 +240,9 @@ public function get($summit_id, $media_upload_type_id) tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( - name: 'summit_id', - in: 'query', - required: false, + name: 'id', + in: 'path', + required: true, schema: new OA\Schema(type: 'integer'), description: 'The summit ID' ), @@ -268,17 +260,15 @@ public function get($summit_id, $media_upload_type_id) new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit not found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit Not Found"), new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), ] )] - public function add($summit_id) - { - return $this->addChild($summit_id); - } + // public function add($summit_id) #[OA\Put( path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}", + operationId: "updateMediaUploadType", summary: "Update a media upload type", description: "Updates an existing media upload type", security: [ @@ -298,9 +288,9 @@ public function add($summit_id) tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( - name: 'summit_id', - in: 'query', - required: false, + name: 'id', + in: 'path', + required: true, schema: new OA\Schema(type: 'integer'), description: 'The summit ID' ), @@ -325,17 +315,15 @@ public function add($summit_id) new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "not found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), ] )] - public function update($summit_id, $media_upload_type_id) - { - return $this->updateChild($summit_id, $media_upload_type_id); - } + // public function update($summit_id, $media_upload_type_id) #[OA\Delete( path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}", + operationId: "deleteMediaUploadType", summary: "Delete a media upload type", description: "Deletes a media upload type from the summit", security: [ @@ -355,9 +343,9 @@ public function update($summit_id, $media_upload_type_id) tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( - name: 'summit_id', - in: 'query', - required: false, + name: 'id', + in: 'path', + required: true, schema: new OA\Schema(type: 'integer'), description: 'The summit ID' ), @@ -373,18 +361,15 @@ public function update($summit_id, $media_upload_type_id) new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Deleted successfully"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "not found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), ] )] - public function delete($summit_id, $media_upload_type_id) - { - return $this->deleteChild($summit_id, $media_upload_type_id); - } + // public function delete($summit_id, $media_upload_type_id) /** * @return array */ - protected function getFilterRules(): array + protected function getFilterRules():array { return [ 'name' => ['=@', '=='], @@ -394,8 +379,7 @@ protected function getFilterRules(): array /** * @return array */ - protected function getFilterValidatorRules(): array - { + protected function getFilterValidatorRules():array{ return [ 'name' => 'sometimes|required|string', ]; @@ -403,8 +387,7 @@ protected function getFilterValidatorRules(): array /** * @return array */ - protected function getOrderRules(): array - { + protected function getOrderRules():array{ return [ 'id', 'name', @@ -504,6 +487,7 @@ protected function updateChild(Summit $summit, int $child_id, array $payload): I #[OA\Put( path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}/presentation-types/{event_type_id}", + operationId: "addMediaUploadTypeToPresentationType", summary: "Add media upload type to presentation type", description: "Associates a media upload type with a specific presentation type", security: [ @@ -523,9 +507,9 @@ protected function updateChild(Summit $summit, int $child_id, array $payload): I tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( - name: 'summit_id', - in: 'query', - required: false, + name: 'id', + in: 'path', + required: true, schema: new OA\Schema(type: 'integer'), description: 'The summit ID' ), @@ -552,15 +536,19 @@ protected function updateChild(Summit $summit, int $child_id, array $payload): I ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "not found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), ] )] - public function addToPresentationType($summit_id, $media_upload_type_id, $presentation_type_id) - { + /** + * @param $summit_id + * @param $media_upload_type_id + * @param $presentation_type_id + * @return \Illuminate\Http\JsonResponse|mixed + */ + public function addToPresentationType($summit_id, $media_upload_type_id, $presentation_type_id){ return $this->processRequest(function () use ($summit_id, $media_upload_type_id, $presentation_type_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($summit_id); - if (is_null($summit)) - return $this->error404(); + if (is_null($summit)) return $this->error404(); // authz // check that we have a current member ( not service account ) @@ -582,6 +570,7 @@ public function addToPresentationType($summit_id, $media_upload_type_id, $presen #[OA\Delete( path: "/api/v1/summits/{id}/media-upload-types/{media_upload_type_id}/presentation-types/{event_type_id}", + operationId: "removeMediaUploadTypeFromPresentationType", summary: "Remove media upload type from presentation type", description: "Removes the association between a media upload type and a presentation type", security: [ @@ -601,9 +590,9 @@ public function addToPresentationType($summit_id, $media_upload_type_id, $presen tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( - name: 'summit_id', - in: 'query', - required: false, + name: 'id', + in: 'path', + required: true, schema: new OA\Schema(type: 'integer'), description: 'The summit ID' ), @@ -630,15 +619,19 @@ public function addToPresentationType($summit_id, $media_upload_type_id, $presen ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "not found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), ] )] - public function deleteFromPresentationType($summit_id, $media_upload_type_id, $presentation_type_id) - { + /** + * @param $summit_id + * @param $media_upload_type_id + * @param $presentation_type_id + * @return \Illuminate\Http\JsonResponse|mixed + */ + public function deleteFromPresentationType($summit_id, $media_upload_type_id, $presentation_type_id){ return $this->processRequest(function () use ($summit_id, $media_upload_type_id, $presentation_type_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($summit_id); - if (is_null($summit)) - return $this->error404(); + if (is_null($summit)) return $this->error404(); // authz // check that we have a current member ( not service account ) @@ -659,6 +652,7 @@ public function deleteFromPresentationType($summit_id, $media_upload_type_id, $p #[OA\Post( path: "/api/v1/summits/{id}/media-upload-types/all/clone/{to_summit_id}", + operationId: "cloneMediaUploadTypes", summary: "Clone media upload types to another summit", description: "Clones all media upload types from one summit to another summit", security: [ @@ -678,9 +672,9 @@ public function deleteFromPresentationType($summit_id, $media_upload_type_id, $p tags: ["Summit Media Upload Types"], parameters: [ new OA\Parameter( - name: 'summit_id', - in: 'query', - required: false, + name: 'id', + in: 'path', + required: true, schema: new OA\Schema(type: 'integer'), description: 'The summit ID' ), @@ -696,23 +690,25 @@ public function deleteFromPresentationType($summit_id, $media_upload_type_id, $p new OA\Response( response: Response::HTTP_CREATED, description: "Success - Returns the target summit with cloned media upload types", - content: new OA\JsonContent(type: "object") + content: new OA\JsonContent(ref: "#/components/schemas/Summit") ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), - new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Source or target summit not found"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Source or target summit Not Found"), ] )] - public function cloneMediaUploadTypes($summit_id, $to_summit_id) - { + /** + * @param $summit_id + * @param $to_summit_id + * @return \Illuminate\Http\JsonResponse|mixed + */ + public function cloneMediaUploadTypes($summit_id, $to_summit_id){ return $this->processRequest(function () use ($summit_id, $to_summit_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($summit_id); - if (is_null($summit)) - return $this->error404(); + if (is_null($summit)) return $this->error404(); $to_summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($to_summit_id); - if (is_null($to_summit)) - return $this->error404(); + if (is_null($to_summit)) return $this->error404(); // authz // check that we have a current member ( not service account ) diff --git a/app/Swagger/SummitSchemas.php b/app/Swagger/SummitSchemas.php index 062cb7d29..72063d23d 100644 --- a/app/Swagger/SummitSchemas.php +++ b/app/Swagger/SummitSchemas.php @@ -33,9 +33,7 @@ ) ] )] -class SummitScheduleConfigContentSchema -{ -} +class SummitScheduleConfigContentSchema {} #[OA\Schema( @@ -52,9 +50,7 @@ class SummitScheduleConfigContentSchema ) ] )] -class SummitScheduleConfigSchema -{ -} +class SummitScheduleConfigSchema {} #[OA\Schema( schema: 'PaginatedSummitScheduleConfigsResponse', @@ -72,9 +68,7 @@ class SummitScheduleConfigSchema ) ] )] -class PaginatedSummitScheduleConfigsResponseSchema -{ -} +class PaginatedSummitScheduleConfigsResponseSchema {} #[OA\Schema( schema: 'SummitScheduleFilterElementConfig', @@ -94,9 +88,7 @@ enum: ['DATE', 'TRACK', 'TRACK_GROUPS', 'COMPANY', 'LEVEL', 'SPEAKERS', 'VENUES' ), ] )] -class SummitScheduleFilterElementConfigSchema -{ -} +class SummitScheduleFilterElementConfigSchema {} #[OA\Schema( schema: 'SummitSchedulePreFilterElementConfig', @@ -119,9 +111,7 @@ enum: ['DATE', 'TRACK', 'TRACK_GROUPS', 'COMPANY', 'LEVEL', 'SPEAKERS', 'VENUES' ) ] )] -class SummitSchedulePreFilterElementConfigSchema -{ -} +class SummitSchedulePreFilterElementConfigSchema {} #[OA\Schema( schema: 'SummitScheduleConfigCreateRequest', @@ -163,9 +153,7 @@ class SummitSchedulePreFilterElementConfigSchema ) ] )] -class SummitScheduleConfigCreateRequestSchema -{ -} +class SummitScheduleConfigCreateRequestSchema {} #[OA\Schema( schema: 'SummitScheduleConfigUpdateRequest', @@ -206,9 +194,7 @@ class SummitScheduleConfigCreateRequestSchema ) ] )] -class SummitScheduleConfigUpdateRequestSchema -{ -} +class SummitScheduleConfigUpdateRequestSchema {} // Summit Documents @@ -236,9 +222,7 @@ class SummitScheduleConfigUpdateRequestSchema new OA\Property(property: "summit_id", type: "integer", description: "Summit ID, full object description when ?expand=summit (summit)"), ] )] -class SummitDocumentSchema -{ -} +class SummitDocumentSchema {} #[OA\Schema( schema: "PaginatedSummitDocumentsResponse", @@ -256,9 +240,7 @@ class SummitDocumentSchema ) ] )] -class PaginatedSummitDocumentsResponseSchema -{ -} +class PaginatedSummitDocumentsResponseSchema {} #[OA\Schema( schema: "SummitDocumentCreateRequest", @@ -288,9 +270,7 @@ class PaginatedSummitDocumentsResponseSchema ), ] )] -class SummitDocumentCreateRequest -{ -} +class SummitDocumentCreateRequest {} #[OA\Schema( schema: "SummitDocumentUpdateRequest", @@ -312,9 +292,7 @@ class SummitDocumentCreateRequest ), ] )] -class SummitDocumentUpdateRequest -{ -} +class SummitDocumentUpdateRequest {} // Summit Attendee Badges @@ -363,55 +341,10 @@ class SummitAttendeeBadgeSchema ) ] )] -class PaginatedSummitAttendeeBadgesResponseSchema -{ -} +class PaginatedSummitAttendeeBadgesResponseSchema {} // Summit Media Upload Type Schemas -#[OA\Schema( - schema: "SummitMediaUploadType", - description: "Summit Media Upload Type", - type: "object", - properties: [ - new OA\Property(property: "id", type: "integer", example: 1), - new OA\Property(property: "created", type: "integer", format: "int64", description: "Creation timestamp (epoch)", example: 1234567890), - new OA\Property(property: "last_edited", type: "integer", format: "int64", description: "Last edit timestamp (epoch)", example: 1234567890), - new OA\Property(property: "name", type: "string", maxLength: 255, example: "Speaker Photo"), - new OA\Property(property: "description", type: "string", maxLength: 5120, nullable: true, example: "High resolution photo of the speaker"), - new OA\Property(property: "max_size", type: "integer", description: "Maximum file size in KB", example: 10240), - new OA\Property(property: "is_mandatory", type: "boolean", example: true), - new OA\Property(property: "min_uploads_qty", type: "integer", minimum: 0, example: 1), - new OA\Property(property: "max_uploads_qty", type: "integer", minimum: 0, example: 1), - new OA\Property(property: "use_temporary_links_on_public_storage", type: "boolean", example: false), - new OA\Property(property: "temporary_links_public_storage_ttl", type: "integer", description: "TTL in seconds", nullable: true, example: 3600), - new OA\Property(property: "private_storage_type", type: "string", example: "local"), - new OA\Property(property: "public_storage_type", type: "string", example: "s3"), - new OA\Property(property: "is_editable", type: "boolean", example: true), - ], - anyOf: [ - new OA\Property(property: "type_id", type: "integer", example: 456), - new OA\Property(property: "type", type: "SummitMediaFileType", description: "Only present when relations=presentation_types and expand includes 'type' in it."), - new OA\Property(property: "summit_id", type: "integer", example: 123, description: "Summit ID, only when expand does NOT include 'summit' in it."), - new OA\Property(property: "summit", type: "Summit", description: "Summit expand (only when relations=presentation_types) and expand includes 'summit' in it."), - new OA\Property( - property: "presentation_types", - type: "array", - items: new OA\Items(type: "integer"), - description: "Array of presentation type IDs (only when relations=presentation_types and expand does not include 'presentation_types' in it)", - example: [1, 2, 3] - ), - new OA\Property( - property: "presentation_types", - type: "array", - items: new OA\Items(type: "PresentationType"), - description: "Array of PresentationType (only when relations=presentation_types and expand includes 'presentation_types' in it)", - ), - ], -)] -class SummitMediaUploadTypeSchema -{ -} #[OA\Schema( schema: "PaginatedSummitMediaUploadTypesResponse", @@ -429,9 +362,7 @@ class SummitMediaUploadTypeSchema ], type: "object" )] -class PaginatedSummitMediaUploadTypesResponseSchema -{ -} +class PaginatedSummitMediaUploadTypesResponseSchema {} #[OA\Schema( schema: "SummitMediaUploadTypeCreateRequest", @@ -461,9 +392,7 @@ class PaginatedSummitMediaUploadTypesResponseSchema ], type: "object" )] -class SummitMediaUploadTypeCreateRequestSchema -{ -} +class SummitMediaUploadTypeCreateRequestSchema {} #[OA\Schema( schema: "SummitMediaUploadTypeUpdateRequest", @@ -492,9 +421,7 @@ class SummitMediaUploadTypeCreateRequestSchema ], type: "object" )] -class SummitMediaUploadTypeUpdateRequestSchema -{ -} +class SummitMediaUploadTypeUpdateRequestSchema {} #[OA\Schema( @@ -513,9 +440,7 @@ class SummitMediaUploadTypeUpdateRequestSchema ) ] )] -class PaginatedSummitSponsorshipTypesResponseSchema -{ -} +class PaginatedSummitSponsorshipTypesResponseSchema {} #[OA\Schema( schema: 'SummitSponsorshipTypeCreateRequest', @@ -527,9 +452,7 @@ class PaginatedSummitSponsorshipTypesResponseSchema new OA\Property(property: 'size', type: 'string', example: ISponsorshipTypeConstants::BigSize, enum: ISponsorshipTypeConstants::AllowedSizes), ] )] -class SummitSponsorshipTypeCreateRequestSchema -{ -} +class SummitSponsorshipTypeCreateRequestSchema {} #[OA\Schema( schema: 'SummitSponsorshipTypeUpdateRequest', @@ -541,31 +464,8 @@ class SummitSponsorshipTypeCreateRequestSchema new OA\Property(property: 'order', type: 'integer', example: 1, minimum: 1), ] )] -class SummitSponsorshipTypeUpdateRequestSchema -{ -} +class SummitSponsorshipTypeUpdateRequestSchema {} -#[OA\Schema( - schema: 'SummitMediaFileType', - type: 'object', - properties: [ - new OA\Property(property: 'id', type: 'integer', example: 1), - new OA\Property(property: 'created', type: 'integer', format: 'int64', example: 1633024800), - new OA\Property(property: 'last_edited', type: 'integer', format: 'int64', example: 1633024800), - new OA\Property(property: 'name', type: 'string', example: 'Presentation'), - new OA\Property(property: 'description', type: 'string', example: 'Presentation files for events'), - new OA\Property(property: 'is_system_defined', type: 'boolean', example: false), - new OA\Property( - property: 'allowed_extensions', - type: 'array', - items: new OA\Items(type: 'string'), - example: ['pdf', 'ppt', 'pptx'] - ), - ] -)] -class SummitMediaFileTypeSchema -{ -} #[OA\Schema( schema: 'PaginatedSummitMediaFileTypesResponse', @@ -583,9 +483,7 @@ class SummitMediaFileTypeSchema ) ] )] -class PaginatedSummitMediaFileTypesResponseSchema -{ -} +class PaginatedSummitMediaFileTypesResponseSchema {} #[OA\Schema( schema: 'SummitMediaFileTypeCreateRequest', @@ -603,9 +501,7 @@ class PaginatedSummitMediaFileTypesResponseSchema ), ] )] -class SummitMediaFileTypeCreateRequestSchema -{ -} +class SummitMediaFileTypeCreateRequestSchema {} #[OA\Schema( schema: 'SummitMediaFileTypeUpdateRequest', @@ -623,6 +519,4 @@ class SummitMediaFileTypeCreateRequestSchema ), ] )] -class SummitMediaFileTypeUpdateRequestSchema -{ -} +class SummitMediaFileTypeUpdateRequestSchema {} From 451e02ee86e0057bf0d296b15d8fef9334533f2f Mon Sep 17 00:00:00 2001 From: Jose Andres Tejerina Date: Thu, 23 Oct 2025 15:52:55 -0300 Subject: [PATCH 09/15] feat: Extend Swagger Coverage for controller OAuth2SummitTracksApiController --- .../OAuth2SummitTracksApiController.php | 369 ++++++++++++++++++ .../PresentationCategoryAllowedTagSchemas.php | 21 + ...esentationCategoryExtraQuestionSchemas.php | 19 + app/Swagger/PresentationCategorySchemas.php | 32 ++ .../PresentationCategorySubTrackSchemas.php | 17 + 5 files changed, 458 insertions(+) create mode 100644 app/Swagger/PresentationCategoryAllowedTagSchemas.php create mode 100644 app/Swagger/PresentationCategoryExtraQuestionSchemas.php create mode 100644 app/Swagger/PresentationCategorySchemas.php create mode 100644 app/Swagger/PresentationCategorySubTrackSchemas.php diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php index ea2699a28..d19f4c7bf 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php @@ -20,6 +20,7 @@ use App\Services\Model\ISummitTrackService; use Exception; use Illuminate\Http\Request as LaravelRequest; +use Illuminate\Http\Response; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Request; use Illuminate\Support\Facades\Validator; @@ -33,11 +34,13 @@ use utils\OrderParser; use utils\PagingInfo; use utils\PagingResponse; +use OpenApi\Attributes as OA; /** * Class OAuth2SummitTracksApiController * @package App\Http\Controllers */ +#[OA\Tag(name: "Summit Tracks", description: "Manage Summit Tracks/Categories")] final class OAuth2SummitTracksApiController extends OAuth2ProtectedController { /** @@ -81,6 +84,30 @@ public function __construct * @param $summit_id * @return mixed */ + #[OA\Get( + path: "/api/v1/summits/{id}/tracks", + operationId: "getAllBySummit", + description: "Get all tracks for a specific summit", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "page", description: "Page number", in: "query", required: false, schema: new OA\Schema(type: "integer", default: 1)), + new OA\Parameter(name: "per_page", description: "Items per page", in: "query", required: false, schema: new OA\Schema(type: "integer", default: 10)), + new OA\Parameter(name: "filter", description: "Filter by fields (not_id, name, description, code, group_name, voting_visible, chair_visible, has_parent, has_subtracks, has_proposed_schedule_allowed_locations)", in: "query", required: false, schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "order", description: "Order by fields (id, code, name, order)", in: "query", required: false, schema: new OA\Schema(type: "string")), + ], + tags: ["Summit Tracks"], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "List of tracks", + content: new OA\JsonContent(ref: "#/components/schemas/PaginateDataSchemaResponse") + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function getAllBySummit($summit_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -148,6 +175,31 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { * @param $summit_id * @return mixed */ + #[OA\Get( + path: "/api/v1/summits/{id}/tracks/csv", + operationId: "getAllBySummitCSV", + description: "Export all tracks for a specific summit as CSV", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "page", description: "Page number", in: "query", required: false, schema: new OA\Schema(type: "integer", default: 1)), + new OA\Parameter(name: "per_page", description: "Items per page", in: "query", required: false, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "filter", description: "Filter by fields", in: "query", required: false, schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "order", description: "Order by fields", in: "query", required: false, schema: new OA\Schema(type: "string")), + ], + tags: ["Summit Tracks"], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "CSV file with tracks data", + content: new OA\MediaType(mediaType: "text/csv") + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function getAllBySummitCSV($summit_id) { $values = Request::all(); @@ -261,6 +313,26 @@ public function getAllBySummitCSV($summit_id) * @param $track_id * @return mixed */ + #[OA\Get( + path: "/api/v1/summits/{id}/tracks/{track_id}", + operationId: "getTrackBySummit", + description: "Get a specific track by ID", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "expand", description: "Expand related data", in: "query", required: false, schema: new OA\Schema(type: "string")), + ], + tags: ["Summit Tracks"], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "Track details", + content: new OA\JsonContent(ref: "#/components/schemas/PresentationCategory") + ), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Track or Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function getTrackBySummit($summit_id, $track_id) { try { @@ -292,6 +364,25 @@ public function getTrackBySummit($summit_id, $track_id) * @param $track_id * @return mixed */ + #[OA\Get( + path: "/api/v1/summits/{id}/tracks/{track_id}/extra-questions", + operationId: "getTrackExtraQuestionsBySummit", + description: "Get extra questions for a specific track", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + tags: ["Summit Tracks"], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "List of extra questions", + content: new OA\JsonContent(ref: "#/components/schemas/PaginateDataSchemaResponse") + ), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Track or Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function getTrackExtraQuestionsBySummit($summit_id, $track_id) { try { @@ -329,6 +420,25 @@ public function getTrackExtraQuestionsBySummit($summit_id, $track_id) * @param $question_id * @return mixed */ + #[OA\Put( + path: "/api/v1/summits/{id}/tracks/{track_id}/extra-questions/{question_id}", + operationId: "addTrackExtraQuestion", + description: "Add an extra question to a track", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "question_id", description: "Question ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + tags: ["Summit Tracks"], + security: [["oauth2" => ["write"]]], + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: "Question added successfully"), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Track, Summit, or Question not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function addTrackExtraQuestion($summit_id, $track_id, $question_id) { try { @@ -358,6 +468,25 @@ public function addTrackExtraQuestion($summit_id, $track_id, $question_id) * @param $question_id * @return mixed */ + #[OA\Delete( + path: "/api/v1/summits/{id}/tracks/{track_id}/extra-questions/{question_id}", + operationId: "removeTrackExtraQuestion", + description: "Remove an extra question from a track", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "question_id", description: "Question ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + tags: ["Summit Tracks"], + security: [["oauth2" => ["write"]]], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Question removed successfully"), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Track, Summit, or Question not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function removeTrackExtraQuestion($summit_id, $track_id, $question_id) { try { @@ -381,6 +510,30 @@ public function removeTrackExtraQuestion($summit_id, $track_id, $question_id) } } + /** + * @param $summit_id + * @param $track_id + * @return mixed + */ + #[OA\Get( + path: "/api/v1/summits/{id}/tracks/{track_id}/allowed-tags", + operationId: "getTrackAllowedTagsBySummit", + description: "Get allowed tags for a specific track", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + tags: ["Summit Tracks"], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "List of allowed tags", + content: new OA\JsonContent(ref: "#/components/schemas/PaginateDataSchemaResponse") + ), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Track or Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function getTrackAllowedTagsBySummit($summit_id, $track_id) { try { @@ -424,6 +577,32 @@ public function getTrackAllowedTagsBySummit($summit_id, $track_id) * @param $summit_id * @return mixed */ + #[OA\Post( + path: "/api/v1/summits/{id}/tracks", + operationId: "addTrackBySummit", + description: "Create a new track for a summit", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/PresentationCategory") + ), + tags: ["Summit Tracks"], + security: [["oauth2" => ["write"]]], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: "Track created successfully", + content: new OA\JsonContent(ref: "#/components/schemas/PresentationCategory") + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function addTrackBySummit($summit_id) { try { @@ -469,6 +648,28 @@ public function addTrackBySummit($summit_id) * @param $to_summit_id * @return mixed */ + #[OA\Post( + path: "/api/v1/summits/{id}/tracks/copy/{to_summit_id}", + operationId: "copyTracksToSummit", + description: "Copy all tracks from one summit to another", + parameters: [ + new OA\Parameter(name: "id", description: "Source Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "to_summit_id", description: "Target Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + tags: ["Summit Tracks"], + security: [["oauth2" => ["write"]]], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: "Tracks copied successfully", + content: new OA\JsonContent(ref: "#/components/schemas/PaginateDataSchemaResponse") + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Source or Target Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function copyTracksToSummit($summit_id, $to_summit_id) { try { @@ -508,6 +709,33 @@ public function copyTracksToSummit($summit_id, $to_summit_id) * @param $track_id * @return mixed */ + #[OA\Put( + path: "/api/v1/summits/{id}/tracks/{track_id}", + operationId: "updateTrackBySummit", + description: "Update a specific track", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/PresentationCategory") + ), + tags: ["Summit Tracks"], + security: [["oauth2" => ["write"]]], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "Track updated successfully", + content: new OA\JsonContent(ref: "#/components/schemas/PresentationCategory") + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Track or Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function updateTrackBySummit($summit_id, $track_id) { try { @@ -553,6 +781,24 @@ public function updateTrackBySummit($summit_id, $track_id) * @param $track_id * @return mixed */ + #[OA\Delete( + path: "/api/v1/summits/{id}/tracks/{track_id}", + operationId: "deleteTrackBySummit", + description: "Delete a specific track", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + tags: ["Summit Tracks"], + security: [["oauth2" => ["write"]]], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Track deleted successfully"), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Track or Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function deleteTrackBySummit($summit_id, $track_id) { try { @@ -574,6 +820,45 @@ public function deleteTrackBySummit($summit_id, $track_id) } } + /** + * @param LaravelRequest $request + * @param $summit_id + * @param $track_id + * @return mixed + */ + #[OA\Post( + path: "/api/v1/summits/{id}/tracks/{track_id}/icon", + operationId: "addTrackIcon", + description: "Add or update an icon for a track", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\MediaType(mediaType: "multipart/form-data", schema: new OA\Schema( + properties: [ + new OA\Property(property: "file", description: "Icon file", type: "string", format: "binary"), + ] + )) + ), + tags: ["Summit Tracks"], + security: [["oauth2" => ["write"]]], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: "Icon added successfully", + content: new OA\JsonContent( + type: "object", + description: "Track icon object (see File schema)" + ) ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Track or Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function addTrackIcon(LaravelRequest $request, $summit_id, $track_id) { try { @@ -605,6 +890,29 @@ public function addTrackIcon(LaravelRequest $request, $summit_id, $track_id) } } + /** + * @param $summit_id + * @param $track_id + * @return mixed + */ + #[OA\Delete( + path: "/api/v1/summits/{id}/tracks/{track_id}/icon", + operationId: "deleteTrackIcon", + description: "Delete the icon for a track", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + tags: ["Summit Tracks"], + security: [["oauth2" => ["write"]]], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Icon deleted successfully"), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Track or Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function deleteTrackIcon($summit_id, $track_id) { try { @@ -624,6 +932,42 @@ public function deleteTrackIcon($summit_id, $track_id) } } + /** + * @param $summit_id + * @param $track_id + * @param $child_track_id + * @return mixed + */ + #[OA\Put( + path: "/api/v1/summits/{id}/tracks/{track_id}/sub-tracks/{child_track_id}", + operationId: "addSubTrack", + description: "Add a sub-track to a parent track", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "track_id", description: "Parent Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "child_track_id", description: "Child Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + requestBody: new OA\RequestBody( + required: false, + content: new OA\JsonContent(properties: [ + new OA\Property(property: "order", description: "Display order", type: "integer", minimum: 1), + ]) + ), + tags: ["Summit Tracks"], + security: [["oauth2" => ["write"]]], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: "Sub-track added successfully", + content: new OA\JsonContent(ref: "#/components/schemas/PresentationCategory") + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Track or Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function addSubTrack($summit_id, $track_id, $child_track_id) { return $this->processRequest(function () use ($summit_id, $track_id, $child_track_id) { @@ -645,6 +989,31 @@ public function addSubTrack($summit_id, $track_id, $child_track_id) }); } + /** + * @param $summit_id + * @param $track_id + * @param $child_track_id + * @return mixed + */ + #[OA\Delete( + path: "/api/v1/summits/{id}/tracks/{track_id}/sub-tracks/{child_track_id}", + operationId: "removeSubTrack", + description: "Remove a sub-track from a parent track", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "track_id", description: "Parent Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "child_track_id", description: "Child Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + tags: ["Summit Tracks"], + security: [["oauth2" => ["write"]]], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Sub-track removed successfully"), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Track or Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function removeSubTrack($summit_id, $track_id, $child_track_id) { return $this->processRequest(function () use ($summit_id, $track_id, $child_track_id) { diff --git a/app/Swagger/PresentationCategoryAllowedTagSchemas.php b/app/Swagger/PresentationCategoryAllowedTagSchemas.php new file mode 100644 index 000000000..611ee7eb6 --- /dev/null +++ b/app/Swagger/PresentationCategoryAllowedTagSchemas.php @@ -0,0 +1,21 @@ + Date: Mon, 8 Dec 2025 19:42:09 +0000 Subject: [PATCH 10/15] chore: add filter and order fields --- .../Summit/OAuth2SummitTracksApiController.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php index d19f4c7bf..d297828d7 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php @@ -92,8 +92,8 @@ public function __construct new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "page", description: "Page number", in: "query", required: false, schema: new OA\Schema(type: "integer", default: 1)), new OA\Parameter(name: "per_page", description: "Items per page", in: "query", required: false, schema: new OA\Schema(type: "integer", default: 10)), - new OA\Parameter(name: "filter", description: "Filter by fields (not_id, name, description, code, group_name, voting_visible, chair_visible, has_parent, has_subtracks, has_proposed_schedule_allowed_locations)", in: "query", required: false, schema: new OA\Schema(type: "string")), - new OA\Parameter(name: "order", description: "Order by fields (id, code, name, order)", in: "query", required: false, schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "filter", description: "Filter by fields: not_id, name, description, code, group_name, voting_visible, chair_visible, has_parent, has_subtracks, has_proposed_schedule_allowed_locations.\n\nValid operands could be: == (equal), =@ (starts with), @@ (contains)", in: "query", required: false, schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "order", description: "Order by fields: id, code, name, order", in: "query", required: false, schema: new OA\Schema(type: "string")), ], tags: ["Summit Tracks"], responses: [ @@ -183,8 +183,8 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "page", description: "Page number", in: "query", required: false, schema: new OA\Schema(type: "integer", default: 1)), new OA\Parameter(name: "per_page", description: "Items per page", in: "query", required: false, schema: new OA\Schema(type: "integer")), - new OA\Parameter(name: "filter", description: "Filter by fields", in: "query", required: false, schema: new OA\Schema(type: "string")), - new OA\Parameter(name: "order", description: "Order by fields", in: "query", required: false, schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "filter", description: "Filter by fields: not_id, name, description, code, group_name, voting_visible, chair_visible, has_proposed_schedule_allowed_locations, has_parent, has_subtracks.\n\nValid operands could be: == (equal), =@ (starts with), @@ (contains)", in: "query", required: false, schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "order", description: "Order by fields: id, code, title, order", in: "query", required: false, schema: new OA\Schema(type: "string")), ], tags: ["Summit Tracks"], responses: [ @@ -1025,4 +1025,4 @@ public function removeSubTrack($summit_id, $track_id, $child_track_id) return $this->deleted(); }); } -} \ No newline at end of file +} From ad71356de78d01a659fb3950fb3a79e18c33ee4d Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Mon, 8 Dec 2025 20:32:40 +0000 Subject: [PATCH 11/15] fix: security schema type, operationId, and undocumented routes --- .../OAuth2SummitTracksApiController.php | 267 +++++++++++++++--- .../PresentationCategorySchema.php} | 4 +- .../Models/TrackQuestionTemplateSchema.php | 33 ++- .../Security/SummitTracksOauth2Schema.php | 27 ++ app/Swagger/SummitPresentationSchemas.php | 223 +++++++++++---- 5 files changed, 446 insertions(+), 108 deletions(-) rename app/Swagger/{PresentationCategorySchemas.php => Models/PresentationCategorySchema.php} (88%) create mode 100644 app/Swagger/Security/SummitTracksOauth2Schema.php diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php index d297828d7..3709b0144 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php @@ -14,9 +14,11 @@ use App\Http\Utils\BooleanCellFormatter; use App\Http\Utils\EpochCellFormatter; +use App\Models\Foundation\Main\IGroup; use App\Models\Foundation\Summit\Repositories\ISummitTrackRepository; use App\ModelSerializers\SerializerUtils; use App\Rules\Boolean; +use App\Security\SummitScopes; use App\Services\Model\ISummitTrackService; use Exception; use Illuminate\Http\Request as LaravelRequest; @@ -40,7 +42,6 @@ * Class OAuth2SummitTracksApiController * @package App\Http\Controllers */ -#[OA\Tag(name: "Summit Tracks", description: "Manage Summit Tracks/Categories")] final class OAuth2SummitTracksApiController extends OAuth2ProtectedController { /** @@ -88,6 +89,15 @@ public function __construct path: "/api/v1/summits/{id}/tracks", operationId: "getAllBySummit", description: "Get all tracks for a specific summit", + tags: ["Summit Tracks"], + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "page", description: "Page number", in: "query", required: false, schema: new OA\Schema(type: "integer", default: 1)), @@ -95,12 +105,11 @@ public function __construct new OA\Parameter(name: "filter", description: "Filter by fields: not_id, name, description, code, group_name, voting_visible, chair_visible, has_parent, has_subtracks, has_proposed_schedule_allowed_locations.\n\nValid operands could be: == (equal), =@ (starts with), @@ (contains)", in: "query", required: false, schema: new OA\Schema(type: "string")), new OA\Parameter(name: "order", description: "Order by fields: id, code, name, order", in: "query", required: false, schema: new OA\Schema(type: "string")), ], - tags: ["Summit Tracks"], responses: [ new OA\Response( response: Response::HTTP_OK, description: "List of tracks", - content: new OA\JsonContent(ref: "#/components/schemas/PaginateDataSchemaResponse") + content: new OA\JsonContent(ref: "#/components/schemas/PaginatedPresentationCategoriesResponse") ), new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), @@ -179,6 +188,14 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { path: "/api/v1/summits/{id}/tracks/csv", operationId: "getAllBySummitCSV", description: "Export all tracks for a specific summit as CSV", + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "page", description: "Page number", in: "query", required: false, schema: new OA\Schema(type: "integer", default: 1)), @@ -317,12 +334,41 @@ public function getAllBySummitCSV($summit_id) path: "/api/v1/summits/{id}/tracks/{track_id}", operationId: "getTrackBySummit", description: "Get a specific track by ID", + tags: ["Summit Tracks"], + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "relations", description: "Relations: track_groups, allowed_tags, extra_questions, selection_lists, allowed_access_levels, proposed_schedule_allowed_locations, subtracks", in: "query", required: false, schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "expand", description: "Expand related data: track_groups, allowed_tags, allowed_access_levels, extra_questions, proposed_schedule_allowed_locations, parent, subtracks", in: "query", required: false, schema: new OA\Schema(type: "string")), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "Track details", + content: new OA\JsonContent(ref: "#/components/schemas/PresentationCategory") + ), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Track or Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] + #[OA\Get( + path: "/api/public/v1/summits/{id}/tracks/{track_id}", + operationId: "getTrackBySummitPublic", + description: "Get a specific track by ID", + tags: ["Summit Tracks (Public)"], parameters: [ new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "expand", description: "Expand related data", in: "query", required: false, schema: new OA\Schema(type: "string")), ], - tags: ["Summit Tracks"], responses: [ new OA\Response( response: Response::HTTP_OK, @@ -368,16 +414,24 @@ public function getTrackBySummit($summit_id, $track_id) path: "/api/v1/summits/{id}/tracks/{track_id}/extra-questions", operationId: "getTrackExtraQuestionsBySummit", description: "Get extra questions for a specific track", + tags: ["Summit Tracks"], + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), ], - tags: ["Summit Tracks"], responses: [ new OA\Response( response: Response::HTTP_OK, description: "List of extra questions", - content: new OA\JsonContent(ref: "#/components/schemas/PaginateDataSchemaResponse") + content: new OA\JsonContent(ref: "#/components/schemas/PaginatedTraksExtraQuestionsResponse") ), new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Track or Summit not found"), new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), @@ -424,13 +478,27 @@ public function getTrackExtraQuestionsBySummit($summit_id, $track_id) path: "/api/v1/summits/{id}/tracks/{track_id}/extra-questions/{question_id}", operationId: "addTrackExtraQuestion", description: "Add an extra question to a track", + tags: ["Summit Tracks"], + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::WriteTracksData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "question_id", description: "Question ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), ], - tags: ["Summit Tracks"], - security: [["oauth2" => ["write"]]], responses: [ new OA\Response(response: Response::HTTP_CREATED, description: "Question added successfully"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), @@ -472,13 +540,27 @@ public function addTrackExtraQuestion($summit_id, $track_id, $question_id) path: "/api/v1/summits/{id}/tracks/{track_id}/extra-questions/{question_id}", operationId: "removeTrackExtraQuestion", description: "Remove an extra question from a track", + tags: ["Summit Tracks"], + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::WriteTracksData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "question_id", description: "Question ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), ], - tags: ["Summit Tracks"], - security: [["oauth2" => ["write"]]], responses: [ new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Question removed successfully"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), @@ -519,16 +601,24 @@ public function removeTrackExtraQuestion($summit_id, $track_id, $question_id) path: "/api/v1/summits/{id}/tracks/{track_id}/allowed-tags", operationId: "getTrackAllowedTagsBySummit", description: "Get allowed tags for a specific track", + tags: ["Summit Tracks"], + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], parameters: [ new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), ], - tags: ["Summit Tracks"], responses: [ new OA\Response( response: Response::HTTP_OK, description: "List of allowed tags", - content: new OA\JsonContent(ref: "#/components/schemas/PaginateDataSchemaResponse") + content: new OA\JsonContent(ref: "#/components/schemas/PaginatedPresentationCategoryAllowedTagResponse") ), new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Track or Summit not found"), new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), @@ -581,6 +671,22 @@ public function getTrackAllowedTagsBySummit($summit_id, $track_id) path: "/api/v1/summits/{id}/tracks", operationId: "addTrackBySummit", description: "Create a new track for a summit", + tags: ["Summit Tracks"], + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::WriteTracksData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), ], @@ -588,8 +694,6 @@ public function getTrackAllowedTagsBySummit($summit_id, $track_id) required: true, content: new OA\JsonContent(ref: "#/components/schemas/PresentationCategory") ), - tags: ["Summit Tracks"], - security: [["oauth2" => ["write"]]], responses: [ new OA\Response( response: Response::HTTP_CREATED, @@ -652,17 +756,31 @@ public function addTrackBySummit($summit_id) path: "/api/v1/summits/{id}/tracks/copy/{to_summit_id}", operationId: "copyTracksToSummit", description: "Copy all tracks from one summit to another", + tags: ["Summit Tracks"], + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::WriteTracksData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: "id", description: "Source Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "to_summit_id", description: "Target Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), ], - tags: ["Summit Tracks"], - security: [["oauth2" => ["write"]]], responses: [ new OA\Response( response: Response::HTTP_CREATED, description: "Tracks copied successfully", - content: new OA\JsonContent(ref: "#/components/schemas/PaginateDataSchemaResponse") + content: new OA\JsonContent(ref: "#/components/schemas/PaginatedPresentationCategoriesResponse") ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), @@ -713,6 +831,22 @@ public function copyTracksToSummit($summit_id, $to_summit_id) path: "/api/v1/summits/{id}/tracks/{track_id}", operationId: "updateTrackBySummit", description: "Update a specific track", + tags: ["Summit Tracks"], + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::WriteTracksData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), @@ -721,8 +855,6 @@ public function copyTracksToSummit($summit_id, $to_summit_id) required: true, content: new OA\JsonContent(ref: "#/components/schemas/PresentationCategory") ), - tags: ["Summit Tracks"], - security: [["oauth2" => ["write"]]], responses: [ new OA\Response( response: Response::HTTP_OK, @@ -785,12 +917,26 @@ public function updateTrackBySummit($summit_id, $track_id) path: "/api/v1/summits/{id}/tracks/{track_id}", operationId: "deleteTrackBySummit", description: "Delete a specific track", + tags: ["Summit Tracks"], + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::WriteTracksData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), ], - tags: ["Summit Tracks"], - security: [["oauth2" => ["write"]]], responses: [ new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Track deleted successfully"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), @@ -830,6 +976,22 @@ public function deleteTrackBySummit($summit_id, $track_id) path: "/api/v1/summits/{id}/tracks/{track_id}/icon", operationId: "addTrackIcon", description: "Add or update an icon for a track", + tags: ["Summit Tracks"], + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::WriteTracksData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), @@ -842,16 +1004,15 @@ public function deleteTrackBySummit($summit_id, $track_id) ] )) ), - tags: ["Summit Tracks"], - security: [["oauth2" => ["write"]]], responses: [ new OA\Response( response: Response::HTTP_CREATED, description: "Icon added successfully", content: new OA\JsonContent( - type: "object", - description: "Track icon object (see File schema)" - ) ), + type: "object", + description: "Track icon object (see File schema)" + ) + ), new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), @@ -899,12 +1060,26 @@ public function addTrackIcon(LaravelRequest $request, $summit_id, $track_id) path: "/api/v1/summits/{id}/tracks/{track_id}/icon", operationId: "deleteTrackIcon", description: "Delete the icon for a track", + tags: ["Summit Tracks"], + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::WriteTracksData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "track_id", description: "Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), ], - tags: ["Summit Tracks"], - security: [["oauth2" => ["write"]]], responses: [ new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Icon deleted successfully"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), @@ -942,6 +1117,22 @@ public function deleteTrackIcon($summit_id, $track_id) path: "/api/v1/summits/{id}/tracks/{track_id}/sub-tracks/{child_track_id}", operationId: "addSubTrack", description: "Add a sub-track to a parent track", + tags: ["Summit Tracks"], + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::WriteTracksData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "track_id", description: "Parent Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), @@ -953,8 +1144,6 @@ public function deleteTrackIcon($summit_id, $track_id) new OA\Property(property: "order", description: "Display order", type: "integer", minimum: 1), ]) ), - tags: ["Summit Tracks"], - security: [["oauth2" => ["write"]]], responses: [ new OA\Response( response: Response::HTTP_CREATED, @@ -999,13 +1188,27 @@ public function addSubTrack($summit_id, $track_id, $child_track_id) path: "/api/v1/summits/{id}/tracks/{track_id}/sub-tracks/{child_track_id}", operationId: "removeSubTrack", description: "Remove a sub-track from a parent track", + tags: ["Summit Tracks"], + security: [ + [ + 'summit_tracks_oauth2' => [ + SummitScopes::WriteTracksData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], parameters: [ new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "track_id", description: "Parent Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), new OA\Parameter(name: "child_track_id", description: "Child Track ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), ], - tags: ["Summit Tracks"], - security: [["oauth2" => ["write"]]], responses: [ new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Sub-track removed successfully"), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), diff --git a/app/Swagger/PresentationCategorySchemas.php b/app/Swagger/Models/PresentationCategorySchema.php similarity index 88% rename from app/Swagger/PresentationCategorySchemas.php rename to app/Swagger/Models/PresentationCategorySchema.php index cf5b2b863..68277176c 100644 --- a/app/Swagger/PresentationCategorySchemas.php +++ b/app/Swagger/Models/PresentationCategorySchema.php @@ -5,7 +5,7 @@ #[OA\Schema( schema: "PresentationCategory", - description: "Summit Track/Presentation Category", + description: "Summit Track/Presentation Category. Expandable relations: , allowed_tags, allowed_access_levels, extra_questions, proposed_schedule_allowed_locations, parent, subtracks", type: "object", properties: [ new OA\Property(property: "id", description: "Track ID", type: "integer", format: "int64"), @@ -29,4 +29,4 @@ ), ] )] -class PresentationCategorySchemas {} \ No newline at end of file +class PresentationCategorySchema {} diff --git a/app/Swagger/Models/TrackQuestionTemplateSchema.php b/app/Swagger/Models/TrackQuestionTemplateSchema.php index f872ae88b..51b749561 100644 --- a/app/Swagger/Models/TrackQuestionTemplateSchema.php +++ b/app/Swagger/Models/TrackQuestionTemplateSchema.php @@ -10,20 +10,27 @@ type: 'object', properties: [ new OA\Property(property: 'id', type: 'integer', example: 1), - new OA\Property(property: 'created', type: 'integer', example: 1634567890), - new OA\Property(property: 'last_edited', type: 'integer', example: 1634567890), - new OA\Property(property: 'name', type: 'string', example: 'my_question'), - new OA\Property(property: 'label', type: 'string', example: 'What is your question?'), - new OA\Property(property: 'is_mandatory', type: 'boolean', example: true), - new OA\Property(property: 'is_read_only', type: 'boolean', example: false), - new OA\Property(property: 'after_question', type: 'string', example: 'previous_question'), - new OA\Property(property: 'class_name', type: 'string', example: 'TrackTextBoxQuestionTemplate'), + new OA\Property(property: 'created', type: 'integer', example: 1), + new OA\Property(property: 'last_edited', type: 'integer', example: 1), + new OA\Property(property: 'name', type: 'string'), + new OA\Property(property: 'label', type: 'string'), + new OA\Property(property: 'is_mandatory', type: 'boolean'), + new OA\Property(property: 'is_read_only', type: 'boolean'), + new OA\Property(property: 'after_question', type: 'string'), + new OA\Property(property: 'class_name', type: 'string'), new OA\Property( property: 'tracks', type: 'array', - items: new OA\Items(type: 'integer'), - description: 'Array of PresentationCategory IDs, or full objects if ?expand=tracks', + description: 'Array of PresentationCategory, IDs or objects when ?expand=tracks', + items: new OA\Items( + oneOf: [ + new OA\Schema(type: 'integer', description: 'PresentationCategory ID'), + new OA\Schema(ref: '#/components/schemas/PresentationCategory') + ] + ) ), - ] -)] -class TrackQuestionTemplateSchema {} + ]) +] +class TrackQuestionTemplateSchema +{ +} diff --git a/app/Swagger/Security/SummitTracksOauth2Schema.php b/app/Swagger/Security/SummitTracksOauth2Schema.php new file mode 100644 index 000000000..d5086d5c4 --- /dev/null +++ b/app/Swagger/Security/SummitTracksOauth2Schema.php @@ -0,0 +1,27 @@ + 'Read Summit Data', + SummitScopes::ReadAllSummitData => 'Read All Summit Data', + SummitScopes::WriteSummitData => 'Write Summit Data', + SummitScopes::WriteTracksData => 'Write Tracks Data', + ], + ), + ], + ) +] +class SummitTracksOauth2Schema {} diff --git a/app/Swagger/SummitPresentationSchemas.php b/app/Swagger/SummitPresentationSchemas.php index 2cdbd9046..68ac9259d 100644 --- a/app/Swagger/SummitPresentationSchemas.php +++ b/app/Swagger/SummitPresentationSchemas.php @@ -147,110 +147,210 @@ class PresentationTrackChairScoreTypeUpdateRequest {} // End Track Chair Score Types + #[OA\Schema( - schema: "SummitSelectedPresentationList", - properties: [ - new OA\Property(property: "id", type: "integer", example: 1), - new OA\Property(property: "created", type: "integer", description: "Unix timestamp", example: 1640995200), - new OA\Property(property: "last_edited", type: "integer", description: "Unix timestamp", example: 1640995200), - new OA\Property(property: "name", type: "string", example: "My Selection List"), - new OA\Property(property: "type", type: "string", enum: ["Individual", "Group"], example: "Individual"), - new OA\Property(property: "hash", type: "string", example: "abc123def456"), - new OA\Property(property: "selected_presentations", type: "array", items: new OA\Items(type: "integer"), description: "Array of SummitSelectedPresentation IDs of collection \"selected\", full objects when ?expand=selected_presentations" ), - new OA\Property(property: "interested_presentations", type: "array", items: new OA\Items(type: "integer"), description: "Array of SummitSelectedPresentation IDs of collection \"maybe\", full objects when ?expand=interested_presentations", nullable: true), - new OA\Property(property: "category_id", type: "integer", example: 5, description: "PresentationCategory ID, full object when ?expand=category", nullable: true), - new OA\Property(property: "owner_id", type: "integer", example: 10, nullable: true, description: "Member ID not present when ?expand=owner"), - new OA\Property(property: "owner", ref: "#/components/schemas/Member", description: "Member full object when ?expand=owner)", nullable: true), - new OA\Property(property: "selection_plan_id", type: "integer", example: 3, description: "SelectionPlan ID, full object when ?expand=selection_plan)", nullable: true), + schema: 'PaginatedPresentationCategoriesResponse', + type: 'object', + description: 'Paginated response containing presentation categories', + allOf: [ + new OA\Schema(ref: '#/components/schemas/PaginateDataSchemaResponse'), + new OA\Schema( + type: 'object', + properties: [ + new OA\Property( + property: 'data', + type: 'array', + items: new OA\Items(ref: '#/components/schemas/PresentationCategory'), + description: 'Array of presentation categories' + ) + ] + ) ] )] -class SummitSelectedPresentationList {} +class PaginatedPresentationCategoriesResponseSchema +{ +} + #[OA\Schema( - schema: "SummitSelectedPresentationListReorderRequest", - required: ["collection"], - properties: [ - new OA\Property(property: "hash", type: "string", nullable: true, example: "abc123def456"), - new OA\Property(property: "collection", type: "string", enum: ["selected", "maybe"], example: "selected"), - new OA\Property(property: "presentations", type: "array", items: new OA\Items(type: "integer"), description: "Array of presentation IDs in the desired order", nullable: true), + schema: 'PaginatedTraksExtraQuestionsResponse', + type: 'object', + description: 'Paginated response containing presentation categories', + allOf: [ + new OA\Schema(ref: '#/components/schemas/PaginateDataSchemaResponse'), + new OA\Schema( + type: 'object', + properties: [ + new OA\Property( + property: 'data', + type: 'array', + items: new OA\Items(ref: '#/components/schemas/TrackQuestionTemplate'), + description: 'Array of track question templates' + ) + ] + ) + ] +)] +class PaginatedTraksExtraQuestionsResponseSchema +{ +} + +#[OA\Schema( + schema: 'PaginatedPresentationCategoryAllowedTagResponse', + type: 'object', + description: 'Paginated response containing presentation categories', + allOf: [ + new OA\Schema(ref: '#/components/schemas/PaginateDataSchemaResponse'), + new OA\Schema( + type: 'object', + properties: [ + new OA\Property( + property: 'data', + type: 'array', + items: new OA\Items(ref: '#/components/schemas/PresentationCategoryAllowedTag'), + description: 'Array of presentation category allowed tags' + ) + ] + ) ] )] -class SummitSelectedPresentationListReorderRequest {} +class PaginatedPresentationCategoryAllowedTagResponseSchema +{ +} + -// Summit Speaker Assistance Schemas #[OA\Schema( - schema: "PresentationSpeakerSummitAssistanceConfirmationRequest", - type: "object", + schema: 'PaginatedPresentationCategoriesResponse', + type: 'object', + description: 'Paginated response containing presentation categories', + allOf: [ + new OA\Schema(ref: '#/components/schemas/PaginateDataSchemaResponse'), + new OA\Schema( + type: 'object', + properties: [ + new OA\Property( + property: 'data', + type: 'array', + items: new OA\Items(ref: '#/components/schemas/PresentationCategory'), + description: 'Array of presentation categories' + ) + ] + ) + ] +)] +class PaginatedPresentationCategoriesResponseSchema +{ +} + + +#[OA\Schema( + schema: 'PaginatedTraksExtraQuestionsResponse', + type: 'object', + description: 'Paginated response containing presentation categories', + allOf: [ + new OA\Schema(ref: '#/components/schemas/PaginateDataSchemaResponse'), + new OA\Schema( + type: 'object', + properties: [ + new OA\Property( + property: 'data', + type: 'array', + items: new OA\Items(ref: '#/components/schemas/TrackQuestionTemplate'), + description: 'Array of track question templates' + ) + ] + ) + ] +)] +class PaginatedTraksExtraQuestionsResponseSchema +{ +} + +#[OA\Schema( + schema: 'PaginatedPresentationCategoryAllowedTagResponse', + type: 'object', + description: 'Paginated response containing presentation categories', + allOf: [ + new OA\Schema(ref: '#/components/schemas/PaginateDataSchemaResponse'), + new OA\Schema( + type: 'object', + properties: [ + new OA\Property( + property: 'data', + type: 'array', + items: new OA\Items(ref: '#/components/schemas/PresentationCategoryAllowedTag'), + description: 'Array of presentation category allowed tags' + ) + ] + ) + ] +)] +class PaginatedPresentationCategoryAllowedTagResponseSchema +{ +} + + +#[OA\Schema( + schema: 'PresentationActionType', + type: 'object', properties: [ - new OA\Property(property: "id", type: "integer", example: 1), - new OA\Property(property: "created", type: "integer", description: "Unix timestamp", example: 1640995200), - new OA\Property(property: "last_edited", type: "integer", description: "Unix timestamp", example: 1640995200), - new OA\Property(property: "on_site_phone", type: "string", nullable: true), - new OA\Property(property: "registered", type: "boolean"), - new OA\Property(property: "is_confirmed", type: "boolean"), - new OA\Property(property: "checked_in", type: "boolean"), - new OA\Property(property: "summit_id", type: "integer"), - new OA\Property(property: "speaker_email", type: "string"), - new OA\Property(property: "speaker_full_name", type: "string"), - new OA\Property(property: "speaker_id", type: "integer", description: "PresentationSpeaker Id, full object available in 'speaker' expand (speaker field)"), - new OA\Property(property: "confirmation_date", type: "integer", nullable: true), + new OA\Property(property: 'id', type: 'integer', example: 1), + new OA\Property(property: 'created', type: 'integer', example: 1630500518), + new OA\Property(property: 'last_edited', type: 'integer', example: 1630500518), + new OA\Property(property: 'label', type: 'string', example: 'Review'), + new OA\Property(property: 'summit_id', type: 'integer', example: 42, description: 'Summit ID, add ?expand=summit to get full summit object'), + new OA\Property(property: 'order', type: 'integer', example: 1, description: 'Order within a selection plan. Only present when filtering by selection_plan_id', ), ] )] -class PresentationSpeakerSummitAssistanceConfirmationRequest +class PresentationActionTypeSchema { } #[OA\Schema( - schema: "PaginatedPresentationSpeakerSummitAssistanceConfirmationRequestsResponse", + schema: 'PaginatedPresentationActionTypesResponse', allOf: [ - new OA\Schema(ref: "#/components/schemas/PaginateDataSchemaResponse"), + new OA\Schema(ref: '#/components/schemas/PaginateDataSchemaResponse'), new OA\Schema( + type: 'object', properties: [ new OA\Property( - property: "data", - type: "array", - items: new OA\Items(ref: "#/components/schemas/PresentationSpeakerSummitAssistanceConfirmationRequest") + property: 'data', + type: 'array', + items: new OA\Items(ref: '#/components/schemas/PresentationActionType') ) ] ) ] )] -class PaginatedPresentationSpeakerSummitAssistanceConfirmationRequestsResponse +class PaginatedPresentationActionTypesResponseSchema { } #[OA\Schema( - schema: "PresentationSpeakerSummitAssistanceConfirmationRequestCreateRequest", - type: "object", - required: ["speaker_id"], + schema: 'PresentationActionTypeCreateRequest', + type: 'object', + required: ['label'], properties: [ - new OA\Property(property: "speaker_id", type: "integer"), - new OA\Property(property: "on_site_phone", type: "string", maxLength: 50), - new OA\Property(property: "registered", type: "boolean"), - new OA\Property(property: "is_confirmed", type: "boolean"), - new OA\Property(property: "checked_in", type: "boolean") + new OA\Property(property: 'label', type: 'string', example: 'Review', maxLength: 255), + new OA\Property(property: 'selection_plan_id', type: 'integer', example: 42, description: 'If provided, the order field will be set within the context of the selection plan'), ] )] -class PresentationSpeakerSummitAssistanceConfirmationRequestCreateRequest +class PresentationActionTypeCreateRequestSchema { } #[OA\Schema( - schema: "PresentationSpeakerSummitAssistanceConfirmationRequestUpdateRequest", - type: "object", + schema: 'PresentationActionTypeUpdateRequest', + type: 'object', properties: [ - new OA\Property(property: "on_site_phone", type: "string", maxLength: 50), - new OA\Property(property: "registered", type: "boolean"), - new OA\Property(property: "is_confirmed", type: "boolean"), - new OA\Property(property: "checked_in", type: "boolean") + new OA\Property(property: 'label', type: 'string', example: 'Review', maxLength: 255), ] )] -class PresentationSpeakerSummitAssistanceConfirmationRequestUpdateRequest +class PresentationActionTypeUpdateRequestSchema { } -// #[OA\Schema( schema: 'PresentationActionType', @@ -311,3 +411,4 @@ class PresentationActionTypeCreateRequestSchema class PresentationActionTypeUpdateRequestSchema { } + From eec2f0779d550f2a358609fef4a9ec3ec571f1c6 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Mon, 29 Dec 2025 20:38:16 +0000 Subject: [PATCH 12/15] fix: repeated operationIds Signed-off-by: Matias Perrone --- .../Apis/Protected/Summit/OAuth2SummitTracksApiController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php index 3709b0144..1f1c0a300 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php @@ -87,7 +87,7 @@ public function __construct */ #[OA\Get( path: "/api/v1/summits/{id}/tracks", - operationId: "getAllBySummit", + operationId: "getAllSummitTracks", description: "Get all tracks for a specific summit", tags: ["Summit Tracks"], security: [ @@ -186,7 +186,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { */ #[OA\Get( path: "/api/v1/summits/{id}/tracks/csv", - operationId: "getAllBySummitCSV", + operationId: "getAllSummitTracksCSV", description: "Export all tracks for a specific summit as CSV", security: [ [ From 2007c8701cbd43ec5e46d75c9d3222b119277bc2 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Mon, 26 Jan 2026 20:50:35 +0000 Subject: [PATCH 13/15] fix: merge conflicts Signed-off-by: Matias Perrone --- app/Swagger/SummitPresentationSchemas.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Swagger/SummitPresentationSchemas.php b/app/Swagger/SummitPresentationSchemas.php index 68ac9259d..d64b0f6ad 100644 --- a/app/Swagger/SummitPresentationSchemas.php +++ b/app/Swagger/SummitPresentationSchemas.php @@ -411,4 +411,3 @@ class PresentationActionTypeCreateRequestSchema class PresentationActionTypeUpdateRequestSchema { } - From a1037b73e7a01938dc8ebfb15de7e9fb2564ec68 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Mon, 26 Jan 2026 21:15:05 +0000 Subject: [PATCH 14/15] chore: add missing required-groups Signed-off-by: Matias Perrone --- .../Apis/Protected/Summit/OAuth2SummitTracksApiController.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php index 1f1c0a300..f6b1b7462 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitTracksApiController.php @@ -1131,6 +1131,8 @@ public function deleteTrackIcon($summit_id, $track_id) IGroup::SuperAdmins, IGroup::Administrators, IGroup::SummitAdministrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, ] ], parameters: [ @@ -1202,6 +1204,8 @@ public function addSubTrack($summit_id, $track_id, $child_track_id) IGroup::SuperAdmins, IGroup::Administrators, IGroup::SummitAdministrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, ] ], parameters: [ From 68ecd06149f868b135820eaa4090d11360de6fb6 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 27 Jan 2026 15:22:46 +0000 Subject: [PATCH 15/15] fix: linting back to main Signed-off-by: Matias Perrone --- app/Swagger/SummitPresentationSchemas.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Swagger/SummitPresentationSchemas.php b/app/Swagger/SummitPresentationSchemas.php index d64b0f6ad..3f4096b55 100644 --- a/app/Swagger/SummitPresentationSchemas.php +++ b/app/Swagger/SummitPresentationSchemas.php @@ -147,7 +147,6 @@ class PresentationTrackChairScoreTypeUpdateRequest {} // End Track Chair Score Types - #[OA\Schema( schema: 'PaginatedPresentationCategoriesResponse', type: 'object',