use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use sqlx::FromRow;
use std::fmt;
#[derive(Debug, Clone, Serialize, Deserialize, FromRow, PartialEq)]
pub struct User {
#[serde(skip_serializing)]
pub sequence_number: Option<i64>,
pub id: String,
pub account: String,
pub label: String,
pub is_admin: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[allow(dead_code)]
#[derive(Debug)]
pub enum UserSearchField {
Id(String),
SequenceNumber(i64),
}
impl fmt::Display for UserSearchField {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
UserSearchField::Id(id) => write!(f, "Id({id})"),
UserSearchField::SequenceNumber(seq) => write!(f, "SequenceNumber({seq})"),
}
}
}
impl User {
pub fn new(id: String, account: String, label: String) -> Self {
let now = Utc::now();
Self {
sequence_number: None,
id,
account,
label,
is_admin: false,
created_at: now,
updated_at: now,
}
}
pub fn has_admin_privileges(&self) -> bool {
self.is_admin || self.sequence_number == Some(1)
}
}
#[cfg(test)]
mod tests;