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

1use 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/// List all applications with pagination support.
10///
11/// # Arguments
12///
13/// * `platform_id` - Platform identifier
14/// * `page` - Required page number for pagination
15/// * `per_page` - Required number of items per page
16/// * `db_manager` - Database manager for accessing platform-specific pools
17///
18/// # Returns
19///
20/// A JSON array of applications or an error if pagination parameters are missing
21#[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    // Get platform information from main database
29    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    // Get platform-specific database pool
43    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/// Count the total number of applications.
109#[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    // Get platform information
115    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    // Get platform-specific database pool
129    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}