quorum_public/routes/
route.rs1use 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}