omni_orchestrator/schemas/v1/api/apps/
list.rs1use super::super::super::db::queries as db;
2use rocket::http::Status;
3use rocket::serde::json::{json, Json, Value};
4use rocket::{get, State};
5use std::sync::Arc;
6
7use crate::DatabaseManager;
8
9#[get("/platform/<platform_id>/apps?<page>&<per_page>")]
22pub async fn list_apps(
23 platform_id: i64,
24 page: Option<i64>,
25 per_page: Option<i64>,
26 db_manager: &State<Arc<DatabaseManager>>,
27) -> Result<Json<Value>, (Status, Json<Value>)> {
28 let platform = match db::platforms::get_platform_by_id(db_manager.get_main_pool(), platform_id).await {
30 Ok(platform) => platform,
31 Err(_) => {
32 return Err((
33 Status::NotFound,
34 Json(json!({
35 "error": "Platform not found",
36 "message": format!("Platform with ID {} does not exist", platform_id)
37 }))
38 ));
39 }
40 };
41
42 let pool = match db_manager.get_platform_pool(&platform.name, platform_id).await {
44 Ok(pool) => pool,
45 Err(_) => {
46 return Err((
47 Status::InternalServerError,
48 Json(json!({
49 "error": "Database error",
50 "message": "Failed to connect to platform database"
51 }))
52 ));
53 }
54 };
55
56 match (page, per_page) {
57 (Some(p), Some(pp)) => {
58 let apps = match db::app::list_apps(&pool, p, pp).await {
59 Ok(apps) => apps,
60 Err(_) => {
61 return Err((
62 Status::InternalServerError,
63 Json(json!({
64 "error": "Database error",
65 "message": "Failed to retrieve applications"
66 }))
67 ));
68 }
69 };
70
71 let total_count = match db::app::count_apps(&pool).await {
72 Ok(count) => count,
73 Err(_) => {
74 return Err((
75 Status::InternalServerError,
76 Json(json!({
77 "error": "Database error",
78 "message": "Failed to count applications"
79 }))
80 ));
81 }
82 };
83
84 let total_pages = (total_count / pp);
85
86 let response = json!({
87 "apps": apps,
88 "pagination": {
89 "page": p,
90 "per_page": pp,
91 "total_count": total_count,
92 "total_pages": total_pages
93 }
94 });
95
96 Ok(Json(response))
97 }
98 _ => Err((
99 Status::BadRequest,
100 Json(json!({
101 "error": "Missing pagination parameters",
102 "message": "Please provide both 'page' and 'per_page' parameters"
103 }))
104 ))
105 }
106}
107
108#[get("/platform/<platform_id>/app-count")]
110pub async fn count_apps(
111 platform_id: i64,
112 db_manager: &State<Arc<DatabaseManager>>
113) -> Result<Json<i64>, (Status, Json<Value>)> {
114 let platform = match db::platforms::get_platform_by_id(db_manager.get_main_pool(), platform_id).await {
116 Ok(platform) => platform,
117 Err(_) => {
118 return Err((
119 Status::NotFound,
120 Json(json!({
121 "error": "Platform not found",
122 "message": format!("Platform with ID {} does not exist", platform_id)
123 }))
124 ));
125 }
126 };
127
128 let pool = match db_manager.get_platform_pool(&platform.name, platform_id).await {
130 Ok(pool) => pool,
131 Err(_) => {
132 return Err((
133 Status::InternalServerError,
134 Json(json!({
135 "error": "Database error",
136 "message": "Failed to connect to platform database"
137 }))
138 ));
139 }
140 };
141
142 match db::app::count_apps(&pool).await {
143 Ok(count) => Ok(Json(count)),
144 Err(_) => Err((
145 Status::InternalServerError,
146 Json(json!({
147 "error": "Database error",
148 "message": "Failed to count applications"
149 }))
150 )),
151 }
152}