Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
14 changes: 8 additions & 6 deletions src/Core/BasicGraphQLExecuter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Threading;
using System.Threading.Tasks;
using GraphQL.Instrumentation;
using GraphQL.Transport;
using GraphQL.Types;
using Microsoft.Extensions.Options;

Expand All @@ -27,11 +28,11 @@ public BasicGraphQLExecuter(
_options = options.Value;
}

public virtual async Task<ExecutionResult> ExecuteAsync(string operationName, string query, Inputs variables, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken = default)
public virtual async Task<ExecutionResult> ExecuteAsync(GraphQLRequest request, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken = default)
{
var start = DateTime.UtcNow;

var options = GetOptions(operationName, query, variables, context, requestServices, cancellationToken);
var options = GetOptions(request, context, requestServices, cancellationToken);
var result = await _documentExecuter.ExecuteAsync(options);

if (options.EnableMetrics)
Expand All @@ -42,14 +43,15 @@ public virtual async Task<ExecutionResult> ExecuteAsync(string operationName, st
return result;
}

protected virtual ExecutionOptions GetOptions(string operationName, string query, Inputs variables, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken)
protected virtual ExecutionOptions GetOptions(GraphQLRequest request, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken)
{
var opts = new ExecutionOptions
{
Schema = Schema,
OperationName = operationName,
Query = query,
Variables = variables,
OperationName = request.OperationName,
Query = request.Query,
Variables = request.Variables,
Extensions = request.Extensions,
UserContext = context,
CancellationToken = cancellationToken,
ComplexityConfiguration = _options.ComplexityConfiguration,
Expand Down
14 changes: 8 additions & 6 deletions src/Core/DefaultGraphQLExecuter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Threading.Tasks;
using GraphQL.Execution;
using GraphQL.Instrumentation;
using GraphQL.Transport;
using GraphQL.Types;
using GraphQL.Validation;
using Microsoft.Extensions.Options;
Expand Down Expand Up @@ -37,11 +38,11 @@ public DefaultGraphQLExecuter(
_validationRules = validationRules;
}

public virtual async Task<ExecutionResult> ExecuteAsync(string operationName, string query, Inputs variables, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken = default)
public virtual async Task<ExecutionResult> ExecuteAsync(GraphQLRequest request, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken = default)
{
var start = DateTime.UtcNow;

var options = GetOptions(operationName, query, variables, context, requestServices, cancellationToken);
var options = GetOptions(request, context, requestServices, cancellationToken);
var result = await _documentExecuter.ExecuteAsync(options);

if (options.EnableMetrics)
Expand All @@ -52,14 +53,15 @@ public virtual async Task<ExecutionResult> ExecuteAsync(string operationName, st
return result;
}

protected virtual ExecutionOptions GetOptions(string operationName, string query, Inputs variables, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken)
protected virtual ExecutionOptions GetOptions(GraphQLRequest request, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken)
{
var opts = new ExecutionOptions
{
Schema = Schema,
OperationName = operationName,
Query = query,
Variables = variables,
OperationName = request.OperationName,
Query = request.Query,
Variables = request.Variables,
Extensions = request.Extensions,
UserContext = context,
CancellationToken = cancellationToken,
ComplexityConfiguration = _options.ComplexityConfiguration,
Expand Down
10 changes: 2 additions & 8 deletions src/Core/IGraphQLExecuter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using GraphQL.Transport;
using GraphQL.Types;

namespace GraphQL.Server
Expand All @@ -14,14 +15,7 @@ public interface IGraphQLExecuter
/// <summary>
/// Execute operation
/// </summary>
/// <param name="operationName"></param>
/// <param name="query"></param>
/// <param name="variables"></param>
/// <param name="context"></param>
/// <param name="requestServices"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<ExecutionResult> ExecuteAsync(string operationName, string query, Inputs variables, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken = default);
Task<ExecutionResult> ExecuteAsync(GraphQLRequest request, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken = default);
}

public interface IGraphQLExecuter<TSchema> : IGraphQLExecuter
Expand Down
6 changes: 2 additions & 4 deletions src/Transports.AspNetCore/GraphQLHttpMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -227,11 +227,9 @@ protected virtual Task HandleInvalidContentTypeErrorAsync(HttpContext context)
protected virtual Task HandleInvalidHttpMethodErrorAsync(HttpContext context)
=> WriteErrorResponseAsync(context, $"Invalid HTTP method. Only GET and POST are supported. {DOCS_URL}", HttpStatusCode.MethodNotAllowed);

private static Task<ExecutionResult> ExecuteRequestAsync(GraphQLRequest gqlRequest, IDictionary<string, object> userContext, IGraphQLExecuter<TSchema> executer, IServiceProvider requestServices, CancellationToken token)
protected virtual Task<ExecutionResult> ExecuteRequestAsync(GraphQLRequest gqlRequest, IDictionary<string, object> userContext, IGraphQLExecuter<TSchema> executer, IServiceProvider requestServices, CancellationToken token)
=> executer.ExecuteAsync(
gqlRequest.OperationName,
gqlRequest.Query,
gqlRequest.Variables,
gqlRequest,
userContext,
requestServices,
token);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,7 @@ private async Task<Subscription> ExecuteAsync(
using (var scope = _serviceScopeFactory.CreateScope())
{
result = await _executer.ExecuteAsync(
payload.OperationName,
payload.Query,
payload.Variables,
payload,
context,
scope.ServiceProvider
).ConfigureAwait(false);
Expand Down
10 changes: 5 additions & 5 deletions tests/ApiApprovalTests/GraphQL.Server.Core.approved.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ namespace GraphQL.Server
{
public BasicGraphQLExecuter(TSchema schema, GraphQL.IDocumentExecuter documentExecuter, Microsoft.Extensions.Options.IOptions<GraphQL.Server.GraphQLOptions> options) { }
public TSchema Schema { get; }
public virtual System.Threading.Tasks.Task<GraphQL.ExecutionResult> ExecuteAsync(string operationName, string query, GraphQL.Inputs variables, System.Collections.Generic.IDictionary<string, object> context, System.IServiceProvider requestServices, System.Threading.CancellationToken cancellationToken = default) { }
protected virtual GraphQL.ExecutionOptions GetOptions(string operationName, string query, GraphQL.Inputs variables, System.Collections.Generic.IDictionary<string, object> context, System.IServiceProvider requestServices, System.Threading.CancellationToken cancellationToken) { }
public virtual System.Threading.Tasks.Task<GraphQL.ExecutionResult> ExecuteAsync(GraphQL.Transport.GraphQLRequest request, System.Collections.Generic.IDictionary<string, object> context, System.IServiceProvider requestServices, System.Threading.CancellationToken cancellationToken = default) { }
protected virtual GraphQL.ExecutionOptions GetOptions(GraphQL.Transport.GraphQLRequest request, System.Collections.Generic.IDictionary<string, object> context, System.IServiceProvider requestServices, System.Threading.CancellationToken cancellationToken) { }
}
public class DefaultErrorInfoProvider : GraphQL.Execution.ErrorInfoProvider
{
Expand All @@ -18,8 +18,8 @@ namespace GraphQL.Server
{
public DefaultGraphQLExecuter(TSchema schema, GraphQL.IDocumentExecuter documentExecuter, Microsoft.Extensions.Options.IOptions<GraphQL.Server.GraphQLOptions> options, System.Collections.Generic.IEnumerable<GraphQL.Execution.IDocumentExecutionListener> listeners, System.Collections.Generic.IEnumerable<GraphQL.Validation.IValidationRule> validationRules) { }
public TSchema Schema { get; }
public virtual System.Threading.Tasks.Task<GraphQL.ExecutionResult> ExecuteAsync(string operationName, string query, GraphQL.Inputs variables, System.Collections.Generic.IDictionary<string, object> context, System.IServiceProvider requestServices, System.Threading.CancellationToken cancellationToken = default) { }
protected virtual GraphQL.ExecutionOptions GetOptions(string operationName, string query, GraphQL.Inputs variables, System.Collections.Generic.IDictionary<string, object> context, System.IServiceProvider requestServices, System.Threading.CancellationToken cancellationToken) { }
public virtual System.Threading.Tasks.Task<GraphQL.ExecutionResult> ExecuteAsync(GraphQL.Transport.GraphQLRequest request, System.Collections.Generic.IDictionary<string, object> context, System.IServiceProvider requestServices, System.Threading.CancellationToken cancellationToken = default) { }
protected virtual GraphQL.ExecutionOptions GetOptions(GraphQL.Transport.GraphQLRequest request, System.Collections.Generic.IDictionary<string, object> context, System.IServiceProvider requestServices, System.Threading.CancellationToken cancellationToken) { }
}
public static class GraphQLBuilderCoreExtensions
{
Expand All @@ -36,7 +36,7 @@ namespace GraphQL.Server
}
public interface IGraphQLExecuter
{
System.Threading.Tasks.Task<GraphQL.ExecutionResult> ExecuteAsync(string operationName, string query, GraphQL.Inputs variables, System.Collections.Generic.IDictionary<string, object> context, System.IServiceProvider requestServices, System.Threading.CancellationToken cancellationToken = default);
System.Threading.Tasks.Task<GraphQL.ExecutionResult> ExecuteAsync(GraphQL.Transport.GraphQLRequest request, System.Collections.Generic.IDictionary<string, object> context, System.IServiceProvider requestServices, System.Threading.CancellationToken cancellationToken = default);
}
public interface IGraphQLExecuter<TSchema> : GraphQL.Server.IGraphQLExecuter
where TSchema : GraphQL.Types.ISchema
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ namespace GraphQL.Server.Transports.AspNetCore
where TSchema : GraphQL.Types.ISchema
{
public GraphQLHttpMiddleware(GraphQL.IGraphQLTextSerializer serializer) { }
protected virtual System.Threading.Tasks.Task<GraphQL.ExecutionResult> ExecuteRequestAsync(GraphQL.Transport.GraphQLRequest gqlRequest, System.Collections.Generic.IDictionary<string, object> userContext, GraphQL.Server.IGraphQLExecuter<TSchema> executer, System.IServiceProvider requestServices, System.Threading.CancellationToken token) { }
protected virtual System.Threading.CancellationToken GetCancellationToken(Microsoft.AspNetCore.Http.HttpContext context) { }
protected virtual System.Threading.Tasks.Task HandleContentTypeCouldNotBeParsedErrorAsync(Microsoft.AspNetCore.Http.HttpContext context) { }
protected virtual System.Threading.Tasks.ValueTask<bool> HandleDeserializationErrorAsync(Microsoft.AspNetCore.Http.HttpContext context, System.Exception ex) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public ProtocolHandlerFacts()
_transportReader = _transport.Reader as TestableReader;
_transportWriter = _transport.Writer as TestableWriter;
_documentExecuter = Substitute.For<IGraphQLExecuter>();
_documentExecuter.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
_documentExecuter.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
new SubscriptionExecutionResult
{
Streams = new Dictionary<string, IObservable<ExecutionResult>>
Expand Down Expand Up @@ -67,7 +67,7 @@ public async Task Receive_init()
public async Task Receive_start_mutation()
{
/* Given */
_documentExecuter.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
_documentExecuter.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
new ExecutionResult());
var expected = new OperationMessage
{
Expand Down Expand Up @@ -104,7 +104,7 @@ public async Task Receive_start_mutation()
public async Task Receive_start_query()
{
/* Given */
_documentExecuter.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
_documentExecuter.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
new ExecutionResult());
var expected = new OperationMessage
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public SubscriptionManagerFacts()
{
_writer = Substitute.For<IWriterPipeline>();
_executer = Substitute.For<IGraphQLExecuter>();
_executer.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
_executer.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
new SubscriptionExecutionResult
{
Streams = new Dictionary<string, IObservable<ExecutionResult>>
Expand All @@ -40,7 +40,7 @@ public async Task Failed_Subscribe_does_not_add()
var payload = new GraphQLRequest();
var context = new MessageHandlingContext(_server, null);

_executer.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
_executer.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
new SubscriptionExecutionResult
{
Errors = new ExecutionErrors
Expand All @@ -64,7 +64,7 @@ public async Task Failed_Subscribe_with_null_stream()
var payload = new GraphQLRequest();
var context = new MessageHandlingContext(_server, null);

_executer.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
_executer.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
new SubscriptionExecutionResult
{
Streams = new Dictionary<string, IObservable<ExecutionResult>>
Expand All @@ -91,7 +91,7 @@ public async Task Failed_Subscribe_writes_error()
var payload = new GraphQLRequest();
var context = new MessageHandlingContext(_server, null);

_executer.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
_executer.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
new SubscriptionExecutionResult
{
Errors = new ExecutionErrors
Expand Down Expand Up @@ -138,9 +138,7 @@ public async Task Subscribe_executes()

/* Then */
await _executer.Received().ExecuteAsync(
Arg.Is(payload.OperationName),
Arg.Is(payload.Query),
Arg.Any<Inputs>(),
Arg.Is(payload),
context,
null);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public SubscriptionServerFacts()
_transportReader = _transport.Reader as TestableReader;
_transportWriter = _transport.Writer as TestableWriter;
_documentExecuter = Substitute.For<IGraphQLExecuter>();
_documentExecuter.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
_documentExecuter.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
new SubscriptionExecutionResult
{
Streams = new Dictionary<string, IObservable<ExecutionResult>>
Expand Down