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

1use super::super::super::db::queries as db;
2use super::types::CreateAlertRequest;
3use rocket::http::Status;
4use rocket::serde::json::{json, Json, Value};
5use rocket::{post, State};
6use std::sync::Arc;
7use crate::DatabaseManager;
8
9/// Create a new alert
10#[post("/platform/<platform_id>/alerts", format = "json", data = "<alert_data>")]
11pub async fn create_alert(
12    platform_id: i64,
13    alert_data: Json<CreateAlertRequest>,
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 data = alert_data.into_inner();
45    
46    let alert = match db::alert::create_alert(
47        &pool,
48        &data.alert_type,
49        &data.severity,
50        &data.service,
51        &data.message,
52        data.metadata,
53        data.org_id,
54        data.app_id,
55        data.instance_id,
56        data.region_id,
57        data.node_id,
58    ).await {
59        Ok(alert) => alert,
60        Err(e) => {
61            log::error!("Failed to create alert: {}", e);
62            return Err((
63                Status::InternalServerError,
64                Json(json!({
65                    "error": "Database error",
66                    "message": "Failed to create alert"
67                }))
68            ));
69        }
70    };
71
72    Ok(Json(json!({
73        "message": "Alert created successfully",
74        "alert": alert
75    })))
76}