use actix_web::{post, web, HttpRequest, HttpResponse, Responder};
use crate::security::jwt::JwtManager;
use crate::db::models::SecurityAlert;
use serde::Deserialize;
use uuid::Uuid;
use serde_json::json;
#[derive(Deserialize)]
pub struct AlertTriggerRequest {
pub entity_id: Uuid, pub entity_type: String, pub alert_type: String, pub severity: String, pub details: serde_json::Value }
#[post("/alerts/trigger")]
pub async fn trigger_alert(
req: HttpRequest, payload: web::Json<AlertTriggerRequest> ) -> impl Responder {
let token = match req.headers().get("Authorization") {
Some(hv) => hv.to_str().unwrap_or("").replace("Bearer ", ""),
None => String::new(),
};
if token.is_empty() {
return HttpResponse::Unauthorized().body("Missing Authorization token");
}
let jwt_manager = JwtManager::new(
secrecy::Secret::new("a_very_secure_and_long_secret_key_that_is_at_least_32_bytes_long".to_string()),
60,
"my_app".to_string(),
"user_service".to_string(),
);
match jwt_manager.decode_token(&token) {
Ok(_) => {},
Err(_) => return HttpResponse::Unauthorized().body("Invalid or expired token"),
};
let alert = SecurityAlert {
id: Uuid::new_v4(),
user_id: payload.entity_id, alert_type: payload.alert_type.clone(), alert_data: payload.details.clone(), created_at: chrono::Utc::now().naive_utc(), };
let saved_alert = alert.clone();
HttpResponse::Ok().json(json!({
"status": "alert_triggered",
"alert": saved_alert
}))
}