//! 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>) -> impl IntoApiResponse { Json(api).into_response() }