use std::collections::HashMap; use std::path::PathBuf; use std::sync::Arc; use tokio::sync::RwLock; use pinakes_core::cache::CacheLayer; use pinakes_core::config::{Config, UserRole}; use pinakes_core::jobs::JobQueue; use pinakes_core::scan::ScanProgress; use pinakes_core::scheduler::TaskScheduler; use pinakes_core::storage::DynStorageBackend; /// Default session TTL: 24 hours. pub const SESSION_TTL_SECS: i64 = 24 * 60 * 60; #[derive(Debug, Clone)] pub struct SessionInfo { pub username: String, pub role: UserRole, pub created_at: chrono::DateTime, } impl SessionInfo { /// Returns true if this session has exceeded its TTL. pub fn is_expired(&self) -> bool { let age = chrono::Utc::now() - self.created_at; age.num_seconds() > SESSION_TTL_SECS } } pub type SessionStore = Arc>>; /// Remove all expired sessions from the store. pub async fn cleanup_expired_sessions(sessions: &SessionStore) { let mut store = sessions.write().await; store.retain(|_, info| !info.is_expired()); } #[derive(Clone)] pub struct AppState { pub storage: DynStorageBackend, pub config: Arc>, pub config_path: Option, pub scan_progress: ScanProgress, pub sessions: SessionStore, pub job_queue: Arc, pub cache: Arc, pub scheduler: Arc, }