Skip to content

Commit 231b8a5

Browse files
authored
Add support for input extensions; light refactoring (#746)
1 parent 42fcba2 commit 231b8a5

File tree

10 files changed

+36
-43
lines changed

10 files changed

+36
-43
lines changed

src/Core/BasicGraphQLExecuter.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Threading;
44
using System.Threading.Tasks;
55
using GraphQL.Instrumentation;
6+
using GraphQL.Transport;
67
using GraphQL.Types;
78
using Microsoft.Extensions.Options;
89

@@ -27,11 +28,11 @@ public BasicGraphQLExecuter(
2728
_options = options.Value;
2829
}
2930

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

34-
var options = GetOptions(operationName, query, variables, context, requestServices, cancellationToken);
35+
var options = GetOptions(request, context, requestServices, cancellationToken);
3536
var result = await _documentExecuter.ExecuteAsync(options);
3637

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

45-
protected virtual ExecutionOptions GetOptions(string operationName, string query, Inputs variables, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken)
46+
protected virtual ExecutionOptions GetOptions(GraphQLRequest request, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken)
4647
{
4748
var opts = new ExecutionOptions
4849
{
4950
Schema = Schema,
50-
OperationName = operationName,
51-
Query = query,
52-
Variables = variables,
51+
OperationName = request.OperationName,
52+
Query = request.Query,
53+
Variables = request.Variables,
54+
Extensions = request.Extensions,
5355
UserContext = context,
5456
CancellationToken = cancellationToken,
5557
ComplexityConfiguration = _options.ComplexityConfiguration,

src/Core/DefaultGraphQLExecuter.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Threading.Tasks;
66
using GraphQL.Execution;
77
using GraphQL.Instrumentation;
8+
using GraphQL.Transport;
89
using GraphQL.Types;
910
using GraphQL.Validation;
1011
using Microsoft.Extensions.Options;
@@ -37,11 +38,11 @@ public DefaultGraphQLExecuter(
3738
_validationRules = validationRules;
3839
}
3940

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

44-
var options = GetOptions(operationName, query, variables, context, requestServices, cancellationToken);
45+
var options = GetOptions(request, context, requestServices, cancellationToken);
4546
var result = await _documentExecuter.ExecuteAsync(options);
4647

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

55-
protected virtual ExecutionOptions GetOptions(string operationName, string query, Inputs variables, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken)
56+
protected virtual ExecutionOptions GetOptions(GraphQLRequest request, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken)
5657
{
5758
var opts = new ExecutionOptions
5859
{
5960
Schema = Schema,
60-
OperationName = operationName,
61-
Query = query,
62-
Variables = variables,
61+
OperationName = request.OperationName,
62+
Query = request.Query,
63+
Variables = request.Variables,
64+
Extensions = request.Extensions,
6365
UserContext = context,
6466
CancellationToken = cancellationToken,
6567
ComplexityConfiguration = _options.ComplexityConfiguration,

src/Core/IGraphQLExecuter.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Threading;
44
using System.Threading.Tasks;
5+
using GraphQL.Transport;
56
using GraphQL.Types;
67

78
namespace GraphQL.Server
@@ -14,14 +15,7 @@ public interface IGraphQLExecuter
1415
/// <summary>
1516
/// Execute operation
1617
/// </summary>
17-
/// <param name="operationName"></param>
18-
/// <param name="query"></param>
19-
/// <param name="variables"></param>
20-
/// <param name="context"></param>
21-
/// <param name="requestServices"></param>
22-
/// <param name="cancellationToken"></param>
23-
/// <returns></returns>
24-
Task<ExecutionResult> ExecuteAsync(string operationName, string query, Inputs variables, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken = default);
18+
Task<ExecutionResult> ExecuteAsync(GraphQLRequest request, IDictionary<string, object> context, IServiceProvider requestServices, CancellationToken cancellationToken = default);
2519
}
2620

2721
public interface IGraphQLExecuter<TSchema> : IGraphQLExecuter

src/Transports.AspNetCore/GraphQLHttpMiddleware.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,11 +227,9 @@ protected virtual Task HandleInvalidContentTypeErrorAsync(HttpContext context)
227227
protected virtual Task HandleInvalidHttpMethodErrorAsync(HttpContext context)
228228
=> WriteErrorResponseAsync(context, $"Invalid HTTP method. Only GET and POST are supported. {DOCS_URL}", HttpStatusCode.MethodNotAllowed);
229229

230-
private static Task<ExecutionResult> ExecuteRequestAsync(GraphQLRequest gqlRequest, IDictionary<string, object> userContext, IGraphQLExecuter<TSchema> executer, IServiceProvider requestServices, CancellationToken token)
230+
protected virtual Task<ExecutionResult> ExecuteRequestAsync(GraphQLRequest gqlRequest, IDictionary<string, object> userContext, IGraphQLExecuter<TSchema> executer, IServiceProvider requestServices, CancellationToken token)
231231
=> executer.ExecuteAsync(
232-
gqlRequest.OperationName,
233-
gqlRequest.Query,
234-
gqlRequest.Variables,
232+
gqlRequest,
235233
userContext,
236234
requestServices,
237235
token);

src/Transports.Subscriptions.Abstractions/SubscriptionManager.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,7 @@ private async Task<Subscription> ExecuteAsync(
9494
using (var scope = _serviceScopeFactory.CreateScope())
9595
{
9696
result = await _executer.ExecuteAsync(
97-
payload.OperationName,
98-
payload.Query,
99-
payload.Variables,
97+
payload,
10098
context,
10199
scope.ServiceProvider
102100
).ConfigureAwait(false);

tests/ApiApprovalTests/GraphQL.Server.Core.approved.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ namespace GraphQL.Server
55
{
66
public BasicGraphQLExecuter(TSchema schema, GraphQL.IDocumentExecuter documentExecuter, Microsoft.Extensions.Options.IOptions<GraphQL.Server.GraphQLOptions> options) { }
77
public TSchema Schema { get; }
8-
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) { }
9-
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) { }
8+
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) { }
9+
protected virtual GraphQL.ExecutionOptions GetOptions(GraphQL.Transport.GraphQLRequest request, System.Collections.Generic.IDictionary<string, object> context, System.IServiceProvider requestServices, System.Threading.CancellationToken cancellationToken) { }
1010
}
1111
public class DefaultErrorInfoProvider : GraphQL.Execution.ErrorInfoProvider
1212
{
@@ -18,8 +18,8 @@ namespace GraphQL.Server
1818
{
1919
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) { }
2020
public TSchema Schema { get; }
21-
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) { }
22-
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) { }
21+
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) { }
22+
protected virtual GraphQL.ExecutionOptions GetOptions(GraphQL.Transport.GraphQLRequest request, System.Collections.Generic.IDictionary<string, object> context, System.IServiceProvider requestServices, System.Threading.CancellationToken cancellationToken) { }
2323
}
2424
public static class GraphQLBuilderCoreExtensions
2525
{
@@ -36,7 +36,7 @@ namespace GraphQL.Server
3636
}
3737
public interface IGraphQLExecuter
3838
{
39-
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);
39+
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);
4040
}
4141
public interface IGraphQLExecuter<TSchema> : GraphQL.Server.IGraphQLExecuter
4242
where TSchema : GraphQL.Types.ISchema

tests/ApiApprovalTests/GraphQL.Server.Transports.AspNetCore.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ namespace GraphQL.Server.Transports.AspNetCore
2525
where TSchema : GraphQL.Types.ISchema
2626
{
2727
public GraphQLHttpMiddleware(GraphQL.IGraphQLTextSerializer serializer) { }
28+
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) { }
2829
protected virtual System.Threading.CancellationToken GetCancellationToken(Microsoft.AspNetCore.Http.HttpContext context) { }
2930
protected virtual System.Threading.Tasks.Task HandleContentTypeCouldNotBeParsedErrorAsync(Microsoft.AspNetCore.Http.HttpContext context) { }
3031
protected virtual System.Threading.Tasks.ValueTask<bool> HandleDeserializationErrorAsync(Microsoft.AspNetCore.Http.HttpContext context, System.Exception ex) { }

tests/Transports.Subscriptions.Abstractions.Tests/ProtocolHandlerFacts.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public ProtocolHandlerFacts()
2727
_transportReader = _transport.Reader as TestableReader;
2828
_transportWriter = _transport.Writer as TestableWriter;
2929
_documentExecuter = Substitute.For<IGraphQLExecuter>();
30-
_documentExecuter.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
30+
_documentExecuter.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
3131
new SubscriptionExecutionResult
3232
{
3333
Streams = new Dictionary<string, IObservable<ExecutionResult>>
@@ -67,7 +67,7 @@ public async Task Receive_init()
6767
public async Task Receive_start_mutation()
6868
{
6969
/* Given */
70-
_documentExecuter.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
70+
_documentExecuter.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
7171
new ExecutionResult());
7272
var expected = new OperationMessage
7373
{
@@ -104,7 +104,7 @@ public async Task Receive_start_mutation()
104104
public async Task Receive_start_query()
105105
{
106106
/* Given */
107-
_documentExecuter.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
107+
_documentExecuter.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
108108
new ExecutionResult());
109109
var expected = new OperationMessage
110110
{

tests/Transports.Subscriptions.Abstractions.Tests/SubscriptionManagerFacts.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public SubscriptionManagerFacts()
1515
{
1616
_writer = Substitute.For<IWriterPipeline>();
1717
_executer = Substitute.For<IGraphQLExecuter>();
18-
_executer.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
18+
_executer.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
1919
new SubscriptionExecutionResult
2020
{
2121
Streams = new Dictionary<string, IObservable<ExecutionResult>>
@@ -40,7 +40,7 @@ public async Task Failed_Subscribe_does_not_add()
4040
var payload = new GraphQLRequest();
4141
var context = new MessageHandlingContext(_server, null);
4242

43-
_executer.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
43+
_executer.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
4444
new SubscriptionExecutionResult
4545
{
4646
Errors = new ExecutionErrors
@@ -64,7 +64,7 @@ public async Task Failed_Subscribe_with_null_stream()
6464
var payload = new GraphQLRequest();
6565
var context = new MessageHandlingContext(_server, null);
6666

67-
_executer.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
67+
_executer.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
6868
new SubscriptionExecutionResult
6969
{
7070
Streams = new Dictionary<string, IObservable<ExecutionResult>>
@@ -91,7 +91,7 @@ public async Task Failed_Subscribe_writes_error()
9191
var payload = new GraphQLRequest();
9292
var context = new MessageHandlingContext(_server, null);
9393

94-
_executer.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
94+
_executer.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
9595
new SubscriptionExecutionResult
9696
{
9797
Errors = new ExecutionErrors
@@ -138,9 +138,7 @@ public async Task Subscribe_executes()
138138

139139
/* Then */
140140
await _executer.Received().ExecuteAsync(
141-
Arg.Is(payload.OperationName),
142-
Arg.Is(payload.Query),
143-
Arg.Any<Inputs>(),
141+
Arg.Is(payload),
144142
context,
145143
null);
146144
}

tests/Transports.Subscriptions.Abstractions.Tests/SubscriptionServerFacts.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public SubscriptionServerFacts()
1818
_transportReader = _transport.Reader as TestableReader;
1919
_transportWriter = _transport.Writer as TestableWriter;
2020
_documentExecuter = Substitute.For<IGraphQLExecuter>();
21-
_documentExecuter.ExecuteAsync(null, null, null, null, null).ReturnsForAnyArgs(
21+
_documentExecuter.ExecuteAsync(null, null, null).ReturnsForAnyArgs(
2222
new SubscriptionExecutionResult
2323
{
2424
Streams = new Dictionary<string, IObservable<ExecutionResult>>

0 commit comments

Comments
 (0)