routes.rsโข7.99 kB
use crate::{
auth_middleware, enhanced_health, handlers, health, rest, service_registry, streaming_handlers,
vector_handlers, versioning_handlers, AppState, RateLimitManager,
};
use axum::response::Html;
use axum::{
middleware,
routing::{get, post},
Router,
};
use http::header::{HeaderName, HeaderValue, CACHE_CONTROL, CONNECTION};
use std::str::FromStr;
use std::time::Duration;
use tower_http::{
compression::CompressionLayer,
cors::CorsLayer,
set_header::SetResponseHeaderLayer,
trace::TraceLayer,
};
#[cfg(feature = "openapi-ui")]
use utoipa_swagger_ui::SwaggerUi;
use utoipa::OpenApi;
pub fn create_router(state: AppState) -> Router {
// GraphQL schema disabled in this build
let mut app = Router::new()
// Health and readiness checks
.route("/health", get(health::comprehensive_health_check))
.route(
"/health/enhanced",
get(enhanced_health::enhanced_health_check),
)
.route("/health/live", get(health::liveness_check))
.route("/health/ready", get(health::readiness_check))
.route("/metrics", get(handlers::metrics_handler))
// GraphQL endpoint disabled in this build to avoid version conflicts
// GraphiQL disabled in this build
// Subscriptions disabled in this build to avoid axum version mismatch
// Node operations
.route("/nodes/:id", get(handlers::get_node))
.route("/nodes/:id/similar", get(handlers::find_similar))
// Parsing
.route("/parse", post(handlers::parse_file))
// Search
.route("/search", get(handlers::search_nodes))
// Streaming endpoints for large datasets
.route(
"/stream/search",
get(streaming_handlers::stream_search_results),
)
.route(
"/stream/dataset",
get(streaming_handlers::stream_large_dataset),
)
.route("/stream/csv", get(streaming_handlers::stream_csv_results))
.route(
"/stream/:id/metadata",
get(streaming_handlers::get_stream_metadata),
)
.route(
"/stream/stats",
get(streaming_handlers::get_flow_control_stats),
)
// Advanced vector search
.route("/vector/search", post(vector_handlers::vector_search))
.route(
"/vector/batch-search",
post(vector_handlers::batch_vector_search),
)
.route("/vector/index/stats", get(vector_handlers::get_index_stats))
.route(
"/vector/index/config",
get(vector_handlers::get_index_config),
)
.route(
"/vector/index/rebuild",
post(vector_handlers::rebuild_index),
)
.route(
"/vector/performance",
get(vector_handlers::get_search_performance),
)
// Batch operations
.route(
"/batch/operations",
post(vector_handlers::submit_batch_operations),
)
.route("/batch/status", get(vector_handlers::get_batch_status))
// Transaction Management
.route(
"/transactions",
post(versioning_handlers::begin_transaction),
)
.route(
"/transactions/:id/commit",
post(versioning_handlers::commit_transaction),
)
.route(
"/transactions/:id/rollback",
post(versioning_handlers::rollback_transaction),
)
// Version Management
.route("/versions", post(versioning_handlers::create_version))
.route("/versions", get(versioning_handlers::list_versions))
.route("/versions/:id", get(versioning_handlers::get_version))
.route("/versions/:id/tag", post(versioning_handlers::tag_version))
.route(
"/versions/:from/compare/:to",
get(versioning_handlers::compare_versions),
)
// Branch Management
.route("/branches", post(versioning_handlers::create_branch))
.route("/branches", get(versioning_handlers::list_branches))
.route("/branches/:name", get(versioning_handlers::get_branch))
.route(
"/branches/:name",
axum::routing::delete(versioning_handlers::delete_branch),
)
// Merge Operations
.route("/merge", post(versioning_handlers::merge_branches))
.route(
"/merge/:id/resolve",
post(versioning_handlers::resolve_conflicts),
)
// Snapshot Management
.route(
"/snapshots/:transaction_id",
post(versioning_handlers::create_snapshot),
)
.route("/snapshots/:id", get(versioning_handlers::get_snapshot))
// Statistics and Monitoring
.route(
"/stats/transactions",
get(versioning_handlers::get_transaction_stats),
)
.route(
"/stats/recovery",
get(versioning_handlers::get_recovery_stats),
)
.route(
"/integrity/check",
post(versioning_handlers::run_integrity_check),
)
// Backup and Recovery
.route("/backup", post(versioning_handlers::create_backup))
.route(
"/backup/:id/restore",
post(versioning_handlers::restore_from_backup),
)
// HTTP/2 routes disabled in this build
// Service Discovery and Registration
.route(
"/services",
post(service_registry::register_service_handler),
)
.route("/services", get(service_registry::list_services_handler))
.route(
"/services/discover",
get(service_registry::discover_services_handler),
)
.route("/services/:id", get(service_registry::get_service_handler))
.route(
"/services/:id",
axum::routing::delete(service_registry::deregister_service_handler),
)
.route(
"/services/heartbeat",
post(service_registry::heartbeat_handler),
)
// Add state
.with_state(state.clone())
// Add middleware (order matters)
.layer(middleware::from_fn(crate::metrics::http_metrics_middleware))
.layer(
CorsLayer::new()
.allow_origin(tower_http::cors::Any)
.allow_methods(tower_http::cors::Any)
.allow_headers(tower_http::cors::Any),
)
// Adaptive response compression (gzip, deflate, brotli, zstd)
.layer(CompressionLayer::new())
// Keep-alive and backpressure layers omitted in this build
.layer(TraceLayer::new_for_http());
// Versioned REST API (v1)
let v1_get = Router::new()
.route("/search", get(rest::handlers::get_search))
.route("/node/:id", get(rest::handlers::get_node))
.route("/graph/neighbors", get(rest::handlers::get_neighbors))
// Add caching headers for GET endpoints
.layer({
let value = HeaderValue::from_static("public, max-age=60");
SetResponseHeaderLayer::if_not_present(CACHE_CONTROL, value)
})
.with_state(state.clone());
let v1_post = Router::new()
.route("/index", post(rest::handlers::post_index))
.with_state(state.clone());
let v1_router = Router::new().merge(v1_get).merge(v1_post);
app = app.nest("/v1", v1_router);
#[cfg(feature = "openapi-ui")]
{
app = app.merge(SwaggerUi::new("/v1/docs").url(
"/v1/openapi.json",
crate::rest::ApiDoc::openapi(),
));
}
// Memory leak detection routes (only when feature enabled)
#[cfg(feature = "leak-detect")]
{
let leak_routes = Router::new()
.route("/memory/stats", get(handlers::memory_stats))
.route("/memory/leaks", get(handlers::export_leak_report));
app = app.merge(leak_routes);
}
app
}