Skip to main content

routa_server/api/
memory.rs

1use axum::{
2    extract::{Query, State},
3    routing::get,
4    Json, Router,
5};
6use serde::Deserialize;
7use sysinfo::System;
8
9use crate::state::AppState;
10
11pub fn router() -> Router<AppState> {
12    Router::new().route(
13        "/",
14        get(get_memory_stats)
15            .post(cleanup_memory)
16            .delete(reset_memory),
17    )
18}
19
20#[derive(Debug, Deserialize)]
21struct MemoryQuery {
22    history: Option<bool>,
23}
24
25/// GET /api/memory — Get memory usage statistics.
26///
27/// For desktop version, returns system memory info.
28async fn get_memory_stats(
29    State(_state): State<AppState>,
30    Query(query): Query<MemoryQuery>,
31) -> Json<serde_json::Value> {
32    let mut sys = System::new_all();
33    sys.refresh_memory();
34
35    let total_memory = sys.total_memory();
36    let used_memory = sys.used_memory();
37    let available_memory = sys.available_memory();
38
39    let usage_percentage = if total_memory > 0 {
40        (used_memory as f64 / total_memory as f64 * 100.0) as u64
41    } else {
42        0
43    };
44
45    let level = if usage_percentage > 90 {
46        "critical"
47    } else if usage_percentage > 75 {
48        "warning"
49    } else {
50        "normal"
51    };
52
53    let stats = serde_json::json!({
54        "heapUsedMB": used_memory / 1024 / 1024,
55        "heapTotalMB": total_memory / 1024 / 1024,
56        "availableMB": available_memory / 1024 / 1024,
57        "usagePercentage": usage_percentage,
58        "level": level,
59        "timestamp": chrono::Utc::now().to_rfc3339(),
60    });
61
62    if query.history.unwrap_or(false) {
63        // Return with empty history for desktop version
64        Json(serde_json::json!({
65            "stats": stats,
66            "history": [],
67            "sessionStore": {
68                "activeSessions": 0,
69                "totalHistorySize": 0,
70                "averageHistorySize": 0
71            }
72        }))
73    } else {
74        Json(stats)
75    }
76}
77
78/// POST /api/memory — Trigger memory cleanup.
79///
80/// For desktop version, this is a no-op.
81async fn cleanup_memory(State(_state): State<AppState>) -> Json<serde_json::Value> {
82    Json(serde_json::json!({
83        "success": true,
84        "message": "Memory cleanup not needed in desktop version",
85        "cleaned": 0
86    }))
87}
88
89/// DELETE /api/memory — Reset memory monitoring.
90///
91/// For desktop version, this is a no-op.
92async fn reset_memory(State(_state): State<AppState>) -> Json<serde_json::Value> {
93    Json(serde_json::json!({
94        "success": true,
95        "message": "Memory monitoring reset not needed in desktop version"
96    }))
97}