mod acl;
mod auth;
mod config;
pub(crate) mod did_manage;
pub mod did_public;
pub(crate) mod health;
pub mod resolve_agent_name;
mod resolve_shared;
#[cfg(feature = "method-web")]
pub mod resolve_web;
#[cfg(feature = "method-webvh")]
pub mod resolve_webvh;
mod stats;
use axum::Router;
use axum::extract::DefaultBodyLimit;
use axum::routing::{get, post, put};
use crate::server::AppState;
fn agent_name_routes() -> Router<AppState> {
Router::new()
.route("/@", get(resolve_agent_name::serve_community))
.route("/@{name}", get(resolve_agent_name::serve))
.route("/@{name}/{*context}", get(resolve_agent_name::serve))
}
pub fn router_without_fallback(upload_body_limit: usize) -> Router<AppState> {
let upload_routes = Router::new()
.route("/dids/{*mnemonic}", put(did_manage::upload_did))
.route("/witness/{*mnemonic}", put(did_manage::upload_witness))
.layer(DefaultBodyLimit::max(upload_body_limit));
let api = Router::new()
.route("/auth/challenge", post(auth::challenge))
.route("/auth/", post(auth::authenticate))
.route("/auth/refresh", post(auth::refresh))
.route("/dids", get(did_manage::list_dids))
.route(
"/dids/{*mnemonic}",
get(did_manage::get_did).delete(did_manage::delete_did),
)
.route("/log/{*mnemonic}", get(did_manage::get_did_log))
.route("/raw/{*mnemonic}", get(did_manage::get_raw_log))
.route("/disable/{*mnemonic}", put(did_manage::disable_did))
.route("/enable/{*mnemonic}", put(did_manage::enable_did))
.route("/services", get(config::get_services))
.route("/stats", get(stats::get_server_stats))
.route("/stats/{*mnemonic}", get(stats::get_did_stats))
.route("/config", get(config::get_config))
.route("/acl", get(acl::list_acl).post(acl::create_acl))
.route("/acl/{did}", put(acl::update_acl).delete(acl::delete_acl))
.merge(upload_routes);
#[allow(unused_mut)]
let mut router = Router::new().nest("/api", api);
#[cfg(feature = "metrics")]
{
router = router.route("/metrics", get(metrics_handler));
}
#[cfg(feature = "method-webvh")]
{
router = router
.route(
"/.well-known/did.jsonl",
get(resolve_webvh::serve_root_did_log),
)
.route(
"/.well-known/did-witness.json",
get(resolve_webvh::serve_root_witness),
);
}
#[cfg(feature = "method-web")]
{
router = router.route(
"/.well-known/did.json",
get(resolve_web::serve_root_did_web),
);
}
router.merge(agent_name_routes())
}
pub fn router_public_only() -> Router<AppState> {
#[allow(unused_mut)]
let mut router = Router::new();
#[cfg(feature = "method-webvh")]
{
router = router
.route(
"/.well-known/did.jsonl",
get(resolve_webvh::serve_root_did_log),
)
.route(
"/.well-known/did-witness.json",
get(resolve_webvh::serve_root_witness),
);
}
#[cfg(feature = "method-web")]
{
router = router.route(
"/.well-known/did.json",
get(resolve_web::serve_root_did_web),
);
}
router.merge(agent_name_routes())
}
pub fn router(upload_body_limit: usize) -> Router<AppState> {
router_without_fallback(upload_body_limit).fallback(did_public::serve_public)
}
#[cfg(feature = "metrics")]
async fn metrics_handler() -> (
axum::http::StatusCode,
[(&'static str, &'static str); 1],
String,
) {
(
axum::http::StatusCode::OK,
[("content-type", "text/plain; version=0.0.4")],
did_hosting_common::server::metrics::render(),
)
}