omni_orchestrator/schemas/v1/api/
instances.rs1use 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#[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 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 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 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#[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 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 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("/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 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 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