use crate::auth::check_access::Authorized;
use crate::schema;
use crate::schema::GraphqlWebData;
use actix_web::{route, HttpResponse};
use actix_web::{web, HttpRequest, Responder};
use actix_web_lab::respond::Html;
use juniper::http::graphiql::graphiql_source;
use juniper::http::GraphQLRequest;
pub async fn graphql_playground() -> impl Responder {
Html(graphiql_source("/graphql", None))
}
#[route("/graphql", method = "GET", method = "POST")]
pub async fn graphql(
st: web::Data<GraphqlWebData>,
data: web::Json<GraphQLRequest>,
req: HttpRequest,
_: Authorized,
) -> impl Responder {
let token = req.headers().get("authorization");
match token {
Some(token_value) => {
let ctx = schema::Context {
sess: st.sess.clone(),
auth_token: Some(token_value.to_str().unwrap_or("").to_string()),
args: st.args.clone(),
db_conn: st.db_conn.clone(),
};
let value = data.execute(&st.schema, &ctx).await;
HttpResponse::Ok().json(value)
}
None => {
let ctx = schema::Context {
sess: st.sess.clone(),
auth_token: None,
args: st.args.clone(),
db_conn: st.db_conn.clone(),
};
let value = data.execute(&st.schema, &ctx).await;
HttpResponse::Ok().json(value)
}
}
}