45 lines
1.3 KiB
Rust
45 lines
1.3 KiB
Rust
use sea_orm::*;
|
|
use crate::models::user::{self, Entity as User, Model as UserModel};
|
|
use crate::models::family::{Entity as Family};
|
|
|
|
pub struct UserService;
|
|
|
|
#[derive(Debug)]
|
|
pub struct LeaveFamilyResult {
|
|
pub family_deleted: bool,
|
|
}
|
|
|
|
impl UserService {
|
|
pub async fn leave_family(db: &DatabaseConnection, user_id: i32) -> Result<LeaveFamilyResult, DbErr> {
|
|
let user = User::find_by_id(user_id)
|
|
.one(db)
|
|
.await?
|
|
.ok_or(DbErr::RecordNotFound("User not found".to_string()))?;
|
|
|
|
let family_id = user.family_id
|
|
.ok_or(DbErr::Custom("User is not in a family".to_string()))?;
|
|
|
|
let mut user_active: user::ActiveModel = user.into();
|
|
user_active.family_id = Set(None);
|
|
user_active.update(db).await?;
|
|
|
|
let remaining_members = User::find()
|
|
.filter(user::Column::FamilyId.eq(family_id))
|
|
.count(db)
|
|
.await?;
|
|
|
|
let family_deleted = if remaining_members == 0 {
|
|
Family::delete_by_id(family_id).exec(db).await?;
|
|
true
|
|
} else {
|
|
false
|
|
};
|
|
|
|
Ok(LeaveFamilyResult { family_deleted })
|
|
}
|
|
|
|
pub async fn find_by_id(db: &DatabaseConnection, id: i32) -> Result<Option<UserModel>, DbErr> {
|
|
User::find_by_id(id).one(db).await
|
|
}
|
|
}
|