1use async_graphql_axum::{GraphQLRequest, GraphQLResponse};
2use axum::extract::Extension;
3use axum::http::header::HeaderMap;
4use axum::http::header::AUTHORIZATION;
5use qm_role::AuthContainer;
6
7mod config;
8pub use config::Config as ServerConfig;
9
10pub async fn graphql_handler<A, Q, M, S>(
11 schema: Extension<async_graphql::Schema<Q, M, S>>,
12 headers: HeaderMap,
13 req: GraphQLRequest,
14) -> GraphQLResponse
15where
16 A: Send + Sync + 'static,
17 Q: async_graphql::ObjectType + Send + Sync + 'static,
18 M: async_graphql::ObjectType + async_graphql::ContainerType + Send + Sync + 'static,
19 S: async_graphql::SubscriptionType + Send + Sync + 'static,
20{
21 let mut req = req.into_inner();
22 if let Some(auth_header) = headers.get(AUTHORIZATION).map(AuthContainer::<A>::from) {
23 req = req.data(auth_header);
24 } else {
25 req = req.data(AuthContainer::<A>::default());
26 }
27 schema.execute(req).await.into()
28}