From 271b00c2c4b4762a867890a9cea2636ab85c5196 Mon Sep 17 00:00:00 2001 From: Maulana Sodiqin Date: Sat, 15 Mar 2025 02:23:27 +0700 Subject: [PATCH] feat: create gacha item --- src/apps/v1/auth/auth_middleware.rs | 4 ++-- src/apps/v1/gacha/gacha_controller.rs | 19 ++++++++++++++++- src/apps/v1/gacha/gacha_dto.rs | 12 +++++++++++ src/apps/v1/gacha/gacha_repository.rs | 30 +++++++++++++++++++++++++-- src/apps/v1/gacha/gacha_schema.rs | 6 ++++++ src/apps/v1/gacha/gacha_service.rs | 14 ++++++++++++- src/apps/v1/gacha/mod.rs | 7 ++++++- src/libs/surrealdb/resource.rs | 2 ++ 8 files changed, 87 insertions(+), 7 deletions(-) diff --git a/src/apps/v1/auth/auth_middleware.rs b/src/apps/v1/auth/auth_middleware.rs index c690fe9..41bb24a 100644 --- a/src/apps/v1/auth/auth_middleware.rs +++ b/src/apps/v1/auth/auth_middleware.rs @@ -29,10 +29,10 @@ pub async fn auth_middleware( let token_data = match decode_access_token(token) { Ok(data) => data, - Err(err) => { + Err(_) => { return Ok(common_response( StatusCode::UNAUTHORIZED, - &format!("Invalid or expired token: {}", &err.to_string()), + &format!("Invalid or expired token"), )); } }; diff --git a/src/apps/v1/gacha/gacha_controller.rs b/src/apps/v1/gacha/gacha_controller.rs index a7a8d70..5bd1058 100644 --- a/src/apps/v1/gacha/gacha_controller.rs +++ b/src/apps/v1/gacha/gacha_controller.rs @@ -1,5 +1,5 @@ use super::{GachaRequestDto, GachaService}; -use crate::{AppState, MessageResponseDto}; +use crate::{v1::GachaCreateItemRequestDto, AppState, MessageResponseDto}; use axum::{response::IntoResponse, Extension, Json}; #[utoipa::path( @@ -18,3 +18,20 @@ pub async fn post_create_gacha( ) -> impl IntoResponse { GachaService::mutation_create_gacha(payload, &state).await } + +#[utoipa::path( + post, + path = "/v1/gacha/create/item", + request_body = GachaCreateItemRequestDto, + responses( + (status = 200, description = "Create gacha item successful", body = MessageResponseDto), + (status = 401, description = "Create gacha item failed", body = MessageResponseDto) + ), + tag = "Gacha" +)] +pub async fn post_create_gacha_item( + Extension(state): Extension, + Json(payload): Json, +) -> impl IntoResponse { + GachaService::mutation_create_gacha_item(payload, &state).await +} diff --git a/src/apps/v1/gacha/gacha_dto.rs b/src/apps/v1/gacha/gacha_dto.rs index a1ddad2..d758e0a 100644 --- a/src/apps/v1/gacha/gacha_dto.rs +++ b/src/apps/v1/gacha/gacha_dto.rs @@ -10,6 +10,18 @@ pub struct GachaRequestDto { pub transaction_number: String, } +#[derive(Clone, Debug, Serialize, Deserialize, ToSchema)] +pub struct GachaCreateItemRequestDto { + pub item_name: String, + pub item_image: String, +} + +#[derive(Clone, Debug, Serialize, Deserialize, ToSchema)] +pub struct GachaItemResponseDto { + pub item_name: String, + pub item_image: String, +} + #[derive(Clone, Debug, Serialize, Deserialize, ToSchema)] pub struct GachaResponseDto { pub transaction_number: String, diff --git a/src/apps/v1/gacha/gacha_repository.rs b/src/apps/v1/gacha/gacha_repository.rs index 18c83a9..7eed740 100644 --- a/src/apps/v1/gacha/gacha_repository.rs +++ b/src/apps/v1/gacha/gacha_repository.rs @@ -1,4 +1,7 @@ -use super::{GachaRequestDto, GachaResponseDto, GachaSchema}; +use super::{ + GachaCreateItemRequestDto, GachaItemSchema, GachaRequestDto, GachaResponseDto, + GachaSchema, +}; use crate::{v1::AuthRepository, AppState, ResourceEnum}; use anyhow::{bail, Result}; use surrealdb::sql::{Id, Thing}; @@ -40,7 +43,10 @@ impl<'a> GachaRepository<'a> { Thing::from((ResourceEnum::Users.to_string(), Id::String(user.email))); let record: Option = db - .create((ResourceEnum::Gacha.to_string(), &data.transaction_number)) + .create(( + ResourceEnum::GachaClaims.to_string(), + &data.transaction_number, + )) .content(GachaSchema { transaction_number: data.transaction_number.clone(), user: user_thing, @@ -52,4 +58,24 @@ impl<'a> GachaRepository<'a> { None => bail!("Failed to create gacha record"), } } + + pub async fn query_create_gacha_item( + &self, + data: GachaCreateItemRequestDto, + ) -> Result { + let db = &self.state.surrealdb; + + let record: Option = db + .create((ResourceEnum::Gacha.to_string(), data.item_name.clone())) + .content(GachaItemSchema { + item_name: data.item_name.clone(), + item_image: data.item_image.clone(), + }) + .await?; + + match record { + Some(_) => Ok("Gacha item successfully created".to_string()), + None => bail!("Failed to create gacha item record"), + } + } } diff --git a/src/apps/v1/gacha/gacha_schema.rs b/src/apps/v1/gacha/gacha_schema.rs index 57c22d0..e8b24f5 100644 --- a/src/apps/v1/gacha/gacha_schema.rs +++ b/src/apps/v1/gacha/gacha_schema.rs @@ -6,3 +6,9 @@ pub struct GachaSchema { pub transaction_number: String, pub user: Thing, } + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct GachaItemSchema { + pub item_image: String, + pub item_name: String, +} diff --git a/src/apps/v1/gacha/gacha_service.rs b/src/apps/v1/gacha/gacha_service.rs index a28fa78..094fdfc 100644 --- a/src/apps/v1/gacha/gacha_service.rs +++ b/src/apps/v1/gacha/gacha_service.rs @@ -1,4 +1,4 @@ -use super::{GachaRepository, GachaRequestDto}; +use super::{GachaCreateItemRequestDto, GachaRepository, GachaRequestDto}; use crate::{common_response, AppState}; use axum::{http::StatusCode, response::Response}; @@ -16,4 +16,16 @@ impl GachaService { Err(err) => common_response(StatusCode::BAD_REQUEST, &err.to_string()), } } + + pub async fn mutation_create_gacha_item( + payload: GachaCreateItemRequestDto, + state: &AppState, + ) -> Response { + let repository = GachaRepository::new(state); + + match repository.query_create_gacha_item(payload).await { + Ok(msg) => common_response(StatusCode::CREATED, &msg), + Err(err) => common_response(StatusCode::BAD_REQUEST, &err.to_string()), + } + } } diff --git a/src/apps/v1/gacha/mod.rs b/src/apps/v1/gacha/mod.rs index ca39215..dca347f 100644 --- a/src/apps/v1/gacha/mod.rs +++ b/src/apps/v1/gacha/mod.rs @@ -12,5 +12,10 @@ pub use gacha_schema::*; pub use gacha_service::*; pub fn gacha_router() -> Router { - Router::new().route("/create", post(gacha_controller::post_create_gacha)) + Router::new() + .route("/create", post(gacha_controller::post_create_gacha)) + .route( + "/create/item", + post(gacha_controller::post_create_gacha_item), + ) } diff --git a/src/libs/surrealdb/resource.rs b/src/libs/surrealdb/resource.rs index 9a16d1a..3067369 100644 --- a/src/libs/surrealdb/resource.rs +++ b/src/libs/surrealdb/resource.rs @@ -3,6 +3,7 @@ use std::fmt; #[derive(Debug, Clone, PartialEq, Eq)] pub enum ResourceEnum { Gacha, + GachaClaims, Users, Roles, Permissions, @@ -15,6 +16,7 @@ impl fmt::Display for ResourceEnum { ResourceEnum::Roles => "app_roles", ResourceEnum::Permissions => "app_permissions", ResourceEnum::Gacha => "app_gacha", + ResourceEnum::GachaClaims => "app_gacha_claims", }; write!(f, "{}", str) }