omni_orchestrator/schemas/v1/api/deployments/
create.rs

1use std::sync::Arc;
2use crate::DatabaseManager;
3use super::super::super::db::queries as db;
4use super::types::CreateDeploymentRequest;
5use rocket::http::Status;
6use rocket::serde::json::{json, Json, Value};
7use rocket::{post, State};
8
9use libomni::types::db::v1 as types;
10use types::deployment::Deployment;
11
12/// Create a new deployment.
13#[post("/platform/<platform_id>/deployments", format = "json", data = "<deployment_request>")]
14pub async fn create_deployment(
15    platform_id: i64,
16    deployment_request: Json<CreateDeploymentRequest>,
17    db_manager: &State<Arc<DatabaseManager>>,
18) -> Result<Json<Deployment>, (Status, Json<Value>)> {
19    // Get platform information
20    let platform = match db::platforms::get_platform_by_id(db_manager.get_main_pool(), platform_id).await {
21        Ok(platform) => platform,
22        Err(_) => {
23            return Err((
24                Status::NotFound,
25                Json(json!({
26                    "error": "Platform not found",
27                    "message": format!("Platform with ID {} does not exist", platform_id)
28                }))
29            ));
30        }
31    };
32
33    // Get platform-specific database pool
34    let pool = match db_manager.get_platform_pool(&platform.name, platform_id).await {
35        Ok(pool) => pool,
36        Err(_) => {
37            return Err((
38                Status::InternalServerError,
39                Json(json!({
40                    "error": "Database error",
41                    "message": "Failed to connect to platform database"
42                }))
43            ));
44        }
45    };
46
47    match db::deployment::create_deployment(
48        &pool,
49        deployment_request.app_id,
50        deployment_request.build_id,
51        &deployment_request.version,
52        &deployment_request.deployment_strategy,
53        deployment_request.previous_deployment_id,
54        deployment_request.canary_percentage,
55        deployment_request.environment_variables.clone(),
56        deployment_request.annotations.clone(),
57        deployment_request.labels.clone(),
58        None, // created_by would typically come from auth middleware
59    ).await {
60        Ok(deployment) => Ok(Json(deployment)),
61        Err(e) => Err((
62            Status::InternalServerError,
63            Json(json!({
64                "error": "Failed to create deployment",
65                "message": e.to_string()
66            }))
67        )),
68    }
69}