Skip to main content

max / goingson

710 B · 27 lines History Blame Raw
1 //! User domain types.
2
3 use chrono::{DateTime, Utc};
4 use serde::{Deserialize, Serialize};
5 use crate::id_types::UserId;
6
7 // ============ User ============
8
9 /// A registered user account.
10 #[derive(Debug, Clone, Serialize, Deserialize)]
11 #[serde(rename_all = "camelCase")]
12 pub struct User {
13 /// Unique identifier.
14 pub id: UserId,
15 /// Email address (used for login).
16 pub email: String,
17 /// Argon2 password hash (never serialized).
18 #[serde(skip_serializing)]
19 pub password_hash: String,
20 /// Display name.
21 pub display_name: String,
22 /// Account creation timestamp.
23 pub created_at: DateTime<Utc>,
24 /// Last successful login.
25 pub last_login_at: Option<DateTime<Utc>>,
26 }
27