omni_orchestrator/schemas/v1/api/audit_log/
list.rs

1use std::sync::Arc;
2use crate::DatabaseManager;
3use super::super::super::db::queries as db;
4use rocket::get;
5use rocket::http::Status;
6use rocket::serde::json::{json, Json, Value};
7use rocket::State;
8
9/// List audit log entries with pagination support.
10#[get("/platform/<platform_id>/audit_logs?<page>&<per_page>")]
11pub async fn list_audit_logs(
12    platform_id: i64,
13    page: Option<u32>,
14    per_page: Option<u32>,
15    db_manager: &State<Arc<DatabaseManager>>,
16) -> Result<Json<Value>, (Status, Json<Value>)> {
17    // Get platform information
18    let platform = match db::platforms::get_platform_by_id(db_manager.get_main_pool(), platform_id).await {
19        Ok(platform) => platform,
20        Err(_) => {
21            return Err((
22                Status::NotFound,
23                Json(json!({
24                    "error": "Platform not found",
25                    "message": format!("Platform with ID {} does not exist", platform_id)
26                }))
27            ));
28        }
29    };
30
31    // Get platform-specific database pool
32    let pool = match db_manager.get_platform_pool(&platform.name, platform_id).await {
33        Ok(pool) => pool,
34        Err(_) => {
35            return Err((
36                Status::InternalServerError,
37                Json(json!({
38                    "error": "Database error",
39                    "message": "Failed to connect to platform database"
40                }))
41            ));
42        }
43    };
44
45    let p: i64 = page.unwrap_or(1).into();
46    let pp: i64 = per_page.unwrap_or(10).into();
47
48    let audit_logs = match db::audit_log::list_audit_logs_paginated(&pool, pp, p).await {
49        Ok(logs) => logs,
50        Err(_) => {
51            return Err((
52                Status::InternalServerError,
53                Json(json!({
54                    "error": "Database error",
55                    "message": "Failed to list audit logs"
56                }))
57            ));
58        }
59    };
60
61    let total_count = match db::audit_log::count_audit_logs(&pool).await {
62        Ok(count) => count,
63        Err(_) => {
64            return Err((
65                Status::InternalServerError,
66                Json(json!({
67                    "error": "Database error",
68                    "message": "Failed to count audit logs"
69                }))
70            ));
71        }
72    };
73
74    let total_pages = if pp > 0 {
75        (total_count + pp - 1) / pp
76    } else {
77        1
78    };
79
80    let response = json!({
81        "audit_logs": audit_logs,
82        "pagination": {
83            "page": p,
84            "per_page": pp,
85            "total_count": total_count,
86            "total_pages": total_pages
87        }
88    });
89
90    Ok(Json(response))
91}