use crate::{config::AuthFrameworkSettings, errors::Result};
use chrono;
use std::sync::Arc;
use tokio::sync::RwLock;
#[derive(Debug, Clone)]
pub struct AppState {
pub config: Arc<RwLock<AuthFrameworkSettings>>,
pub config_manager: crate::config::ConfigManager,
pub health_status: HealthStatus,
pub server_status: Arc<RwLock<ServerStatus>>,
}
#[derive(Debug, Clone)]
pub struct ServerStatus {
pub web_server_running: bool,
pub web_server_port: Option<u16>,
pub last_config_update: Option<chrono::DateTime<chrono::Utc>>,
pub active_sessions: u32,
pub health_status: HealthStatus,
}
#[derive(Debug, Clone)]
pub enum HealthStatus {
Healthy,
Warning(String),
Critical(String),
}
#[derive(Debug, Clone)]
pub struct ServerInfo {
pub version: String,
pub uptime: String,
pub status: String,
pub port: Option<u16>,
pub active_sessions: u32,
}
#[derive(Debug, Clone)]
pub struct UserStatistics {
pub total_users: u32,
pub active_sessions: u32,
pub failed_logins_today: u32,
pub new_registrations_today: u32,
}
#[derive(Debug, Clone)]
pub struct SecurityEvent {
pub timestamp: chrono::DateTime<chrono::Utc>,
pub event_type: String,
pub description: String,
pub ip_address: Option<String>,
pub user_id: Option<String>,
}
impl AppState {
pub fn new(settings: AuthFrameworkSettings) -> Result<Self> {
let config = Arc::new(RwLock::new(settings));
let config_manager = crate::config::ConfigManager::new()?;
let server_status = ServerStatus {
web_server_running: false,
web_server_port: None,
last_config_update: None,
active_sessions: 0,
health_status: HealthStatus::Healthy,
};
Ok(Self {
config,
config_manager,
health_status: HealthStatus::Healthy,
server_status: Arc::new(RwLock::new(server_status)),
})
}
pub async fn get_health_status(&self) -> HealthStatus {
HealthStatus::Healthy
}
pub async fn reload_config(&self) -> Result<()> {
let mut status = self.server_status.write().await;
status.last_config_update = Some(chrono::Utc::now());
Ok(())
}
pub async fn update_server_status(&self, running: bool, port: Option<u16>) {
let mut status = self.server_status.write().await;
status.web_server_running = running;
status.web_server_port = port;
}
pub async fn get_server_info(&self) -> Result<ServerInfo> {
let status = self.server_status.read().await;
Ok(ServerInfo {
version: env!("CARGO_PKG_VERSION").to_string(),
uptime: "N/A".to_string(), status: if status.web_server_running {
"Running"
} else {
"Stopped"
}
.to_string(),
port: status.web_server_port,
active_sessions: status.active_sessions,
})
}
pub async fn get_user_statistics(&self) -> Result<UserStatistics> {
Ok(UserStatistics {
total_users: 0,
active_sessions: 0,
failed_logins_today: 0,
new_registrations_today: 0,
})
}
pub async fn get_recent_security_events(&self) -> Result<Vec<SecurityEvent>> {
Ok(vec![])
}
} #[cfg(feature = "cli")]
pub mod cli;
#[cfg(feature = "tui")]
pub mod tui;
#[cfg(feature = "web-gui")]
pub mod web;
#[derive(Debug, Clone, clap::Subcommand)]
pub enum CliCommand {
Config {
#[command(subcommand)]
action: ConfigAction,
},
Users {
#[command(subcommand)]
action: UserAction,
},
Server {
#[command(subcommand)]
action: ServerAction,
},
Security {
#[command(subcommand)]
action: SecurityAction,
},
Status {
#[arg(long)]
detailed: bool,
#[arg(long, default_value = "table")]
format: String,
},
}
#[derive(Debug, Clone, clap::Subcommand)]
pub enum ConfigAction {
Show {
section: Option<String>,
#[arg(long, default_value = "table")]
format: String,
},
Set {
key: String,
value: String,
#[arg(long)]
hot_reload: bool,
},
Reset,
Validate {
file: Option<String>,
},
Get {
key: String,
},
Reload {
#[arg(long)]
show_diff: bool,
},
Template {
output: Option<String>,
#[arg(long)]
complete: bool,
},
}
#[derive(Debug, Clone, clap::Subcommand)]
pub enum UserAction {
List {
limit: Option<u32>,
#[arg(long)]
active: bool,
},
Create {
email: String,
password: Option<String>,
#[arg(long)]
admin: bool,
},
Delete {
user: String,
#[arg(long)]
force: bool,
},
SetRole {
email: String,
role: String,
},
Update {
user: String,
#[arg(long)]
email: Option<String>,
#[arg(long)]
active: Option<bool>,
},
}
#[derive(Debug, Clone, clap::Subcommand)]
pub enum ServerAction {
Status,
Start {
port: Option<u16>,
#[arg(long)]
daemon: bool,
},
Stop {
#[arg(long)]
force: bool,
},
Restart {
port: Option<u16>,
},
}
#[derive(Debug, Clone, clap::Subcommand)]
pub enum SecurityAction {
AuditLog,
ThreatReport,
ForceLogout {
user_id: String,
},
Audit {
#[arg(long, default_value = "7")]
days: u32,
#[arg(long)]
detailed: bool,
},
Sessions {
#[arg(long)]
user: Option<String>,
#[arg(long)]
terminate: Option<String>,
},
ThreatIntel {
#[arg(long)]
update: bool,
#[arg(long)]
check_ip: Option<String>,
},
}