use anyhow::Context; use axum::{ http::{HeaderValue, Method}, Router, }; use como_infrastructure::register::ServiceRegister; use tower::ServiceBuilder; use tower_http::{cors::CorsLayer, trace::TraceLayer}; use crate::controllers::graphql::GraphQLController; pub struct Api; impl Api { pub async fn new( port: u32, cors_origin: &str, service_register: ServiceRegister, ) -> anyhow::Result<()> { let router = Router::new() .nest( "/graphql", GraphQLController::new_router(service_register.clone()), ) .layer(ServiceBuilder::new().layer(TraceLayer::new_for_http())) .layer( CorsLayer::new() .allow_origin( cors_origin .parse::() .context("could not parse cors origin as header")?, ) .allow_headers([axum::http::header::CONTENT_TYPE]) .allow_methods([Method::GET, Method::POST, Method::OPTIONS]), ); axum::Server::bind(&format!("0.0.0.0:{}", port).parse().unwrap()) .serve(router.into_make_service()) .await .context("error while starting API")?; Ok(()) } }