omni_orchestrator/schemas/v1/api/
instances.rs

1use std::sync::Arc;
2use crate::DatabaseManager;
3use crate::models::instance::Instance;
4use rocket::get;
5use rocket::http::Status;
6use rocket::serde::json::{json, Json, Value};
7use rocket::State;
8use crate::schemas::v1::db::queries::{self as db};
9
10/// List all instances by `region_id` and `app_id`
11#[get("/platform/<platform_id>/apps/<app_id>/instances/region/<region_id>?<page>&<per_page>")]
12pub async fn list_instances_by_region(
13    platform_id: i64,
14    app_id: i64,
15    region_id: i64,
16    page: Option<i64>,
17    per_page: Option<i64>,
18    db_manager: &State<Arc<DatabaseManager>>,
19) -> Result<Json<Value>, (Status, Json<Value>)> {
20    // Get platform information
21    let platform = match db::platforms::get_platform_by_id(db_manager.get_main_pool(), platform_id).await {
22        Ok(platform) => platform,
23        Err(_) => {
24            return Err((
25                Status::NotFound,
26                Json(json!({
27                    "error": "Platform not found",
28                    "message": format!("Platform with ID {} does not exist", platform_id)
29                }))
30            ));
31        }
32    };
33
34    // Get platform-specific database pool
35    let pool = match db_manager.get_platform_pool(&platform.name, platform_id).await {
36        Ok(pool) => pool,
37        Err(_) => {
38            return Err((
39                Status::InternalServerError,
40                Json(json!({
41                    "error": "Database error",
42                    "message": "Failed to connect to platform database"
43                }))
44            ));
45        }
46    };
47
48    // Default to page 1 and 10 items per page
49    let page = page.unwrap_or(1);
50    let per_page = per_page.unwrap_or(10);
51    
52    let instances = match db::instance::list_instances_by_region(&pool, region_id, app_id, page, per_page).await {
53        Ok(instances) => instances,
54        Err(_) => {
55            return Err((
56                Status::InternalServerError,
57                Json(json!({
58                    "error": "Database error",
59                    "message": "Failed to list instances by region"
60                }))
61            ));
62        }
63    };
64    
65    let instances_vec: Vec<Instance> = instances.into_iter().collect();
66    
67    Ok(Json(json!({
68        "instances": instances_vec,
69        "pagination": {
70            "page": page,
71            "per_page": per_page
72        }
73    })))
74}
75
76/// Count all instances across all applications
77#[get("/platform/<platform_id>/instance-count")]
78pub async fn count_instances(
79    platform_id: i64,
80    db_manager: &State<Arc<DatabaseManager>>,
81) -> Result<Json<Value>, (Status, Json<Value>)> {
82    // Get platform information
83    let platform = match db::platforms::get_platform_by_id(db_manager.get_main_pool(), platform_id).await {
84        Ok(platform) => platform,
85        Err(_) => {
86            return Err((
87                Status::NotFound,
88                Json(json!({
89                    "error": "Platform not found",
90                    "message": format!("Platform with ID {} does not exist", platform_id)
91                }))
92            ));
93        }
94    };
95
96    // Get platform-specific database pool
97    let pool = match db_manager.get_platform_pool(&platform.name, platform_id).await {
98        Ok(pool) => pool,
99        Err(_) => {
100            return Err((
101                Status::InternalServerError,
102                Json(json!({
103                    "error": "Database error",
104                    "message": "Failed to connect to platform database"
105                }))
106            ));
107        }
108    };
109
110    let count = match db::instance::count_instances(&pool).await {
111        Ok(count) => count,
112        Err(_) => {
113            return Err((
114                Status::InternalServerError,
115                Json(json!({
116                    "error": "Database error",
117                    "message": "Failed to count instances"
118                }))
119            ));
120        }
121    };
122    
123    Ok(Json(json!({ "count": count })))
124}
125
126/// Get an instance by ID
127#[get("/platform/<platform_id>/instances/<instance_id>")]
128pub async fn get_instance(
129    platform_id: i64,
130    instance_id: i64,
131    db_manager: &State<Arc<DatabaseManager>>,
132) -> Result<Json<Instance>, (Status, Json<Value>)> {
133    // Get platform information
134    let platform = match db::platforms::get_platform_by_id(db_manager.get_main_pool(), platform_id).await {
135        Ok(platform) => platform,
136        Err(_) => {
137            return Err((
138                Status::NotFound,
139                Json(json!({
140                    "error": "Platform not found",
141                    "message": format!("Platform with ID {} does not exist", platform_id)
142                }))
143            ));
144        }
145    };
146
147    // Get platform-specific database pool
148    let pool = match db_manager.get_platform_pool(&platform.name, platform_id).await {
149        Ok(pool) => pool,
150        Err(_) => {
151            return Err((
152                Status::InternalServerError,
153                Json(json!({
154                    "error": "Database error",
155                    "message": "Failed to connect to platform database"
156                }))
157            ));
158        }
159    };
160
161    match db::instance::get_instance_by_id(&pool, instance_id).await {
162        Ok(instance) => Ok(Json(instance)),
163        Err(_) => {
164            Err((
165                Status::NotFound,
166                Json(json!({
167                    "error": "Instance not found",
168                    "message": format!("Instance with ID {} does not exist", instance_id)
169                }))
170            ))
171        }
172    }
173}
174
175// Note: The commented out routes would also need similar updates if enabled