diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php index d700c3a41..5838c9d51 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitsEventTypesApiController.php @@ -14,9 +14,11 @@ use App\Http\Utils\BooleanCellFormatter; use App\Http\Utils\EpochCellFormatter; +use App\Models\Foundation\Main\IGroup; use App\Models\Foundation\Summit\Events\SummitEventTypeConstants; use App\Models\Foundation\Summit\Repositories\ISummitEventTypeRepository; use App\ModelSerializers\SerializerUtils; +use App\Security\SummitScopes; use App\Services\Model\ISummitEventTypeService; use Exception; use Illuminate\Support\Facades\Log; @@ -33,6 +35,8 @@ use utils\OrderParser; use utils\PagingInfo; use utils\PagingResponse; +use OpenApi\Attributes as OA; +use Symfony\Component\HttpFoundation\Response; /** * Class OAuth2SummitsEventTypesApiController @@ -77,6 +81,75 @@ public function __construct * @param $summit_id * @return mixed */ + #[OA\Get( + path: "/api/v1/summits/{id}/event-types", + operationId: "getAllSummitEventTypesBySummit", + description: "Get all event types for a summit with pagination and filtering", + 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", 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) { @@ -146,6 +219,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(); @@ -272,6 +407,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,6 +516,51 @@ 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) { @@ -321,6 +585,58 @@ 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) { @@ -345,6 +661,52 @@ 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) { @@ -362,6 +724,46 @@ 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) { @@ -390,6 +792,59 @@ 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: "addSummitDocumentToEventType", + 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) { @@ -419,6 +874,59 @@ 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: "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) { @@ -440,4 +948,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 @@ +