Can leave a family

This commit is contained in:
Pierre HUBERT 2023-06-21 17:35:07 +02:00
parent ad54f83c2c
commit a94b26b23c
5 changed files with 60 additions and 8 deletions

View File

@ -79,6 +79,13 @@ pub async fn single_info(f: FamilyInPath) -> HttpResult {
.json(families_service::get_family_membership(f.family_id(), f.user_id()).await?)) .json(families_service::get_family_membership(f.family_id(), f.user_id()).await?))
} }
/// Attempt to leave a family
pub async fn leave(f: FamilyInPath) -> HttpResult {
families_service::remove_membership(f.family_id(), f.user_id()).await?;
Ok(HttpResponse::Accepted().finish())
}
/// Get the list of users who belongs to a family /// Get the list of users who belongs to a family
pub async fn users(f: FamilyInPath) -> HttpResult { pub async fn users(f: FamilyInPath) -> HttpResult {
Ok(HttpResponse::Ok().json(families_service::get_memberships_of_family(f.family_id()).await?)) Ok(HttpResponse::Ok().json(families_service::get_memberships_of_family(f.family_id()).await?))

View File

@ -97,6 +97,10 @@ async fn main() -> std::io::Result<()> {
"/family/{id}/info", "/family/{id}/info",
web::get().to(families_controller::single_info), web::get().to(families_controller::single_info),
) )
.route(
"/family/{id}/leave",
web::post().to(families_controller::leave),
)
.route( .route(
"/family/{id}/users", "/family/{id}/users",
web::get().to(families_controller::users), web::get().to(families_controller::users),

View File

@ -111,8 +111,8 @@ pub struct FamilyMembership {
family_id: i32, family_id: i32,
name: String, name: String,
time_create: i64, time_create: i64,
is_admin: bool, pub is_admin: bool,
invitation_code: String, invitation_code: String,
count_members: i64, pub count_members: i64,
count_admins: i64, pub count_admins: i64,
} }

View File

@ -132,9 +132,49 @@ pub async fn get_family_membership(
}) })
} }
/// Delete a family
pub async fn delete_family(family_id: FamilyID) -> anyhow::Result<()> {
// TODO : delete members and couples
// Remove all memberships
db_connection::execute(|conn| {
diesel::delete(
memberships::dsl::memberships.filter(memberships::dsl::family_id.eq(family_id.0)),
)
.execute(conn)
})?;
// Remove the family itself
db_connection::execute(|conn| {
diesel::delete(families::dsl::families.filter(families::dsl::id.eq(family_id.0)))
.execute(conn)
})?;
Ok(())
}
/// Remove a membership to a family /// Remove a membership to a family
pub async fn remove_membership(_family_id: FamilyID, _user_id: UserID) { pub async fn remove_membership(family_id: FamilyID, user_id: UserID) -> anyhow::Result<()> {
todo!() let family = get_family_membership(family_id, user_id).await?;
if family.is_admin && family.count_admins == 1 {
// We need to delete the whole family
delete_family(family_id).await
} else {
// Remove the single membership
db_connection::execute(|conn| {
diesel::delete(
memberships::dsl::memberships.filter(
memberships::dsl::user_id
.eq(user_id.0)
.and(memberships::dsl::family_id.eq(family_id.0)),
),
)
.execute(conn)
})?;
Ok(())
}
} }
/// Remove all memberships of user /// Remove all memberships of user

View File

@ -177,9 +177,10 @@ pub async fn delete_account(user: &User) -> anyhow::Result<()> {
login_token_service::disconnect_user_from_all_devices(user.id()).await?; login_token_service::disconnect_user_from_all_devices(user.id()).await?;
db_connection::execute(|conn| { db_connection::execute(|conn| {
diesel::delete(users::dsl::users.filter(users::dsl::id.eq(user.id().0))).execute(conn)?; diesel::delete(users::dsl::users.filter(users::dsl::id.eq(user.id().0))).execute(conn)
})?;
Ok(()) Ok(())
})
} }
/// Mark account as validated /// Mark account as validated