Skip to main content

orca_control/api/
mod.rs

1use std::sync::Arc;
2
3use axum::Router;
4use axum::routing::{delete, get, post};
5
6use crate::auth::auth_middleware;
7use crate::cluster_handlers;
8use crate::state::AppState;
9use crate::webhook;
10
11mod handlers;
12
13/// Build the axum router for the API.
14pub fn router(state: Arc<AppState>) -> Router {
15    // Unauthenticated routes (metrics, WS agent endpoint).
16    // WS does its own token auth via query param.
17    let public = Router::new()
18        .route("/metrics", get(crate::metrics::metrics_handler))
19        .route("/api/v1/ws/agent", get(crate::ws_handler::ws_agent_handler))
20        .with_state(state.clone());
21
22    let authed = Router::new()
23        .route("/api/v1/health", get(handlers::health))
24        .route("/api/v1/deploy", post(handlers::deploy))
25        .route("/api/v1/status", get(handlers::status))
26        .route("/api/v1/services/{name}/logs", get(handlers::logs))
27        .route(
28            "/api/v1/services/{name}/exec",
29            get(handlers::exec::exec_ws_handler),
30        )
31        .route("/api/v1/services/{name}/scale", post(handlers::scale))
32        .route("/api/v1/services/{name}/rollback", post(handlers::rollback))
33        .route("/api/v1/services/{name}/redeploy", post(handlers::redeploy))
34        .route("/api/v1/services/{name}/promote", post(handlers::promote))
35        .route("/api/v1/services/{name}", delete(handlers::stop_service))
36        .route("/api/v1/projects/{project}", delete(handlers::stop_project))
37        .route("/api/v1/stop", post(handlers::stop_all))
38        .route("/api/v1/secrets", get(handlers::secrets::list_secrets))
39        .route("/api/v1/secrets/{key}", post(handlers::secrets::set_secret))
40        .route(
41            "/api/v1/secrets/{key}",
42            delete(handlers::secrets::remove_secret),
43        )
44        .merge(webhook::webhook_router())
45        .merge(cluster_handlers::cluster_router())
46        .layer(axum::middleware::from_fn_with_state(
47            state.clone(),
48            auth_middleware,
49        ))
50        .with_state(state);
51
52    public.merge(authed)
53}