omni_orchestrator/schemas/v1/api/instances/
list.rs1use std::sync::Arc;
2use crate::DatabaseManager;
3use rocket::get;
4use rocket::http::Status;
5use rocket::serde::json::{json, Json, Value};
6use rocket::State;
7use crate::schemas::v1::db::queries::{self as db};
8
9use libomni::types::db::v1 as types;
10use types::instance::Instance;
11
12#[get("/platform/<platform_id>/apps/<app_id>/instances/region/<region_id>?<page>&<per_page>")]
14pub async fn list_instances_by_region(
15 platform_id: i64,
16 app_id: i64,
17 region_id: i64,
18 page: Option<i64>,
19 per_page: Option<i64>,
20 db_manager: &State<Arc<DatabaseManager>>,
21) -> Result<Json<Value>, (Status, Json<Value>)> {
22 let platform = match db::platforms::get_platform_by_id(db_manager.get_main_pool(), platform_id).await {
24 Ok(platform) => platform,
25 Err(_) => {
26 return Err((
27 Status::NotFound,
28 Json(json!({
29 "error": "Platform not found",
30 "message": format!("Platform with ID {} does not exist", platform_id)
31 }))
32 ));
33 }
34 };
35
36 let pool = match db_manager.get_platform_pool(&platform.name, platform_id).await {
38 Ok(pool) => pool,
39 Err(_) => {
40 return Err((
41 Status::InternalServerError,
42 Json(json!({
43 "error": "Database error",
44 "message": "Failed to connect to platform database"
45 }))
46 ));
47 }
48 };
49
50 let page = page.unwrap_or(1);
52 let per_page = per_page.unwrap_or(10);
53
54 let instances = match db::instance::list_instances_by_region(&pool, region_id, app_id, page, per_page).await {
55 Ok(instances) => instances,
56 Err(_) => {
57 return Err((
58 Status::InternalServerError,
59 Json(json!({
60 "error": "Database error",
61 "message": "Failed to list instances by region"
62 }))
63 ));
64 }
65 };
66
67 let instances_vec: Vec<Instance> = instances.into_iter().collect();
68
69 Ok(Json(json!({
70 "instances": instances_vec,
71 "pagination": {
72 "page": page,
73 "per_page": per_page
74 }
75 })))
76}