retrom_rest_service/
lib.rs1use 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 .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}