use super::{UsersActiveInactiveSchema, UsersSchema, UsersSetNewPasswordSchema}; use crate::{ get_id, make_thing, query_list_with_meta, AppState, MetaRequestDto, ResourceEnum, ResponseListSuccessDto, }; use anyhow::{bail, Result}; pub struct UsersRepository<'a> { state: &'a AppState, } impl<'a> UsersRepository<'a> { pub fn new(state: &'a AppState) -> Self { Self { state } } pub async fn query_user_list( &self, meta: MetaRequestDto, ) -> Result>> { let db = &self.state.surrealdb_ws; let table = ResourceEnum::Users.to_string(); let mut conditions = vec!["is_deleted = false".to_string()]; if meta.search.is_some() { conditions.push("string::contains(name, $search)".into()); } if meta.filter_by.is_some() && meta.filter.is_some() { let filter_by = meta.filter_by.as_ref().unwrap(); conditions.push(format!("{} = $filter", filter_by)); } query_list_with_meta::(db, &table, &meta, conditions).await } pub async fn query_user_by_email(&self, email: String) -> Result { let db = &self.state.surrealdb_ws; let sql = format!( "SELECT * FROM {} WHERE email = $email AND is_deleted = false", ResourceEnum::Users.to_string() ); let mut response: Vec = db .query(sql) .bind(("email", email.clone())) .await? .take(0)?; match response.pop() { Some(user) => Ok(user), None => bail!("User not found"), } } pub async fn query_user_by_id(&self, id: String) -> Result { let db = &self.state.surrealdb_ws; let result: Option = db .select((ResourceEnum::Users.to_string(), id.clone())) .await?; match result { Some(response) if !response.is_deleted => Ok(response), _ => bail!("User not found"), } } pub async fn query_create_user(&self, data: UsersSchema) -> Result { let db = &self.state.surrealdb_ws; let record: Option = db .create(ResourceEnum::Users.to_string()) .content(data) .await?; match record { Some(_) => Ok("Success create user".into()), None => bail!("Failed to create user"), } } pub async fn query_update_user(&self, data: UsersSchema) -> Result { let db = &self.state.surrealdb_ws; let record_key = get_id(&data.id)?; let existing = self.query_user_by_id(data.id.id.to_raw()).await?; if existing.is_deleted { bail!("User already deleted"); } let merged = UsersSchema { password: existing.password, created_at: existing.created_at, ..data.clone() }; let record: Option = db.update(record_key).merge(merged).await?; match record { Some(_) => Ok("Success update user".into()), None => bail!("Failed to update user"), } } pub async fn query_active_inactive_user( &self, email: String, data: UsersActiveInactiveSchema, ) -> Result { let db = &self.state.surrealdb_ws; let user = self.query_user_by_email(email.clone()).await?; if user.is_deleted { bail!("User not found"); } let record_key = get_id(&user.id)?; let record: Option = db .update(record_key) .merge(UsersActiveInactiveSchema { is_active: data.is_active, }) .await?; match record { Some(_) => Ok("Success update user".into()), None => bail!("Failed to update user"), } } pub async fn query_active_inactive_user_by_id( &self, id: String, data: UsersActiveInactiveSchema, ) -> Result { let db = &self.state.surrealdb_ws; let record: Option = db .update((ResourceEnum::Users.to_string(), id)) .merge(UsersActiveInactiveSchema { is_active: data.is_active, }) .await?; match record { Some(_) => Ok("Success update user".into()), None => bail!("Failed to update user"), } } pub async fn query_update_password_user( &self, email: String, data: UsersSetNewPasswordSchema, ) -> Result { let db = &self.state.surrealdb_ws; let user = self.query_user_by_email(email).await?; let record_key = get_id(&user.id)?; let record: Option = db .update(record_key) .merge(UsersSetNewPasswordSchema { password: data.password.clone(), }) .await?; match record { Some(_) => Ok("Success update password user".into()), None => bail!("Failed to update password user"), } } pub async fn query_delete_user(&self, id: String) -> Result { let db = &self.state.surrealdb_ws; let user_id = make_thing(&ResourceEnum::Users.to_string(), &id); let user = self.query_user_by_id(user_id.id.to_raw()).await?; if user.is_deleted { bail!("User already deleted"); } let record_key = get_id(&user.id)?; let record: Option = db .update(record_key) .merge(serde_json::json!({ "is_deleted": true })) .await?; match record { Some(_) => Ok("Success delete user".into()), None => bail!("Failed to delete user"), } } }