use regex::Regex; use std::sync::LazyLock; use serde::{Serialize, Deserialize}; use validator::Validate; #[derive(Debug, Serialize, Deserialize)] pub struct Claims { pub sub: String, pub exp: usize, } static USERNAME_REG: LazyLock = LazyLock::new(|| { Regex::new(r"^[a-zA-Z0-9_]+$").unwrap() }); #[derive(Debug, Validate, Deserialize)] pub struct RegisterUser { #[validate( email(message = "Invalid email format"), length(min = 3, max = 50) )] pub email: String, #[validate( length(min = 3, max = 40, message = "Username must be 3-40 characters"), regex( path = *USERNAME_REG, message = "Username can only contain letters, numbers, and underscores" ) )] pub username: String, #[validate( length( min = 8, message = "Password must be at least 8 characters" ) )] pub password: String, } #[derive(Debug, Validate, Deserialize)] pub struct LoginUser { #[validate( email(message = "Invalid email format"), length(min = 3, max = 50) )] pub email: String, pub password: String, } #[derive(Debug, Serialize)] pub struct LoginResponse { pub token: String, pub user_id: String, }