Skip to main content

ordinary_api/server/
console.rs

1// Copyright (C) 2026 Ordinary Labs, LLC.
2//
3// SPDX-License-Identifier: AGPL-3.0-only
4
5use askama::Template;
6use axum::Router;
7use axum::http::StatusCode;
8use axum::http::header::{CONTENT_SECURITY_POLICY, CONTENT_TYPE};
9use axum::routing::get;
10use ordinary_assets::{
11    API_CLIENT_JS, API_INDEX_HTML_CSP, API_LOGIN_HTML_CSP, API_REGISTER_HTML_CSP, API_STYLES_CSS,
12    ApiIndexHtml, ApiLoginHtml, ApiRegisterHtml, V1_WASM,
13};
14use ordinary_utils::SERVER;
15
16pub fn setup_routes<S>(
17    domain: &str,
18    swagger: bool,
19    invite_token_link: &str,
20) -> anyhow::Result<Router<S>>
21where
22    S: Clone + Send + Sync + 'static,
23{
24    tracing::debug!("setting up index.html template");
25    let index_html_template = ApiIndexHtml {
26        domain,
27        server: SERVER,
28        swagger,
29    };
30    let index_html = index_html_template.render()?;
31
32    tracing::debug!("setting up login.html template");
33    let login_html_template = ApiLoginHtml { domain, swagger };
34    let login_html = login_html_template.render()?;
35
36    tracing::debug!("setting up register.html template");
37    let register_html_template = ApiRegisterHtml {
38        domain,
39        swagger,
40        invite_token_link,
41    };
42    let register_html = register_html_template.render()?;
43
44    let router = Router::new()
45        .route(
46            "/client.wasm",
47            get(|| async move {
48                (
49                    StatusCode::OK,
50                    [(CONTENT_TYPE, "application/wasm")],
51                    V1_WASM,
52                )
53            }),
54        )
55        .route(
56            "/client.js",
57            get(|| async move {
58                (
59                    StatusCode::OK,
60                    [(CONTENT_TYPE, "text/javascript")],
61                    API_CLIENT_JS,
62                )
63            }),
64        )
65        .route(
66            "/styles.css",
67            get(|| async move { (StatusCode::OK, [(CONTENT_TYPE, "text/css")], API_STYLES_CSS) }),
68        )
69        .route(
70            "/",
71            get(|| async move {
72                (
73                    StatusCode::OK,
74                    [
75                        (CONTENT_TYPE, "text/html"),
76                        (CONTENT_SECURITY_POLICY, API_INDEX_HTML_CSP),
77                    ],
78                    index_html.clone(),
79                )
80            }),
81        )
82        .route(
83            "/login",
84            get(|| async move {
85                (
86                    StatusCode::OK,
87                    [
88                        (CONTENT_TYPE, "text/html"),
89                        (CONTENT_SECURITY_POLICY, API_LOGIN_HTML_CSP),
90                    ],
91                    login_html.clone(),
92                )
93            }),
94        )
95        .route(
96            "/register",
97            get(|| async move {
98                (
99                    StatusCode::OK,
100                    [
101                        (CONTENT_TYPE, "text/html"),
102                        (CONTENT_SECURITY_POLICY, API_REGISTER_HTML_CSP),
103                    ],
104                    register_html.clone(),
105                )
106            }),
107        );
108
109    Ok(router)
110}