vane 0.9.2

A flow-based reverse proxy with multi-layer routing and programmable pipelines.
/* src/api/router.rs */

use crate::api::handlers::{
	applications, certs, config, flow, nodes, plugins, ports, resolvers, system,
};
use crate::api::middleware::{auth, logger};
#[cfg(feature = "swagger-ui")]
use crate::api::openapi;

#[cfg(feature = "swagger-ui")]
use axum::response::Redirect;
use axum::routing::{get, post};
use axum::{Router, middleware};

#[cfg(feature = "swagger-ui")]
use utoipa::OpenApi;
#[cfg(feature = "swagger-ui")]
use utoipa_swagger_ui::SwaggerUi;

#[cfg(feature = "console")]
pub fn create_router() -> Router {
	let router = Router::new();

	#[cfg(feature = "swagger-ui")]
	let router = router
		.merge(
			SwaggerUi::new("/swagger-ui").url("/.well-known/openapi.json", openapi::ApiDoc::openapi()),
		)
		.route("/", get(|| async { Redirect::temporary("/swagger-ui") }));

	#[cfg(not(feature = "swagger-ui"))]
	let router = router.route("/", get(system::root_handler));

	router
		.route("/system", get(system::root_handler))
		.route("/health", get(system::health_handler))
		.merge(
			Router::new()
				.route("/status", get(system::status_handler))
				.nest(
					"/ports",
					Router::new()
						.route("/", get(ports::list_ports_handler))
						.route(
							"/{port}",
							get(ports::get_port_handler)
								.post(ports::create_port_handler)
								.delete(ports::delete_port_handler),
						)
						.route(
							"/{port}/{protocol}",
							post(ports::enable_protocol_handler).delete(ports::disable_protocol_handler),
						)
						.route(
							"/{port}/{protocol}/flow",
							get(flow::get_flow_handler)
								.post(flow::post_flow_handler)
								.put(flow::put_flow_handler)
								.delete(flow::delete_flow_handler),
						)
						.route(
							"/{port}/{protocol}/flow/validate",
							post(flow::validate_flow_handler),
						),
				)
				.nest(
					"/plugins",
					Router::new()
						.route("/", get(plugins::list_plugins_handler))
						.route(
							"/{name}",
							get(plugins::get_plugin_handler)
								.post(plugins::create_plugin_handler)
								.put(plugins::update_plugin_handler)
								.delete(plugins::delete_plugin_handler),
						),
				)
				.nest(
					"/nodes",
					Router::new()
						.route(
							"/",
							get(nodes::list_nodes_handler).post(nodes::create_node_handler),
						)
						.route(
							"/{name}",
							get(nodes::get_node_handler)
								.put(nodes::update_node_handler)
								.delete(nodes::delete_node_handler),
						),
				)
				.nest(
					"/certs",
					Router::new()
						.route("/", get(certs::list_certs_handler))
						.route(
							"/{id}",
							get(certs::get_cert_handler)
								.post(certs::upload_cert_handler)
								.delete(certs::delete_cert_handler),
						),
				)
				.nest(
					"/resolvers",
					Router::new()
						.route("/", get(resolvers::list_resolvers_handler))
						.route(
							"/{protocol}",
							get(resolvers::get_resolver_handler)
								.post(resolvers::post_resolver_handler)
								.put(resolvers::put_resolver_handler)
								.delete(resolvers::delete_resolver_handler),
						),
				)
				.nest(
					"/applications",
					Router::new()
						.route("/", get(applications::list_applications_handler))
						.route(
							"/{protocol}",
							get(applications::get_application_handler)
								.post(applications::post_application_handler)
								.put(applications::put_application_handler)
								.delete(applications::delete_application_handler),
						),
				)
				.nest(
					"/config",
					Router::new()
						.route("/reload", post(config::reload_config_handler))
						.route("/export", get(config::export_config_handler))
						.route("/import", post(config::import_config_handler)),
				)
				.layer(middleware::from_fn(auth::require_access_token)),
		)
		.layer(middleware::from_fn(logger::log_requests))
}