use crate::config::{Config, generate_log_file_name}; use crate::middleware::AppState; use axum::body::Body; use axum::extract::Request; use log::{LevelFilter, error, info}; use simplelog::{ColorChoice, CombinedLogger, TermLogger, TerminalMode, WriteLogger}; use std::fs::File; use std::sync::Arc; use serde::de::DeserializeOwned; use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _}; pub fn decode_payload_unchecked(token: &str) -> Result> { let mut parts = token.split('.'); let _header = parts.next().ok_or("missing header")?; let payload_b64 = parts.next().ok_or("missing payload")?; // signature is parts.next() but we ignore it here let payload = URL_SAFE_NO_PAD.decode(payload_b64.as_bytes())?; let claims = serde_json::from_slice::(&payload)?; Ok(claims) } pub fn initialize_logging(config: &Config) { CombinedLogger::init(vec![ TermLogger::new( LevelFilter::Info, simplelog::Config::default(), TerminalMode::Mixed, ColorChoice::Auto, ), WriteLogger::new( LevelFilter::Info, simplelog::Config::default(), File::create(generate_log_file_name(config.log_file_prefix.clone())).unwrap(), ), ]) .unwrap(); } pub async fn set_and_log_session(state: &Arc, session: String) { match state.repository.set_session(session.clone()).await { Ok(_) => { info!("Redis: saved session {}", &session); } Err(err) => { error!("Redis: failed to save session: {}", err); } } }