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

1use std::sync::Arc;
2use crate::DatabaseManager;
3use super::super::super::db::queries as db;
4use rocket::serde::json::{json, Json, Value};
5use rocket::{get, http::Status, State};
6
7use libomni::types::db::v1 as types;
8use types::build::Build;
9
10/// List all builds with pagination support.
11#[get("/platform/<platform_id>/builds?<page>&<per_page>")]
12pub async fn list_builds(
13    platform_id: i64,
14    page: Option<u32>,
15    per_page: Option<u32>,
16    db_manager: &State<Arc<DatabaseManager>>,
17) -> Result<Json<Value>, (Status, Json<Value>)> {
18    // Get platform information
19    let platform = match db::platforms::get_platform_by_id(db_manager.get_main_pool(), platform_id).await {
20        Ok(platform) => platform,
21        Err(_) => {
22            return Err((
23                Status::NotFound,
24                Json(json!({
25                    "error": "Platform not found",
26                    "message": format!("Platform with ID {} does not exist", platform_id)
27                }))
28            ));
29        }
30    };
31
32    // Get platform-specific database pool
33    let pool = match db_manager.get_platform_pool(&platform.name, platform_id).await {
34        Ok(pool) => pool,
35        Err(_) => {
36            return Err((
37                Status::InternalServerError,
38                Json(json!({
39                    "error": "Database error",
40                    "message": "Failed to connect to platform database"
41                }))
42            ));
43        }
44    };
45
46    let page: i64 = page.unwrap_or(0).into();
47    let per_page: i64 = per_page.unwrap_or(10).into();
48    let offset = page * per_page;
49    
50    let builds = match db::build::list_builds_paginated(&pool, per_page, offset).await {
51        Ok(builds) => builds,
52        Err(_) => {
53            return Err((
54                Status::InternalServerError,
55                Json(json!({
56                    "error": "Database error",
57                    "message": "Failed to list builds"
58                }))
59            ));
60        }
61    };
62    
63    let total_count = match db::build::get_total_build_count(&pool).await {
64        Ok(count) => count,
65        Err(_) => {
66            return Err((
67                Status::InternalServerError,
68                Json(json!({
69                    "error": "Database error",
70                    "message": "Failed to count builds"
71                }))
72            ));
73        }
74    };
75    
76    let total_pages = (total_count as f64 / per_page as f64).ceil() as i64;
77    
78    let response = json!({
79        "builds": builds,
80        "pagination": {
81            "page": page,
82            "per_page": per_page,
83            "total_count": total_count,
84            "total_pages": total_pages
85        }
86    });
87    
88    Ok(Json(response))
89}
90
91/// List builds for a specific application with pagination support.
92#[get("/platform/<platform_id>/apps/<app_id>/builds?<page>&<per_page>")]
93pub async fn list_builds_for_app(
94    platform_id: i64,
95    app_id: i64,
96    page: Option<u32>,
97    per_page: Option<u32>,
98    db_manager: &State<Arc<DatabaseManager>>,
99) -> Result<Json<Vec<Build>>, (Status, Json<Value>)> {
100    // Get platform information
101    let platform = match db::platforms::get_platform_by_id(db_manager.get_main_pool(), platform_id).await {
102        Ok(platform) => platform,
103        Err(_) => {
104            return Err((
105                Status::NotFound,
106                Json(json!({
107                    "error": "Platform not found",
108                    "message": format!("Platform with ID {} does not exist", platform_id)
109                }))
110            ));
111        }
112    };
113
114    // Get platform-specific database pool
115    let pool = match db_manager.get_platform_pool(&platform.name, platform_id).await {
116        Ok(pool) => pool,
117        Err(_) => {
118            return Err((
119                Status::InternalServerError,
120                Json(json!({
121                    "error": "Database error",
122                    "message": "Failed to connect to platform database"
123                }))
124            ));
125        }
126    };
127
128    let page: i64 = page.unwrap_or(1).into();
129    let per_page: i64 = per_page.unwrap_or(10).into();
130    let offset = (page - 1) * per_page;
131    
132    match db::build::list_builds_for_app_paginated(&pool, app_id, per_page, offset).await {
133        Ok(builds) => Ok(Json(builds)),
134        Err(_) => Err((
135            Status::InternalServerError,
136            Json(json!({
137                "error": "Database error",
138                "message": "Failed to list builds for application"
139            }))
140        )),
141    }
142}