omni_orchestrator/schemas/v1/api/alerts/
create.rs1use 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#[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 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 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}