use crate::{ AppState, GachaItemDto, GachaItemRequestDto, GachaItemUpdateRequestDto, GachaItemService, MessageResponseDto, MetaRequestDto, ResponseListSuccessDto, ResponseSuccessDto, }; use axum::{ Extension, Json, extract::{Path, Query}, http::HeaderMap, response::IntoResponse, }; use imphnen_iam::{PermissionsEnum, permissions_guard}; #[utoipa::path( get, path = "/v1/gacha/items", security( ("Bearer" = []) ), 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 = "Get gacha item list", body = ResponseListSuccessDto>) ), tag = "Gacha" )] pub async fn get_gacha_item_list( headers: HeaderMap, Extension(state): Extension, Query(meta): Query, ) -> impl IntoResponse { match permissions_guard( headers, Extension(state), vec![PermissionsEnum::ReadListGachaItems], ) .await { Ok((_user, state)) => GachaItemService::get_gacha_item_list(&state, meta).await, Err(response) => response, } } #[utoipa::path( get, path = "/v1/gacha/items/detail/{id}", security( ("Bearer" = []) ), params(("id" = String, Path, description = "Gacha Item ID")), responses( (status = 200, description = "Get gacha item by ID", body = ResponseSuccessDto) ), tag = "Gacha" )] pub async fn get_gacha_item_by_id( headers: HeaderMap, Extension(state): Extension, Path(id): Path, ) -> impl IntoResponse { match permissions_guard( headers, Extension(state), vec![PermissionsEnum::ReadDetailGachaItems], ) .await { Ok((_user, state)) => GachaItemService::get_gacha_item_by_id(&state, id).await, Err(response) => response, } } #[utoipa::path( post, path = "/v1/gacha/items/create", security( ("Bearer" = []) ), request_body = GachaItemRequestDto, responses( (status = 201, description = "Create gacha item", body = MessageResponseDto) ), tag = "Gacha" )] pub async fn post_create_gacha_item( headers: HeaderMap, Extension(state): Extension, Json(payload): Json, ) -> impl IntoResponse { match permissions_guard( headers, Extension(state), vec![PermissionsEnum::CreateGachaItems], ) .await { Ok((_user, state)) => GachaItemService::create_gacha_item(&state, payload).await, Err(response) => response, } } #[utoipa::path( put, path = "/v1/gacha/items/update/{id}", security( ("Bearer" = []) ), request_body = GachaItemUpdateRequestDto, responses( (status = 200, description = "Update gacha item", body = MessageResponseDto) ), tag = "Gacha" )] pub async fn put_update_gacha_item( headers: HeaderMap, Extension(state): Extension, Path(id): Path, Json(payload): Json, ) -> impl IntoResponse { match permissions_guard( headers, Extension(state), vec![PermissionsEnum::UpdateGachaItems], ) .await { Ok((_user, state)) => GachaItemService::update_gacha_item(&state, payload, id).await, Err(response) => response, } } #[utoipa::path( delete, path = "/v1/gacha/items/delete/{id}", security( ("Bearer" = []) ), responses( (status = 200, description = "Delete gacha item", body = MessageResponseDto) ), tag = "Gacha" )] pub async fn delete_gacha_item( headers: HeaderMap, Extension(state): Extension, Path(id): Path, ) -> impl IntoResponse { match permissions_guard( headers, Extension(state), vec![PermissionsEnum::DeleteGachaItems], ) .await { Ok((_user, state)) => GachaItemService::delete_gacha_item(&state, id).await, Err(response) => response, } }