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