use rand::{distributions::Alphanumeric, Rng}; use serde::Serialize; use tracing::instrument; use crate::database; use crate::types::http::{ResponseCode, Result}; #[derive(Serialize)] pub struct Session { pub user_id: u64, pub token: String, } impl Session { #[instrument()] 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) } #[instrument()] pub fn reterieve_all() -> Result> { let Ok(sessions) = database::sessions::get_all_sessions() else { return Err(ResponseCode::InternalServerError.text("Failed to fetch sessions")) }; Ok(sessions) } #[instrument()] 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(_) => Err(ResponseCode::BadRequest.text("Failed to create session")), Ok(_) => Ok(Self { user_id, token }), } } #[instrument()] pub fn delete(user_id: u64) -> Result<()> { if database::sessions::delete_session(user_id).is_err() { tracing::error!("Failed to logout user"); return Err(ResponseCode::InternalServerError.text("Failed to logout")); }; Ok(()) } }