vibe_graph_api/routes/
mod.rs1pub mod git;
4mod graph;
5mod health;
6pub mod ops;
7
8use std::path::PathBuf;
9use std::sync::Arc;
10
11use axum::{
12 routing::{delete, get, post},
13 Router,
14};
15use tower_http::cors::{Any, CorsLayer};
16use tower_http::trace::{DefaultMakeSpan, DefaultOnResponse, TraceLayer};
17use tracing::Level;
18use vibe_graph_ops::OpsContext;
19
20use crate::types::ApiState;
21use crate::ws::ws_handler;
22use git::GitOpsState;
23use ops::OpsState;
24
25pub fn create_api_router(state: Arc<ApiState>) -> Router {
27 let cors = CorsLayer::new()
28 .allow_origin(Any)
29 .allow_methods(Any)
30 .allow_headers(Any);
31
32 Router::new()
33 .route("/health", get(health::health_handler))
35 .route("/graph", get(graph::graph_handler))
37 .route("/graph/nodes", get(graph::nodes_handler))
38 .route("/graph/edges", get(graph::edges_handler))
39 .route("/graph/metadata", get(graph::metadata_handler))
40 .route("/git/changes", get(git::changes_handler))
42 .route("/ws", get(ws_handler))
44 .layer(
46 TraceLayer::new_for_http()
47 .make_span_with(
48 DefaultMakeSpan::new()
49 .level(Level::INFO)
50 .include_headers(false),
51 )
52 .on_response(DefaultOnResponse::new().level(Level::INFO)),
53 )
54 .layer(cors)
55 .with_state(state)
56}
57
58pub fn create_ops_router(ctx: OpsContext) -> Router {
63 let state = Arc::new(OpsState { ctx });
64
65 let cors = CorsLayer::new()
66 .allow_origin(Any)
67 .allow_methods(Any)
68 .allow_headers(Any);
69
70 Router::new()
71 .route("/sync", post(ops::sync_handler))
73 .route("/sync", get(ops::sync_query_handler))
74 .route("/graph", post(ops::graph_handler))
76 .route("/graph", get(ops::graph_query_handler))
77 .route("/status", get(ops::status_handler))
79 .route("/load", get(ops::load_handler))
81 .route("/clean", delete(ops::clean_handler))
83 .route("/git-changes", get(ops::git_changes_handler))
85 .layer(
87 TraceLayer::new_for_http()
88 .make_span_with(
89 DefaultMakeSpan::new()
90 .level(Level::INFO)
91 .include_headers(false),
92 )
93 .on_response(DefaultOnResponse::new().level(Level::INFO)),
94 )
95 .layer(cors)
96 .with_state(state)
97}
98
99pub fn create_git_commands_router(workspace_path: PathBuf) -> Router {
111 let state = Arc::new(GitOpsState::single_repo(workspace_path));
112 build_git_commands_router(state)
113}
114
115pub fn create_git_commands_router_multi(
122 workspace_path: PathBuf,
123 repos: Vec<(String, PathBuf)>,
124) -> Router {
125 let state = Arc::new(GitOpsState::multi_repo(workspace_path, repos));
126 build_git_commands_router(state)
127}
128
129fn build_git_commands_router(state: Arc<GitOpsState>) -> Router {
131 let cors = CorsLayer::new()
132 .allow_origin(Any)
133 .allow_methods(Any)
134 .allow_headers(Any);
135
136 Router::new()
137 .route("/repos", get(git::repos_handler))
139 .route("/add", post(git::add_handler))
141 .route("/commit", post(git::commit_handler))
143 .route("/reset", post(git::reset_handler))
145 .route("/branches", get(git::branches_handler))
147 .route("/checkout", post(git::checkout_handler))
149 .route("/log", get(git::log_handler))
151 .route("/diff", get(git::diff_handler))
153 .layer(
154 TraceLayer::new_for_http()
155 .make_span_with(
156 DefaultMakeSpan::new()
157 .level(Level::INFO)
158 .include_headers(false),
159 )
160 .on_response(DefaultOnResponse::new().level(Level::INFO)),
161 )
162 .layer(cors)
163 .with_state(state)
164}
165
166pub fn create_full_api_router(api_state: Arc<ApiState>, ops_ctx: OpsContext) -> Router {
172 let cors = CorsLayer::new()
173 .allow_origin(Any)
174 .allow_methods(Any)
175 .allow_headers(Any);
176
177 let ops_router = create_ops_router(ops_ctx);
179
180 let viz_router = Router::new()
182 .route("/health", get(health::health_handler))
183 .route("/graph", get(graph::graph_handler))
184 .route("/graph/nodes", get(graph::nodes_handler))
185 .route("/graph/edges", get(graph::edges_handler))
186 .route("/graph/metadata", get(graph::metadata_handler))
187 .route("/git/changes", get(git::changes_handler))
188 .route("/ws", get(ws_handler))
189 .with_state(api_state);
190
191 Router::new()
193 .nest("/ops", ops_router)
194 .merge(viz_router)
195 .layer(
196 TraceLayer::new_for_http()
197 .make_span_with(
198 DefaultMakeSpan::new()
199 .level(Level::INFO)
200 .include_headers(false),
201 )
202 .on_response(DefaultOnResponse::new().level(Level::INFO)),
203 )
204 .layer(cors)
205}
206
207pub fn create_full_api_router_with_git(
214 api_state: Arc<ApiState>,
215 ops_ctx: OpsContext,
216 workspace_path: PathBuf,
217) -> Router {
218 let git_cmd_router = create_git_commands_router(workspace_path);
219 build_full_api_router_with_git_router(api_state, ops_ctx, git_cmd_router)
220}
221
222pub fn create_full_api_router_with_git_multi(
229 api_state: Arc<ApiState>,
230 ops_ctx: OpsContext,
231 workspace_path: PathBuf,
232 repos: Vec<(String, PathBuf)>,
233) -> Router {
234 let git_cmd_router = create_git_commands_router_multi(workspace_path, repos);
235 build_full_api_router_with_git_router(api_state, ops_ctx, git_cmd_router)
236}
237
238fn build_full_api_router_with_git_router(
240 api_state: Arc<ApiState>,
241 ops_ctx: OpsContext,
242 git_cmd_router: Router,
243) -> Router {
244 let cors = CorsLayer::new()
245 .allow_origin(Any)
246 .allow_methods(Any)
247 .allow_headers(Any);
248
249 let ops_router = create_ops_router(ops_ctx);
251
252 let viz_router = Router::new()
254 .route("/health", get(health::health_handler))
255 .route("/graph", get(graph::graph_handler))
256 .route("/graph/nodes", get(graph::nodes_handler))
257 .route("/graph/edges", get(graph::edges_handler))
258 .route("/graph/metadata", get(graph::metadata_handler))
259 .route("/git/changes", get(git::changes_handler))
260 .route("/ws", get(ws_handler))
261 .with_state(api_state);
262
263 Router::new()
265 .nest("/ops", ops_router)
266 .nest("/git/cmd", git_cmd_router)
267 .merge(viz_router)
268 .layer(
269 TraceLayer::new_for_http()
270 .make_span_with(
271 DefaultMakeSpan::new()
272 .level(Level::INFO)
273 .include_headers(false),
274 )
275 .on_response(DefaultOnResponse::new().level(Level::INFO)),
276 )
277 .layer(cors)
278}