From 082a897ef9854fce5d6ba1fbb5b405f2219432be Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 6 Jan 2026 21:09:36 +0000 Subject: [PATCH 1/7] feat: initial version of the OpenAPI documentation of the controller Signed-off-by: Matias Perrone --- ...Auth2SummitSelectionPlansApiController.php | 2583 ++++++++++++++++- ...edSelectionPlanExtraQuestionTypeSchema.php | 35 + .../Models/PresentationActionTypeSchema.php | 20 + .../SelectionPlanAllowedMemberSchema.php | 15 + app/Swagger/Models/SelectionPlanSchema.php | 85 + .../Models/SummitCategoryChangeSchema.php | 25 + .../SummitPresentationCommentSchema.php | 22 + ...itSelectionPlanExtraQuestionTypeSchema.php | 46 + ...mmitSelectionPlansApiControllerSchemas.php | 206 ++ .../Security/SelectionPlansAuthSchema.php | 26 + 10 files changed, 3062 insertions(+), 1 deletion(-) create mode 100644 app/Swagger/Models/AssignedSelectionPlanExtraQuestionTypeSchema.php create mode 100644 app/Swagger/Models/PresentationActionTypeSchema.php create mode 100644 app/Swagger/Models/SelectionPlanAllowedMemberSchema.php create mode 100644 app/Swagger/Models/SelectionPlanSchema.php create mode 100644 app/Swagger/Models/SummitCategoryChangeSchema.php create mode 100644 app/Swagger/Models/SummitPresentationCommentSchema.php create mode 100644 app/Swagger/Models/SummitSelectionPlanExtraQuestionTypeSchema.php create mode 100644 app/Swagger/OAuth2SummitSelectionPlansApiControllerSchemas.php create mode 100644 app/Swagger/Security/SelectionPlansAuthSchema.php diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php index 8ca51eba7..f152ca486 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php @@ -13,6 +13,10 @@ **/ use App\Http\Utils\EpochCellFormatter; +use App\Models\Foundation\Main\IGroup; +use App\Security\SummitScopes; +use OpenApi\Attributes as OA; +use Symfony\Component\HttpFoundation\Response; use App\Models\Foundation\Summit\Repositories\IPresentationActionTypeRepository; use App\Models\Foundation\Summit\Repositories\ISelectionPlanRepository; use App\Models\Foundation\Summit\Repositories\ISummitCategoryChangeRepository; @@ -122,6 +126,67 @@ public function __construct * @param $selection_plan_id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}', + operationId: 'getSelectionPlan', + summary: 'Get a selection plan by ID', + description: 'Retrieves a specific selection plan for a summit by its ID.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans'], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships: track_groups, extra_questions, event_types, track_chair_rating_types, allowed_presentation_action_types, summit', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Relations to include', + schema: new OA\Schema(type: 'string') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Selection plan retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SelectionPlan') + ), + 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 or Selection Plan not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getSelectionPlan($summit_id, $selection_plan_id) { return $this->processRequest(function () use ($summit_id, $selection_plan_id) { @@ -146,6 +211,61 @@ public function getSelectionPlan($summit_id, $selection_plan_id) * @param $selection_plan_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}', + operationId: 'updateSelectionPlan', + summary: 'Update a selection plan', + description: 'Updates an existing selection plan for a summit.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships', + schema: new OA\Schema(type: 'string') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Selection plan updated successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SelectionPlan') + ), + 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 or Selection Plan not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function updateSelectionPlan($summit_id, $selection_plan_id) { return $this->processRequest(function () use ($summit_id, $selection_plan_id) { @@ -172,6 +292,54 @@ public function updateSelectionPlan($summit_id, $selection_plan_id) * @param $summit_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/selection-plans', + operationId: 'addSelectionPlan', + summary: 'Create a new selection plan', + description: 'Creates a new selection plan for a summit.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships', + schema: new OA\Schema(type: 'string') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Selection plan created successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SelectionPlan') + ), + 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_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function addSelectionPlan($summit_id) { return $this->processRequest(function () use ($summit_id) { @@ -200,6 +368,48 @@ public function addSelectionPlan($summit_id) * @param $selection_plan_id * @return mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}', + operationId: 'deleteSelectionPlan', + summary: 'Delete a selection plan', + description: 'Deletes an existing selection plan from a summit.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Selection plan 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: 'Summit or Selection Plan not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function deleteSelectionPlan($summit_id, $selection_plan_id) { return $this->processRequest(function () use ($summit_id, $selection_plan_id) { @@ -219,6 +429,55 @@ public function deleteSelectionPlan($summit_id, $selection_plan_id) * @param $track_group_id * @return mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/track-groups/{track_group_id}', + operationId: 'addTrackGroupToSelectionPlan', + summary: 'Add a track group to a selection plan', + description: 'Associates a track group with a selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'track_group_id', + in: 'path', + required: true, + description: 'Track Group ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Track group added 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: 'Summit, Selection Plan, or Track Group not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function addTrackGroupToSelectionPlan($summit_id, $selection_plan_id, $track_group_id) { return $this->processRequest(function () use ($summit_id, $selection_plan_id, $track_group_id) { @@ -238,6 +497,55 @@ public function addTrackGroupToSelectionPlan($summit_id, $selection_plan_id, $tr * @param $track_group_id * @return mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/track-groups/{track_group_id}', + operationId: 'deleteTrackGroupToSelectionPlan', + summary: 'Remove a track group from a selection plan', + description: 'Removes the association between a track group and a selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'track_group_id', + in: 'path', + required: true, + description: 'Track Group ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Track group removed 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: 'Summit, Selection Plan, or Track Group not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function deleteTrackGroupToSelectionPlan($summit_id, $selection_plan_id, $track_group_id) { return $this->processRequest(function () use ($summit_id, $selection_plan_id, $track_group_id) { @@ -256,6 +564,45 @@ public function deleteTrackGroupToSelectionPlan($summit_id, $selection_plan_id, * @param $status * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/public/v1/summits/{id}/selection-plans/current/{status}', + operationId: 'getCurrentSelectionPlanByStatus', + summary: 'Get current selection plan by status (Public)', + description: 'Retrieves the current active selection plan for a summit filtered by status. This is a public endpoint.', + tags: ['Selection Plans (Public)'], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'status', + in: 'path', + required: true, + description: 'Selection plan status: submission, selection, or voting', + schema: new OA\Schema(type: 'string', enum: ['submission', 'selection', 'voting']) + ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships', + schema: new OA\Schema(type: 'string') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Current selection plan retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SelectionPlan') + ), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Selection Plan not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getCurrentSelectionPlanByStatus($summit_id, $status) { return $this->processRequest(function () use ($summit_id, $status) { @@ -283,6 +630,79 @@ public function getCurrentSelectionPlanByStatus($summit_id, $status) * @param $summit_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plans', + operationId: 'getAllSelectionPlans', + summary: 'Get all selection plans for a summit', + description: 'Retrieves a paginated list of selection plans for a specific summit.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans'], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + description: 'Page number for pagination', + schema: new OA\Schema(type: 'integer', example: 1) + ), + new OA\Parameter( + name: 'per_page', + in: 'query', + required: false, + description: 'Items per page', + schema: new OA\Schema(type: 'integer', example: 10, maximum: 100) + ), + new OA\Parameter( + name: 'filter[]', + in: 'query', + required: false, + description: 'Filter expressions. Available fields: name (=@, @@, ==), status (==, values: submission, selection, voting)', + style: 'form', + explode: true, + schema: new OA\Schema( + type: 'array', + items: new OA\Items(type: 'string', example: 'status==submission') + ) + ), + new OA\Parameter( + name: 'order', + in: 'query', + required: false, + description: 'Order by field(s). Available fields: id, created, last_edited. Use + for asc, - for desc.', + schema: new OA\Schema(type: 'string', example: '+id') + ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships', + schema: new OA\Schema(type: 'string') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Selection plans retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/PaginatedSelectionPlansResponse') + ), + 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_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getAll($summit_id) { return $this->_getAll( @@ -326,6 +746,93 @@ function () { * @param $selection_plan_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/presentations', + operationId: 'getSelectionPlanPresentations', + summary: 'Get presentations for a selection plan', + description: 'Retrieves a paginated list of presentations for a specific selection plan. Only available to track chairs.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + description: 'Page number for pagination', + schema: new OA\Schema(type: 'integer', example: 1) + ), + new OA\Parameter( + name: 'per_page', + in: 'query', + required: false, + description: 'Items per page', + schema: new OA\Schema(type: 'integer', example: 10, maximum: 100) + ), + new OA\Parameter( + name: 'filter[]', + in: 'query', + required: false, + description: 'Filter expressions. Available fields: title, abstract, social_summary, tags, level (=@, ==), summit_type_id, event_type_id, track_id, speaker_id, id, selection_plan_id (==), speaker, speaker_email (=@, ==), status, selection_status, is_chair_visible, is_voting_visible, track_chairs_status (voted, untouched, team_selected, selected, maybe, pass), viewed_status (seen, unseen, moved), actions', + style: 'form', + explode: true, + schema: new OA\Schema( + type: 'array', + items: new OA\Items(type: 'string', example: 'track_id==10') + ) + ), + new OA\Parameter( + name: 'order', + in: 'query', + required: false, + description: 'Order by field(s). Available fields: id, title, start_date, end_date, created, track, location, trackchairsel, last_edited', + schema: new OA\Schema(type: 'string', example: '+title') + ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships', + schema: new OA\Schema(type: 'string') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Presentations retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/PaginateDataSchemaResponse') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: 'Forbidden - Not a track chair'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Selection Plan not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getSelectionPlanPresentations($summit_id, $selection_plan_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -435,6 +942,75 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { * @param $selection_plan_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/presentations/csv', + operationId: 'getSelectionPlanPresentationsCSV', + summary: 'Export presentations for a selection plan to CSV', + description: 'Exports presentations for a specific selection plan as a CSV file. Only available to track chairs.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'filter[]', + in: 'query', + required: false, + description: 'Filter expressions (same as getSelectionPlanPresentations)', + style: 'form', + explode: true, + schema: new OA\Schema( + type: 'array', + items: new OA\Items(type: 'string') + ) + ), + new OA\Parameter( + name: 'order', + in: 'query', + required: false, + description: 'Order by field(s)', + schema: new OA\Schema(type: 'string') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'CSV file generated successfully', + content: new OA\MediaType( + mediaType: 'text/csv', + schema: new OA\Schema(type: 'string', format: 'binary') + ) + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: 'Forbidden - Not a track chair'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Selection Plan not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getSelectionPlanPresentationsCSV($summit_id, $selection_plan_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -557,6 +1133,66 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { * @param $presentation_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/presentations/{presentation_id}', + operationId: 'getSelectionPlanPresentation', + summary: 'Get a specific presentation from a selection plan', + description: 'Retrieves a specific presentation by ID from a selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'presentation_id', + in: 'path', + required: true, + description: 'Presentation ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships', + schema: new OA\Schema(type: 'string') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Presentation retrieved 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: 'Summit, Selection Plan, or Presentation not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getSelectionPlanPresentation($summit_id, $selection_plan_id, $presentation_id) { return $this->processRequest(function () use ($summit_id, $selection_plan_id, $presentation_id) { @@ -592,6 +1228,56 @@ public function getSelectionPlanPresentation($summit_id, $selection_plan_id, $pr * @param $presentation_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/presentations/{presentation_id}/view', + operationId: 'markPresentationAsViewed', + summary: 'Mark a presentation as viewed', + description: 'Marks a presentation as viewed by the current track chair.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'presentation_id', + in: 'path', + required: true, + description: 'Presentation ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Presentation marked as viewed 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: 'Summit, Selection Plan, or Presentation not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function markPresentationAsViewed($summit_id, $selection_plan_id, $presentation_id) { return $this->processRequest(function () use ($summit_id, $selection_plan_id, $presentation_id) { @@ -625,6 +1311,67 @@ public function markPresentationAsViewed($summit_id, $selection_plan_id, $presen * @param $presentation_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/presentations/{presentation_id}/comments', + operationId: 'addCommentToPresentation', + summary: 'Add a comment to a presentation', + description: 'Adds a new comment to a presentation within a selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + requestBody: new OA\RequestBody( + description: 'Comment data', + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/PresentationCommentPayload') + ), + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'presentation_id', + in: 'path', + required: true, + description: 'Presentation ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Comment added successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SummitPresentationComment') + ), + 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, Selection Plan, or Presentation not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function addCommentToPresentation($summit_id, $selection_plan_id, $presentation_id) { return $this->processRequest(function () use ($summit_id, $selection_plan_id, $presentation_id) { @@ -660,6 +1407,87 @@ public function addCommentToPresentation($summit_id, $selection_plan_id, $presen * @param $selection_plan_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/presentations/all/category-change-requests', + operationId: 'getAllPresentationCategoryChangeRequest', + summary: 'Get all category change requests for a selection plan', + description: 'Retrieves a paginated list of category change requests for presentations in a selection plan. Only available to track chairs.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + description: 'Page number for pagination', + schema: new OA\Schema(type: 'integer', example: 1) + ), + new OA\Parameter( + name: 'per_page', + in: 'query', + required: false, + description: 'Items per page', + schema: new OA\Schema(type: 'integer', example: 10) + ), + new OA\Parameter( + name: 'filter[]', + in: 'query', + required: false, + description: 'Filter expressions. Available fields: selection_plan_id, summit_id, new_category_id, old_category_id (==), new_category_name, old_category_name, requester_fullname, requester_email, aprover_fullname, aprover_email, presentation_title (=@, ==)', + style: 'form', + explode: true, + schema: new OA\Schema( + type: 'array', + items: new OA\Items(type: 'string') + ) + ), + new OA\Parameter( + name: 'order', + in: 'query', + required: false, + description: 'Order by field(s). Available: id, approval_date, status, presentation_title, new_category_name, old_category_name, requester_fullname', + schema: new OA\Schema(type: 'string') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Category change requests retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/PaginatedSummitCategoryChangesResponse') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: 'Forbidden - Not a track chair'), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: 'Summit or Selection Plan not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getAllPresentationCategoryChangeRequest($summit_id, $selection_plan_id) { @@ -746,6 +1574,67 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { * @param $presentation_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/presentations/{presentation_id}/category-change-requests', + operationId: 'createPresentationCategoryChangeRequest', + summary: 'Create a category change request for a presentation', + description: 'Creates a new request to change the category/track of a presentation.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + requestBody: new OA\RequestBody( + description: 'Category change request data', + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/CategoryChangeRequestPayload') + ), + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'presentation_id', + in: 'path', + required: true, + description: 'Presentation ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Category change request created successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SummitCategoryChange') + ), + 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, Selection Plan, or Presentation not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function createPresentationCategoryChangeRequest($summit_id, $selection_plan_id, $presentation_id) { return $this->processRequest(function () use ($summit_id, $selection_plan_id, $presentation_id) { @@ -781,6 +1670,74 @@ public function createPresentationCategoryChangeRequest($summit_id, $selection_p * @param $category_change_request_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/presentations/{presentation_id}/category-change-requests/{category_change_request_id}', + operationId: 'resolvePresentationCategoryChangeRequest', + summary: 'Resolve a category change request', + description: 'Approves or rejects a category change request for a presentation.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + requestBody: new OA\RequestBody( + description: 'Resolution data', + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/ResolveCategoryChangeRequestPayload') + ), + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'presentation_id', + in: 'path', + required: true, + description: 'Presentation ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'category_change_request_id', + in: 'path', + required: true, + description: 'Category Change Request ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Category change request resolved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SummitCategoryChange') + ), + 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: 'Resource not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function resolvePresentationCategoryChangeRequest($summit_id, $selection_plan_id, $presentation_id, $category_change_request_id) { return $this->processRequest(function () use ($summit_id, $selection_plan_id, $presentation_id, $category_change_request_id) { @@ -822,6 +1779,76 @@ public function resolvePresentationCategoryChangeRequest($summit_id, $selection_ * @param $selection_plan_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plan-extra-questions', + operationId: 'getExtraQuestions', + summary: 'Get all extra questions for a summit', + description: 'Retrieves a paginated list of extra questions available for selection plans in a summit.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + description: 'Page number', + schema: new OA\Schema(type: 'integer', example: 1) + ), + new OA\Parameter( + name: 'per_page', + in: 'query', + required: false, + description: 'Items per page', + schema: new OA\Schema(type: 'integer', example: 10) + ), + new OA\Parameter( + name: 'filter[]', + in: 'query', + required: false, + description: 'Filter expressions. Available fields: name, type, label (=@, ==)', + style: 'form', + explode: true, + schema: new OA\Schema(type: 'array', items: new OA\Items(type: 'string')) + ), + new OA\Parameter( + name: 'order', + in: 'query', + required: false, + description: 'Order by field(s). Available: id, name, label, order', + schema: new OA\Schema(type: 'string') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Extra questions retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/PaginatedSummitSelectionPlanExtraQuestionTypesResponse') + ), + 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_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getExtraQuestions($summit_id) { @@ -881,6 +1908,60 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { * @param $question_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plan-extra-questions/{question_id}', + operationId: 'getExtraQuestion', + summary: 'Get a specific extra question', + description: 'Retrieves a specific extra question by ID.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'question_id', + in: 'path', + required: true, + description: 'Question ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships: values, sub_question_rules, parent_rules', + schema: new OA\Schema(type: 'string') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Extra question retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SummitSelectionPlanExtraQuestionType') + ), + 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 or Question not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getExtraQuestion($summit_id, $question_id){ return $this->processRequest(function() use($summit_id, $question_id){ $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -901,6 +1982,76 @@ public function getExtraQuestion($summit_id, $question_id){ * @param $selection_plan_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/extra-questions', + operationId: 'getExtraQuestionsBySelectionPlan', + summary: 'Get extra questions for a selection plan', + description: 'Retrieves a paginated list of extra questions assigned to a specific selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + description: 'Page number', + schema: new OA\Schema(type: 'integer', example: 1) + ), + new OA\Parameter( + name: 'per_page', + in: 'query', + required: false, + description: 'Items per page', + schema: new OA\Schema(type: 'integer', example: 10) + ), + new OA\Parameter( + name: 'filter[]', + in: 'query', + required: false, + description: 'Filter expressions. Available fields: name, type, label (=@, ==)', + style: 'form', + explode: true, + schema: new OA\Schema(type: 'array', items: new OA\Items(type: 'string')) + ), + new OA\Parameter( + name: 'order', + in: 'query', + required: false, + description: 'Order by field(s). Available: id, name, label, order', + schema: new OA\Schema(type: 'string') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Extra questions retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/PaginatedAssignedSelectionPlanExtraQuestionTypesResponse') + ), + 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 or Selection Plan not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getExtraQuestionsBySelectionPlan($summit_id, $selection_plan_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -961,6 +2112,46 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { * @param $selection_plan_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plan-extra-questions/metadata', + operationId: 'getExtraQuestionsMetadata', + summary: 'Get extra questions metadata', + description: 'Retrieves metadata about available extra question types.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Metadata retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/ExtraQuestionTypeMetadata') + ), + 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_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getExtraQuestionsMetadata($summit_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -978,6 +2169,46 @@ public function getExtraQuestionsMetadata($summit_id) * @param $selection_plan_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/extra-questions/metadata', + operationId: 'getExtraQuestionsMetadataBySelectionPlan', + summary: 'Get extra questions metadata for a selection plan', + description: 'Retrieves metadata about available extra question types for a specific selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Metadata retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/ExtraQuestionTypeMetadata') + ), + 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 or Selection Plan not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getExtraQuestionsMetadataBySelectionPlan($summit_id, $selection_plan_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -995,6 +2226,47 @@ public function getExtraQuestionsMetadataBySelectionPlan($summit_id, $selection_ * @param $summit_id * @return \Illuminate\Http\JsonResponse */ + #[OA\Post( + path: '/api/v1/summits/{id}/selection-plan-extra-questions', + operationId: 'addExtraQuestion', + summary: 'Create a new extra question', + description: 'Creates a new extra question for selection plans in a summit.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Extra question created successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SummitSelectionPlanExtraQuestionType') + ), + 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_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function addExtraQuestion($summit_id) { @@ -1019,6 +2291,54 @@ function ($payload, $summit) { * @param $question_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/selection-plan-extra-questions/{question_id}', + operationId: 'updateExtraQuestion', + summary: 'Update an extra question', + description: 'Updates an existing extra question.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'question_id', + in: 'path', + required: true, + description: 'Question ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Extra question updated successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SummitSelectionPlanExtraQuestionType') + ), + 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 or Question not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function updateExtraQuestion($summit_id, $question_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1044,6 +2364,54 @@ function ($question_id, $payload, $summit) { * @param $selection_plan_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/extra-questions', + operationId: 'addExtraQuestionAndAssign', + summary: 'Create and assign an extra question to a selection plan', + description: 'Creates a new extra question and assigns it to a specific selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Extra question created and assigned successfully', + content: new OA\JsonContent(ref: '#/components/schemas/AssignedSelectionPlanExtraQuestionType') + ), + 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 or Selection Plan not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function addExtraQuestionAndAssign($summit_id, $selection_plan_id){ $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); @@ -1070,6 +2438,52 @@ function ($payload, $selection_plan_id) { * @param $question_id * @return mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/extra-questions/{question_id}', + operationId: 'assignExtraQuestion', + summary: 'Assign an existing extra question to a selection plan', + description: 'Assigns an existing extra question to a specific selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'question_id', + in: 'path', + required: true, + description: 'Question ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Extra question assigned successfully', + content: new OA\JsonContent(ref: '#/components/schemas/AssignedSelectionPlanExtraQuestionType') + ), + 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, Selection Plan, or Question not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function assignExtraQuestion($summit_id, $selection_plan_id, $question_id){ return $this->processRequest(function() use($summit_id, $selection_plan_id, $question_id){ @@ -1098,6 +2512,53 @@ public function assignExtraQuestion($summit_id, $selection_plan_id, $question_id * @param $question_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/extra-questions/{question_id}', + operationId: 'getExtraQuestionBySelectionPlan', + summary: 'Get an extra question by selection plan', + description: 'Retrieves a specific extra question assigned to a selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'question_id', + in: 'path', + required: true, + description: 'Question ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Extra question retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/AssignedSelectionPlanExtraQuestionType') + ), + 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, Selection Plan, or Question not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getExtraQuestionBySelectionPlan($summit_id, $selection_plan_id, $question_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1121,6 +2582,61 @@ public function getExtraQuestionBySelectionPlan($summit_id, $selection_plan_id, * @param $question_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/extra-questions/{question_id}', + operationId: 'updateExtraQuestionBySelectionPlan', + summary: 'Update an extra question by selection plan', + description: 'Updates a specific extra question assigned to a selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'question_id', + in: 'path', + required: true, + description: 'Question ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Extra question updated successfully', + content: new OA\JsonContent(ref: '#/components/schemas/AssignedSelectionPlanExtraQuestionType') + ), + 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, Selection Plan, or Question not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function updateExtraQuestionBySelectionPlan($summit_id, $selection_plan_id, $question_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1151,6 +2667,48 @@ function ($question_id, $payload, $selection_plan) { * @param $question_id * @return \Illuminate\Http\JsonResponse */ + #[OA\Delete( + path: '/api/v1/summits/{id}/selection-plan-extra-questions/{question_id}', + operationId: 'deleteExtraQuestion', + summary: 'Delete an extra question', + description: 'Deletes a specific extra question from a summit.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'question_id', + in: 'path', + required: true, + description: 'Question ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Extra question 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: 'Summit or Question not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function deleteExtraQuestion($summit_id, $question_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1169,6 +2727,55 @@ public function deleteExtraQuestion($summit_id, $question_id) * @param $question_id * @return \Illuminate\Http\JsonResponse */ + #[OA\Delete( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/extra-questions/{question_id}', + operationId: 'removeExtraQuestion', + summary: 'Remove an extra question from a selection plan', + description: 'Removes an extra question assignment from a specific selection plan (does not delete the question).', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'question_id', + in: 'path', + required: true, + description: 'Question ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Extra question removed 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: 'Summit, Selection Plan, or Question not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function removeExtraQuestion($summit_id, $selection_plan_id, $question_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1191,6 +2798,54 @@ public function removeExtraQuestion($summit_id, $selection_plan_id, $question_id * @param $question_id * @return \Illuminate\Http\JsonResponse */ + #[OA\Post( + path: '/api/v1/summits/{id}/selection-plan-extra-questions/{question_id}/values', + operationId: 'addExtraQuestionValue', + summary: 'Add a value to an extra question', + description: 'Adds a new value option to an extra question.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'question_id', + in: 'path', + required: true, + description: 'Question ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Extra question value created successfully', + content: new OA\JsonContent(ref: '#/components/schemas/ExtraQuestionTypeValue') + ), + 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 or Question not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function addExtraQuestionValue($summit_id, $question_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1217,6 +2872,61 @@ function ($payload, $summit, $question_id) { * @param $question_id * @return \Illuminate\Http\JsonResponse */ + #[OA\Post( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/extra-questions/{question_id}/values', + operationId: 'addExtraQuestionValueBySelectionPlan', + summary: 'Add a value to an extra question by selection plan', + description: 'Adds a new value option to an extra question via selection plan context.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'question_id', + in: 'path', + required: true, + description: 'Question ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Extra question value created successfully', + content: new OA\JsonContent(ref: '#/components/schemas/ExtraQuestionTypeValue') + ), + 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, Selection Plan, or Question not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function addExtraQuestionValueBySelectionPlan($summit_id, $selection_plan_id, $question_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1246,6 +2956,61 @@ function ($payload, $summit, $question_id) { * @param $value_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/selection-plan-extra-questions/{question_id}/values/{value_id}', + operationId: 'updateExtraQuestionValue', + summary: 'Update an extra question value', + description: 'Updates a value option for an extra question.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'question_id', + in: 'path', + required: true, + description: 'Question ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'value_id', + in: 'path', + required: true, + description: 'Value ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Extra question value updated successfully', + content: new OA\JsonContent(ref: '#/components/schemas/ExtraQuestionTypeValue') + ), + 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, Question, or Value not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function updateExtraQuestionValue($summit_id, $question_id, $value_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1274,6 +3039,68 @@ function ($value_id, $payload, $summit, $question_id) { * @param $value_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/extra-questions/{question_id}/values/{value_id}', + operationId: 'updateExtraQuestionValueBySelectionPlan', + summary: 'Update an extra question value by selection plan', + description: 'Updates a value option for an extra question via selection plan context.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'question_id', + in: 'path', + required: true, + description: 'Question ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'value_id', + in: 'path', + required: true, + description: 'Value ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Extra question value updated successfully', + content: new OA\JsonContent(ref: '#/components/schemas/ExtraQuestionTypeValue') + ), + 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, Selection Plan, Question, or Value not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function updateExtraQuestionValueBySelectionPlan($summit_id, $selection_plan_id, $question_id, $value_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1304,6 +3131,55 @@ function ($value_id, $payload, $summit, $question_id) { * @param $value_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/selection-plan-extra-questions/{question_id}/values/{value_id}', + operationId: 'deleteExtraQuestionValue', + summary: 'Delete an extra question value', + description: 'Deletes a value option from an extra question.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'question_id', + in: 'path', + required: true, + description: 'Question ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'value_id', + in: 'path', + required: true, + description: 'Value ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Extra question value 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: 'Summit, Question, or Value not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function deleteExtraQuestionValue($summit_id, $question_id, $value_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1324,6 +3200,62 @@ public function deleteExtraQuestionValue($summit_id, $question_id, $value_id) * @param $value_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/extra-questions/{question_id}/values/{value_id}', + operationId: 'deleteExtraQuestionValueBySelectionPlan', + summary: 'Delete an extra question value by selection plan', + description: 'Deletes a value option from an extra question via selection plan context.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Extra Questions'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'question_id', + in: 'path', + required: true, + description: 'Question ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'value_id', + in: 'path', + required: true, + description: 'Value ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Extra question value 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: 'Summit, Selection Plan, Question, or Value not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function deleteExtraQuestionValueBySelectionPlan($summit_id, $selection_plan_id, $question_id, $value_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1346,6 +3278,55 @@ public function deleteExtraQuestionValueBySelectionPlan($summit_id, $selection_p * @param $event_type_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/event-types/{event_type_id}', + operationId: 'attachEventType', + summary: 'Attach an event type to a selection plan', + description: 'Attaches an event type to a specific selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'event_type_id', + in: 'path', + required: true, + description: 'Event Type ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Event type attached 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: 'Summit, Selection Plan, or Event Type not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function attachEventType($id, $selection_plan_id, $event_type_id) { return $this->processRequest(function () use ($id, $selection_plan_id, $event_type_id) { @@ -1363,6 +3344,55 @@ public function attachEventType($id, $selection_plan_id, $event_type_id) * @param $event_type_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/event-types/{event_type_id}', + operationId: 'detachEventType', + summary: 'Detach an event type from a selection plan', + description: 'Detaches an event type from a specific selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'event_type_id', + in: 'path', + required: true, + description: 'Event Type ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Event type detached 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: 'Summit, Selection Plan, or Event Type not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function detachEventType($id, $selection_plan_id, $event_type_id) { return $this->processRequest(function () use ($id, $selection_plan_id, $event_type_id) { @@ -1381,6 +3411,83 @@ public function detachEventType($id, $selection_plan_id, $event_type_id) * @param $selection_plan_id * @return \Illuminate\Http\JsonResponse */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/allowed-presentation-action-types', + operationId: 'getAllowedPresentationActionTypes', + summary: 'Get allowed presentation action types', + description: 'Retrieves all allowed presentation action types for a selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans - Action Types'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'filter', + in: 'query', + required: false, + description: 'Filter criteria. Supported filters: label (=@, ==), id (==)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'order', + in: 'query', + required: false, + description: 'Sort order. Supported: order', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + description: 'Page number', + schema: new OA\Schema(type: 'integer', default: 1) + ), + new OA\Parameter( + name: 'per_page', + in: 'query', + required: false, + description: 'Items per page', + schema: new OA\Schema(type: 'integer', default: 10) + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Allowed presentation action types retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/PaginatedPresentationActionTypesResponse') + ), + 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 or Selection Plan not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getAllowedPresentationActionTypes($summit_id, $selection_plan_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1437,6 +3544,61 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { * @param $type_id * @return \Illuminate\Http\JsonResponse */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/allowed-presentation-action-types/{type_id}', + operationId: 'getAllowedPresentationActionType', + summary: 'Get a specific allowed presentation action type', + description: 'Retrieves a specific allowed presentation action type for a selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans - Action Types'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'type_id', + in: 'path', + required: true, + description: 'Presentation Action Type ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Presentation action type retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/PresentationActionType') + ), + 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, Selection Plan, or Action Type not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getAllowedPresentationActionType($summit_id, $selection_plan_id, $type_id) { return $this->processRequest(function() use($summit_id, $selection_plan_id, $type_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1468,6 +3630,63 @@ public function getAllowedPresentationActionType($summit_id, $selection_plan_id, * @param $type_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/allowed-presentation-action-types/{type_id}', + operationId: 'addAllowedPresentationActionType', + summary: 'Add an allowed presentation action type', + description: 'Adds an allowed presentation action type to a selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Action Types'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'type_id', + in: 'path', + required: true, + description: 'Presentation Action Type ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Presentation action type added successfully', + content: new OA\JsonContent(ref: '#/components/schemas/PresentationActionType') + ), + 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, Selection Plan, or Action Type not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function addAllowedPresentationActionType($id, $selection_plan_id, $type_id) { return $this->processRequest(function () use ($id, $selection_plan_id, $type_id) { @@ -1496,6 +3715,63 @@ public function addAllowedPresentationActionType($id, $selection_plan_id, $type_ * @param $type_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Put( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/allowed-presentation-action-types/{type_id}', + operationId: 'updateAllowedPresentationActionType', + summary: 'Update an allowed presentation action type', + description: 'Updates an allowed presentation action type for a selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Action Types'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'type_id', + in: 'path', + required: true, + description: 'Presentation Action Type ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Presentation action type updated successfully', + content: new OA\JsonContent(ref: '#/components/schemas/PresentationActionType') + ), + 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, Selection Plan, or Action Type not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function updateAllowedPresentationActionType($id, $selection_plan_id, $type_id) { return $this->processRequest(function () use ($id, $selection_plan_id, $type_id) { @@ -1524,6 +3800,57 @@ public function updateAllowedPresentationActionType($id, $selection_plan_id, $ty * @param $type_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/allowed-presentation-action-types/{type_id}', + operationId: 'removeAllowedPresentationActionType', + summary: 'Remove an allowed presentation action type', + description: 'Removes an allowed presentation action type from a selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Action Types'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'type_id', + in: 'path', + required: true, + description: 'Presentation Action Type ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Presentation action type removed 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: 'Summit, Selection Plan, or Action Type not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function removeAllowedPresentationActionType($id, $selection_plan_id, $type_id) { return $this->processRequest(function () use ($id, $selection_plan_id, $type_id) { @@ -1544,6 +3871,81 @@ public function removeAllowedPresentationActionType($id, $selection_plan_id, $ty * @param $selection_plan_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/allowed-members', + operationId: 'getAllowedMembers', + summary: 'Get allowed members for a selection plan', + description: 'Retrieves all members allowed for a selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans - Allowed Members'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'filter', + in: 'query', + required: false, + description: 'Filter criteria. Supported filters: email (@@, =@)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'order', + in: 'query', + required: false, + description: 'Sort order. Supported: email', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + description: 'Page number', + schema: new OA\Schema(type: 'integer', default: 1) + ), + new OA\Parameter( + name: 'per_page', + in: 'query', + required: false, + description: 'Items per page', + schema: new OA\Schema(type: 'integer', default: 10) + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Allowed members retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/PaginatedSelectionPlanAllowedMembersResponse') + ), + 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 or Selection Plan not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getAllowedMembers($id, $selection_plan_id){ $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($id); @@ -1595,6 +3997,59 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { * @param $selection_plan_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/allowed-members', + operationId: 'addAllowedMember', + summary: 'Add an allowed member to a selection plan', + description: 'Adds a member to the allowed members list of a selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Allowed Members'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + requestBody: new OA\RequestBody( + description: 'Allowed member data', + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/AllowedMemberPayload') + ), + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Allowed member added successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SelectionPlanAllowedMember') + ), + 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 or Selection Plan not found'), + new OA\Response(response: Response::HTTP_UNPROCESSABLE_ENTITY, description: 'Validation Error'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function addAllowedMember($id, $selection_plan_id){ return $this->processRequest(function () use ($id, $selection_plan_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($id); @@ -1620,6 +4075,55 @@ public function addAllowedMember($id, $selection_plan_id){ * @param $selection_plan_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Delete( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/allowed-members/{allowed_member_id}', + operationId: 'removeAllowedMember', + summary: 'Remove an allowed member from a selection plan', + description: 'Removes a member from the allowed members list of a selection plan.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Allowed Members'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'allowed_member_id', + in: 'path', + required: true, + description: 'Allowed Member ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: 'Allowed member removed 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: 'Summit, Selection Plan, or Allowed Member not found'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function removeAllowedMember($id, $selection_plan_id, $allowed_member_id){ return $this->processRequest(function () use ($id, $selection_plan_id, $allowed_member_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($id); @@ -1636,6 +4140,50 @@ public function removeAllowedMember($id, $selection_plan_id, $allowed_member_id) * @param $selection_plan_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Post( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/allowed-members/csv', + operationId: 'importAllowedMembers', + summary: 'Import allowed members from CSV', + description: 'Imports allowed members from a CSV file.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::WriteSummitData, + ]] + ], + tags: ['Selection Plans - Allowed Members'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'selection_plan_id', + in: 'path', + required: true, + description: 'Selection Plan ID', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: 'Allowed members imported successfully'), + 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 or Selection Plan not found'), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: 'File param not set'), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function importAllowedMembers(LaravelRequest $request, $id, $selection_plan_id) { @@ -1663,6 +4211,39 @@ public function importAllowedMembers(LaravelRequest $request, $id, $selection_pl * @param $id * @return mixed */ + #[OA\Get( + path: '/api/v1/summits/{id}/selection-plans/me', + operationId: 'getMySelectionPlans', + summary: 'Get my selection plans', + description: 'Retrieves selection plans for the current authenticated user.', + security: [ + ['selection_plans_oauth2' => [ + SummitScopes::ReadAllSummitData, + SummitScopes::ReadSummitData, + ]] + ], + tags: ['Selection Plans'], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID or slug', + schema: new OA\Schema(type: 'integer') + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Selection plans retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/PaginatedSelectionPlansResponse') + ), + 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_INTERNAL_SERVER_ERROR, description: 'Server Error'), + ] + )] public function getMySelectionPlans($id){ return $this->processRequest(function() use($id){ @@ -1683,4 +4264,4 @@ public function getMySelectionPlans($id){ )); }); } -} \ No newline at end of file +} diff --git a/app/Swagger/Models/AssignedSelectionPlanExtraQuestionTypeSchema.php b/app/Swagger/Models/AssignedSelectionPlanExtraQuestionTypeSchema.php new file mode 100644 index 000000000..f901003b4 --- /dev/null +++ b/app/Swagger/Models/AssignedSelectionPlanExtraQuestionTypeSchema.php @@ -0,0 +1,35 @@ + 'Read All Summit Data', + SummitScopes::ReadSummitData => 'Read Summit Data', + SummitScopes::WriteSummitData => 'Write Summit Data', + ], + ), + ], + ) +] +class SelectionPlansAuthSchema {} From 3678200ebba8ce38514ee4f4e31060ac8de1e1af Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 8 Jan 2026 20:16:09 +0000 Subject: [PATCH 2/7] chore: unify tags name Signed-off-by: Matias Perrone --- ...Auth2SummitSelectionPlansApiController.php | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php index f152ca486..a8b5766b6 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php @@ -1790,7 +1790,7 @@ public function resolvePresentationCategoryChangeRequest($summit_id, $selection_ SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -1919,7 +1919,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -1993,7 +1993,7 @@ public function getExtraQuestion($summit_id, $question_id){ SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2123,7 +2123,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2180,7 +2180,7 @@ public function getExtraQuestionsMetadata($summit_id) SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2236,7 +2236,7 @@ public function getExtraQuestionsMetadataBySelectionPlan($summit_id, $selection_ SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2301,7 +2301,7 @@ function ($payload, $summit) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2374,7 +2374,7 @@ function ($question_id, $payload, $summit) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2448,7 +2448,7 @@ function ($payload, $selection_plan_id) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2523,7 +2523,7 @@ public function assignExtraQuestion($summit_id, $selection_plan_id, $question_id SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2592,7 +2592,7 @@ public function getExtraQuestionBySelectionPlan($summit_id, $selection_plan_id, SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2677,7 +2677,7 @@ function ($question_id, $payload, $selection_plan) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2737,7 +2737,7 @@ public function deleteExtraQuestion($summit_id, $question_id) SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2808,7 +2808,7 @@ public function removeExtraQuestion($summit_id, $selection_plan_id, $question_id SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2882,7 +2882,7 @@ function ($payload, $summit, $question_id) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2966,7 +2966,7 @@ function ($payload, $summit, $question_id) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3049,7 +3049,7 @@ function ($value_id, $payload, $summit, $question_id) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3141,7 +3141,7 @@ function ($value_id, $payload, $summit, $question_id) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3210,7 +3210,7 @@ public function deleteExtraQuestionValue($summit_id, $question_id, $value_id) SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Extra Questions'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3422,7 +3422,7 @@ public function detachEventType($id, $selection_plan_id, $event_type_id) SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans - Action Types'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3554,7 +3554,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans - Action Types'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3640,7 +3640,7 @@ public function getAllowedPresentationActionType($summit_id, $selection_plan_id, SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Action Types'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3725,7 +3725,7 @@ public function addAllowedPresentationActionType($id, $selection_plan_id, $type_ SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Action Types'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3810,7 +3810,7 @@ public function updateAllowedPresentationActionType($id, $selection_plan_id, $ty SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Action Types'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3882,7 +3882,7 @@ public function removeAllowedPresentationActionType($id, $selection_plan_id, $ty SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans - Allowed Members'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -4007,7 +4007,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Allowed Members'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -4085,7 +4085,7 @@ public function addAllowedMember($id, $selection_plan_id){ SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Allowed Members'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -4150,7 +4150,7 @@ public function removeAllowedMember($id, $selection_plan_id, $allowed_member_id) SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans - Allowed Members'], + tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, From 7f06130f05603b00396f144b5571f4e3a15ed4b5 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 8 Jan 2026 20:34:46 +0000 Subject: [PATCH 3/7] chore: reorder OpenAPI attributes Signed-off-by: Matias Perrone --- ...Auth2SummitSelectionPlansApiController.php | 78 +++++++++---------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php index a8b5766b6..3c56d9b08 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php @@ -221,7 +221,6 @@ public function getSelectionPlan($summit_id, $selection_plan_id) SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -229,6 +228,7 @@ public function getSelectionPlan($summit_id, $selection_plan_id) IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -302,7 +302,6 @@ public function updateSelectionPlan($summit_id, $selection_plan_id) SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -310,6 +309,7 @@ public function updateSelectionPlan($summit_id, $selection_plan_id) IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -378,7 +378,6 @@ public function addSelectionPlan($summit_id) SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -386,6 +385,7 @@ public function addSelectionPlan($summit_id) IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -439,7 +439,6 @@ public function deleteSelectionPlan($summit_id, $selection_plan_id) SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -447,6 +446,7 @@ public function deleteSelectionPlan($summit_id, $selection_plan_id) IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -507,7 +507,6 @@ public function addTrackGroupToSelectionPlan($summit_id, $selection_plan_id, $tr SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -515,6 +514,7 @@ public function addTrackGroupToSelectionPlan($summit_id, $selection_plan_id, $tr IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -756,7 +756,6 @@ function () { SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -765,6 +764,7 @@ function () { IGroup::TrackChairsAdmins, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -952,7 +952,6 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -961,6 +960,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { IGroup::TrackChairsAdmins, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -1143,7 +1143,6 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -1152,6 +1151,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { IGroup::TrackChairsAdmins, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -1238,7 +1238,6 @@ public function getSelectionPlanPresentation($summit_id, $selection_plan_id, $pr SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -1247,6 +1246,7 @@ public function getSelectionPlanPresentation($summit_id, $selection_plan_id, $pr IGroup::TrackChairsAdmins, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -1321,7 +1321,6 @@ public function markPresentationAsViewed($summit_id, $selection_plan_id, $presen SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -1330,6 +1329,7 @@ public function markPresentationAsViewed($summit_id, $selection_plan_id, $presen IGroup::TrackChairsAdmins, ] ], + tags: ['Selection Plans'], requestBody: new OA\RequestBody( description: 'Comment data', required: true, @@ -1418,7 +1418,6 @@ public function addCommentToPresentation($summit_id, $selection_plan_id, $presen SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -1427,6 +1426,7 @@ public function addCommentToPresentation($summit_id, $selection_plan_id, $presen IGroup::TrackChairsAdmins, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -1584,7 +1584,6 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -1593,6 +1592,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { IGroup::TrackChairsAdmins, ] ], + tags: ['Selection Plans'], requestBody: new OA\RequestBody( description: 'Category change request data', required: true, @@ -1680,7 +1680,6 @@ public function createPresentationCategoryChangeRequest($summit_id, $selection_p SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -1689,6 +1688,7 @@ public function createPresentationCategoryChangeRequest($summit_id, $selection_p IGroup::TrackChairsAdmins, ] ], + tags: ['Selection Plans'], requestBody: new OA\RequestBody( description: 'Resolution data', required: true, @@ -1790,7 +1790,6 @@ public function resolvePresentationCategoryChangeRequest($summit_id, $selection_ SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -1798,6 +1797,7 @@ public function resolvePresentationCategoryChangeRequest($summit_id, $selection_ IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -1919,7 +1919,6 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -1927,6 +1926,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2123,7 +2123,6 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2131,6 +2130,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2236,7 +2236,6 @@ public function getExtraQuestionsMetadataBySelectionPlan($summit_id, $selection_ SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2244,6 +2243,7 @@ public function getExtraQuestionsMetadataBySelectionPlan($summit_id, $selection_ IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2301,7 +2301,6 @@ function ($payload, $summit) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2309,6 +2308,7 @@ function ($payload, $summit) { IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2374,7 +2374,6 @@ function ($question_id, $payload, $summit) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2382,6 +2381,7 @@ function ($question_id, $payload, $summit) { IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2592,7 +2592,6 @@ public function getExtraQuestionBySelectionPlan($summit_id, $selection_plan_id, SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2600,6 +2599,7 @@ public function getExtraQuestionBySelectionPlan($summit_id, $selection_plan_id, IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2677,7 +2677,6 @@ function ($question_id, $payload, $selection_plan) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2685,6 +2684,7 @@ function ($question_id, $payload, $selection_plan) { IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2737,7 +2737,6 @@ public function deleteExtraQuestion($summit_id, $question_id) SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2745,6 +2744,7 @@ public function deleteExtraQuestion($summit_id, $question_id) IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2808,7 +2808,6 @@ public function removeExtraQuestion($summit_id, $selection_plan_id, $question_id SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2816,6 +2815,7 @@ public function removeExtraQuestion($summit_id, $selection_plan_id, $question_id IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2882,7 +2882,6 @@ function ($payload, $summit, $question_id) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2890,6 +2889,7 @@ function ($payload, $summit, $question_id) { IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2966,7 +2966,6 @@ function ($payload, $summit, $question_id) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -2974,6 +2973,7 @@ function ($payload, $summit, $question_id) { IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3049,7 +3049,6 @@ function ($value_id, $payload, $summit, $question_id) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3057,6 +3056,7 @@ function ($value_id, $payload, $summit, $question_id) { IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3141,7 +3141,6 @@ function ($value_id, $payload, $summit, $question_id) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3149,6 +3148,7 @@ function ($value_id, $payload, $summit, $question_id) { IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3210,7 +3210,6 @@ public function deleteExtraQuestionValue($summit_id, $question_id, $value_id) SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3218,6 +3217,7 @@ public function deleteExtraQuestionValue($summit_id, $question_id, $value_id) IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3288,7 +3288,6 @@ public function deleteExtraQuestionValueBySelectionPlan($summit_id, $selection_p SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3296,6 +3295,7 @@ public function deleteExtraQuestionValueBySelectionPlan($summit_id, $selection_p IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3354,7 +3354,6 @@ public function attachEventType($id, $selection_plan_id, $event_type_id) SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3362,6 +3361,7 @@ public function attachEventType($id, $selection_plan_id, $event_type_id) IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3422,7 +3422,6 @@ public function detachEventType($id, $selection_plan_id, $event_type_id) SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3432,6 +3431,7 @@ public function detachEventType($id, $selection_plan_id, $event_type_id) IGroup::TrackChairsAdmins, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3554,7 +3554,6 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3564,6 +3563,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { IGroup::TrackChairsAdmins, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3640,7 +3640,6 @@ public function getAllowedPresentationActionType($summit_id, $selection_plan_id, SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3650,6 +3649,7 @@ public function getAllowedPresentationActionType($summit_id, $selection_plan_id, IGroup::TrackChairsAdmins, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3725,7 +3725,6 @@ public function addAllowedPresentationActionType($id, $selection_plan_id, $type_ SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3735,6 +3734,7 @@ public function addAllowedPresentationActionType($id, $selection_plan_id, $type_ IGroup::TrackChairsAdmins, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3810,7 +3810,6 @@ public function updateAllowedPresentationActionType($id, $selection_plan_id, $ty SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3820,6 +3819,7 @@ public function updateAllowedPresentationActionType($id, $selection_plan_id, $ty IGroup::TrackChairsAdmins, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3882,7 +3882,6 @@ public function removeAllowedPresentationActionType($id, $selection_plan_id, $ty SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -3890,6 +3889,7 @@ public function removeAllowedPresentationActionType($id, $selection_plan_id, $ty IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -4007,7 +4007,6 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -4015,6 +4014,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], requestBody: new OA\RequestBody( description: 'Allowed member data', required: true, @@ -4085,7 +4085,6 @@ public function addAllowedMember($id, $selection_plan_id){ SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -4093,6 +4092,7 @@ public function addAllowedMember($id, $selection_plan_id){ IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -4150,7 +4150,6 @@ public function removeAllowedMember($id, $selection_plan_id, $allowed_member_id) SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], x: [ 'required-groups' => [ IGroup::SuperAdmins, @@ -4158,6 +4157,7 @@ public function removeAllowedMember($id, $selection_plan_id, $allowed_member_id) IGroup::SummitAdministrators, ] ], + tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', From 9252da13c14160e5dd3b556a2e7880639895f648 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 8 Jan 2026 20:38:36 +0000 Subject: [PATCH 4/7] chore: reorder OpenAPI attributes Signed-off-by: Matias Perrone --- ...Auth2SummitSelectionPlansApiController.php | 92 +++++++++---------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php index 3c56d9b08..bfaf56e31 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php @@ -131,13 +131,13 @@ public function __construct operationId: 'getSelectionPlan', summary: 'Get a selection plan by ID', description: 'Retrieves a specific selection plan for a summit by its ID.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadAllSummitData, SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -216,6 +216,7 @@ public function getSelectionPlan($summit_id, $selection_plan_id) operationId: 'updateSelectionPlan', summary: 'Update a selection plan', description: 'Updates an existing selection plan for a summit.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -228,7 +229,6 @@ public function getSelectionPlan($summit_id, $selection_plan_id) IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -297,6 +297,7 @@ public function updateSelectionPlan($summit_id, $selection_plan_id) operationId: 'addSelectionPlan', summary: 'Create a new selection plan', description: 'Creates a new selection plan for a summit.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -309,7 +310,6 @@ public function updateSelectionPlan($summit_id, $selection_plan_id) IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -373,6 +373,7 @@ public function addSelectionPlan($summit_id) operationId: 'deleteSelectionPlan', summary: 'Delete a selection plan', description: 'Deletes an existing selection plan from a summit.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -385,7 +386,6 @@ public function addSelectionPlan($summit_id) IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -434,6 +434,7 @@ public function deleteSelectionPlan($summit_id, $selection_plan_id) operationId: 'addTrackGroupToSelectionPlan', summary: 'Add a track group to a selection plan', description: 'Associates a track group with a selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -446,7 +447,6 @@ public function deleteSelectionPlan($summit_id, $selection_plan_id) IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -502,6 +502,7 @@ public function addTrackGroupToSelectionPlan($summit_id, $selection_plan_id, $tr operationId: 'deleteTrackGroupToSelectionPlan', summary: 'Remove a track group from a selection plan', description: 'Removes the association between a track group and a selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -514,7 +515,6 @@ public function addTrackGroupToSelectionPlan($summit_id, $selection_plan_id, $tr IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -635,13 +635,13 @@ public function getCurrentSelectionPlanByStatus($summit_id, $status) operationId: 'getAllSelectionPlans', summary: 'Get all selection plans for a summit', description: 'Retrieves a paginated list of selection plans for a specific summit.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadAllSummitData, SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -751,6 +751,7 @@ function () { operationId: 'getSelectionPlanPresentations', summary: 'Get presentations for a selection plan', description: 'Retrieves a paginated list of presentations for a specific selection plan. Only available to track chairs.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadSummitData, @@ -764,7 +765,6 @@ function () { IGroup::TrackChairsAdmins, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -947,6 +947,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { operationId: 'getSelectionPlanPresentationsCSV', summary: 'Export presentations for a selection plan to CSV', description: 'Exports presentations for a specific selection plan as a CSV file. Only available to track chairs.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadSummitData, @@ -960,7 +961,6 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { IGroup::TrackChairsAdmins, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -1138,6 +1138,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { operationId: 'getSelectionPlanPresentation', summary: 'Get a specific presentation from a selection plan', description: 'Retrieves a specific presentation by ID from a selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadSummitData, @@ -1151,7 +1152,6 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { IGroup::TrackChairsAdmins, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -1233,6 +1233,7 @@ public function getSelectionPlanPresentation($summit_id, $selection_plan_id, $pr operationId: 'markPresentationAsViewed', summary: 'Mark a presentation as viewed', description: 'Marks a presentation as viewed by the current track chair.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -1246,7 +1247,6 @@ public function getSelectionPlanPresentation($summit_id, $selection_plan_id, $pr IGroup::TrackChairsAdmins, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -1316,6 +1316,7 @@ public function markPresentationAsViewed($summit_id, $selection_plan_id, $presen operationId: 'addCommentToPresentation', summary: 'Add a comment to a presentation', description: 'Adds a new comment to a presentation within a selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -1329,7 +1330,6 @@ public function markPresentationAsViewed($summit_id, $selection_plan_id, $presen IGroup::TrackChairsAdmins, ] ], - tags: ['Selection Plans'], requestBody: new OA\RequestBody( description: 'Comment data', required: true, @@ -1412,6 +1412,7 @@ public function addCommentToPresentation($summit_id, $selection_plan_id, $presen operationId: 'getAllPresentationCategoryChangeRequest', summary: 'Get all category change requests for a selection plan', description: 'Retrieves a paginated list of category change requests for presentations in a selection plan. Only available to track chairs.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadAllSummitData, @@ -1426,7 +1427,6 @@ public function addCommentToPresentation($summit_id, $selection_plan_id, $presen IGroup::TrackChairsAdmins, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -1579,6 +1579,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { operationId: 'createPresentationCategoryChangeRequest', summary: 'Create a category change request for a presentation', description: 'Creates a new request to change the category/track of a presentation.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -1592,7 +1593,6 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { IGroup::TrackChairsAdmins, ] ], - tags: ['Selection Plans'], requestBody: new OA\RequestBody( description: 'Category change request data', required: true, @@ -1675,6 +1675,7 @@ public function createPresentationCategoryChangeRequest($summit_id, $selection_p operationId: 'resolvePresentationCategoryChangeRequest', summary: 'Resolve a category change request', description: 'Approves or rejects a category change request for a presentation.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -1688,7 +1689,6 @@ public function createPresentationCategoryChangeRequest($summit_id, $selection_p IGroup::TrackChairsAdmins, ] ], - tags: ['Selection Plans'], requestBody: new OA\RequestBody( description: 'Resolution data', required: true, @@ -1784,6 +1784,7 @@ public function resolvePresentationCategoryChangeRequest($summit_id, $selection_ operationId: 'getExtraQuestions', summary: 'Get all extra questions for a summit', description: 'Retrieves a paginated list of extra questions available for selection plans in a summit.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadAllSummitData, @@ -1797,7 +1798,6 @@ public function resolvePresentationCategoryChangeRequest($summit_id, $selection_ IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -1913,6 +1913,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { operationId: 'getExtraQuestion', summary: 'Get a specific extra question', description: 'Retrieves a specific extra question by ID.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadAllSummitData, @@ -1926,7 +1927,6 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -1987,13 +1987,13 @@ public function getExtraQuestion($summit_id, $question_id){ operationId: 'getExtraQuestionsBySelectionPlan', summary: 'Get extra questions for a selection plan', description: 'Retrieves a paginated list of extra questions assigned to a specific selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadAllSummitData, SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2117,6 +2117,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { operationId: 'getExtraQuestionsMetadata', summary: 'Get extra questions metadata', description: 'Retrieves metadata about available extra question types.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadAllSummitData, @@ -2130,7 +2131,6 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2174,13 +2174,13 @@ public function getExtraQuestionsMetadata($summit_id) operationId: 'getExtraQuestionsMetadataBySelectionPlan', summary: 'Get extra questions metadata for a selection plan', description: 'Retrieves metadata about available extra question types for a specific selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadAllSummitData, SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2231,6 +2231,7 @@ public function getExtraQuestionsMetadataBySelectionPlan($summit_id, $selection_ operationId: 'addExtraQuestion', summary: 'Create a new extra question', description: 'Creates a new extra question for selection plans in a summit.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -2243,7 +2244,6 @@ public function getExtraQuestionsMetadataBySelectionPlan($summit_id, $selection_ IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2296,6 +2296,7 @@ function ($payload, $summit) { operationId: 'updateExtraQuestion', summary: 'Update an extra question', description: 'Updates an existing extra question.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -2308,7 +2309,6 @@ function ($payload, $summit) { IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2369,6 +2369,7 @@ function ($question_id, $payload, $summit) { operationId: 'addExtraQuestionAndAssign', summary: 'Create and assign an extra question to a selection plan', description: 'Creates a new extra question and assigns it to a specific selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -2381,7 +2382,6 @@ function ($question_id, $payload, $summit) { IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2443,12 +2443,12 @@ function ($payload, $selection_plan_id) { operationId: 'assignExtraQuestion', summary: 'Assign an existing extra question to a selection plan', description: 'Assigns an existing extra question to a specific selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, ]] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2517,13 +2517,13 @@ public function assignExtraQuestion($summit_id, $selection_plan_id, $question_id operationId: 'getExtraQuestionBySelectionPlan', summary: 'Get an extra question by selection plan', description: 'Retrieves a specific extra question assigned to a selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadAllSummitData, SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2587,6 +2587,7 @@ public function getExtraQuestionBySelectionPlan($summit_id, $selection_plan_id, operationId: 'updateExtraQuestionBySelectionPlan', summary: 'Update an extra question by selection plan', description: 'Updates a specific extra question assigned to a selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -2599,7 +2600,6 @@ public function getExtraQuestionBySelectionPlan($summit_id, $selection_plan_id, IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2672,6 +2672,7 @@ function ($question_id, $payload, $selection_plan) { operationId: 'deleteExtraQuestion', summary: 'Delete an extra question', description: 'Deletes a specific extra question from a summit.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -2684,7 +2685,6 @@ function ($question_id, $payload, $selection_plan) { IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2732,6 +2732,7 @@ public function deleteExtraQuestion($summit_id, $question_id) operationId: 'removeExtraQuestion', summary: 'Remove an extra question from a selection plan', description: 'Removes an extra question assignment from a specific selection plan (does not delete the question).', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -2744,7 +2745,6 @@ public function deleteExtraQuestion($summit_id, $question_id) IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2803,6 +2803,7 @@ public function removeExtraQuestion($summit_id, $selection_plan_id, $question_id operationId: 'addExtraQuestionValue', summary: 'Add a value to an extra question', description: 'Adds a new value option to an extra question.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -2815,7 +2816,6 @@ public function removeExtraQuestion($summit_id, $selection_plan_id, $question_id IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2877,6 +2877,7 @@ function ($payload, $summit, $question_id) { operationId: 'addExtraQuestionValueBySelectionPlan', summary: 'Add a value to an extra question by selection plan', description: 'Adds a new value option to an extra question via selection plan context.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -2889,7 +2890,6 @@ function ($payload, $summit, $question_id) { IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -2961,6 +2961,7 @@ function ($payload, $summit, $question_id) { operationId: 'updateExtraQuestionValue', summary: 'Update an extra question value', description: 'Updates a value option for an extra question.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -2973,7 +2974,6 @@ function ($payload, $summit, $question_id) { IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3044,6 +3044,7 @@ function ($value_id, $payload, $summit, $question_id) { operationId: 'updateExtraQuestionValueBySelectionPlan', summary: 'Update an extra question value by selection plan', description: 'Updates a value option for an extra question via selection plan context.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -3056,7 +3057,6 @@ function ($value_id, $payload, $summit, $question_id) { IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3136,6 +3136,7 @@ function ($value_id, $payload, $summit, $question_id) { operationId: 'deleteExtraQuestionValue', summary: 'Delete an extra question value', description: 'Deletes a value option from an extra question.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -3148,7 +3149,6 @@ function ($value_id, $payload, $summit, $question_id) { IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3205,6 +3205,7 @@ public function deleteExtraQuestionValue($summit_id, $question_id, $value_id) operationId: 'deleteExtraQuestionValueBySelectionPlan', summary: 'Delete an extra question value by selection plan', description: 'Deletes a value option from an extra question via selection plan context.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -3217,7 +3218,6 @@ public function deleteExtraQuestionValue($summit_id, $question_id, $value_id) IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3283,6 +3283,7 @@ public function deleteExtraQuestionValueBySelectionPlan($summit_id, $selection_p operationId: 'attachEventType', summary: 'Attach an event type to a selection plan', description: 'Attaches an event type to a specific selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -3295,7 +3296,6 @@ public function deleteExtraQuestionValueBySelectionPlan($summit_id, $selection_p IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3349,6 +3349,7 @@ public function attachEventType($id, $selection_plan_id, $event_type_id) operationId: 'detachEventType', summary: 'Detach an event type from a selection plan', description: 'Detaches an event type from a specific selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -3361,7 +3362,6 @@ public function attachEventType($id, $selection_plan_id, $event_type_id) IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3416,6 +3416,7 @@ public function detachEventType($id, $selection_plan_id, $event_type_id) operationId: 'getAllowedPresentationActionTypes', summary: 'Get allowed presentation action types', description: 'Retrieves all allowed presentation action types for a selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadAllSummitData, @@ -3431,7 +3432,6 @@ public function detachEventType($id, $selection_plan_id, $event_type_id) IGroup::TrackChairsAdmins, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3549,6 +3549,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { operationId: 'getAllowedPresentationActionType', summary: 'Get a specific allowed presentation action type', description: 'Retrieves a specific allowed presentation action type for a selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadSummitData, @@ -3563,7 +3564,6 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { IGroup::TrackChairsAdmins, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3635,6 +3635,7 @@ public function getAllowedPresentationActionType($summit_id, $selection_plan_id, operationId: 'addAllowedPresentationActionType', summary: 'Add an allowed presentation action type', description: 'Adds an allowed presentation action type to a selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -3649,7 +3650,6 @@ public function getAllowedPresentationActionType($summit_id, $selection_plan_id, IGroup::TrackChairsAdmins, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3720,6 +3720,7 @@ public function addAllowedPresentationActionType($id, $selection_plan_id, $type_ operationId: 'updateAllowedPresentationActionType', summary: 'Update an allowed presentation action type', description: 'Updates an allowed presentation action type for a selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -3734,7 +3735,6 @@ public function addAllowedPresentationActionType($id, $selection_plan_id, $type_ IGroup::TrackChairsAdmins, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3805,6 +3805,7 @@ public function updateAllowedPresentationActionType($id, $selection_plan_id, $ty operationId: 'removeAllowedPresentationActionType', summary: 'Remove an allowed presentation action type', description: 'Removes an allowed presentation action type from a selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -3819,7 +3820,6 @@ public function updateAllowedPresentationActionType($id, $selection_plan_id, $ty IGroup::TrackChairsAdmins, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -3876,6 +3876,7 @@ public function removeAllowedPresentationActionType($id, $selection_plan_id, $ty operationId: 'getAllowedMembers', summary: 'Get allowed members for a selection plan', description: 'Retrieves all members allowed for a selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadAllSummitData, @@ -3889,7 +3890,6 @@ public function removeAllowedPresentationActionType($id, $selection_plan_id, $ty IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -4002,6 +4002,7 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { operationId: 'addAllowedMember', summary: 'Add an allowed member to a selection plan', description: 'Adds a member to the allowed members list of a selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -4014,7 +4015,6 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], requestBody: new OA\RequestBody( description: 'Allowed member data', required: true, @@ -4080,6 +4080,7 @@ public function addAllowedMember($id, $selection_plan_id){ operationId: 'removeAllowedMember', summary: 'Remove an allowed member from a selection plan', description: 'Removes a member from the allowed members list of a selection plan.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -4092,7 +4093,6 @@ public function addAllowedMember($id, $selection_plan_id){ IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -4145,6 +4145,7 @@ public function removeAllowedMember($id, $selection_plan_id, $allowed_member_id) operationId: 'importAllowedMembers', summary: 'Import allowed members from CSV', description: 'Imports allowed members from a CSV file.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::WriteSummitData, @@ -4157,7 +4158,6 @@ public function removeAllowedMember($id, $selection_plan_id, $allowed_member_id) IGroup::SummitAdministrators, ] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', @@ -4216,13 +4216,13 @@ public function importAllowedMembers(LaravelRequest $request, $id, $selection_pl operationId: 'getMySelectionPlans', summary: 'Get my selection plans', description: 'Retrieves selection plans for the current authenticated user.', + tags: ['Selection Plans'], security: [ ['selection_plans_oauth2' => [ SummitScopes::ReadAllSummitData, SummitScopes::ReadSummitData, ]] ], - tags: ['Selection Plans'], parameters: [ new OA\Parameter( name: 'id', From 76e1d5d024a91b5cd9ed023d88b2b48f4b24de14 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 8 Jan 2026 21:06:33 +0000 Subject: [PATCH 5/7] chore: add missing model serializer attributes Signed-off-by: Matias Perrone --- .../PresentationCategoryGroupSchema.php | 31 +++++++++++++++++++ app/Swagger/Models/SelectionPlanSchema.php | 15 +++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 app/Swagger/Models/PresentationCategoryGroupSchema.php diff --git a/app/Swagger/Models/PresentationCategoryGroupSchema.php b/app/Swagger/Models/PresentationCategoryGroupSchema.php new file mode 100644 index 000000000..21d927fa7 --- /dev/null +++ b/app/Swagger/Models/PresentationCategoryGroupSchema.php @@ -0,0 +1,31 @@ + Date: Fri, 9 Jan 2026 15:18:05 +0000 Subject: [PATCH 6/7] chore: Add missing schemas and documentation. Signed-off-by: Matias Perrone --- ...Auth2SummitSelectionPlansApiController.php | 80 ++++++- .../Models/AdminPresentationSchema.php | 50 ++++ .../Models/ExtraQuestionAnswerSchema.php | 25 ++ app/Swagger/Models/PresentationLinkSchema.php | 30 +++ .../Models/PresentationMediaUploadSchema.php | 34 +++ app/Swagger/Models/PresentationSchema.php | 224 ++++++++++++++++++ .../Models/PresentationSlideSchema.php | 31 +++ .../Models/PresentationSpeakerSchema.php | 156 ++++++++++++ .../Models/PresentationVideoSchema.php | 34 +++ .../Models/SummitEventFeedbackSchema.php | 23 ++ .../Models/TrackChairPresentationSchema.php | 97 ++++++++ 11 files changed, 776 insertions(+), 8 deletions(-) create mode 100644 app/Swagger/Models/AdminPresentationSchema.php create mode 100644 app/Swagger/Models/ExtraQuestionAnswerSchema.php create mode 100644 app/Swagger/Models/PresentationLinkSchema.php create mode 100644 app/Swagger/Models/PresentationMediaUploadSchema.php create mode 100644 app/Swagger/Models/PresentationSchema.php create mode 100644 app/Swagger/Models/PresentationSlideSchema.php create mode 100644 app/Swagger/Models/PresentationSpeakerSchema.php create mode 100644 app/Swagger/Models/PresentationVideoSchema.php create mode 100644 app/Swagger/Models/SummitEventFeedbackSchema.php create mode 100644 app/Swagger/Models/TrackChairPresentationSchema.php diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php index bfaf56e31..693b56975 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php @@ -157,7 +157,7 @@ public function __construct name: 'expand', in: 'query', required: false, - description: 'Expand relationships: track_groups, extra_questions, event_types, track_chair_rating_types, allowed_presentation_action_types, summit', + description: 'Expand relationships to include as full objects: track_groups, extra_questions, event_types, track_chair_rating_types, allowed_presentation_action_types, allowed_presentation_action_types, allowed_presentation_questions, allowed_presentation_editable_questions, summit', schema: new OA\Schema(type: 'string') ), new OA\Parameter( @@ -171,7 +171,7 @@ public function __construct name: 'relations', in: 'query', required: false, - description: 'Relations to include', + description: 'Relations to include: track_groups, extra_questions, event_types, track_chair_rating_types, allowed_presentation_action_types, allowed_presentation_action_types, allowed_presentation_questions, allowed_presentation_editable_questions', schema: new OA\Schema(type: 'string') ), ], @@ -248,7 +248,21 @@ public function getSelectionPlan($summit_id, $selection_plan_id) name: 'expand', in: 'query', required: false, - description: 'Expand relationships', + description: 'Expand relationships to include as full objects: track_groups, extra_questions, event_types, track_chair_rating_types, allowed_presentation_action_types, allowed_presentation_action_types, allowed_presentation_questions, allowed_presentation_editable_questions, summit', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Relations to include: track_groups, extra_questions, event_types, track_chair_rating_types, allowed_presentation_action_types, allowed_presentation_action_types, allowed_presentation_questions, allowed_presentation_editable_questions', schema: new OA\Schema(type: 'string') ), ], @@ -322,7 +336,21 @@ public function updateSelectionPlan($summit_id, $selection_plan_id) name: 'expand', in: 'query', required: false, - description: 'Expand relationships', + description: 'Expand relationships to include as full objects: track_groups, extra_questions, event_types, track_chair_rating_types, allowed_presentation_action_types, allowed_presentation_action_types, allowed_presentation_questions, allowed_presentation_editable_questions, summit', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Relations to include: track_groups, extra_questions, event_types, track_chair_rating_types, allowed_presentation_action_types, allowed_presentation_action_types, allowed_presentation_questions, allowed_presentation_editable_questions', schema: new OA\Schema(type: 'string') ), ], @@ -589,7 +617,21 @@ public function deleteTrackGroupToSelectionPlan($summit_id, $selection_plan_id, name: 'expand', in: 'query', required: false, - description: 'Expand relationships', + description: 'Expand relationships to include as full objects: track_groups, extra_questions, event_types, track_chair_rating_types, allowed_presentation_action_types, allowed_presentation_action_types, allowed_presentation_questions, allowed_presentation_editable_questions, summit', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Relations to include: track_groups, extra_questions, event_types, track_chair_rating_types, allowed_presentation_action_types, allowed_presentation_action_types, allowed_presentation_questions, allowed_presentation_editable_questions', schema: new OA\Schema(type: 'string') ), ], @@ -687,7 +729,21 @@ public function getCurrentSelectionPlanByStatus($summit_id, $status) name: 'expand', in: 'query', required: false, - description: 'Expand relationships', + description: 'Expand relationships to include as full objects: track_groups, extra_questions, event_types, track_chair_rating_types, allowed_presentation_action_types, allowed_presentation_action_types, allowed_presentation_questions, allowed_presentation_editable_questions, summit', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Relations to include: track_groups, extra_questions, event_types, track_chair_rating_types, allowed_presentation_action_types, allowed_presentation_action_types, allowed_presentation_questions, allowed_presentation_editable_questions', schema: new OA\Schema(type: 'string') ), ], @@ -1185,7 +1241,8 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { responses: [ new OA\Response( response: Response::HTTP_OK, - description: 'Presentation retrieved successfully' + description: 'Presentation retrieved successfully', + content: new OA\JsonContent(ref: '#/components/schemas/TrackChairPresentation') ), new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: 'Unauthorized'), new OA\Response(response: Response::HTTP_FORBIDDEN, description: 'Forbidden'), @@ -1271,7 +1328,11 @@ public function getSelectionPlanPresentation($summit_id, $selection_plan_id, $pr ), ], responses: [ - new OA\Response(response: Response::HTTP_OK, description: 'Presentation marked as viewed successfully'), + new OA\Response( + response: Response::HTTP_OK, + description: 'Presentation marked as viewed successfully', + content: new OA\JsonContent(ref: '#/components/schemas/TrackChairPresentation') + ), 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, Selection Plan, or Presentation not found'), @@ -3983,6 +4044,9 @@ function () { null, null, function ($page, $per_page, $filter, $order, $applyExtraFilters) { + /** + * @var ISelectionPlanRepository $this->repository + */ return $this->repository->getAllAllowedMembersByPage ( new PagingInfo($page, $per_page), diff --git a/app/Swagger/Models/AdminPresentationSchema.php b/app/Swagger/Models/AdminPresentationSchema.php new file mode 100644 index 000000000..903d4c31a --- /dev/null +++ b/app/Swagger/Models/AdminPresentationSchema.php @@ -0,0 +1,50 @@ + Date: Mon, 12 Jan 2026 19:28:13 +0000 Subject: [PATCH 7/7] chore: add missing params and request bodies. Signed-off-by: Matias Perrone --- ...Auth2SummitSelectionPlansApiController.php | 251 ++++++++++++++++++ ...mmitSelectionPlansApiControllerSchemas.php | 80 ++++++ 2 files changed, 331 insertions(+) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php index 693b56975..1d122030e 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSelectionPlansApiController.php @@ -229,6 +229,11 @@ public function getSelectionPlan($summit_id, $selection_plan_id) IGroup::SummitAdministrators, ] ], + requestBody: new OA\RequestBody( + description: 'Selection plan data', + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/UpdateSelectionPlanPayload') + ), parameters: [ new OA\Parameter( name: 'id', @@ -324,6 +329,11 @@ public function updateSelectionPlan($summit_id, $selection_plan_id) IGroup::SummitAdministrators, ] ], + requestBody: new OA\RequestBody( + description: 'Selection plan data', + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/AddSelectionPlanPayload') + ), parameters: [ new OA\Parameter( name: 'id', @@ -876,6 +886,20 @@ function () { description: 'Expand relationships', schema: new OA\Schema(type: 'string') ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Related entities to include (comma-separated)', + schema: new OA\Schema(type: 'string') + ), ], responses: [ new OA\Response( @@ -1051,6 +1075,27 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { description: 'Order by field(s)', schema: new OA\Schema(type: 'string') ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Related entities to include (comma-separated)', + schema: new OA\Schema(type: 'string') + ), ], responses: [ new OA\Response( @@ -1237,6 +1282,20 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { description: 'Expand relationships', schema: new OA\Schema(type: 'string') ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Related entities to include (comma-separated)', + schema: new OA\Schema(type: 'string') + ), ], responses: [ new OA\Response( @@ -1536,6 +1595,27 @@ public function addCommentToPresentation($summit_id, $selection_plan_id, $presen description: 'Order by field(s). Available: id, approval_date, status, presentation_title, new_category_name, old_category_name, requester_fullname', schema: new OA\Schema(type: 'string') ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Related entities to include (comma-separated)', + schema: new OA\Schema(type: 'string') + ), ], responses: [ new OA\Response( @@ -1897,6 +1977,27 @@ public function resolvePresentationCategoryChangeRequest($summit_id, $selection_ description: 'Order by field(s). Available: id, name, label, order', schema: new OA\Schema(type: 'string') ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships: values, sub_question_rules, parent_rules', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Related entities to include (comma-separated)', + schema: new OA\Schema(type: 'string') + ), ], responses: [ new OA\Response( @@ -2010,6 +2111,20 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { description: 'Expand relationships: values, sub_question_rules, parent_rules', schema: new OA\Schema(type: 'string') ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Related entities to include (comma-separated)', + schema: new OA\Schema(type: 'string') + ), ], responses: [ new OA\Response( @@ -2100,6 +2215,27 @@ public function getExtraQuestion($summit_id, $question_id){ description: 'Order by field(s). Available: id, name, label, order', schema: new OA\Schema(type: 'string') ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships: values, sub_question_rules, parent_rules', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Related entities to include (comma-separated)', + schema: new OA\Schema(type: 'string') + ), ], responses: [ new OA\Response( @@ -2607,6 +2743,27 @@ public function assignExtraQuestion($summit_id, $selection_plan_id, $question_id description: 'Question ID', schema: new OA\Schema(type: 'integer') ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships: values, sub_question_rules, parent_rules', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Related entities to include (comma-separated)', + schema: new OA\Schema(type: 'string') + ), ], responses: [ new OA\Response( @@ -3536,6 +3693,27 @@ public function detachEventType($id, $selection_plan_id, $event_type_id) description: 'Items per page', schema: new OA\Schema(type: 'integer', default: 10) ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Related entities to include (comma-separated)', + schema: new OA\Schema(type: 'string') + ), ], responses: [ new OA\Response( @@ -3647,6 +3825,27 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { description: 'Presentation Action Type ID', schema: new OA\Schema(type: 'integer') ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Related entities to include (comma-separated)', + schema: new OA\Schema(type: 'string') + ), ], responses: [ new OA\Response( @@ -3711,6 +3910,11 @@ public function getAllowedPresentationActionType($summit_id, $selection_plan_id, IGroup::TrackChairsAdmins, ] ], + requestBody: new OA\RequestBody( + description: 'Allowed presentation action type data', + required: false, + content: new OA\JsonContent(ref: '#/components/schemas/AddAllowedPresentationActionTypePayload') + ), parameters: [ new OA\Parameter( name: 'id', @@ -3796,6 +4000,11 @@ public function addAllowedPresentationActionType($id, $selection_plan_id, $type_ IGroup::TrackChairsAdmins, ] ], + requestBody: new OA\RequestBody( + description: 'Allowed presentation action type data', + required: true, + content: new OA\JsonContent(ref: '#/components/schemas/UpdateAllowedPresentationActionTypePayload') + ), parameters: [ new OA\Parameter( name: 'id', @@ -3994,6 +4203,27 @@ public function removeAllowedPresentationActionType($id, $selection_plan_id, $ty description: 'Items per page', schema: new OA\Schema(type: 'integer', default: 10) ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Related entities to include (comma-separated)', + schema: new OA\Schema(type: 'string') + ), ], responses: [ new OA\Response( @@ -4295,6 +4525,27 @@ public function importAllowedMembers(LaravelRequest $request, $id, $selection_pl description: 'Summit ID or slug', schema: new OA\Schema(type: 'integer') ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships: track_groups, extra_questions, event_types', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'fields', + in: 'query', + required: false, + description: 'Fields to return (comma-separated)', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'relations', + in: 'query', + required: false, + description: 'Related entities to include (comma-separated)', + schema: new OA\Schema(type: 'string') + ), ], responses: [ new OA\Response( diff --git a/app/Swagger/OAuth2SummitSelectionPlansApiControllerSchemas.php b/app/Swagger/OAuth2SummitSelectionPlansApiControllerSchemas.php index 51c226242..99316c669 100644 --- a/app/Swagger/OAuth2SummitSelectionPlansApiControllerSchemas.php +++ b/app/Swagger/OAuth2SummitSelectionPlansApiControllerSchemas.php @@ -204,3 +204,83 @@ class ResolveCategoryChangeRequestPayloadSchema {} ] )] class AllowedMemberPayloadSchema {} + +#[OA\Schema( + schema: 'AddSelectionPlanPayload', + type: 'object', + description: 'Payload for creating a new selection plan', + required: ['name', 'is_enabled', 'is_hidden', 'allow_new_presentations'], + properties: [ + new OA\Property(property: 'name', type: 'string', maxLength: 255, description: 'Name of the selection plan'), + new OA\Property(property: 'is_enabled', type: 'boolean', description: 'Whether the selection plan is enabled'), + new OA\Property(property: 'is_hidden', type: 'boolean', description: 'Whether the selection plan is hidden'), + new OA\Property(property: 'allow_new_presentations', type: 'boolean', description: 'Whether new presentations are allowed'), + new OA\Property(property: 'max_submission_allowed_per_user', type: 'integer', minimum: 1, description: 'Maximum submissions allowed per user'), + new OA\Property(property: 'submission_begin_date', type: 'integer', description: 'Unix timestamp for submission begin date', nullable: true), + new OA\Property(property: 'submission_end_date', type: 'integer', description: 'Unix timestamp for submission end date', nullable: true), + new OA\Property(property: 'submission_lock_down_presentation_status_date', type: 'integer', description: 'Unix timestamp for submission lockdown date', nullable: true), + new OA\Property(property: 'voting_begin_date', type: 'integer', description: 'Unix timestamp for voting begin date', nullable: true), + new OA\Property(property: 'voting_end_date', type: 'integer', description: 'Unix timestamp for voting end date', nullable: true), + new OA\Property(property: 'selection_begin_date', type: 'integer', description: 'Unix timestamp for selection begin date', nullable: true), + new OA\Property(property: 'selection_end_date', type: 'integer', description: 'Unix timestamp for selection end date', nullable: true), + new OA\Property(property: 'submission_period_disclaimer', type: 'string', description: 'Disclaimer text for the submission period'), + new OA\Property(property: 'presentation_creator_notification_email_template', type: 'string', maxLength: 255, description: 'Email template for presentation creator notifications'), + new OA\Property(property: 'presentation_moderator_notification_email_template', type: 'string', maxLength: 255, description: 'Email template for presentation moderator notifications'), + new OA\Property(property: 'presentation_speaker_notification_email_template', type: 'string', maxLength: 255, description: 'Email template for presentation speaker notifications'), + new OA\Property(property: 'allowed_presentation_questions', type: 'array', items: new OA\Items(type: 'string'), description: 'List of allowed presentation questions'), + new OA\Property(property: 'allow_proposed_schedules', type: 'boolean', description: 'Whether proposed schedules are allowed'), + new OA\Property(property: 'allowed_presentation_editable_questions', type: 'array', items: new OA\Items(type: 'string'), description: 'List of allowed editable presentation questions'), + new OA\Property(property: 'allow_track_change_requests', type: 'boolean', description: 'Whether track change requests are allowed'), + ] +)] +class AddSelectionPlanPayloadSchema {} + +#[OA\Schema( + schema: 'UpdateSelectionPlanPayload', + type: 'object', + description: 'Payload for updating an existing selection plan', + properties: [ + new OA\Property(property: 'name', type: 'string', maxLength: 255, description: 'Name of the selection plan'), + new OA\Property(property: 'is_enabled', type: 'boolean', description: 'Whether the selection plan is enabled'), + new OA\Property(property: 'is_hidden', type: 'boolean', description: 'Whether the selection plan is hidden'), + new OA\Property(property: 'allow_new_presentations', type: 'boolean', description: 'Whether new presentations are allowed'), + new OA\Property(property: 'max_submission_allowed_per_user', type: 'integer', minimum: 1, description: 'Maximum submissions allowed per user'), + new OA\Property(property: 'submission_begin_date', type: 'integer', description: 'Unix timestamp for submission begin date', nullable: true), + new OA\Property(property: 'submission_end_date', type: 'integer', description: 'Unix timestamp for submission end date', nullable: true), + new OA\Property(property: 'submission_lock_down_presentation_status_date', type: 'integer', description: 'Unix timestamp for submission lockdown date', nullable: true), + new OA\Property(property: 'voting_begin_date', type: 'integer', description: 'Unix timestamp for voting begin date', nullable: true), + new OA\Property(property: 'voting_end_date', type: 'integer', description: 'Unix timestamp for voting end date', nullable: true), + new OA\Property(property: 'selection_begin_date', type: 'integer', description: 'Unix timestamp for selection begin date', nullable: true), + new OA\Property(property: 'selection_end_date', type: 'integer', description: 'Unix timestamp for selection end date', nullable: true), + new OA\Property(property: 'submission_period_disclaimer', type: 'string', description: 'Disclaimer text for the submission period'), + new OA\Property(property: 'presentation_creator_notification_email_template', type: 'string', maxLength: 255, description: 'Email template for presentation creator notifications'), + new OA\Property(property: 'presentation_moderator_notification_email_template', type: 'string', maxLength: 255, description: 'Email template for presentation moderator notifications'), + new OA\Property(property: 'presentation_speaker_notification_email_template', type: 'string', maxLength: 255, description: 'Email template for presentation speaker notifications'), + new OA\Property(property: 'allowed_presentation_questions', type: 'array', items: new OA\Items(type: 'string'), description: 'List of allowed presentation questions'), + new OA\Property(property: 'allow_proposed_schedules', type: 'boolean', description: 'Whether proposed schedules are allowed'), + new OA\Property(property: 'allowed_presentation_editable_questions', type: 'array', items: new OA\Items(type: 'string'), description: 'List of allowed editable presentation questions'), + new OA\Property(property: 'allow_track_change_requests', type: 'boolean', description: 'Whether track change requests are allowed'), + ] +)] +class UpdateSelectionPlanPayloadSchema {} + +#[OA\Schema( + schema: 'AddAllowedPresentationActionTypePayload', + type: 'object', + description: 'Payload for adding an allowed presentation action type to a selection plan', + properties: [ + new OA\Property(property: 'order', type: 'integer', minimum: 1, description: 'Order of the action type'), + ] +)] +class AddAllowedPresentationActionTypePayloadSchema {} + +#[OA\Schema( + schema: 'UpdateAllowedPresentationActionTypePayload', + type: 'object', + description: 'Payload for updating an allowed presentation action type in a selection plan', + required: ['order'], + properties: [ + new OA\Property(property: 'order', type: 'integer', minimum: 1, description: 'Order of the action type'), + ] +)] +class UpdateAllowedPresentationActionTypePayloadSchema {}