refactor to GraphQLHttpRequest and GraphQLHttpResponse and added params map

This commit is contained in:
Andreas Marek
2020-09-15 03:09:27 +10:00
parent 740a3f1f92
commit 8238353f9a
7 changed files with 88 additions and 48 deletions

View File

@@ -19,29 +19,29 @@ public class GraphQLHandler {
this.interceptor = interceptor;
}
public Mono<GraphQLResponse> graphqlPOST(GraphQLRequestBody body, HttpHeaders httpHeaders) {
String query = body.getQuery();
public Mono<GraphQLHttpResponse> graphqlPOST(GraphQLHttpRequest graphQLHttpRequest) {
String query = graphQLHttpRequest.getQuery();
ExecutionInput input = ExecutionInput.newExecutionInput()
.query(query)
.operationName(body.getOperationName())
.variables(body.getVariables())
.operationName(graphQLHttpRequest.getOperationName())
.variables(graphQLHttpRequest.getVariables())
.build();
Mono<ExecutionInput> executionInput = interceptor.preHandle(input, httpHeaders);
Mono<ExecutionInput> executionInput = interceptor.preHandle(input, graphQLHttpRequest.getHttpHeaders());
return executionInput
.flatMap(this::execute)
.flatMap(result -> interceptor.postHandle(result, httpHeaders))
.flatMap(result -> toResponseBody(result, httpHeaders));
.flatMap(result -> interceptor.postHandle(result, graphQLHttpRequest.getHttpHeaders()))
.flatMap(result -> toResponseBody(result, graphQLHttpRequest.getHttpHeaders()));
}
private Mono<GraphQLResponse> toResponseBody(ExecutionResult executionResult, HttpHeaders httpHeaders) {
private Mono<GraphQLHttpResponse> toResponseBody(ExecutionResult executionResult, HttpHeaders httpHeaders) {
Map<String, Object> responseBodyRaw = executionResult.toSpecification();
Object data = responseBodyRaw.get("data");
List<Map<String, Object>> errors = (List<Map<String, Object>>) responseBodyRaw.get("errors");
Map<String, Object> extensions = (Map<String, Object>) responseBodyRaw.get("extensions");
GraphQLResponse responseBody = new GraphQLResponse(data,
GraphQLHttpResponse responseBody = new GraphQLHttpResponse(data,
errors,
extensions);
Mono<GraphQLResponse> graphQLResponseBodyMono = interceptor.customizeResponseBody(responseBody, executionResult, httpHeaders);
extensions, httpHeaders);
Mono<GraphQLHttpResponse> graphQLResponseBodyMono = interceptor.customizeResponseBody(responseBody, executionResult, httpHeaders);
return graphQLResponseBodyMono;
}

View File

@@ -0,0 +1,46 @@
package org.springframework.graphql;
import org.springframework.http.HttpHeaders;
import org.springframework.util.MultiValueMap;
import java.util.Map;
public class GraphQLHttpRequest {
private final String query;
private final String operationName;
private final Map<String, Object> variables;
private final HttpHeaders httpHeaders;
private final MultiValueMap<String, String> requestParams;
public GraphQLHttpRequest(String query,
String operationName,
Map<String, Object> variables,
HttpHeaders httpHeaders,
MultiValueMap<String, String> requestParams) {
this.query = query;
this.operationName = operationName;
this.variables = variables;
this.httpHeaders = httpHeaders;
this.requestParams = requestParams;
}
public String getQuery() {
return query;
}
public String getOperationName() {
return operationName;
}
public Map<String, Object> getVariables() {
return variables;
}
public HttpHeaders getHttpHeaders() {
return httpHeaders;
}
public MultiValueMap<String, String> getRequestParams() {
return requestParams;
}
}

View File

@@ -1,18 +1,25 @@
package org.springframework.graphql;
import org.springframework.http.HttpHeaders;
import java.util.List;
import java.util.Map;
public class GraphQLResponse {
public class GraphQLHttpResponse {
private final Object data;
private final List<Map<String, Object>> errors;
private final Map<String, Object> extensions;
private final HttpHeaders httpHeaders;
public GraphQLResponse(Object data, List<Map<String, Object>> errors, Map<String, Object> extensions) {
public GraphQLHttpResponse(Object data,
List<Map<String, Object>> errors,
Map<String, Object> extensions,
HttpHeaders httpHeaders) {
this.data = data;
this.errors = errors;
this.extensions = extensions;
this.httpHeaders = httpHeaders;
}
public Object getData() {
@@ -26,4 +33,8 @@ public class GraphQLResponse {
public Map<String, Object> getExtensions() {
return extensions;
}
public HttpHeaders getHttpHeaders() {
return httpHeaders;
}
}

View File

@@ -15,8 +15,8 @@ public interface GraphQLInterceptor {
return Mono.just(result);
}
default Mono<GraphQLResponse> customizeResponseBody(GraphQLResponse graphQLResponse, ExecutionResult executionResult, HttpHeaders httpHeader) {
return Mono.just(graphQLResponse);
default Mono<GraphQLHttpResponse> customizeResponseBody(GraphQLHttpResponse graphQLHttpResponse, ExecutionResult executionResult, HttpHeaders httpHeader) {
return Mono.just(graphQLHttpResponse);
}
}

View File

@@ -1,27 +0,0 @@
package org.springframework.graphql;
import java.util.Map;
public class GraphQLRequestBody {
private final String query;
private final String operationName;
private final Map<String, Object> variables;
public GraphQLRequestBody(String query, String operationName, Map<String, Object> variables) {
this.query = query;
this.operationName = operationName;
this.variables = variables;
}
public String getQuery() {
return query;
}
public String getOperationName() {
return operationName;
}
public Map<String, Object> getVariables() {
return variables;
}
}

View File

@@ -7,8 +7,8 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.graphql.DefaultGraphQLInterceptor;
import org.springframework.graphql.GraphQLHandler;
import org.springframework.graphql.GraphQLHttpRequest;
import org.springframework.graphql.GraphQLInterceptor;
import org.springframework.graphql.GraphQLRequestBody;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
@@ -58,8 +58,13 @@ public class GraphQLController {
if (variables == null) {
variables = Collections.emptyMap();
}
GraphQLRequestBody graphQLRequestBody = new GraphQLRequestBody(query, body.getOperationName(), variables);
return graphQLHandler.graphqlPOST(graphQLRequestBody, serverRequest.headers().asHttpHeaders());
GraphQLHttpRequest graphQLHttpRequest = new GraphQLHttpRequest(
query,
body.getOperationName(),
variables,
serverRequest.headers().asHttpHeaders(),
serverRequest.queryParams());
return graphQLHandler.graphqlPOST(graphQLHttpRequest);
}).flatMap(graphQLResponseBody -> {
//TODO: this should be handled better:
// we don't want to serialize `null` values for `errors` and `extensions`

View File

@@ -7,8 +7,8 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.graphql.DefaultGraphQLInterceptor;
import org.springframework.graphql.GraphQLHandler;
import org.springframework.graphql.GraphQLHttpRequest;
import org.springframework.graphql.GraphQLInterceptor;
import org.springframework.graphql.GraphQLRequestBody;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.function.RequestPredicates;
import org.springframework.web.servlet.function.RouterFunction;
@@ -70,9 +70,14 @@ public class GraphQLController {
variables = Collections.emptyMap();
}
GraphQLRequestBody graphQLRequestBody = new GraphQLRequestBody(query, body.getOperationName(), variables);
GraphQLHttpRequest graphQLHttpRequest = new GraphQLHttpRequest(
query,
body.getOperationName(),
variables,
serverRequest.headers().asHttpHeaders(),
serverRequest.params());
Mono<Map<String, Object>> responseRawMono = graphQLHandler.graphqlPOST(graphQLRequestBody, serverRequest.headers().asHttpHeaders())
Mono<Map<String, Object>> responseRawMono = graphQLHandler.graphqlPOST(graphQLHttpRequest)
.map(graphQLResponseBody -> {
//TODO: this should be handled better:
// we don't want to serialize `null` values for `errors` and `extensions`