omni_orchestrator/schemas/v1/api/deployments/
create.rs1use 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#[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 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 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, ).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}