summaryrefslogtreecommitdiff
path: root/src/api/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/mod.rs')
-rw-r--r--src/api/mod.rs43
1 files changed, 43 insertions, 0 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),
+ }),
+ )
+}