omni_orchestrator/schemas/v1/api/alerts/
org_alerts.rs

1use super::super::super::db::queries as db;
2use rocket::http::Status;
3use rocket::serde::json::{json, Json, Value};
4use rocket::{get, State};
5use std::sync::Arc;
6use crate::DatabaseManager;
7
8/// Get active alerts for an organization
9#[get("/platform/<platform_id>/orgs/<org_id>/active-alerts?<limit>")]
10pub async fn get_org_active_alerts(
11    platform_id: i64,
12    org_id: i64,
13    limit: Option<i64>,
14    db_manager: &State<Arc<DatabaseManager>>,
15) -> Result<Json<Value>, (Status, Json<Value>)> {
16    // Get platform information
17    let platform = match db::platforms::get_platform_by_id(db_manager.get_main_pool(), platform_id).await {
18        Ok(platform) => platform,
19        Err(_) => {
20            return Err((
21                Status::NotFound,
22                Json(json!({
23                    "error": "Platform not found",
24                    "message": format!("Platform with ID {} does not exist", platform_id)
25                }))
26            ));
27        }
28    };
29
30    // Get platform-specific database pool
31    let pool = match db_manager.get_platform_pool(&platform.name, platform_id).await {
32        Ok(pool) => pool,
33        Err(_) => {
34            return Err((
35                Status::InternalServerError,
36                Json(json!({
37                    "error": "Database error",
38                    "message": "Failed to connect to platform database"
39                }))
40            ));
41        }
42    };
43
44    let limit = limit.unwrap_or(20);
45    
46    let alerts = match db::alert::get_org_active_alerts(
47        &pool,
48        org_id,
49        limit,
50    ).await {
51        Ok(alerts) => alerts,
52        Err(e) => {
53            log::error!("Failed to fetch org active alerts: {}", e);
54            return Err((
55                Status::InternalServerError,
56                Json(json!({
57                    "error": "Database error",
58                    "message": "Failed to fetch organization alerts"
59                }))
60            ));
61        }
62    };
63
64    Ok(Json(json!({ "alerts": alerts })))
65}
66
67/// Get alert statistics for an organization
68#[get("/platform/<platform_id>/orgs/<org_id>/alert-stats?<days>")]
69pub async fn get_org_alert_stats(
70    platform_id: i64,
71    org_id: i64,
72    days: Option<i64>,
73    db_manager: &State<Arc<DatabaseManager>>,
74) -> Result<Json<Value>, (Status, Json<Value>)> {
75    // Get platform information
76    let platform = match db::platforms::get_platform_by_id(db_manager.get_main_pool(), platform_id).await {
77        Ok(platform) => platform,
78        Err(_) => {
79            return Err((
80                Status::NotFound,
81                Json(json!({
82                    "error": "Platform not found",
83                    "message": format!("Platform with ID {} does not exist", platform_id)
84                }))
85            ));
86        }
87    };
88
89    // Get platform-specific database pool
90    let pool = match db_manager.get_platform_pool(&platform.name, platform_id).await {
91        Ok(pool) => pool,
92        Err(_) => {
93            return Err((
94                Status::InternalServerError,
95                Json(json!({
96                    "error": "Database error",
97                    "message": "Failed to connect to platform database"
98                }))
99            ));
100        }
101    };
102
103    let days = days.unwrap_or(30); // Default to last 30 days
104    
105    let stats = match db::alert::get_alert_stats(
106        &pool,
107        org_id,
108        days,
109    ).await {
110        Ok(stats) => stats,
111        Err(e) => {
112            log::error!("Failed to fetch alert stats: {}", e);
113            return Err((
114                Status::InternalServerError,
115                Json(json!({
116                    "error": "Database error",
117                    "message": "Failed to fetch alert statistics"
118                }))
119            ));
120        }
121    };
122
123    Ok(Json(stats))
124}