summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/api/mod.rs43
-rw-r--r--src/main.rs24
2 files changed, 46 insertions, 21 deletions
diff --git a/src/api/mod.rs b/src/api/mod.rs
index c347207..d36b127 100644
--- a/src/api/mod.rs
+++ b/src/api/mod.rs
@@ -1,5 +1,48 @@
+use crate::types::extract::RouterURI;
+use axum::{Extension, Router, BoxError, error_handling::HandleErrorLayer};
+use tower::ServiceBuilder;
+use tower_governor::{governor::GovernorConfigBuilder, GovernorLayer, errors::display_error, key_extractor::SmartIpKeyExtractor};
+
pub mod admin;
pub mod auth;
pub mod pages;
pub mod posts;
pub mod users;
+
+pub fn router() -> Router {
+ let governor_conf = Box::new(
+ GovernorConfigBuilder::default()
+ .burst_size(10)
+ .per_second(1)
+ .key_extractor(SmartIpKeyExtractor)
+ .finish()
+ .expect("Failed to create rate limiter"),
+ );
+
+ Router::new()
+ .nest(
+ "/admin",
+ admin::router().layer(Extension(RouterURI("/api/admin"))),
+ )
+ .nest(
+ "/auth",
+ auth::router().layer(Extension(RouterURI("/api/auth"))),
+ )
+ .nest(
+ "/users",
+ users::router().layer(Extension(RouterURI("/api/users"))),
+ )
+ .nest(
+ "/posts",
+ posts::router().layer(Extension(RouterURI("/api/posts"))),
+ )
+ .layer(
+ ServiceBuilder::new()
+ .layer(HandleErrorLayer::new(|e: BoxError| async move {
+ display_error(e)
+ }))
+ .layer(GovernorLayer {
+ config: Box::leak(governor_conf),
+ }),
+ )
+}
diff --git a/src/main.rs b/src/main.rs
index 03cee25..a72ec5f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -3,7 +3,7 @@ use axum::{
http::{Request, StatusCode},
middleware::{self, Next},
response::Response,
- Extension, RequestExt, Router,
+ RequestExt, Router,
};
use axum_client_ip::ClientIp;
use std::{net::SocketAddr, process::exit};
@@ -14,10 +14,7 @@ use tracing_subscriber::{
};
use types::http::ResponseCode;
-use crate::{
- api::{auth, pages, posts, users},
- types::extract::RouterURI,
-};
+use crate::api::pages;
mod admin;
mod api;
@@ -77,22 +74,7 @@ async fn main() {
.layer(middleware::from_fn(log))
.layer(middleware::from_fn(serve))
.nest("/", pages::router())
- .nest(
- "/api/admin",
- api::admin::router().layer(Extension(RouterURI("/api/admin"))),
- )
- .nest(
- "/api/auth",
- auth::router().layer(Extension(RouterURI("/api/auth"))),
- )
- .nest(
- "/api/users",
- users::router().layer(Extension(RouterURI("/api/users"))),
- )
- .nest(
- "/api/posts",
- posts::router().layer(Extension(RouterURI("/api/posts"))),
- )
+ .nest("/api", api::router())
.layer(CookieManagerLayer::new());
let Ok(addr) = "[::]:8080".parse::<std::net::SocketAddr>() else {