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