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_builtins::{
11    API_CLIENT_JS, API_FAVICON, API_INDEX_HTML_CSP, API_LOGIN_HTML_CSP, API_REGISTER_HTML_CSP,
12    API_STYLES_CSS, ApiIndexHtml, ApiLoginHtml, ApiRegisterHtml, V1_WASM,
13};
14use ordinary_utils::SERVER;
15use std::future::ready;
16
17pub fn setup_routes<S>(
18    domain: &str,
19    swagger: bool,
20    invite_token_link: &str,
21) -> anyhow::Result<Router<S>>
22where
23    S: Clone + Send + Sync + 'static,
24{
25    tracing::debug!("setting up index.html template");
26    let index_html_template = ApiIndexHtml {
27        domain,
28        server: SERVER,
29        swagger,
30    };
31    let index_html = index_html_template.render()?;
32
33    tracing::debug!("setting up login.html template");
34    let login_html_template = ApiLoginHtml { domain, swagger };
35    let login_html = login_html_template.render()?;
36
37    tracing::debug!("setting up register.html template");
38    let register_html_template = ApiRegisterHtml {
39        domain,
40        swagger,
41        invite_token_link,
42    };
43    let register_html = register_html_template.render()?;
44
45    let router = Router::new()
46        .route(
47            "/favicon.svg",
48            get(|| {
49                ready((
50                    StatusCode::OK,
51                    [(CONTENT_TYPE, "image/svg+xml")],
52                    API_FAVICON,
53                ))
54            }),
55        )
56        .route(
57            "/client.wasm",
58            get(|| {
59                ready((
60                    StatusCode::OK,
61                    [(CONTENT_TYPE, "application/wasm")],
62                    V1_WASM,
63                ))
64            }),
65        )
66        .route(
67            "/client.js",
68            get(|| {
69                ready((
70                    StatusCode::OK,
71                    [(CONTENT_TYPE, "text/javascript")],
72                    API_CLIENT_JS,
73                ))
74            }),
75        )
76        .route(
77            "/styles.css",
78            get(|| ready((StatusCode::OK, [(CONTENT_TYPE, "text/css")], API_STYLES_CSS))),
79        )
80        .route(
81            "/",
82            get(move || {
83                ready((
84                    StatusCode::OK,
85                    [
86                        (CONTENT_TYPE, "text/html"),
87                        (CONTENT_SECURITY_POLICY, API_INDEX_HTML_CSP),
88                    ],
89                    index_html.clone(),
90                ))
91            }),
92        )
93        .route(
94            "/login",
95            get(move || {
96                ready((
97                    StatusCode::OK,
98                    [
99                        (CONTENT_TYPE, "text/html"),
100                        (CONTENT_SECURITY_POLICY, API_LOGIN_HTML_CSP),
101                    ],
102                    login_html.clone(),
103                ))
104            }),
105        )
106        .route(
107            "/register",
108            get(move || {
109                ready((
110                    StatusCode::OK,
111                    [
112                        (CONTENT_TYPE, "text/html"),
113                        (CONTENT_SECURITY_POLICY, API_REGISTER_HTML_CSP),
114                    ],
115                    register_html.clone(),
116                ))
117            }),
118        );
119
120    Ok(router)
121}