diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php index d700c3a41..6b8430168 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php @@ -1,4 +1,5 @@ - [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + schema: new OA\Schema(type: "string"), + description: "Summit ID" + ), + new OA\Parameter( + name: "page", + in: "query", + required: false, + schema: new OA\Schema(type: "integer", default: 1), + description: "Page number" + ), + new OA\Parameter( + name: "per_page", + in: "query", + required: false, + schema: new OA\Schema(type: "integer", default: 20), + description: "Items per page" + ), + new OA\Parameter( + name: "filter", + in: "query", + required: false, + schema: new OA\Schema(type: "string"), + description: "Filter by: name, class_name, is_default, black_out_times, use_sponsors, are_sponsors_mandatory, allows_attachment, use_speakers, are_speakers_mandatory, use_moderator, is_moderator_mandatory, should_be_available_on_cfp" + ), + new OA\Parameter( + name: "order", + in: "query", + required: false, + schema: new OA\Schema(type: "string"), + description: "Order by: id, name" + ), + new OA\Parameter( + name: "expand", + in: "query", + required: false, + schema: new OA\Schema(type: "string"), + description: "Expand relationships: summit, summit_documents, allowed_ticket_types" + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "Event types retrieved successfully", + content: new OA\JsonContent(ref: "#/components/schemas/PaginatedEventTypesResponse") + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function getAllBySummit($summit_id) { $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(); return $this->_getAll( function () { @@ -146,6 +221,68 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($summit) { * @param $summit_id * @return mixed */ + #[OA\Get( + path: "/api/v1/summits/{id}/event-types/csv", + operationId: "getAllSummitEventTypesBySummitCSV", + description: "Export event types for a summit as CSV", + tags: ["Event Types"], + security: [ + [ + 'summit_event_types_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + schema: new OA\Schema(type: "string"), + description: "Summit ID" + ), + new OA\Parameter( + name: "page", + in: "query", + required: false, + schema: new OA\Schema(type: "integer", default: 1), + description: "Page number" + ), + new OA\Parameter( + name: "per_page", + in: "query", + required: false, + schema: new OA\Schema(type: "integer"), + description: "Items per page" + ), + new OA\Parameter( + name: "filter", + in: "query", + required: false, + schema: new OA\Schema(type: "string"), + description: "Filter criteria" + ), + new OA\Parameter( + name: "order", + in: "query", + required: false, + schema: new OA\Schema(type: "string"), + description: "Order by: id, name" + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "CSV file exported successfully", + content: new OA\MediaType(mediaType: "text/csv") + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function getAllBySummitCSV($summit_id) { $values = Request::all(); @@ -155,7 +292,8 @@ public function getAllBySummitCSV($summit_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(); $validation = Validator::make($values, $rules); @@ -192,7 +330,8 @@ public function getAllBySummitCSV($summit_id) ]); } - if (is_null($filter)) $filter = new Filter(); + if (is_null($filter)) + $filter = new Filter(); $filter->validate([ 'class_name' => 'sometimes|string|in:'.join(",", SummitEventTypeConstants::$valid_class_names), @@ -272,6 +411,90 @@ public function getAllBySummitCSV($summit_id) * @param $event_type_id * @return mixed */ + #[OA\Get( + path: "/api/v1/summits/{id}/event-types/{event_type_id}", + operationId: "getEventTypeBySummit", + description: "Get a specific event type by ID", + tags: ["Event Types"], + security: [ + [ + 'summit_event_types_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + schema: new OA\Schema(type: "string"), + description: "Summit ID" + ), + new OA\Parameter( + name: "event_type_id", + in: "path", + required: true, + schema: new OA\Schema(type: "integer", format: "int64"), + description: "Event type ID" + ), + new OA\Parameter( + name: "expand", + in: "query", + required: false, + schema: new OA\Schema(type: "string"), + description: "Expand relationships" + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "Event type retrieved successfully", + content: new OA\JsonContent(ref: "#/components/schemas/EventType") + ), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Event type or summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] + #[OA\Get( + path: "/api/public/v1/summits/{id}/event-types/{event_type_id}", + operationId: "getEventTypeBySummitPublic", + description: "Get a specific event type by ID", + tags: ["Event Types (Public)"], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + schema: new OA\Schema(type: "string"), + description: "Summit ID" + ), + new OA\Parameter( + name: "event_type_id", + in: "path", + required: true, + schema: new OA\Schema(type: "integer", format: "int64"), + description: "Event type ID" + ), + new OA\Parameter( + name: "expand", + in: "query", + required: false, + schema: new OA\Schema(type: "string"), + description: "Expand relationships" + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "Event type retrieved successfully", + content: new OA\JsonContent(ref: "#/components/schemas/EventType") + ), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Event type or summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function getEventTypeBySummit($summit_id, $event_type_id) { return $this->processRequest(function () use ($summit_id, $event_type_id) { @@ -297,12 +520,58 @@ public function getEventTypeBySummit($summit_id, $event_type_id) * @param $summit_id * @return mixed */ + #[OA\Post( + path: "/api/v1/summits/{id}/event-types", + operationId: "addEventTypeBySummit", + description: "Create a new event type", + tags: ["Event Types"], + security: [ + [ + 'summit_event_types_oauth2' => [ + SummitScopes::WriteEventTypeData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + schema: new OA\Schema(type: "string"), + description: "Summit ID" + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/EventTypeAddRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: "Event type created successfully", + content: new OA\JsonContent(ref: "#/components/schemas/EventType") + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function addEventTypeBySummit($summit_id) { return $this->processRequest(function () use ($summit_id) { $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(); $payload = $this->getJsonPayload(EventTypeValidationRulesFactory::build(Request::all())); @@ -321,12 +590,65 @@ public function addEventTypeBySummit($summit_id) * @param $event_type_id * @return mixed */ + #[OA\Put( + path: "/api/v1/summits/{id}/event-types/{event_type_id}", + operationId: "updateEventTypeBySummit", + description: "Update an existing event type", + tags: ["Event Types"], + security: [ + [ + 'summit_event_types_oauth2' => [ + SummitScopes::WriteEventTypeData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + schema: new OA\Schema(type: "string"), + description: "Summit ID" + ), + new OA\Parameter( + name: "event_type_id", + in: "path", + required: true, + schema: new OA\Schema(type: "integer", format: "int64"), + description: "Event type ID" + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/EventTypeUpdateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: "Event type updated successfully", + content: new OA\JsonContent(ref: "#/components/schemas/EventType") + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Event type or summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function updateEventTypeBySummit($summit_id, $event_type_id) { return $this->processRequest(function () use ($summit_id, $event_type_id) { $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(); $payload = $this->getJsonPayload(EventTypeValidationRulesFactory::build(Request::all(), true)); @@ -345,12 +667,59 @@ public function updateEventTypeBySummit($summit_id, $event_type_id) * @param $event_type_id * @return mixed */ + #[OA\Delete( + path: "/api/v1/summits/{id}/event-types/{event_type_id}", + operationId: "deleteEventTypeBySummit", + description: "Delete an event type", + tags: ["Event Types"], + security: [ + [ + 'summit_event_types_oauth2' => [ + SummitScopes::WriteEventTypeData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + schema: new OA\Schema(type: "string"), + description: "Summit ID" + ), + new OA\Parameter( + name: "event_type_id", + in: "path", + required: true, + schema: new OA\Schema(type: "integer", format: "int64"), + description: "Event type ID" + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_NO_CONTENT, + description: "Event type deleted successfully" + ), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Event type or summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function deleteEventTypeBySummit($summit_id, $event_type_id) { return $this->processRequest(function () use ($summit_id, $event_type_id) { $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(); $this->event_type_service->deleteEventType($summit, intval($event_type_id)); @@ -362,12 +731,53 @@ public function deleteEventTypeBySummit($summit_id, $event_type_id) * @param $summit_id * @return mixed */ + #[OA\Post( + path: "/api/v1/summits/{id}/event-types/seed-defaults", + operationId: "seedDefaultEventTypesBySummit", + description: "Seed default event types for a summit", + tags: ["Event Types"], + security: [ + [ + 'summit_event_types_oauth2' => [ + SummitScopes::WriteEventTypeData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + schema: new OA\Schema(type: "string"), + description: "Summit ID" + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: "Default event types seeded successfully", + content: new OA\JsonContent(ref: "#/components/schemas/PaginatedEventTypesResponse") + ), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Summit not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function seedDefaultEventTypesBySummit($summit_id) { return $this->processRequest(function () use ($summit_id) { $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(); $event_types = $this->event_type_service->seedDefaultEventTypes($summit); @@ -390,12 +800,66 @@ public function seedDefaultEventTypesBySummit($summit_id) * @param $document_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Put( + path: "/api/v1/summits/{id}/event-types/{event_type_id}/summit-documents/{document_id}", + operationId: "addSummitDocument", + description: "Add a document to an event type", + tags: ["Event Types"], + security: [ + [ + 'summit_event_types_oauth2' => [ + SummitScopes::WriteEventTypeData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + schema: new OA\Schema(type: "string"), + description: "Summit ID" + ), + new OA\Parameter( + name: "event_type_id", + in: "path", + required: true, + schema: new OA\Schema(type: "integer", format: "int64"), + description: "Event type ID" + ), + new OA\Parameter( + name: "document_id", + in: "path", + required: true, + schema: new OA\Schema(type: "integer", format: "int64"), + description: "Document ID" + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: "Document added to event type successfully", + content: new OA\JsonContent(ref: "#/components/schemas/EventType") + ), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Event type, summit or document not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function addSummitDocument($summit_id, $event_type_id, $document_id) { return $this->processRequest(function () use ($summit_id, $event_type_id, $document_id) { $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(); $document = $this->event_type_service->addSummitDocumentToEventType @@ -419,12 +883,73 @@ public function addSummitDocument($summit_id, $event_type_id, $document_id) * @param $document_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Delete( + path: "/api/v1/summits/{id}/event-types/{event_type_id}/summit-documents/{document_id}", + operationId: "removeSummitDocument", + description: "Remove a document from an event type", + tags: ["Event Types"], + security: [ + [ + 'summit_event_types_oauth2' => [ + SummitScopes::WriteEventTypeData, + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: "access_token", + in: "query", + required: false, + description: "OAuth2 access token (alternative to Authorization: Bearer)", + schema: new OA\Schema(type: "string", example: "eyJhbGciOi..."), + ), + new OA\Parameter( + name: "id", + in: "path", + required: true, + schema: new OA\Schema(type: "string"), + description: "Summit ID" + ), + new OA\Parameter( + name: "event_type_id", + in: "path", + required: true, + schema: new OA\Schema(type: "integer", format: "int64"), + description: "Event type ID" + ), + new OA\Parameter( + name: "document_id", + in: "path", + required: true, + schema: new OA\Schema(type: "integer", format: "int64"), + description: "Document ID" + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: "Document removed from event type successfully", + content: new OA\JsonContent(ref: "#/components/schemas/EventType") + ), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Event type, summit or document not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function removeSummitDocument($summit_id, $event_type_id, $document_id) { return $this->processRequest(function () use ($summit_id, $event_type_id, $document_id) { $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(); $document = $this->event_type_service->removeSummitDocumentFromEventType ( @@ -440,4 +965,4 @@ public function removeSummitDocument($summit_id, $event_type_id, $document_id) )); }); } -} \ No newline at end of file +} diff --git a/app/Swagger/Models/EventTypeSchema.php b/app/Swagger/Models/EventTypeSchema.php new file mode 100644 index 000000000..0ad880ae2 --- /dev/null +++ b/app/Swagger/Models/EventTypeSchema.php @@ -0,0 +1,144 @@ + 'Read Summit Data', + SummitScopes::ReadAllSummitData => 'Read All Summit Data', + SummitScopes::WriteSummitData => 'Write Summit Data', + SummitScopes::WriteEventTypeData => 'Write Event Type Data', + ], + ), + ], + ) +] +class EventTypesSecurityScheme{} diff --git a/app/Swagger/SummitEventTypeSchemas.php b/app/Swagger/SummitEventTypeSchemas.php new file mode 100644 index 000000000..26d9441bb --- /dev/null +++ b/app/Swagger/SummitEventTypeSchemas.php @@ -0,0 +1,217 @@ +