tdm_server_rust/web/
doc_controller.rs1use crate::config::SpringdocConfig;
6use axum::{
7 http::{header, StatusCode},
8 response::{Html, IntoResponse, Redirect, Response},
9 routing::get,
10 Router,
11};
12
13const OPENAPI_JSON: &str = include_str!("../../assets/doc/openapi.json");
15
16const SWAGGER_UI_TEMPLATE: &str = r##"<!DOCTYPE html>
18<html lang="en">
19<head>
20 <meta charset="UTF-8">
21 <title>Swagger UI</title>
22 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.18.3/swagger-ui.css">
23</head>
24<body>
25<div id="swagger-ui"></div>
26<script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.18.3/swagger-ui-bundle.js"></script>
27<script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.18.3/swagger-ui-standalone-preset.js"></script>
28<script>
29window.onload = function () {
30 window.ui = SwaggerUIBundle({
31 url: "__OPENAPI_URL__",
32 dom_id: "#swagger-ui",
33 deepLinking: true,
34 presets: [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset],
35 plugins: [SwaggerUIBundle.plugins.DownloadUrl],
36 layout: "StandaloneLayout",
37 operationsSorter: "__OPERATIONS_SORTER__"
38 });
39};
40</script>
41</body>
42</html>"##;
43
44#[tracing::instrument(skip_all, level = "info")]
46async fn openapi_json() -> Response {
47 (
48 StatusCode::OK,
49 [(header::CONTENT_TYPE, "application/json; charset=utf-8")],
50 OPENAPI_JSON,
51 )
52 .into_response()
53}
54
55#[tracing::instrument(skip_all, level = "info")]
57async fn doc_root() -> Redirect {
58 Redirect::permanent("/doc/openapi.json")
59}
60
61#[tracing::instrument(skip_all, level = "info")]
63fn build_swagger_ui_html(cfg: &SpringdocConfig) -> Html<String> {
64 let html = SWAGGER_UI_TEMPLATE
65 .replace("__OPENAPI_URL__", &cfg.swagger_ui.url)
66 .replace("__OPERATIONS_SORTER__", &cfg.swagger_ui.operations_sorter);
67 Html(html)
68}
69
70pub fn routes(cfg: SpringdocConfig) -> Router {
72 Router::new()
73 .route("/doc/openapi.json", get(openapi_json))
74 .route("/doc/", get(doc_root))
75 .route(
76 "/swagger-ui.html",
77 get({
78 let cfg = cfg.clone();
79 move || async move { build_swagger_ui_html(&cfg) }
80 }),
81 )
82}