use axum::{
Router,
extract::DefaultBodyLimit,
routing::{delete, get, post},
};
use http::Method;
use tower_http::cors::{self, CorsLayer};
use crate::{
AppError, AppState, DynamicRouterService,
model::{GLOBAL_SSE_MCP_ROUTES_PREFIX, GLOBAL_STREAM_MCP_ROUTES_PREFIX, McpProtocol},
server::handlers::check_mcp_is_status_handler,
};
use super::{
get_health, get_ready,
handlers::{
add_route_handler, check_mcp_status_handler_sse, check_mcp_status_handler_stream,
delete_route_handler, run_code_handler,
},
set_layer,
};
pub async fn get_router(state: AppState) -> Result<Router, AppError> {
let health = Router::new()
.route("/health", get(get_health))
.route("/ready", get(get_ready));
let cors = CorsLayer::new()
.allow_methods([
Method::GET,
Method::POST,
Method::PATCH,
Method::DELETE,
Method::PUT,
])
.allow_origin(cors::Any)
.allow_headers(cors::Any);
let api = Router::new()
.route_service(
&format!("{GLOBAL_SSE_MCP_ROUTES_PREFIX}/proxy/{{*path}}"),
DynamicRouterService(McpProtocol::Sse),
)
.route(
&format!("{GLOBAL_SSE_MCP_ROUTES_PREFIX}/add"),
post(add_route_handler),
)
.route("/mcp/config/delete/{mcp_id}", delete(delete_route_handler))
.route(
"/mcp/check/status/{mcp_id}",
get(check_mcp_is_status_handler),
)
.route(
&format!("{GLOBAL_SSE_MCP_ROUTES_PREFIX}/check_status"),
post(check_mcp_status_handler_sse),
)
.route_service(
&format!("{GLOBAL_STREAM_MCP_ROUTES_PREFIX}/proxy/{{*path}}"),
DynamicRouterService(McpProtocol::Stream),
)
.route(
&format!("{GLOBAL_STREAM_MCP_ROUTES_PREFIX}/check_status"),
post(check_mcp_status_handler_stream),
)
.route("/api/run_code_with_log", post(run_code_handler))
.layer(DefaultBodyLimit::max(20 * 1024 * 1024))
.layer(tower_http::catch_panic::CatchPanicLayer::new())
.layer(cors);
let app: Router<AppState> = Router::new().merge(health).merge(api);
let app = app.merge(super::openapi::create_docs_router());
let app = app.with_state(state.clone());
let router = set_layer(app, state);
Ok(router)
}