Files
imphnen-backend-service/imphnen-gacha/src/v1/gacha_items/gacha_items_repository.rs
T

110 lines
2.9 KiB
Rust
Raw Normal View History

2025-04-07 00:50:57 +07:00
use super::GachaItemSchema;
2025-04-01 20:00:00 +07:00
use crate::{
2025-05-20 10:45:01 +07:00
AppState, GachaItemDto, MetaRequestDto, ResourceEnum, ResponseListSuccessDto,
2025-05-20 16:57:45 +07:00
get_id, make_thing,
2025-04-01 20:00:00 +07:00
};
2025-04-06 22:13:46 +07:00
use anyhow::{Result, bail};
2025-05-20 16:57:45 +07:00
use imphnen_iam::QueryListBuilder;
2025-04-01 20:00:00 +07:00
2025-04-07 00:50:57 +07:00
pub struct GachaItemRepository<'a> {
2025-04-01 20:00:00 +07:00
state: &'a AppState,
}
2025-04-07 00:50:57 +07:00
impl<'a> GachaItemRepository<'a> {
2025-04-01 20:00:00 +07:00
pub fn new(state: &'a AppState) -> Self {
Self { state }
}
pub async fn query_gacha_item_list(
&self,
meta: MetaRequestDto,
2025-05-20 10:45:01 +07:00
) -> Result<ResponseListSuccessDto<Vec<GachaItemDto>>> {
let raw_result: ResponseListSuccessDto<Vec<GachaItemSchema>> =
2025-05-20 16:57:45 +07:00
QueryListBuilder::new(
2025-05-20 10:45:01 +07:00
&self.state.surrealdb_ws,
&ResourceEnum::GachaItems.to_string(),
&meta,
)
2025-05-20 16:57:45 +07:00
.with_condition("is_deleted = false")
.search_field("name")
.select_fields(vec!["*"])
.build()
2025-05-20 10:45:01 +07:00
.await?;
2025-05-20 16:57:45 +07:00
let data = raw_result
2025-05-20 10:45:01 +07:00
.data
.into_iter()
2025-05-20 16:57:45 +07:00
.map(GachaItemDto::from)
2025-05-20 10:45:01 +07:00
.collect();
Ok(ResponseListSuccessDto {
2025-05-20 16:57:45 +07:00
data,
2025-05-20 10:45:01 +07:00
meta: raw_result.meta,
})
2025-04-01 20:00:00 +07:00
}
pub async fn query_gacha_item_by_id(&self, id: String) -> Result<GachaItemSchema> {
let db = &self.state.surrealdb_ws;
let result: Option<GachaItemSchema> = db
.select((ResourceEnum::GachaItems.to_string(), id.clone()))
.await?;
match result {
Some(item) if !item.is_deleted => Ok(item),
_ => bail!("Gacha Item not found"),
}
}
pub async fn query_create_gacha_item(
&self,
data: GachaItemSchema,
) -> Result<String> {
let db = &self.state.surrealdb_ws;
let record: Option<GachaItemSchema> = db
.create(ResourceEnum::GachaItems.to_string())
.content(data)
.await?;
match record {
Some(_) => Ok("Success create Gacha Item".into()),
None => bail!("Failed to create Gacha Item"),
}
}
pub async fn query_update_gacha_item(
&self,
data: GachaItemSchema,
) -> Result<String> {
let db = &self.state.surrealdb_ws;
let record_key = get_id(&data.id)?;
let existing = self.query_gacha_item_by_id(data.id.id.to_raw()).await?;
if existing.is_deleted {
bail!("Gacha Item already deleted");
}
let merged = GachaItemSchema {
created_at: existing.created_at,
..data.clone()
};
let record: Option<GachaItemSchema> =
db.update(record_key).merge(merged).await?;
match record {
Some(_) => Ok("Success update Gacha Item".into()),
None => bail!("Failed to update Gacha Item"),
}
}
pub async fn query_delete_gacha_item(&self, id: String) -> Result<String> {
let db = &self.state.surrealdb_ws;
let item_id = make_thing(&ResourceEnum::GachaItems.to_string(), &id);
let item = self.query_gacha_item_by_id(item_id.id.to_raw()).await?;
if item.is_deleted {
bail!("Gacha Item already deleted");
}
let record_key = get_id(&item.id)?;
let record: Option<GachaItemSchema> = db
.update(record_key)
.merge(serde_json::json!({ "is_deleted": true }))
.await?;
match record {
Some(_) => Ok("Success delete Gacha Item".into()),
None => bail!("Failed to delete Gacha Item"),
}
}
}