personal account
This commit is contained in:
@@ -4,6 +4,7 @@ use argon2::{
|
||||
Argon2,
|
||||
};
|
||||
use crate::models::family::{self, Entity as Family, Model as FamilyModel};
|
||||
use crate::models::user::{self, Entity as User, Model as UserModel};
|
||||
|
||||
pub struct FamilyService;
|
||||
|
||||
@@ -72,4 +73,11 @@ impl FamilyService {
|
||||
let family: family::ActiveModel = family.into();
|
||||
family.delete(db).await
|
||||
}
|
||||
|
||||
pub async fn get_members(db: &DatabaseConnection, family_id: i32) -> Result<Vec<UserModel>, DbErr> {
|
||||
User::find()
|
||||
.filter(user::Column::FamilyId.eq(family_id))
|
||||
.all(db)
|
||||
.await
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ pub mod expense_service;
|
||||
pub mod shopping_item_service;
|
||||
pub mod oauth_service;
|
||||
pub mod invite_link_service;
|
||||
pub mod user_service;
|
||||
|
||||
pub use family_service::FamilyService;
|
||||
pub use category_service::CategoryService;
|
||||
@@ -11,3 +12,4 @@ pub use expense_service::ExpenseService;
|
||||
pub use shopping_item_service::ShoppingItemService;
|
||||
pub use oauth_service::OAuthService;
|
||||
pub use invite_link_service::InviteLinkService;
|
||||
pub use user_service::UserService;
|
||||
|
||||
44
backend/src/services/user_service.rs
Normal file
44
backend/src/services/user_service.rs
Normal file
@@ -0,0 +1,44 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user