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 mod image; 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), }), ) }