retrom_rest_service/
lib.rs

1use axum::{
2    middleware::{self as axum_middleware},
3    response::Redirect,
4    routing::get,
5    Extension, Router,
6};
7use axum_tracing_opentelemetry::middleware::{OtelAxumLayer, OtelInResponseLayer};
8use file::file_routes;
9use game::game_routes;
10use middleware::{
11    cache_control::cache_control_middleware,
12    cross_origin_isolation::cross_origin_isolation_middleware,
13};
14use public::public_routes;
15use retrom_db::Pool;
16use std::sync::Arc;
17use tower_http::{
18    compression::CompressionLayer, cors::CorsLayer, decompression::RequestDecompressionLayer,
19};
20use web::web_routes;
21
22pub mod error;
23pub mod file;
24pub mod game;
25mod middleware;
26mod public;
27mod web;
28
29pub fn rest_service(pool: Arc<Pool>) -> Router {
30    let api_routes = Router::new()
31        .nest("/file", file_routes())
32        .nest("/game", game_routes())
33        .nest("/public", public_routes());
34
35    Router::new()
36        .nest("/rest", api_routes)
37        // use nest_service so both `/web` and `/web/` are defined
38        // https://github.com/tokio-rs/axum/issues/2659#issuecomment-2676985411
39        .nest_service("/web", web_routes())
40        .layer(OtelInResponseLayer)
41        .layer(OtelAxumLayer::default())
42        .layer(axum_middleware::from_fn(cross_origin_isolation_middleware))
43        .route(
44            "/",
45            get(|| async { Redirect::to("/web") }).head(|| async { Redirect::to("/web") }),
46        )
47        .layer(Extension(pool))
48        .layer(CorsLayer::permissive())
49        .layer(RequestDecompressionLayer::new())
50        .layer(CompressionLayer::new())
51        .layer(axum_middleware::from_fn(cache_control_middleware))
52}