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

1use 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/// List all instances by `region_id` and `app_id`
13#[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    // Get platform information
23    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    // Get platform-specific database pool
37    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    // Default to page 1 and 10 items per page
51    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}