diff options
Diffstat (limited to 'src/api/mod.rs')
-rw-r--r-- | src/api/mod.rs | 43 |
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), + }), + ) +} |