Skip to main content

quorum_public/routes/
route.rs

1//! Routes for the public Quorum server.
2
3use axum::{
4    Router,
5    routing::{get, post},
6};
7use quorum_core::db::DB;
8use quorum_core::routes::{echo::echo, health::health};
9use quorum_core::utility::config::Config;
10use std::sync::Arc;
11use std::time::Duration;
12use tower_governor::{GovernorLayer, governor::GovernorConfigBuilder};
13
14use super::auth::{
15    delete_account, get_user_data, login, logout, refresh_token, signup, update_user_profile,
16};
17
18use http::header::{HeaderName, HeaderValue};
19use tower::ServiceBuilder;
20use tower_http::cors::{Any, CorsLayer};
21use tower_http::set_header::SetResponseHeaderLayer;
22
23pub fn create_router(db: DB) -> Router {
24    let cors = CorsLayer::new()
25        .allow_origin(Any)
26        .allow_methods(Any)
27        .allow_headers(Any);
28
29    let security_headers = ServiceBuilder::new()
30        .layer(SetResponseHeaderLayer::if_not_present(
31            HeaderName::from_static("x-frame-options"),
32            HeaderValue::from_static("DENY"),
33        ))
34        .layer(SetResponseHeaderLayer::if_not_present(
35            HeaderName::from_static("strict-transport-security"),
36            HeaderValue::from_static("max-age=31536000; includeSubDomains; preload"),
37        ))
38        .layer(SetResponseHeaderLayer::if_not_present(
39            HeaderName::from_static("x-content-type-options"),
40            HeaderValue::from_static("nosniff"),
41        ));
42
43    Router::new()
44        .route("/", get(|| async { "Quorum public server is running" }))
45        .route("/health", get(health))
46        .route("/echo", post(echo))
47        .merge(auth_routes())
48        .layer(cors)
49        .layer(security_headers)
50        .with_state(db)
51}
52
53fn auth_routes() -> Router<DB> {
54    let config = Config::get();
55
56    let (per_second, burst_size) = if config.enable_testing {
57        (config.testing_per_second, config.testing_burst_size)
58    } else {
59        (config.default_per_second, config.default_burst_size)
60    };
61
62    let governor_conf = Arc::new(
63        GovernorConfigBuilder::default()
64            .per_second(per_second)
65            .burst_size(burst_size)
66            .finish()
67            .unwrap(),
68    );
69
70    let limiter = governor_conf.limiter().clone();
71    std::thread::spawn(move || {
72        loop {
73            std::thread::sleep(Duration::from_secs(60));
74            limiter.retain_recent();
75        }
76    });
77
78    Router::new()
79        .route("/auth/signup", post(signup))
80        .route("/auth/login", post(login))
81        .route("/auth/delete", post(delete_account))
82        .route("/auth/me", post(get_user_data))
83        .route("/auth/refresh", post(refresh_token))
84        .route("/auth/logout", post(logout))
85        .route("/auth/updateuserprofile", post(update_user_profile))
86        .layer(GovernorLayer::new(governor_conf))
87}