omni_orchestrator/schemas/v1/api/
platforms.rs

1use crate::db_manager::{self, DatabaseManager};
2use rocket::{get, post, delete};
3use rocket::serde::json::Json;
4use rocket::http::Status;
5use std::sync::Arc;
6use rocket::State;
7use log::{info, error}; // Add logging
8
9// Import the types we need
10use libomni::types::db::v1 as types;
11use types::platform::Platform;
12
13#[get("/platforms")]
14pub async fn list_platforms(db_manager: &State<Arc<DatabaseManager>>) -> Json<Vec<Platform>> {
15    info!("Listing all platforms");
16    let platforms = db_manager.get_all_platforms().await.unwrap_or_default();
17    Json(platforms)
18}
19
20#[post("/platforms", data = "<platform_data>")]
21pub async fn add_platform(
22    platform_data: Json<Platform>,
23    db_manager: &State<Arc<DatabaseManager>>
24) -> Status {
25    info!("Adding new platform: {:?}", platform_data.name);
26
27    // Make a mutable copy to modify fields
28    let mut platform = platform_data.into_inner();
29    if platform.table_name.is_none() {
30        platform.table_name = Some(format!("omni_p_{}", platform.name));
31    }
32    if platform.subdomain.is_none() {
33        platform.subdomain = Some(platform.name.clone());
34    }
35
36    info!("Platform Data: {:?}", platform);
37
38    match db_manager.create_platform(
39        db_manager,
40        platform.clone()
41    ).await {
42        Ok(platform_id) => {
43            info!("Platform created with id: {}", platform_id);
44            if let Err(_e) = db_manager.get_platform_pool(&platform.name, platform_id).await {
45                error!("Failed to initialize connection pool for platform: {}", platform.name);
46                return Status::InternalServerError;
47            }
48            Status::Created
49        }
50        Err(e) => {
51            error!("Failed to create platform: {:?}", e);
52            Status::InternalServerError
53        }
54    }
55}
56
57#[delete("/platforms/<platform_id>")]
58pub async fn remove_platform(
59    platform_id: i64,
60    db_manager: &State<Arc<DatabaseManager>>
61) -> Status {
62    info!("Removing platform with id: {}", platform_id);
63    match db_manager.delete_platform(platform_id).await {
64        Ok(_) => {
65            info!("Platform {} removed successfully", platform_id);
66            Status::NoContent
67        },
68        Err(e) => {
69            error!("Failed to remove platform {}: {:?}", platform_id, e);
70            Status::InternalServerError
71        }
72    }
73}