use crate::connections::db_connection; use crate::constants::FAMILY_INVITATION_CODE_LEN; use crate::models::{Family, FamilyID, Membership, NewFamily, NewMembership, UserID}; use crate::schema::{families, memberships}; use crate::utils::string_utils::rand_str; use crate::utils::time_utils::time; use diesel::RunQueryDsl; /// Create a new family, with an initial administrator pub async fn create(name: &str, user_id: UserID) -> anyhow::Result { let family = db_connection::execute(|conn| { let res: Family = diesel::insert_into(families::table) .values(&NewFamily { name: name.trim(), invitation_code: rand_str(FAMILY_INVITATION_CODE_LEN), time_create: time() as i64, }) .get_result(conn)?; Ok(res) })?; add_member(family.id(), user_id, true).await?; Ok(family) } /// Add a member to a family pub async fn add_member( family_id: FamilyID, user_id: UserID, admin: bool, ) -> anyhow::Result { db_connection::execute(|conn| { let res = diesel::insert_into(memberships::table) .values(&NewMembership { user_id: user_id.0, family_id: family_id.0, time_create: time() as i64, is_admin: admin, }) .get_result(conn)?; Ok(res) }) }