Skip to content
This repository was archived by the owner on Oct 25, 2021. It is now read-only.

add ExecutionInputCustomizer #9

Merged
merged 4 commits into from
Apr 8, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package graphql.spring.web.reactive;

import graphql.ExecutionInput;
import graphql.PublicApi;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@PublicApi

This comment was marked as resolved.

public interface ExecutionInputCustomizer {

Mono<ExecutionInput> customizeExecutionInput(ExecutionInput executionInput, ServerWebExchange webRequest);

}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was thinking it should not be a Mono - but - perhaps it should since you might call out to somewhere to get a special "context token" etc...

So good idea!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yea ... it is all about giving the user the possibilities, so I think making it async is a good thing.

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package graphql.spring.web.reactive.components;

import graphql.ExecutionInput;
import graphql.Internal;
import graphql.spring.web.reactive.ExecutionInputCustomizer;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
@Internal
public class DefaultExecutionInputCustomizer implements ExecutionInputCustomizer {

@Override
public Mono<ExecutionInput> customizeExecutionInput(ExecutionInput executionInput, ServerWebExchange webRequest) {
return Mono.just(executionInput);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import graphql.ExecutionResult;
import graphql.GraphQL;
import graphql.Internal;
import graphql.spring.web.reactive.ExecutionInputCustomizer;
import graphql.spring.web.reactive.GraphQLInvocation;
import graphql.spring.web.reactive.GraphQLInvocationData;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -18,14 +19,18 @@ public class DefaultGraphQLInvocation implements GraphQLInvocation {
@Autowired
private GraphQL graphQL;

@Autowired
ExecutionInputCustomizer executionInputCustomizer;

@Override
public Mono<ExecutionResult> invoke(GraphQLInvocationData invocationData, ServerWebExchange serverWebExchange) {
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
.query(invocationData.getQuery())
.operationName(invocationData.getOperationName())
.variables(invocationData.getVariables())
.build();
return Mono.fromCompletionStage(graphQL.executeAsync(executionInput));
Mono<ExecutionInput> customizedExecutionInputMono = executionInputCustomizer.customizeExecutionInput(executionInput, serverWebExchange);
return customizedExecutionInputMono.flatMap(customizedExecutionInput -> Mono.fromCompletionStage(graphQL.executeAsync(customizedExecutionInput)));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package graphql.spring.web.servlet;

import graphql.ExecutionInput;
import graphql.PublicApi;
import org.springframework.web.context.request.WebRequest;

import java.util.concurrent.CompletableFuture;

@PublicApi
public interface ExecutionInputCustomizer {

CompletableFuture<ExecutionInput> customizeExecutionInput(ExecutionInput executionInput, WebRequest webRequest);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package graphql.spring.web.servlet.components;

import graphql.ExecutionInput;
import graphql.Internal;
import graphql.spring.web.servlet.ExecutionInputCustomizer;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.WebRequest;

import java.util.concurrent.CompletableFuture;

@Component
@Internal
public class DefaultExecutionInputCustomizer implements ExecutionInputCustomizer {

@Override
public CompletableFuture<ExecutionInput> customizeExecutionInput(ExecutionInput executionInput, WebRequest webRequest) {
return CompletableFuture.completedFuture(executionInput);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import graphql.ExecutionResult;
import graphql.GraphQL;
import graphql.Internal;
import graphql.spring.web.servlet.ExecutionInputCustomizer;
import graphql.spring.web.servlet.GraphQLInvocation;
import graphql.spring.web.servlet.GraphQLInvocationData;
import org.springframework.beans.factory.annotation.Autowired;
Expand All @@ -19,14 +20,18 @@ public class DefaultGraphQLInvocation implements GraphQLInvocation {
@Autowired
private GraphQL graphQL;

@Autowired
ExecutionInputCustomizer executionInputCustomizer;

@Override
public CompletableFuture<ExecutionResult> invoke(GraphQLInvocationData invocationData, WebRequest webRequest) {
ExecutionInput executionInput = ExecutionInput.newExecutionInput()
.query(invocationData.getQuery())
.operationName(invocationData.getOperationName())
.variables(invocationData.getVariables())
.build();
return graphQL.executeAsync(executionInput);
CompletableFuture<ExecutionInput> customizedExecutionInput = executionInputCustomizer.customizeExecutionInput(executionInput, webRequest);
return customizedExecutionInput.thenCompose(graphQL::executeAsync);
}

}