From 7a6b5843ceba73754db25bbada18891d7dbe8bd7 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 2 Oct 2025 16:29:18 -0300 Subject: [PATCH 1/6] feat: Extend Swagger Coverage for controller OAuth2SummitPresentationActionApiController.php --- ...2SummitPresentationActionApiController.php | 122 +++++++++++++++++- 1 file changed, 121 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php index d4a4f3d3f..0cbabcc91 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php @@ -11,6 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ +use App\Security\SummitScopes; use App\Services\Model\ISummitPresentationActionService; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Request; @@ -19,6 +20,7 @@ use models\oauth2\IResourceServerContext; use models\summit\ISummitRepository; use ModelSerializers\SerializerRegistry; +use OpenApi\Attributes as OA; use Exception; /** * Class OAuth2SummitPresentationActionApiController @@ -56,6 +58,66 @@ public function __construct parent::__construct($resource_server_context); } + // OpenAPI Documentation + + #[OA\Put( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/presentations/{presentation_id}/actions/{action_type_id}/complete', + summary: 'Mark a presentation action as completed', + description: 'Marks a specific action for a presentation as completed by a track chair. Track chairs use presentation actions to manage the review process (e.g., "Review Video", "Check Speakers", "Verify Content"). Only track chairs and track chair admins can perform this action.', + security: [['oauth2_security_scope' => [SummitScopes::WriteSummitData]]], + tags: ['Presentation Actions'], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID', + 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: 'action_type_id', + in: 'path', + required: true, + description: 'Action Type ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships. Available: presentation, type, created_by, updated_by', + schema: new OA\Schema(type: 'string', example: 'type,created_by') + ), + ], + responses: [ + new OA\Response( + response: 200, + description: 'Presentation action marked as completed successfully', + content: new OA\JsonContent(ref: '#/components/schemas/PresentationAction') + ), + new OA\Response(response: 400, ref: '#/components/responses/400'), + new OA\Response(response: 401, ref: '#/components/responses/401'), + new OA\Response(response: 403, ref: '#/components/responses/403', description: 'Forbidden - User must be a track chair or track chair admin'), + new OA\Response(response: 404, ref: '#/components/responses/404'), + new OA\Response(response: 412, ref: '#/components/responses/412'), + new OA\Response(response: 500, ref: '#/components/responses/500'), + ] + )] + /** * @param $summit_id * @param $selection_plan_id @@ -93,6 +155,64 @@ public function complete($summit_id, $selection_plan_id, $presentation_id, $acti } } + #[OA\Delete( + path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/presentations/{presentation_id}/actions/{action_type_id}/incomplete', + summary: 'Mark a presentation action as incomplete', + description: 'Unmarks a completed presentation action, setting it back to incomplete status. This allows track chairs to revert an action they previously marked as done. Only track chairs and track chair admins can perform this action.', + security: [['oauth2_security_scope' => [SummitScopes::WriteSummitData]]], + tags: ['Presentation Actions'], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + description: 'Summit ID', + 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: 'action_type_id', + in: 'path', + required: true, + description: 'Action Type ID', + schema: new OA\Schema(type: 'integer') + ), + new OA\Parameter( + name: 'expand', + in: 'query', + required: false, + description: 'Expand relationships. Available: presentation, type, created_by, updated_by', + schema: new OA\Schema(type: 'string', example: 'type,created_by') + ), + ], + responses: [ + new OA\Response( + response: 200, + description: 'Presentation action marked as incomplete successfully', + content: new OA\JsonContent(ref: '#/components/schemas/PresentationAction') + ), + new OA\Response(response: 400, ref: '#/components/responses/400'), + new OA\Response(response: 401, ref: '#/components/responses/401'), + new OA\Response(response: 403, ref: '#/components/responses/403', description: 'Forbidden - User must be a track chair or track chair admin'), + new OA\Response(response: 404, ref: '#/components/responses/404'), + new OA\Response(response: 412, ref: '#/components/responses/412'), + new OA\Response(response: 500, ref: '#/components/responses/500'), + ] + )] + /** * @param $summit_id * @param $selection_plan_id @@ -129,4 +249,4 @@ public function uncomplete($summit_id, $selection_plan_id, $presentation_id, $ac return $this->error500($ex); } } -} \ No newline at end of file +} From 89dd97cb03a61a318917dd36d85d17b09836c446 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 2 Oct 2025 16:40:55 -0300 Subject: [PATCH 2/6] fix: HTTP codes now uses Response::HTTP_* constants --- ...2SummitPresentationActionApiController.php | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php index 0cbabcc91..c9231cdda 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php @@ -13,6 +13,7 @@ **/ use App\Security\SummitScopes; use App\Services\Model\ISummitPresentationActionService; +use Illuminate\Http\Response; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Request; use models\exceptions\EntityNotFoundException; @@ -109,12 +110,11 @@ public function __construct description: 'Presentation action marked as completed successfully', content: new OA\JsonContent(ref: '#/components/schemas/PresentationAction') ), - new OA\Response(response: 400, ref: '#/components/responses/400'), - new OA\Response(response: 401, ref: '#/components/responses/401'), - new OA\Response(response: 403, ref: '#/components/responses/403', description: 'Forbidden - User must be a track chair or track chair admin'), - new OA\Response(response: 404, ref: '#/components/responses/404'), - new OA\Response(response: 412, ref: '#/components/responses/412'), - new OA\Response(response: 500, ref: '#/components/responses/500'), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden - User must be a track chair or track chair admin"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), ] )] @@ -204,12 +204,11 @@ public function complete($summit_id, $selection_plan_id, $presentation_id, $acti description: 'Presentation action marked as incomplete successfully', content: new OA\JsonContent(ref: '#/components/schemas/PresentationAction') ), - new OA\Response(response: 400, ref: '#/components/responses/400'), - new OA\Response(response: 401, ref: '#/components/responses/401'), - new OA\Response(response: 403, ref: '#/components/responses/403', description: 'Forbidden - User must be a track chair or track chair admin'), - new OA\Response(response: 404, ref: '#/components/responses/404'), - new OA\Response(response: 412, ref: '#/components/responses/412'), - new OA\Response(response: 500, ref: '#/components/responses/500'), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden - User must be a track chair or track chair admin"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), ] )] From aa008ca604dd79bdf6163e1778e3771b3566258a Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 9 Oct 2025 11:39:42 -0300 Subject: [PATCH 3/6] fix: Move schema to the new file and remove requiere --- app/Swagger/SummitPresentationSchemas.php | 24 ++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/app/Swagger/SummitPresentationSchemas.php b/app/Swagger/SummitPresentationSchemas.php index 6b3e2f895..bc9fe0f50 100644 --- a/app/Swagger/SummitPresentationSchemas.php +++ b/app/Swagger/SummitPresentationSchemas.php @@ -4,4 +4,26 @@ use OpenApi\Attributes as OA; -// +// Presentation Actions + +#[OA\Schema( + schema: 'PresentationAction', + type: 'object', + properties: [ + new OA\Property(property: 'id', type: 'integer', example: 1), + new OA\Property(property: 'is_completed', type: 'boolean', example: true, description: 'Whether the action has been completed'), + new OA\Property(property: 'created', type: 'integer', example: 1633024800, description: 'Unix timestamp when created'), + new OA\Property(property: 'last_edited', type: 'integer', example: 1633111200, description: 'Unix timestamp when last updated'), + ], + anyOf: [ + new OA\Property(property: 'presentation_id', type: 'integer', example: 10, description: 'The ID of the presentation'), + new OA\Property(property: 'presentation', type: 'Presentation'), + new OA\Property(property: 'type_id', type: 'integer', example: 5, description: 'ID of the action type (e.g., Review Video, Check Speakers)'), + new OA\Property(property: 'type', type: 'PresentationActionType'), + new OA\Property(property: 'created_by_id', type: 'integer', nullable: true, example: 42, description: 'ID of the user who created this action'), + new OA\Property(property: 'created_by', type: 'Member'), + new OA\Property(property: 'updated_by_id', type: 'integer', nullable: true, example: 42, description: 'ID of the user who last updated this action'), + new OA\Property(property: 'updated_by', type: 'Member'), + ], +)] +class PresentationActionSchema {} From 51bc32c6f59c9c2e7dc26b6e5edfdc3a0370cdf8 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 14 Oct 2025 14:46:28 -0300 Subject: [PATCH 4/6] fix: Change "namespace" word positioning --- .../Summit/OAuth2SummitPresentationActionApiController.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php index c9231cdda..3ce2aa57e 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php @@ -1,4 +1,7 @@ -error500($ex); } } -} +} \ No newline at end of file From fc71a25393cc63b62b95e7864eb89feb75c82fbb Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Thu, 13 Nov 2025 20:22:55 +0000 Subject: [PATCH 5/6] chore: Add the security schema for the controller to its own file --- ...2SummitPresentationActionApiController.php | 30 +++++++++++++++++-- .../PresentationActionsAuthSchema.php | 25 ++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 app/Swagger/Security/PresentationActionsAuthSchema.php diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php index 3ce2aa57e..419f558b2 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php @@ -14,6 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ +use App\Models\Foundation\Main\IGroup; use App\Security\SummitScopes; use App\Services\Model\ISummitPresentationActionService; use Illuminate\Http\Response; @@ -26,6 +27,8 @@ use ModelSerializers\SerializerRegistry; use OpenApi\Attributes as OA; use Exception; + + /** * Class OAuth2SummitPresentationActionApiController * @package App\Http\Controllers @@ -68,7 +71,18 @@ public function __construct path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/presentations/{presentation_id}/actions/{action_type_id}/complete', summary: 'Mark a presentation action as completed', description: 'Marks a specific action for a presentation as completed by a track chair. Track chairs use presentation actions to manage the review process (e.g., "Review Video", "Check Speakers", "Verify Content"). Only track chairs and track chair admins can perform this action.', - security: [['oauth2_security_scope' => [SummitScopes::WriteSummitData]]], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + security: [['presentation_actions_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteEventData, + ]]], tags: ['Presentation Actions'], parameters: [ new OA\Parameter( @@ -162,7 +176,17 @@ public function complete($summit_id, $selection_plan_id, $presentation_id, $acti path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/presentations/{presentation_id}/actions/{action_type_id}/incomplete', summary: 'Mark a presentation action as incomplete', description: 'Unmarks a completed presentation action, setting it back to incomplete status. This allows track chairs to revert an action they previously marked as done. Only track chairs and track chair admins can perform this action.', - security: [['oauth2_security_scope' => [SummitScopes::WriteSummitData]]], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::TrackChairs, + IGroup::TrackChairsAdmins, + ] + ], + security: [['presentation_actions_oauth2' => [ + SummitScopes::WriteSummitData, + ]]], tags: ['Presentation Actions'], parameters: [ new OA\Parameter( @@ -251,4 +275,4 @@ public function uncomplete($summit_id, $selection_plan_id, $presentation_id, $ac return $this->error500($ex); } } -} \ No newline at end of file +} diff --git a/app/Swagger/Security/PresentationActionsAuthSchema.php b/app/Swagger/Security/PresentationActionsAuthSchema.php new file mode 100644 index 000000000..424789e83 --- /dev/null +++ b/app/Swagger/Security/PresentationActionsAuthSchema.php @@ -0,0 +1,25 @@ + 'Write Summit Data', + SummitScopes::WriteEventData => 'Write Event Data', + ], + ), + ], + ) +] +class PresentationActionsAuthSchema{} From b07a9f6a0796f225c3c02430a3da7eb6954a3fb0 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Mon, 24 Nov 2025 13:18:02 +0000 Subject: [PATCH 6/6] chore: include PR requested changes --- ...2SummitPresentationActionApiController.php | 48 ++++++++++++------- .../Models/PresentationActionSchema.php | 27 +++++++++++ .../PresentationActionsAuthSchema.php | 37 +++++++------- app/Swagger/SummitPresentationSchemas.php | 26 +--------- 4 files changed, 77 insertions(+), 61 deletions(-) create mode 100644 app/Swagger/Models/PresentationActionSchema.php diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php index 419f558b2..a9b9f230c 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitPresentationActionApiController.php @@ -33,8 +33,7 @@ * Class OAuth2SummitPresentationActionApiController * @package App\Http\Controllers */ -final class OAuth2SummitPresentationActionApiController - extends OAuth2ProtectedController +final class OAuth2SummitPresentationActionApiController extends OAuth2ProtectedController { /** @@ -58,8 +57,7 @@ public function __construct ISummitRepository $summit_repository, ISummitPresentationActionService $service, IResourceServerContext $resource_server_context - ) - { + ) { $this->summit_repository = $summit_repository; $this->service = $service; parent::__construct($resource_server_context); @@ -69,6 +67,7 @@ public function __construct #[OA\Put( path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/presentations/{presentation_id}/actions/{action_type_id}/complete', + operationId: 'completePresentationAction', summary: 'Mark a presentation action as completed', description: 'Marks a specific action for a presentation as completed by a track chair. Track chairs use presentation actions to manage the review process (e.g., "Review Video", "Check Speakers", "Verify Content"). Only track chairs and track chair admins can perform this action.', x: [ @@ -79,10 +78,14 @@ public function __construct IGroup::TrackChairsAdmins, ] ], - security: [['presentation_actions_oauth2' => [ - SummitScopes::WriteSummitData, - SummitScopes::WriteEventData, - ]]], + security: [ + [ + 'presentation_actions_oauth2' => [ + SummitScopes::WriteSummitData, + SummitScopes::WriteEventData, + ] + ] + ], tags: ['Presentation Actions'], parameters: [ new OA\Parameter( @@ -141,11 +144,13 @@ public function __construct * @param $presentation_id * @param $action_type_id */ - public function complete($summit_id, $selection_plan_id, $presentation_id, $action_type_id){ + public function complete($summit_id, $selection_plan_id, $presentation_id, $action_type_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $member = $this->resource_server_context->getCurrentUser(); @@ -157,7 +162,7 @@ public function complete($summit_id, $selection_plan_id, $presentation_id, $acti if (!$authz) return $this->error403(); - $action = $this->service->updateAction($summit, intval($selection_plan_id), intval($presentation_id), intval($action_type_id), true ); + $action = $this->service->updateAction($summit, intval($selection_plan_id), intval($presentation_id), intval($action_type_id), true); return $this->updated(SerializerRegistry::getInstance()->getSerializer($action)->serialize(Request::input('expand', ''))); } catch (ValidationException $ex) { @@ -174,6 +179,7 @@ public function complete($summit_id, $selection_plan_id, $presentation_id, $acti #[OA\Delete( path: '/api/v1/summits/{id}/selection-plans/{selection_plan_id}/presentations/{presentation_id}/actions/{action_type_id}/incomplete', + operationId: 'incompletePresentationAction', summary: 'Mark a presentation action as incomplete', description: 'Unmarks a completed presentation action, setting it back to incomplete status. This allows track chairs to revert an action they previously marked as done. Only track chairs and track chair admins can perform this action.', x: [ @@ -184,9 +190,13 @@ public function complete($summit_id, $selection_plan_id, $presentation_id, $acti IGroup::TrackChairsAdmins, ] ], - security: [['presentation_actions_oauth2' => [ - SummitScopes::WriteSummitData, - ]]], + security: [ + [ + 'presentation_actions_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], tags: ['Presentation Actions'], parameters: [ new OA\Parameter( @@ -245,11 +255,13 @@ public function complete($summit_id, $selection_plan_id, $presentation_id, $acti * @param $presentation_id * @param $action_type_id */ - public function uncomplete($summit_id, $selection_plan_id, $presentation_id, $action_type_id){ + public function uncomplete($summit_id, $selection_plan_id, $presentation_id, $action_type_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $member = $this->resource_server_context->getCurrentUser(); @@ -261,7 +273,7 @@ public function uncomplete($summit_id, $selection_plan_id, $presentation_id, $ac if (!$authz) return $this->error403(); - $action = $this->service->updateAction($summit, intval($selection_plan_id), intval($presentation_id), intval($action_type_id), false ); + $action = $this->service->updateAction($summit, intval($selection_plan_id), intval($presentation_id), intval($action_type_id), false); return $this->updated(SerializerRegistry::getInstance()->getSerializer($action)->serialize(Request::input('expand', ''))); } catch (ValidationException $ex) { @@ -275,4 +287,4 @@ public function uncomplete($summit_id, $selection_plan_id, $presentation_id, $ac return $this->error500($ex); } } -} +} \ No newline at end of file diff --git a/app/Swagger/Models/PresentationActionSchema.php b/app/Swagger/Models/PresentationActionSchema.php new file mode 100644 index 000000000..23a8d15ae --- /dev/null +++ b/app/Swagger/Models/PresentationActionSchema.php @@ -0,0 +1,27 @@ + 'Write Summit Data', - SummitScopes::WriteEventData => 'Write Event Data', - ], - ), - ], - ) +#[OA\SecurityScheme( + type: 'oauth2', + securityScheme: 'presentation_actions_oauth2', + flows: [ + new OA\Flow( + authorizationUrl: L5_SWAGGER_CONST_AUTH_URL, + tokenUrl: L5_SWAGGER_CONST_TOKEN_URL, + flow: 'authorizationCode', + scopes: [ + SummitScopes::WriteSummitData => 'Write Summit Data', + SummitScopes::WriteEventData => 'Write Event Data', + ], + ), + ], +) ] -class PresentationActionsAuthSchema{} +class PresentationActionsAuthSchema +{ +} diff --git a/app/Swagger/SummitPresentationSchemas.php b/app/Swagger/SummitPresentationSchemas.php index bc9fe0f50..8de16ad2e 100644 --- a/app/Swagger/SummitPresentationSchemas.php +++ b/app/Swagger/SummitPresentationSchemas.php @@ -2,28 +2,4 @@ namespace App\Swagger\schemas; -use OpenApi\Attributes as OA; - -// Presentation Actions - -#[OA\Schema( - schema: 'PresentationAction', - type: 'object', - properties: [ - new OA\Property(property: 'id', type: 'integer', example: 1), - new OA\Property(property: 'is_completed', type: 'boolean', example: true, description: 'Whether the action has been completed'), - new OA\Property(property: 'created', type: 'integer', example: 1633024800, description: 'Unix timestamp when created'), - new OA\Property(property: 'last_edited', type: 'integer', example: 1633111200, description: 'Unix timestamp when last updated'), - ], - anyOf: [ - new OA\Property(property: 'presentation_id', type: 'integer', example: 10, description: 'The ID of the presentation'), - new OA\Property(property: 'presentation', type: 'Presentation'), - new OA\Property(property: 'type_id', type: 'integer', example: 5, description: 'ID of the action type (e.g., Review Video, Check Speakers)'), - new OA\Property(property: 'type', type: 'PresentationActionType'), - new OA\Property(property: 'created_by_id', type: 'integer', nullable: true, example: 42, description: 'ID of the user who created this action'), - new OA\Property(property: 'created_by', type: 'Member'), - new OA\Property(property: 'updated_by_id', type: 'integer', nullable: true, example: 42, description: 'ID of the user who last updated this action'), - new OA\Property(property: 'updated_by', type: 'Member'), - ], -)] -class PresentationActionSchema {} +use OpenApi\Attributes as OA; \ No newline at end of file