use axum::{
body::Body,
extract::Request,
http::{header, HeaderValue},
middleware::{self, Next},
response::Response,
routing::{get, post},
Router,
};
use tower::ServiceBuilder;
use tower_cookies::CookieManagerLayer;
use tower_http::cors::CorsLayer;
use crate::{core::AppState, AppContext};
use super::layers::{
pubky_host::PubkyHostLayer, rate_limiter::RateLimiterLayer, trace::with_trace_layer,
};
mod auth;
mod feed;
mod root;
mod tenants;
static HOMESERVER_VERSION: &str = concat!("pubky.org", "@", env!("CARGO_PKG_VERSION"),);
const TRACING_EXCLUDED_PATHS: [&str; 1] = ["/events/"];
fn base() -> Router<AppState> {
Router::new()
.route("/", get(root::handler))
.route("/signup", post(auth::signup))
.route("/session", post(auth::signin))
.route("/events/", get(feed::feed))
}
pub fn create_app(state: AppState, context: &AppContext) -> Router {
let app = base()
.merge(tenants::router(state.clone()))
.layer(CookieManagerLayer::new())
.layer(CorsLayer::very_permissive())
.layer(ServiceBuilder::new().layer(middleware::from_fn(add_server_header)))
.layer(RateLimiterLayer::new(
context.config_toml.drive.rate_limits.clone(),
))
.layer(PubkyHostLayer)
.with_state(state);
with_trace_layer(app, &TRACING_EXCLUDED_PATHS)
}
async fn add_server_header(request: Request<Body>, next: Next) -> Response {
let mut response = next.run(request).await;
response
.headers_mut()
.insert(header::SERVER, HeaderValue::from_static(HOMESERVER_VERSION));
response
}