vibe_graph_api/routes/
mod.rs

1//! API route handlers.
2
3mod git;
4mod graph;
5mod health;
6
7use std::sync::Arc;
8
9use axum::{routing::get, Router};
10use tower_http::cors::{Any, CorsLayer};
11use tower_http::trace::{DefaultMakeSpan, DefaultOnResponse, TraceLayer};
12use tracing::Level;
13
14use crate::types::ApiState;
15use crate::ws::ws_handler;
16
17/// Create the API router with all endpoints.
18pub fn create_api_router(state: Arc<ApiState>) -> Router {
19    let cors = CorsLayer::new()
20        .allow_origin(Any)
21        .allow_methods(Any)
22        .allow_headers(Any);
23
24    Router::new()
25        // Health
26        .route("/health", get(health::health_handler))
27        // Graph endpoints
28        .route("/graph", get(graph::graph_handler))
29        .route("/graph/nodes", get(graph::nodes_handler))
30        .route("/graph/edges", get(graph::edges_handler))
31        .route("/graph/metadata", get(graph::metadata_handler))
32        // Git endpoints
33        .route("/git/changes", get(git::changes_handler))
34        // WebSocket
35        .route("/ws", get(ws_handler))
36        // Request tracing (enable with RUST_LOG=tower_http=info or higher)
37        .layer(
38            TraceLayer::new_for_http()
39                .make_span_with(
40                    DefaultMakeSpan::new()
41                        .level(Level::INFO)
42                        .include_headers(false),
43                )
44                .on_response(DefaultOnResponse::new().level(Level::INFO)),
45        )
46        .layer(cors)
47        .with_state(state)
48}