use crate::schema::{families, memberships, users}; use diesel::prelude::*; /// User ID holder #[derive(Debug, Clone, Copy, serde::Serialize, serde::Deserialize, PartialEq, Eq)] pub struct UserID(pub i32); #[derive(Queryable, Debug, serde::Serialize)] pub struct User { id: i32, pub name: String, pub email: String, #[serde(skip_serializing)] pub password: Option, pub time_create: i64, #[serde(skip_serializing)] pub reset_password_token: Option, #[serde(skip_serializing)] pub time_gen_reset_token: i64, #[serde(skip_serializing)] pub delete_account_token: Option, #[serde(skip_serializing)] pub time_gen_delete_account_token: i64, pub time_activate: i64, pub active: bool, pub admin: bool, } impl User { pub fn id(&self) -> UserID { UserID(self.id) } pub fn check_password(&self, password: &str) -> bool { self.password .as_deref() .map(|hash| { bcrypt::verify(password, hash).unwrap_or_else(|e| { log::error!("Failed to validate password! {}", e); false }) }) .unwrap_or(false) } } #[derive(Insertable)] #[diesel(table_name = users)] pub struct NewUser<'a> { pub name: &'a str, pub email: &'a str, pub time_create: i64, } /// Family ID holder #[derive(Debug, Clone, Copy, serde::Serialize, serde::Deserialize)] pub struct FamilyID(pub i32); #[derive(Queryable, Debug, serde::Serialize)] pub struct Family { id: i32, pub time_create: i64, pub name: String, pub invitation_code: String, } impl Family { pub fn id(&self) -> FamilyID { FamilyID(self.id) } } #[derive(Insertable)] #[diesel(table_name = families)] pub struct NewFamily<'a> { pub name: &'a str, pub invitation_code: String, pub time_create: i64, } #[derive(Queryable, Debug, serde::Serialize)] pub struct Membership { user_id: i32, family_id: i32, pub time_create: i64, pub is_admin: bool, } impl Membership { pub fn user_id(&self) -> UserID { UserID(self.user_id) } pub fn family_id(&self) -> FamilyID { FamilyID(self.family_id) } } #[derive(Insertable)] #[diesel(table_name = memberships)] pub struct NewMembership { pub user_id: i32, pub family_id: i32, pub time_create: i64, pub is_admin: bool, } #[derive(Queryable, Debug, serde::Serialize)] pub struct FamilyMembership { user_id: i32, family_id: i32, name: String, time_create: i64, pub is_admin: bool, invitation_code: String, pub count_members: i64, pub count_admins: i64, }