Skip to content

Commit

Permalink
Merge pull request #254 from graphql-java-kickstart/bugfix/252-fallba…
Browse files Browse the repository at this point in the history
…ck-subscription-deserialization

Deserialize payload depending on type fix #252
  • Loading branch information
oliemansm authored May 20, 2020
2 parents be0d682 + 267a9e3 commit c86bef7
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,38 @@

import com.fasterxml.jackson.core.JsonProcessingException;
import graphql.ExecutionResult;
import graphql.GraphQLException;
import graphql.kickstart.execution.GraphQLObjectMapper;
import graphql.kickstart.execution.GraphQLRequest;
import java.util.Map;
import java.util.Objects;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class GraphQLSubscriptionMapper {

private final GraphQLObjectMapper graphQLObjectMapper;

public GraphQLRequest readGraphQLRequest(Object payload) {
public GraphQLRequest readGraphQLRequest(String payload) {
Objects.requireNonNull(payload, "Payload is required");
try {
return graphQLObjectMapper.getJacksonMapper().readValue(payload, GraphQLRequest.class);
} catch (JsonProcessingException e) {
throw new GraphQLException("Cannot read GraphQL request from payload '" + payload + "'", e);
}
}

public GraphQLRequest convertGraphQLRequest(Object payload) {
Objects.requireNonNull(payload, "Payload is required");
return graphQLObjectMapper.getJacksonMapper().convertValue(payload, GraphQLRequest.class);
}

public ExecutionResult sanitizeErrors(ExecutionResult executionResult) {
return graphQLObjectMapper.sanitizeErrors(executionResult);
}

public boolean areErrorsPresent(ExecutionResult executionResult) {
return graphQLObjectMapper.areErrorsPresent(executionResult);
public boolean hasNoErrors(ExecutionResult executionResult) {
return !graphQLObjectMapper.areErrorsPresent(executionResult);
}

public Map<String, Object> convertSanitizedExecutionResult(ExecutionResult executionResult) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,15 @@ public void apply(SubscriptionSession session, OperationMessage message) {

private CompletableFuture<ExecutionResult> executeAsync(Object payload, SubscriptionSession session) {
Objects.requireNonNull(payload, "Payload is required");
GraphQLRequest graphQLRequest = mapper.readGraphQLRequest(payload);
GraphQLRequest graphQLRequest = mapper.convertGraphQLRequest(payload);

GraphQLSingleInvocationInput invocationInput = invocationInputFactory.create(graphQLRequest, session);
return graphQLInvoker.executeAsync(invocationInput);
}

private void handleSubscriptionStart(SubscriptionSession session, String id, ExecutionResult executionResult) {
ExecutionResult sanitizedExecutionResult = mapper.sanitizeErrors(executionResult);
if (!mapper.areErrorsPresent(sanitizedExecutionResult)) {
if (mapper.hasNoErrors(sanitizedExecutionResult)) {
session.subscribe(id, sanitizedExecutionResult.getData());
} else {
Object payload = mapper.convertSanitizedExecutionResult(sanitizedExecutionResult);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,7 @@ public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request,
response.getHeaders().put(HandshakeRequest.SEC_WEBSOCKET_PROTOCOL,
new ArrayList<>(asList(subscriptionProtocolFactory.getProtocol())));
}

}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public void accept(String text) {
executionResult.thenAccept(result -> handleSubscriptionStart(session, UUID.randomUUID().toString(), result));
}

private CompletableFuture<ExecutionResult> executeAsync(Object payload, SubscriptionSession session) {
private CompletableFuture<ExecutionResult> executeAsync(String payload, SubscriptionSession session) {
Objects.requireNonNull(payload, "Payload is required");
GraphQLRequest graphQLRequest = mapper.readGraphQLRequest(payload);

Expand All @@ -40,7 +40,7 @@ private CompletableFuture<ExecutionResult> executeAsync(Object payload, Subscrip

private void handleSubscriptionStart(SubscriptionSession session, String id, ExecutionResult executionResult) {
ExecutionResult sanitizedExecutionResult = mapper.sanitizeErrors(executionResult);
if (!mapper.areErrorsPresent(sanitizedExecutionResult)) {
if (mapper.hasNoErrors(sanitizedExecutionResult)) {
session.subscribe(id, sanitizedExecutionResult.getData());
} else {
Object payload = mapper.convertSanitizedExecutionResult(sanitizedExecutionResult);
Expand Down

0 comments on commit c86bef7

Please sign in to comment.