routa_server/api/
memory.rs1use 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
25async 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 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
78async 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
89async 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}