diff --git a/src/api/handlers.rs b/src/api/handlers.rs index 9a820d7..abfa36a 100644 --- a/src/api/handlers.rs +++ b/src/api/handlers.rs @@ -125,21 +125,62 @@ pub async fn restart_app_handler( } pub async fn get_app_status_handler( - State(state): State>, + State(_state): State>, Path(app_name): Path, ) -> Result>, StatusCode> { + use crate::config::get_config_manager; + use crate::systemd::SystemCtl; + use crate::models::{AppStatus, ServiceStatus}; - match state.app_manager.get_app_status(&app_name) { - Some(managed_app) => { - let response = AppStatusResponse { - name: managed_app.name, - status: managed_app.status.as_str().to_string(), - pid: managed_app.pid, - cpu_usage: managed_app.cpu_usage, - memory_usage: format!("{:.2} MB", managed_app.memory_usage as f64 / 1024.0 / 1024.0), - systemd_status: managed_app.systemd_status.as_str().to_string(), - last_updated: managed_app.last_updated, + let config_manager = get_config_manager(); + let apps = config_manager.get_apps(); + + // Buscar la app en monitored_apps.json + let app = apps.iter().find(|a| a.name == app_name); + + match app { + Some(app) => { + let service_name = format!("siax-app-{}.service", app.name); + let systemd_status = SystemCtl::status(&service_name); + + // Obtener métricas del proceso + let mut sys = System::new_all(); + sys.refresh_all(); + + let mut pid = None; + let mut cpu_usage = 0.0; + let mut memory_mb = 0.0; + + // Buscar proceso por nombre de app + for (process_pid, process) in sys.processes() { + let cmd = process.cmd().join(" "); + if cmd.contains(&app.name) || cmd.contains(&app.entry_point) { + pid = Some(process_pid.as_u32() as i32); + cpu_usage = process.cpu_usage(); + memory_mb = process.memory() as f64 / 1024.0 / 1024.0; + break; + } + } + + let status = match systemd_status { + ServiceStatus::Active => "Running", + ServiceStatus::Inactive => "Stopped", + ServiceStatus::Failed => "Failed", + ServiceStatus::Activating => "Starting", + ServiceStatus::Deactivating => "Stopping", + ServiceStatus::Unknown => "Unknown", }; + + let response = AppStatusResponse { + name: app.name.clone(), + status: status.to_string(), + pid, + cpu_usage, + memory_usage: format!("{:.2} MB", memory_mb), + systemd_status: systemd_status.as_str().to_string(), + last_updated: chrono::Local::now().format("%Y-%m-%d %H:%M:%S").to_string(), + }; + Ok(Json(ApiResponse::success(response))) } None => Ok(Json(ApiResponse::error( @@ -149,13 +190,49 @@ pub async fn get_app_status_handler( } pub async fn list_apps_handler( - State(state): State>, -) -> Result>, StatusCode> { + State(_state): State>, +) -> Result, StatusCode> { + use crate::config::get_config_manager; + use crate::systemd::SystemCtl; - let apps = state.app_manager.list_apps(); - let total = apps.len(); + // Leer apps desde monitored_apps.json (apps descubiertas + registradas) + let config_manager = get_config_manager(); + let monitored_apps = config_manager.get_apps(); - Ok(Json(ApiResponse::success(AppListResponse { apps, total }))) + // Crear respuesta con información de cada app + let mut apps_with_status = Vec::new(); + + for app in monitored_apps { + // Verificar estado en systemd + let service_name = format!("siax-app-{}.service", app.name); + let systemd_status = SystemCtl::status(&service_name); + + let status = match systemd_status { + crate::models::ServiceStatus::Active => "Running", + crate::models::ServiceStatus::Inactive => "Stopped", + crate::models::ServiceStatus::Failed => "Failed", + crate::models::ServiceStatus::Activating => "Starting", + crate::models::ServiceStatus::Deactivating => "Stopping", + crate::models::ServiceStatus::Unknown => "Unknown", + }; + + apps_with_status.push(serde_json::json!({ + "name": app.name, + "status": status, + "port": app.port, + "service_name": app.service_name, + })); + } + + let total = apps_with_status.len(); + + Ok(Json(serde_json::json!({ + "success": true, + "data": { + "apps": apps_with_status, + "total": total + } + }))) } pub async fn scan_processes_handler() -> Result>, StatusCode> {