/*! Users are entities that interact with the system. * * They are notably separate from any API tokens. */ use std::fmt::{Debug, Display}; use argon2::{password_hash::{rand_core::OsRng, SaltString}, Argon2}; use chrono::{DateTime, Utc}; use crate::errors::{EmptyResult, Result}; /** A single User with access to the system * * The specific User object contains profile and biographic data that's either useful to ACM or * required by external partners (see: MLH). */ #[derive(Clone)] struct User { /// Unique user identifier, a V4 UUID id: uuid::Uuid, /// The user's name. Not guaranteed to be anything in particular, should be /// treated as a standard UTF8 string name: String, /// User's (hashed) password password_hash: String, /// User's email. This must be validated for correct format! email: String, /// Whether the user is allowed to log in. is_active: bool, /// UTC date/time of creation created: chrono::DateTime, /// UTC date/time of last login last_login: Option>, } impl Display for User { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{} ({})", self.email, self.id) } } impl Debug for User { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{} ({})", self.email, self.id) } } impl User { pub fn new_user() -> Self { Self { id: uuid::Uuid::new_v4(), name: String::new(), password_hash: String::new(), email: String::new(), is_active: true, created: Utc::now(), last_login: None } } pub fn set_password(new_pw: String) -> EmptyResult { let argon = Argon2::default(); let salt = SaltString::generate(&mut OsRng); let mut out: Vec = Vec::new(); Ok(()) } }