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 api::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 protected = Router::<()>::new() .merge(domains::account_deletion::protected(deps)) .merge(domains::auth::protected(deps)) .merge(domains::chat::protected(deps)) .merge(domains::issues::protected(deps)) .merge(domains::space::protected(deps)) .merge(domains::user::protected(deps)) .merge(cleanup::protected( state.database.clone(), deps.space.clone(), deps.chat.clone(), deps.issues.clone(), deps.git.clone(), )) .wrap(Guard::Session); let open = Router::<()>::new() .merge(domains::auth::public(deps)) .merge(domains::chat::public(deps)) .merge(domains::space::public(deps)) .merge(domains::user::public(deps)) .merge(domains::git::router(deps)) .merge(domains::pulls::router(deps)); let api = Router::<()>::new() .setup(move |scope| { scope .app_data(web::Data::new(accounts)) .app_data(web::Data::new(push_config)) }) .merge(open) .merge(protected); Router::<()>::new() .nest("/api/v1/internal", internal) .nest("/api/v1", api) .nest("/pages", domains::auth::pages(deps)) .merge(::bootstrap::health::router(state.clone())) .into_scope(web::scope("")) .default_service(web::to(assets::serve)) }