Search in sources :

Example 1 with ExecutionInputBuilderWithContext

use of io.vertx.ext.web.handler.graphql.ExecutionInputBuilderWithContext in project vertx-web by vert-x3.

the class GraphQLHandlerImpl method execute.

private Future<JsonObject> execute(RoutingContext rc, GraphQLQuery query) {
    ExecutionInput.Builder builder = ExecutionInput.newExecutionInput();
    builder.query(query.getQuery());
    String operationName = query.getOperationName();
    if (operationName != null) {
        builder.operationName(operationName);
    }
    Map<String, Object> variables = query.getVariables();
    if (variables != null) {
        builder.variables(variables);
    }
    Object initialValue = query.getInitialValue();
    if (initialValue != null) {
        builder.root(initialValue);
    }
    Function<RoutingContext, Object> qc;
    Function<RoutingContext, DataLoaderRegistry> dlr;
    Function<RoutingContext, Locale> l;
    Handler<ExecutionInputBuilderWithContext<RoutingContext>> be;
    synchronized (this) {
        qc = queryContextFactory;
        dlr = dataLoaderRegistryFactory;
        l = localeFactory;
        be = beforeExecute;
    }
    builder.context(qc.apply(rc));
    DataLoaderRegistry registry = dlr.apply(rc);
    if (registry != null) {
        builder.dataLoaderRegistry(registry);
    }
    Locale locale = l.apply(rc);
    if (locale != null) {
        builder.locale(locale);
    }
    builder.graphQLContext(Collections.singletonMap(RoutingContext.class, rc));
    if (be != null) {
        be.handle(new ExecutionInputBuilderWithContext<RoutingContext>() {

            @Override
            public RoutingContext context() {
                return rc;
            }

            @Override
            public ExecutionInput.Builder builder() {
                return builder;
            }
        });
    }
    return Future.fromCompletionStage(graphQL.executeAsync(builder.build()), rc.vertx().getOrCreateContext()).map(executionResult -> new JsonObject(executionResult.toSpecification()));
}
Also used : JsonObject(io.vertx.core.json.JsonObject) ExecutionInputBuilderWithContext(io.vertx.ext.web.handler.graphql.ExecutionInputBuilderWithContext) RoutingContext(io.vertx.ext.web.RoutingContext) DataLoaderRegistry(org.dataloader.DataLoaderRegistry) JsonObject(io.vertx.core.json.JsonObject) ExecutionInput(graphql.ExecutionInput)

Example 2 with ExecutionInputBuilderWithContext

use of io.vertx.ext.web.handler.graphql.ExecutionInputBuilderWithContext in project vertx-web by vert-x3.

the class ApolloWSConnectionHandler method start.

private void start(ApolloWSMessage message) {
    String opId = message.content().getString("id");
    // Unsubscribe if it's subscribed
    if (subscriptions.containsKey(opId)) {
        stop(opId);
    }
    GraphQLQuery payload = new GraphQLQuery(message.content().getJsonObject("payload"));
    ExecutionInput.Builder builder = ExecutionInput.newExecutionInput();
    builder.query(payload.getQuery());
    builder.context(apolloWSHandler.getQueryContext().apply(message));
    DataLoaderRegistry registry = apolloWSHandler.getDataLoaderRegistry().apply(message);
    if (registry != null) {
        builder.dataLoaderRegistry(registry);
    }
    Locale locale = apolloWSHandler.getLocale().apply(message);
    if (locale != null) {
        builder.locale(locale);
    }
    String operationName = payload.getOperationName();
    if (operationName != null) {
        builder.operationName(operationName);
    }
    Map<String, Object> variables = payload.getVariables();
    if (variables != null) {
        builder.variables(variables);
    }
    Object initialValue = payload.getInitialValue();
    if (initialValue != null) {
        builder.root(initialValue);
    }
    Handler<ExecutionInputBuilderWithContext<ApolloWSMessage>> beforeExecute = apolloWSHandler.getBeforeExecute();
    if (beforeExecute != null) {
        beforeExecute.handle(new ExecutionInputBuilderWithContext<ApolloWSMessage>() {

            @Override
            public ApolloWSMessage context() {
                return message;
            }

            @Override
            public ExecutionInput.Builder builder() {
                return builder;
            }
        });
    }
    builder.graphQLContext(Collections.singletonMap(ApolloWSMessage.class, message));
    apolloWSHandler.getGraphQL().executeAsync(builder).whenCompleteAsync((executionResult, throwable) -> {
        if (throwable == null) {
            if (executionResult.getData() instanceof Publisher) {
                subscribe(opId, executionResult);
            } else {
                sendMessage(opId, DATA, new JsonObject(executionResult.toSpecification()));
                sendMessage(opId, COMPLETE, null);
            }
        } else {
            if (log.isDebugEnabled()) {
                log.debug("Failed to execute GraphQL query, opId=" + opId, throwable);
            }
            sendMessage(opId, ERROR, toJsonObject(throwable));
        }
    }, executor);
}
Also used : Locale(java.util.Locale) ApolloWSMessage(io.vertx.ext.web.handler.graphql.ApolloWSMessage) JsonObject(io.vertx.core.json.JsonObject) ErrorUtil.toJsonObject(io.vertx.ext.web.handler.graphql.impl.ErrorUtil.toJsonObject) Publisher(org.reactivestreams.Publisher) ExecutionInputBuilderWithContext(io.vertx.ext.web.handler.graphql.ExecutionInputBuilderWithContext) DataLoaderRegistry(org.dataloader.DataLoaderRegistry) JsonObject(io.vertx.core.json.JsonObject) ErrorUtil.toJsonObject(io.vertx.ext.web.handler.graphql.impl.ErrorUtil.toJsonObject) ExecutionInput(graphql.ExecutionInput)

Aggregations

ExecutionInput (graphql.ExecutionInput)2 JsonObject (io.vertx.core.json.JsonObject)2 ExecutionInputBuilderWithContext (io.vertx.ext.web.handler.graphql.ExecutionInputBuilderWithContext)2 DataLoaderRegistry (org.dataloader.DataLoaderRegistry)2 RoutingContext (io.vertx.ext.web.RoutingContext)1 ApolloWSMessage (io.vertx.ext.web.handler.graphql.ApolloWSMessage)1 ErrorUtil.toJsonObject (io.vertx.ext.web.handler.graphql.impl.ErrorUtil.toJsonObject)1 Locale (java.util.Locale)1 Publisher (org.reactivestreams.Publisher)1