use rand::{distributions::Alphanumeric, Rng}; use serde::Serialize; use crate::database; use crate::types::response::{Result, ResponseCode}; #[derive(Serialize)] pub struct Session { pub user_id: u64, pub token: String } impl Session { pub fn from_token(token: &str) -> Result { let Ok(Some(session)) = database::sessions::get_session(token) else { return Err(ResponseCode::BadRequest.text("Invalid auth token")); }; Ok(session) } pub fn new(user_id: u64) -> Result { let token: String = rand::thread_rng().sample_iter(&Alphanumeric).take(32).map(char::from).collect(); match database::sessions::set_session(user_id, &token) { Err(_) => return Err(ResponseCode::BadRequest.text("Failed to create session")), Ok(_) => return Ok(Session {user_id, token}) }; } pub fn delete(user_id: u64) -> Result<()> { if let Err(_) = database::sessions::delete_session(user_id) { return Err(ResponseCode::InternalServerError.text("Failed to logout")); }; Ok(()) } }