pub mod account_deletion; pub mod assets; pub mod bootstrap; pub mod cleanup; pub mod domains; pub mod middleware; pub mod openapi; use actix_cors::Cors; use actix_web::http::Method; use actix_web::{Scope, web}; use export::http::{Guard, Router}; pub const MAX_REQUEST_BODY_BYTES: usize = 2 * 1024 * 1024; pub fn build_cors(web: &config::web::WebConfig) -> Cors { let mut cors = Cors::default(); for origin in &web.cors_allow_origins { cors = cors.allowed_origin(origin); } let mut cors = cors .allowed_methods([ Method::GET, Method::POST, Method::PUT, Method::PATCH, Method::DELETE, Method::OPTIONS, ]) .allowed_headers(["content-type", "authorization", "x-request-id"]) .expose_headers(["x-request-id"]); if web.cors_allow_credentials { cors = cors.supports_credentials(); } cors } pub fn routes(deps: &bootstrap::Deps) -> Scope { let state = &deps.state; let accounts = deps.accounts.clone(); let push_config = state.config.push.clone(); let internal = Router::<()>::new() .merge(domains::git::internal(deps)) .merge(domains::chat::internal(deps)) .with_state(deps.internal_service_key.clone()) .wrap(Guard::ServiceKey); let public = Router::<()>::new() .setup(move |scope| { scope .app_data(web::Data::new(accounts)) .app_data(web::Data::new(push_config)) }) .merge(domains::account_deletion::router(deps)) .merge(domains::auth::router(deps)) .merge(domains::chat::router(deps)) .merge(domains::issues::router(deps)) .merge(domains::space::router(deps)) .merge(domains::user::router(deps)) .merge(domains::git::router(deps)) .merge(domains::pulls::router(deps)) .merge(cleanup::router( state.database.clone(), deps.space.clone(), deps.chat.clone(), deps.issues.clone(), deps.git.clone(), )); Router::<()>::new() .nest("/api/v1/internal", internal) .nest("/api/v1", public) .nest("/pages", domains::auth::pages(deps)) .merge(export::health::router(state.clone())) .into_scope(web::scope("")) .default_service(web::to(assets::serve)) }