ordinary-api 0.9.0

API server for Ordinary
// Copyright (C) 2026 Ordinary Labs, LLC.
//
// SPDX-License-Identifier: AGPL-3.0-only

use askama::Template;
use axum::Router;
use axum::http::StatusCode;
use axum::http::header::{CONTENT_SECURITY_POLICY, CONTENT_TYPE};
use axum::routing::get;
use ordinary_assets::{
    API_CLIENT_JS, API_INDEX_HTML_CSP, API_LOGIN_HTML_CSP, API_REGISTER_HTML_CSP, API_STYLES_CSS,
    ApiIndexHtml, ApiLoginHtml, ApiRegisterHtml, V1_WASM,
};
use ordinary_utils::SERVER;

pub fn setup_routes<S>(
    domain: &str,
    swagger: bool,
    invite_token_link: &str,
) -> anyhow::Result<Router<S>>
where
    S: Clone + Send + Sync + 'static,
{
    tracing::debug!("setting up index.html template");
    let index_html_template = ApiIndexHtml {
        domain,
        server: SERVER,
        swagger,
    };
    let index_html = index_html_template.render()?;

    tracing::debug!("setting up login.html template");
    let login_html_template = ApiLoginHtml { domain, swagger };
    let login_html = login_html_template.render()?;

    tracing::debug!("setting up register.html template");
    let register_html_template = ApiRegisterHtml {
        domain,
        swagger,
        invite_token_link,
    };
    let register_html = register_html_template.render()?;

    let router = Router::new()
        .route(
            "/client.wasm",
            get(|| async move {
                (
                    StatusCode::OK,
                    [(CONTENT_TYPE, "application/wasm")],
                    V1_WASM,
                )
            }),
        )
        .route(
            "/client.js",
            get(|| async move {
                (
                    StatusCode::OK,
                    [(CONTENT_TYPE, "text/javascript")],
                    API_CLIENT_JS,
                )
            }),
        )
        .route(
            "/styles.css",
            get(|| async move { (StatusCode::OK, [(CONTENT_TYPE, "text/css")], API_STYLES_CSS) }),
        )
        .route(
            "/",
            get(|| async move {
                (
                    StatusCode::OK,
                    [
                        (CONTENT_TYPE, "text/html"),
                        (CONTENT_SECURITY_POLICY, API_INDEX_HTML_CSP),
                    ],
                    index_html.clone(),
                )
            }),
        )
        .route(
            "/login",
            get(|| async move {
                (
                    StatusCode::OK,
                    [
                        (CONTENT_TYPE, "text/html"),
                        (CONTENT_SECURITY_POLICY, API_LOGIN_HTML_CSP),
                    ],
                    login_html.clone(),
                )
            }),
        )
        .route(
            "/register",
            get(|| async move {
                (
                    StatusCode::OK,
                    [
                        (CONTENT_TYPE, "text/html"),
                        (CONTENT_SECURITY_POLICY, API_REGISTER_HTML_CSP),
                    ],
                    register_html.clone(),
                )
            }),
        );

    Ok(router)
}