use super::{ events_dto::{ EventsCreateRequestDto, EventsDetailItemDto, EventsListItemDto, EventsUpdateRequestDto, }, events_service::EventsService, }; use axum::extract::{Path, Query}; use axum::response::IntoResponse; use axum::{Extension, http::HeaderMap}; use imphnen_libs::{ AppState, MessageResponseDto, MetaRequestDto, ResponseListSuccessDto, ResponseSuccessDto, ValidatedJson, }; use imphnen_iam::{PermissionsEnum, require_permissions}; #[utoipa::path( get, path = "/v1/cms/landing/events", params( ("page" = Option, Query, description = "Page number"), ("per_page" = Option, Query, description = "Items per page"), ("search" = Option, Query, description = "Search keyword"), ("sort_by" = Option, Query, description = "Sort by field"), ("order" = Option, Query, description = "Order ASC or DESC"), ("filter" = Option, Query, description = "Filter value"), ("filter_by" = Option, Query, description = "Field to filter by"), ), responses( (status = 200, description = "[PUBLIC] Get event list", body = ResponseListSuccessDto>) ), tag = "Events" )] pub async fn get_event_list( Extension(state): Extension, Query(meta): Query, ) -> impl IntoResponse { EventsService::get_event_list(&state, meta).await } #[utoipa::path( get, path = "/v1/cms/landing/events/detail/{id}", params( ("id" = String, Path, description = "Event ID") ), responses( (status = 200, description = "[PUBLIC] Get event by ID", body = ResponseSuccessDto) ), tag = "Events" )] pub async fn get_event_by_id( Extension(state): Extension, Path(id): Path, ) -> impl IntoResponse { EventsService::get_event_by_id(&state, id).await } #[utoipa::path( post, security( ("Bearer" = []) ), path = "/v1/cms/landing/events/create", request_body = EventsCreateRequestDto, responses( (status = 201, description = "[ADMIN] Create new event", body = MessageResponseDto) ), tag = "Events" )] pub async fn post_create_event( headers: HeaderMap, Extension(state): Extension, ValidatedJson(payload): ValidatedJson, ) -> impl IntoResponse { require_permissions!(headers, state, [PermissionsEnum::Administrator], { EventsService::create_event(&state, payload).await }) } #[utoipa::path( patch, security( ("Bearer" = []) ), path = "/v1/cms/landing/events/update/{id}", params( ("id" = String, Path, description = "Event ID") ), request_body = EventsUpdateRequestDto, responses( (status = 200, description = "[ADMIN] Update event", body = MessageResponseDto) ), tag = "Events" )] pub async fn patch_update_event( headers: HeaderMap, Extension(state): Extension, Path(id): Path, ValidatedJson(payload): ValidatedJson, ) -> impl IntoResponse { require_permissions!(headers, state, [PermissionsEnum::Administrator], { EventsService::update_event(&state, id, payload).await }) } #[utoipa::path( delete, security( ("Bearer" = []) ), path = "/v1/cms/landing/events/delete/{id}", params( ("id" = String, Path, description = "Event ID") ), responses( (status = 200, description = "[ADMIN] Soft delete event", body = MessageResponseDto) ), tag = "Events" )] pub async fn delete_event( headers: HeaderMap, Extension(state): Extension, Path(id): Path, ) -> impl IntoResponse { require_permissions!(headers, state, [PermissionsEnum::Administrator], { EventsService::delete_event(&state, id).await }) }