vibe_graph_api/routes/
mod.rs1pub mod file;
4pub mod git;
5mod graph;
6mod health;
7pub mod ops;
8
9use std::path::PathBuf;
10use std::sync::Arc;
11
12use axum::{
13 routing::{delete, get, post},
14 Router,
15};
16use tower_http::cors::{Any, CorsLayer};
17use tower_http::trace::{DefaultMakeSpan, DefaultOnResponse, TraceLayer};
18use tracing::Level;
19use vibe_graph_ops::OpsContext;
20
21use crate::types::ApiState;
22use crate::ws::ws_handler;
23use file::FileState;
24use git::GitOpsState;
25use ops::OpsState;
26
27pub fn create_api_router(state: Arc<ApiState>) -> Router {
29 let cors = CorsLayer::new()
30 .allow_origin(Any)
31 .allow_methods(Any)
32 .allow_headers(Any);
33
34 Router::new()
35 .route("/health", get(health::health_handler))
37 .route("/graph", get(graph::graph_handler))
39 .route("/graph/nodes", get(graph::nodes_handler))
40 .route("/graph/edges", get(graph::edges_handler))
41 .route("/graph/metadata", get(graph::metadata_handler))
42 .route("/git/changes", get(git::changes_handler))
44 .route("/ws", get(ws_handler))
46 .layer(
48 TraceLayer::new_for_http()
49 .make_span_with(
50 DefaultMakeSpan::new()
51 .level(Level::INFO)
52 .include_headers(false),
53 )
54 .on_response(DefaultOnResponse::new().level(Level::INFO)),
55 )
56 .layer(cors)
57 .with_state(state)
58}
59
60pub fn create_ops_router(ctx: OpsContext) -> Router {
65 let state = Arc::new(OpsState { ctx });
66
67 let cors = CorsLayer::new()
68 .allow_origin(Any)
69 .allow_methods(Any)
70 .allow_headers(Any);
71
72 Router::new()
73 .route("/sync", post(ops::sync_handler))
75 .route("/sync", get(ops::sync_query_handler))
76 .route("/graph", post(ops::graph_handler))
78 .route("/graph", get(ops::graph_query_handler))
79 .route("/status", get(ops::status_handler))
81 .route("/load", get(ops::load_handler))
83 .route("/clean", delete(ops::clean_handler))
85 .route("/git-changes", get(ops::git_changes_handler))
87 .layer(
89 TraceLayer::new_for_http()
90 .make_span_with(
91 DefaultMakeSpan::new()
92 .level(Level::INFO)
93 .include_headers(false),
94 )
95 .on_response(DefaultOnResponse::new().level(Level::INFO)),
96 )
97 .layer(cors)
98 .with_state(state)
99}
100
101pub fn create_git_commands_router(workspace_path: PathBuf) -> Router {
113 let state = Arc::new(GitOpsState::single_repo(workspace_path));
114 build_git_commands_router(state)
115}
116
117pub fn create_git_commands_router_multi(
124 workspace_path: PathBuf,
125 repos: Vec<(String, PathBuf)>,
126) -> Router {
127 let state = Arc::new(GitOpsState::multi_repo(workspace_path, repos));
128 build_git_commands_router(state)
129}
130
131pub fn create_file_router(workspace_path: PathBuf) -> Router {
135 let state = Arc::new(FileState {
136 workspace_root: workspace_path,
137 });
138
139 Router::new()
140 .route("/", get(file::file_handler))
141 .with_state(state)
142}
143
144fn build_git_commands_router(state: Arc<GitOpsState>) -> Router {
146 let cors = CorsLayer::new()
147 .allow_origin(Any)
148 .allow_methods(Any)
149 .allow_headers(Any);
150
151 Router::new()
152 .route("/repos", get(git::repos_handler))
154 .route("/add", post(git::add_handler))
156 .route("/commit", post(git::commit_handler))
158 .route("/reset", post(git::reset_handler))
160 .route("/branches", get(git::branches_handler))
162 .route("/checkout", post(git::checkout_handler))
164 .route("/log", get(git::log_handler))
166 .route("/diff", get(git::diff_handler))
168 .layer(
169 TraceLayer::new_for_http()
170 .make_span_with(
171 DefaultMakeSpan::new()
172 .level(Level::INFO)
173 .include_headers(false),
174 )
175 .on_response(DefaultOnResponse::new().level(Level::INFO)),
176 )
177 .layer(cors)
178 .with_state(state)
179}
180
181pub fn create_full_api_router(api_state: Arc<ApiState>, ops_ctx: OpsContext) -> Router {
187 let cors = CorsLayer::new()
188 .allow_origin(Any)
189 .allow_methods(Any)
190 .allow_headers(Any);
191
192 let ops_router = create_ops_router(ops_ctx);
194
195 let viz_router = Router::new()
197 .route("/health", get(health::health_handler))
198 .route("/graph", get(graph::graph_handler))
199 .route("/graph/nodes", get(graph::nodes_handler))
200 .route("/graph/edges", get(graph::edges_handler))
201 .route("/graph/metadata", get(graph::metadata_handler))
202 .route("/git/changes", get(git::changes_handler))
203 .route("/ws", get(ws_handler))
204 .with_state(api_state);
205
206 Router::new()
208 .nest("/ops", ops_router)
209 .merge(viz_router)
210 .layer(
211 TraceLayer::new_for_http()
212 .make_span_with(
213 DefaultMakeSpan::new()
214 .level(Level::INFO)
215 .include_headers(false),
216 )
217 .on_response(DefaultOnResponse::new().level(Level::INFO)),
218 )
219 .layer(cors)
220}
221
222pub fn create_full_api_router_with_git(
229 api_state: Arc<ApiState>,
230 ops_ctx: OpsContext,
231 workspace_path: PathBuf,
232) -> Router {
233 let git_cmd_router = create_git_commands_router(workspace_path.clone());
234 let file_router = create_file_router(workspace_path);
235 build_full_api_router_with_git_router(api_state, ops_ctx, git_cmd_router, file_router)
236}
237
238pub fn create_full_api_router_with_git_multi(
246 api_state: Arc<ApiState>,
247 ops_ctx: OpsContext,
248 workspace_path: PathBuf,
249 repos: Vec<(String, PathBuf)>,
250) -> Router {
251 let git_cmd_router = create_git_commands_router_multi(workspace_path.clone(), repos);
252 let file_router = create_file_router(workspace_path);
253 build_full_api_router_with_git_router(api_state, ops_ctx, git_cmd_router, file_router)
254}
255
256fn build_full_api_router_with_git_router(
258 api_state: Arc<ApiState>,
259 ops_ctx: OpsContext,
260 git_cmd_router: Router,
261 file_router: Router,
262) -> Router {
263 let cors = CorsLayer::new()
264 .allow_origin(Any)
265 .allow_methods(Any)
266 .allow_headers(Any);
267
268 let ops_router = create_ops_router(ops_ctx);
270
271 let viz_router = Router::new()
273 .route("/health", get(health::health_handler))
274 .route("/graph", get(graph::graph_handler))
275 .route("/graph/nodes", get(graph::nodes_handler))
276 .route("/graph/edges", get(graph::edges_handler))
277 .route("/graph/metadata", get(graph::metadata_handler))
278 .route("/git/changes", get(git::changes_handler))
279 .route("/ws", get(ws_handler))
280 .with_state(api_state);
281
282 Router::new()
284 .nest("/ops", ops_router)
285 .nest("/git/cmd", git_cmd_router)
286 .nest("/file", file_router)
287 .merge(viz_router)
288 .layer(
289 TraceLayer::new_for_http()
290 .make_span_with(
291 DefaultMakeSpan::new()
292 .level(Level::INFO)
293 .include_headers(false),
294 )
295 .on_response(DefaultOnResponse::new().level(Level::INFO)),
296 )
297 .layer(cors)
298}