45 lines
1.3 KiB
Rust
45 lines
1.3 KiB
Rust
|
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::<HeaderValue>()
|
||
|
.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(())
|
||
|
}
|
||
|
}
|