use crate::common::model::message::TaskEvent;
use crate::engine::api::auth::auth_middleware;
use crate::engine::api::control::{get_nodes, pause_engine, resume_engine};
use crate::engine::api::dlq::get_dlq;
use crate::engine::api::health;
use crate::engine::api::limit;
use crate::engine::api::observability;
use crate::engine::api::state::ApiState;
use crate::queue::QueuedItem;
use axum::extract::State;
use axum::routing::{get, post};
use axum::{Json, Router, middleware};
use tower_http::cors::CorsLayer;
pub fn router(state: ApiState) -> Router {
let protected_routes = Router::new()
.route("/start_work", post(start_work))
.route("/nodes", get(get_nodes))
.route("/dlq", get(get_dlq))
.route("/control/pause", post(pause_engine))
.route("/control/resume", post(resume_engine))
.route_layer(middleware::from_fn_with_state(
state.clone(),
auth_middleware,
));
let rate_limited_routes = Router::new()
.route("/metrics", get(metrics_handler))
.route("/observability/cluster", get(observability::cluster_status))
.route("/observability/engine", get(observability::engine_stats))
.route("/observability/system", get(observability::system_stats))
.route("/observability/logs", get(observability::recent_logs))
.merge(protected_routes)
.route_layer(middleware::from_fn_with_state(
state.clone(),
limit::rate_limit_middleware,
));
let health_route = Router::new()
.route("/", get(dashboard_page))
.route("/health", get(health::health_check));
rate_limited_routes
.merge(health_route)
.with_state(state)
.layer(CorsLayer::permissive())
}
async fn dashboard_page() -> axum::response::Html<&'static str> {
axum::response::Html(include_str!("../../../dashboard/index.html"))
}
pub async fn metrics_handler(State(state): State<ApiState>) -> String {
if let Some(handle) = &state.prometheus_handle {
handle.render()
} else {
"Prometheus metrics not available (recorder not initialized)".to_string()
}
}
pub async fn start_work(State(app_state): State<ApiState>, Json(task): Json<TaskEvent>) {
let task_pop_chain = app_state.queue_manager.get_task_push_channel().clone();
if let Err(e) = task_pop_chain.send(QueuedItem::new(task)).await {
log::error!("Failed to send task to processing channel: {}", e);
}
}