49 lines
1.4 KiB
Rust
49 lines
1.4 KiB
Rust
//! OpenAPI document + Scalar viewer, served on `/api/docs`.
|
|
//! The frontend types are generated from `/api/docs/private/api.json`
|
|
//! (`npm run openapi` in `frontend/`).
|
|
|
|
use std::sync::Arc;
|
|
|
|
use aide::{
|
|
axum::{ApiRouter, IntoApiResponse},
|
|
openapi::{OpenApi, Server, Tag},
|
|
scalar::Scalar,
|
|
transform::TransformOpenApi,
|
|
};
|
|
use axum::{Extension, Json, response::IntoResponse, routing::get};
|
|
|
|
pub fn api_docs_metadata(api: TransformOpenApi) -> TransformOpenApi {
|
|
api.title(&format!("{} API documentation", env!("CRATE_NAME")))
|
|
.description(format!("Build version: {}", env!("GIT_HASH")).as_str())
|
|
.tag(Tag {
|
|
name: "Auth".to_owned(),
|
|
..Default::default()
|
|
})
|
|
.tag(Tag {
|
|
name: "Bikes".to_owned(),
|
|
..Default::default()
|
|
})
|
|
.tag(Tag {
|
|
name: "misc".to_owned(),
|
|
..Default::default()
|
|
})
|
|
.server(Server {
|
|
url: "/".to_owned(),
|
|
..Default::default()
|
|
})
|
|
}
|
|
|
|
pub fn routes() -> ApiRouter {
|
|
ApiRouter::new()
|
|
.route(
|
|
"/",
|
|
get(Scalar::new("/api/docs/private/api.json")
|
|
.with_title(env!("CRATE_NAME"))
|
|
.axum_handler()),
|
|
)
|
|
.route("/private/api.json", get(serve_docs))
|
|
}
|
|
|
|
async fn serve_docs(Extension(api): Extension<Arc<OpenApi>>) -> impl IntoApiResponse {
|
|
Json(api).into_response()
|
|
}
|