use anyhow::Context; use axum::{ http::{HeaderValue, Method}, response::IntoResponse, Router, }; use como_infrastructure::register::ServiceRegister; use tower::ServiceBuilder; use tower_http::{cors::CorsLayer, trace::TraceLayer}; use zitadel::axum::introspection::IntrospectedUser; use crate::controllers::auth::AuthController; use crate::controllers::graphql::GraphQLController; async fn authed(user: IntrospectedUser) -> impl IntoResponse { format!( "Hello authorized user: {:?} with id {}", user.username, user.user_id ) } pub struct Api; impl Api { pub async fn new( port: u32, cors_origin: &str, service_register: ServiceRegister, ) -> anyhow::Result<()> { let router = Router::new() .nest( "/auth", AuthController::new_router(service_register.clone()).await?, ) .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]), ); tracing::info!("running on: 0.0.0.0:{}", port); axum::Server::bind(&format!("0.0.0.0:{}", port).parse().unwrap()) .serve(router.into_make_service()) .await .context("error while starting API")?; Ok(()) } }