use super::ids::Base62Id; use serde::{Deserialize, Serialize}; use time::OffsetDateTime; #[derive(Copy, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(from = "Base62Id")] #[serde(into = "Base62Id")] pub struct UserId(pub u64); pub const DELETED_USER: UserId = UserId(127155982985829); #[derive(Serialize, Deserialize, Clone)] pub struct User { pub id: UserId, pub github_id: Option, pub username: String, pub name: Option, pub email: Option, pub avatar_url: Option, pub bio: Option, #[serde(with = "crate::util::time_ser")] pub created: OffsetDateTime, pub role: Role, } use crate::database::models::user_item::User as DBUser; impl From for User { fn from(data: DBUser) -> Self { Self { id: data.id.into(), github_id: data.github_id.map(|i| i as u64), username: data.username, name: data.name, email: None, avatar_url: data.avatar_url, bio: data.bio, created: data.created, role: Role::from_string(&*data.role), } } } #[derive(Serialize, Deserialize, PartialEq, Eq, Clone)] #[serde(rename_all = "lowercase")] pub enum Role { Developer, Moderator, Admin, } impl std::fmt::Display for Role { fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result { fmt.write_str(self.as_str()) } } impl Role { pub fn from_string(string: &str) -> Role { match string { "admin" => Role::Admin, "moderator" => Role::Moderator, _ => Role::Developer, } } pub fn as_str(&self) -> &'static str { match self { Role::Developer => "developer", Role::Moderator => "moderator", Role::Admin => "admin", } } pub fn is_mod(&self) -> bool { match self { Role::Developer => false, Role::Moderator | Role::Admin => true, } } }