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
13pub fn router(state: Arc<AppState>) -> Router {
15 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/cluster/backups", get(handlers::cluster_backups))
39 .route(
40 "/api/v1/cluster/backups/trigger",
41 post(handlers::trigger_cluster_backup),
42 )
43 .route("/api/v1/cluster/networks", get(handlers::cluster_networks))
44 .route("/api/v1/ask", post(handlers::ask::ask))
45 .route("/api/v1/alerts", get(handlers::alerts::list))
46 .route("/api/v1/alerts/{id}", get(handlers::alerts::view))
47 .route("/api/v1/alerts/{id}/reply", post(handlers::alerts::reply))
48 .route(
49 "/api/v1/alerts/{id}/dismiss",
50 post(handlers::alerts::dismiss),
51 )
52 .route(
53 "/api/v1/alerts/{id}/resolve",
54 post(handlers::alerts::resolve),
55 )
56 .route("/api/v1/secrets", get(handlers::secrets::list_secrets))
57 .route(
58 "/api/v1/secrets/usage",
59 get(handlers::secrets::secrets_usage),
60 )
61 .route("/api/v1/secrets/{key}", post(handlers::secrets::set_secret))
62 .route(
63 "/api/v1/secrets/{key}",
64 delete(handlers::secrets::remove_secret),
65 )
66 .merge(webhook::webhook_router())
67 .merge(cluster_handlers::cluster_router())
68 .layer(axum::middleware::from_fn_with_state(
69 state.clone(),
70 auth_middleware,
71 ))
72 .with_state(state);
73
74 public.merge(authed)
75}