From 8238353f9a1f8557b1b5b61fb0ef63dab7b686c2 Mon Sep 17 00:00:00 2001 From: Andreas Marek Date: Tue, 15 Sep 2020 03:09:27 +1000 Subject: [PATCH] refactor to GraphQLHttpRequest and GraphQLHttpResponse and added params map --- .../graphql/GraphQLHandler.java | 22 ++++----- .../graphql/GraphQLHttpRequest.java | 46 +++++++++++++++++++ ...Response.java => GraphQLHttpResponse.java} | 15 +++++- .../graphql/GraphQLInterceptor.java | 4 +- .../graphql/GraphQLRequestBody.java | 27 ----------- .../components/GraphQLController.java | 11 +++-- .../servlet/components/GraphQLController.java | 11 +++-- 7 files changed, 88 insertions(+), 48 deletions(-) create mode 100644 spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLHttpRequest.java rename spring-graphql-common/src/main/java/org/springframework/graphql/{GraphQLResponse.java => GraphQLHttpResponse.java} (53%) delete mode 100644 spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLRequestBody.java diff --git a/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLHandler.java b/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLHandler.java index bfe43ace..29532830 100644 --- a/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLHandler.java +++ b/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLHandler.java @@ -19,29 +19,29 @@ public class GraphQLHandler { this.interceptor = interceptor; } - public Mono graphqlPOST(GraphQLRequestBody body, HttpHeaders httpHeaders) { - String query = body.getQuery(); + public Mono 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 = interceptor.preHandle(input, httpHeaders); + Mono 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 toResponseBody(ExecutionResult executionResult, HttpHeaders httpHeaders) { + private Mono toResponseBody(ExecutionResult executionResult, HttpHeaders httpHeaders) { Map responseBodyRaw = executionResult.toSpecification(); Object data = responseBodyRaw.get("data"); List> errors = (List>) responseBodyRaw.get("errors"); Map extensions = (Map) responseBodyRaw.get("extensions"); - GraphQLResponse responseBody = new GraphQLResponse(data, + GraphQLHttpResponse responseBody = new GraphQLHttpResponse(data, errors, - extensions); - Mono graphQLResponseBodyMono = interceptor.customizeResponseBody(responseBody, executionResult, httpHeaders); + extensions, httpHeaders); + Mono graphQLResponseBodyMono = interceptor.customizeResponseBody(responseBody, executionResult, httpHeaders); return graphQLResponseBodyMono; } diff --git a/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLHttpRequest.java b/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLHttpRequest.java new file mode 100644 index 00000000..df19cf75 --- /dev/null +++ b/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLHttpRequest.java @@ -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 variables; + private final HttpHeaders httpHeaders; + private final MultiValueMap requestParams; + + public GraphQLHttpRequest(String query, + String operationName, + Map variables, + HttpHeaders httpHeaders, + MultiValueMap 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 getVariables() { + return variables; + } + + public HttpHeaders getHttpHeaders() { + return httpHeaders; + } + + public MultiValueMap getRequestParams() { + return requestParams; + } +} diff --git a/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLResponse.java b/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLHttpResponse.java similarity index 53% rename from spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLResponse.java rename to spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLHttpResponse.java index 7e4f3554..dc1a1f64 100644 --- a/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLResponse.java +++ b/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLHttpResponse.java @@ -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> errors; private final Map extensions; + private final HttpHeaders httpHeaders; - public GraphQLResponse(Object data, List> errors, Map extensions) { + public GraphQLHttpResponse(Object data, + List> errors, + Map 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 getExtensions() { return extensions; } + + public HttpHeaders getHttpHeaders() { + return httpHeaders; + } } diff --git a/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLInterceptor.java b/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLInterceptor.java index a4f8d761..3220ea82 100644 --- a/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLInterceptor.java +++ b/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLInterceptor.java @@ -15,8 +15,8 @@ public interface GraphQLInterceptor { return Mono.just(result); } - default Mono customizeResponseBody(GraphQLResponse graphQLResponse, ExecutionResult executionResult, HttpHeaders httpHeader) { - return Mono.just(graphQLResponse); + default Mono customizeResponseBody(GraphQLHttpResponse graphQLHttpResponse, ExecutionResult executionResult, HttpHeaders httpHeader) { + return Mono.just(graphQLHttpResponse); } } \ No newline at end of file diff --git a/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLRequestBody.java b/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLRequestBody.java deleted file mode 100644 index 45dfbd11..00000000 --- a/spring-graphql-common/src/main/java/org/springframework/graphql/GraphQLRequestBody.java +++ /dev/null @@ -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 variables; - - public GraphQLRequestBody(String query, String operationName, Map variables) { - this.query = query; - this.operationName = operationName; - this.variables = variables; - } - - public String getQuery() { - return query; - } - - public String getOperationName() { - return operationName; - } - - public Map getVariables() { - return variables; - } -} diff --git a/spring-graphql-webflux/src/main/java/org/springframework/graphql/reactive/components/GraphQLController.java b/spring-graphql-webflux/src/main/java/org/springframework/graphql/reactive/components/GraphQLController.java index 950cd787..0ea5f9b5 100644 --- a/spring-graphql-webflux/src/main/java/org/springframework/graphql/reactive/components/GraphQLController.java +++ b/spring-graphql-webflux/src/main/java/org/springframework/graphql/reactive/components/GraphQLController.java @@ -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` diff --git a/spring-graphql-webmvc/src/main/java/org/springframework/graphql/servlet/components/GraphQLController.java b/spring-graphql-webmvc/src/main/java/org/springframework/graphql/servlet/components/GraphQLController.java index c3c8bdfb..ab0508b2 100644 --- a/spring-graphql-webmvc/src/main/java/org/springframework/graphql/servlet/components/GraphQLController.java +++ b/spring-graphql-webmvc/src/main/java/org/springframework/graphql/servlet/components/GraphQLController.java @@ -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> responseRawMono = graphQLHandler.graphqlPOST(graphQLRequestBody, serverRequest.headers().asHttpHeaders()) + Mono> responseRawMono = graphQLHandler.graphqlPOST(graphQLHttpRequest) .map(graphQLResponseBody -> { //TODO: this should be handled better: // we don't want to serialize `null` values for `errors` and `extensions`