use crate::types::extract::{RouterURI, self}; use axum::{ error_handling::HandleErrorLayer, BoxError, Extension, Router, middleware, }; use tower::ServiceBuilder; use tower_governor::{ errors::display_error, governor::GovernorConfigBuilder, key_extractor::SmartIpKeyExtractor, GovernorLayer, }; pub mod admin; pub mod auth; pub mod posts; pub mod users; pub use auth::RegistrationRequet; pub fn router() -> Router { let governor_conf = Box::new( GovernorConfigBuilder::default() .burst_size(15) .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), }), ) .layer(middleware::from_fn(extract::connect)) }