Skip to content

Commit 84768c6

Browse files
schabannestlilsylvain-chabannesBoBieneyokan87
authored
Upgrade GraphQL.NET dependency to version 3.0.0 (#194)
* Update dotnetcore.yml * Update GraphQL .Net to latest preview (3.0.0-preview-1271) Replace UserContextWrapper by new GraphQL.Net UserContext dictionary. Rename IdGraphType name from 'ID' to 'Identity' to avoid clash with GraphQL.Net internal IdGraphType. Fix Unit tests. * Add Async overloads. Cleanup csproj. * Ignore dotsettings file (resharper) + .gitignore * Use async API in IGraphQLExecutor and IRequestHandler. Remove sync conterpart methods. Update tests. * Remove async/await on delegating methods. * Compatiblity with GraphQL 3.0.0-preview-1719 * Fix Tests.Adapters.Engine.Bugs.BugUnexpectedTypeTests.Can_Resolve_Null_NonNull_Query * Restore Workflow-File * Using GraphQL release 3.0.0 * fixed subscription execution * resolve TypeName of generic type in IObservable * Fix ErrorTests. * UserContextExtensions now uses IProvideUserContext. Fix test to use the new usercontext dictionary. * Fix broken test. * Trivial code review changes. * Remove obsolete tests (ExposingExceptionsTests). * Use TryGetValue in UserContextExtensions. * Add TypeConverter support to PrimitiveWrapper. Remove IdGraphType and add IdConverter. Revert IdGraphType renaming (ID to Identity). Fix tests. * Post-merge fix * Fix version number Co-authored-by: Tommy Lillehagen <tommy@lillehagen.me> Co-authored-by: Sylvain Chabannes <sylvain.chabannes@datacom.com.au> Co-authored-by: Bo Biene <bo_biene@hotmail.com> Co-authored-by: Bo Biene <BoBiene@users.noreply.github.com> Co-authored-by: Jan Domnick <jan.domnick@gmail.com>
1 parent c63aff3 commit 84768c6

File tree

55 files changed

+398
-531
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+398
-531
lines changed

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,9 @@ TestResults/
1717
packages/
1818
node_modules/
1919
nuget/lib
20+
21+
# ReSharper is a .NET coding add-in
22+
_ReSharper*/
23+
*.[Rr]e[Ss]harper
24+
*.DotSettings
25+
*.DotSettings.user

Conventions.sln.DotSettings

Lines changed: 0 additions & 2 deletions
This file was deleted.

src/GraphQL.Conventions/Adapters/Engine/DocumentExecuter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public async Task<ExecutionResult> ExecuteAsync(ISchema schema, object root, str
2929
.WithInputs(inputs)
3030
.WithCancellationToken(cancellationToken)
3131
.WithValidationRules(rules)
32-
.Execute();
32+
.ExecuteAsync();
3333
}
3434

3535
public async Task<ExecutionResult> ExecuteAsync(ExecutionOptions options)
@@ -43,7 +43,7 @@ public async Task<ExecutionResult> ExecuteAsync(ExecutionOptions options)
4343
.WithInputs(options.Inputs)
4444
.WithCancellationToken(options.CancellationToken)
4545
.WithValidationRules(options.ValidationRules)
46-
.Execute();
46+
.ExecuteAsync();
4747
}
4848

4949
public Task<ExecutionResult> ExecuteAsync(Action<ExecutionOptions> configure)

src/GraphQL.Conventions/Adapters/Engine/GraphQLEngine.cs

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
using GraphQL.Conventions.Types.Descriptors;
1414
using GraphQL.Conventions.Types.Resolution;
1515
using GraphQL.Execution;
16-
using GraphQL.Http;
1716
using GraphQL.Instrumentation;
17+
using GraphQL.NewtonsoftJson;
1818
using GraphQL.Types;
1919
using GraphQL.Utilities;
2020
using GraphQL.Validation;
@@ -54,14 +54,10 @@ public class GraphQLEngine
5454

5555
private bool _includeFieldDeprecationReasons;
5656

57-
private bool _exposeExceptions;
58-
5957
private class NoopValidationRule : IValidationRule
6058
{
61-
public INodeVisitor Validate(ValidationContext context)
62-
{
63-
return new EnterLeaveListener(_ => { });
64-
}
59+
public Task<INodeVisitor> ValidateAsync(ValidationContext context)
60+
=> Task.FromResult<INodeVisitor>(new EnterLeaveListener(_ => { }));
6561
}
6662

6763
private class WrappedDependencyInjector : IDependencyInjector
@@ -190,17 +186,6 @@ public GraphQLEngine WithCustomErrorTransformation(IErrorTransformation errorTra
190186
return this;
191187
}
192188

193-
/// <summary>
194-
/// Enables <see cref="ExecutionOptions.ExposeExceptions"/> which leads to exception stack trace
195-
/// be appended to the error message when serializing response.
196-
/// </summary>
197-
/// <param name="expose">Indicates whether to expose exceptions.</param>
198-
public GraphQLEngine WithExposedExceptions(bool expose = true)
199-
{
200-
_exposeExceptions = expose;
201-
return this;
202-
}
203-
204189
public GraphQLEngine WithQueryExtensions(System.Type typeExtensions)
205190
{
206191
_typeResolver.AddExtensions(typeExtensions);
@@ -273,12 +258,9 @@ public GraphQLEngine RegisterScalarType<TType, TGraphType>(string name = null)
273258
return this;
274259
}
275260

276-
public string SerializeResult(ExecutionResult result)
277-
{
278-
return _documentWriter.Write(result);
279-
}
261+
public Task<string> SerializeResultAsync(ExecutionResult result) => _documentWriter.WriteToStringAsync(result);
280262

281-
internal async Task<ExecutionResult> Execute(
263+
internal async Task<ExecutionResult> ExecuteAsync(
282264
object rootObject,
283265
string query,
284266
string operationName,
@@ -305,12 +287,14 @@ internal async Task<ExecutionResult> Execute(
305287
Query = query,
306288
OperationName = operationName,
307289
Inputs = inputs,
308-
UserContext = UserContextWrapper.Create(userContext, dependencyInjector
309-
?? new WrappedDependencyInjector(_constructor.TypeResolutionDelegate)),
290+
UserContext = new Dictionary<string, object>()
291+
{
292+
{ typeof(IUserContext).FullName, userContext},
293+
{ typeof(IDependencyInjector).FullName, dependencyInjector ?? new WrappedDependencyInjector(_constructor.TypeResolutionDelegate)},
294+
},
310295
ValidationRules = validationRules.Any() ? validationRules : null,
311296
ComplexityConfiguration = complexityConfiguration,
312297
CancellationToken = cancellationToken,
313-
ExposeExceptions = _exposeExceptions
314298
};
315299

316300
if (listeners != null)
@@ -344,10 +328,10 @@ internal async Task<ExecutionResult> Execute(
344328
return result;
345329
}
346330

347-
internal IValidationResult Validate(string queryString)
331+
internal Task<IValidationResult> ValidateAsync(string queryString)
348332
{
349333
var document = _documentBuilder.Build(queryString);
350-
return _documentValidator.Validate(queryString, _schema, document);
334+
return _documentValidator.ValidateAsync(queryString, _schema, document);
351335
}
352336

353337
private object CreateInstance(System.Type type)

src/GraphQL.Conventions/Adapters/Engine/GraphQLExecutor.cs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,12 @@ public IGraphQLExecutor<ExecutionResult> WithOperationName(string operationName)
6565

6666
public IGraphQLExecutor<ExecutionResult> WithInputs(Dictionary<string, object> inputs)
6767
{
68-
_inputs = inputs != null ? new Inputs(inputs) : new Inputs();
68+
return WithInputs(new Inputs(inputs ?? new Dictionary<string, object>()));
69+
}
70+
71+
public IGraphQLExecutor<ExecutionResult> WithInputs(Inputs inputs)
72+
{
73+
_inputs = inputs;
6974
return this;
7075
}
7176

@@ -133,18 +138,16 @@ public IGraphQLExecutor<ExecutionResult> DisableProfiling()
133138
return this.EnableProfiling(false);
134139
}
135140

136-
public async Task<ExecutionResult> Execute() =>
137-
await _engine
138-
.Execute(
139-
_rootObject, _queryString, _operationName, _inputs, _userContext, _dependencyInjector,
140-
enableValidation: _enableValidation,
141-
enableProfiling: _enableProfiling,
142-
rules: _validationRules,
143-
complexityConfiguration: _complexityConfiguration,
144-
cancellationToken: _cancellationToken,
145-
listeners: _documentExecutionListeners)
146-
.ConfigureAwait(false);
141+
public Task<ExecutionResult> ExecuteAsync()
142+
=> _engine.ExecuteAsync(
143+
_rootObject, _queryString, _operationName, _inputs, _userContext, _dependencyInjector,
144+
enableValidation: _enableValidation,
145+
enableProfiling: _enableProfiling,
146+
rules: _validationRules,
147+
complexityConfiguration: _complexityConfiguration,
148+
cancellationToken: _cancellationToken,
149+
listeners: _documentExecutionListeners);
147150

148-
public IValidationResult Validate() => _engine.Validate(_queryString);
151+
public Task<IValidationResult> ValidateAsync() => _engine.ValidateAsync(_queryString);
149152
}
150153
}

src/GraphQL.Conventions/Adapters/Engine/IGraphQLExecutor.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public interface IGraphQLExecutor<TResult>
1515

1616
IGraphQLExecutor<TResult> WithOperationName(string operationName);
1717

18+
IGraphQLExecutor<TResult> WithInputs(Inputs inputs);
19+
1820
IGraphQLExecutor<TResult> WithInputs(Dictionary<string, object> inputs);
1921

2022
IGraphQLExecutor<TResult> WithRootObject(object rootValue);
@@ -39,6 +41,8 @@ public interface IGraphQLExecutor<TResult>
3941

4042
IGraphQLExecutor<TResult> DisableProfiling();
4143

42-
Task<TResult> Execute();
44+
Task<TResult> ExecuteAsync();
45+
46+
Task<IValidationResult> ValidateAsync();
4347
}
4448
}
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
using System.Threading;
21
using System.Threading.Tasks;
32
using GraphQL.Execution;
3+
using GraphQL.Validation;
44

55
namespace GraphQL.Conventions.Adapters.Engine.Listeners.DataLoader
66
{
7-
class DataLoaderListener : DocumentExecutionListenerBase<IDataLoaderContextProvider>
7+
class DataLoaderListener : DocumentExecutionListenerBase
88
{
9-
public override async Task BeforeExecutionStepAwaitedAsync(
10-
IDataLoaderContextProvider userContext,
11-
CancellationToken token)
9+
public override async Task AfterValidationAsync(IExecutionContext context, IValidationResult validationResult)
1210
{
13-
await userContext.FetchData(token).ConfigureAwait(false);
11+
var key = typeof(IUserContext).FullName;
12+
if (context.UserContext.ContainsKey(key) && context.UserContext[key] is IDataLoaderContextProvider provider)
13+
await provider.FetchData(context.CancellationToken).ConfigureAwait(false);
1414
}
1515
}
1616
}

src/GraphQL.Conventions/Adapters/Engine/Listeners/DataLoader/IDataLoaderContextProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
namespace GraphQL.Conventions
55
{
6-
public interface IDataLoaderContextProvider
6+
public interface IDataLoaderContextProvider : IUserContext
77
{
88
Task FetchData(CancellationToken token);
99
}

src/GraphQL.Conventions/Adapters/GraphTypeAdapter.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,14 @@ public ISchema DeriveSchema(GraphSchemaInfo schemaInfo)
4141
.GroupBy(t => t.Name)
4242
.Select(g => g.First())
4343
.ToArray();
44-
var schema = new Schema(new FuncDependencyResolver(DeriveTypeFromTypeInfo))
44+
var schema = new Schema(new FuncServiceProvider(DeriveTypeFromTypeInfo))
4545
{
4646
Query = DeriveOperationType(schemaInfo.Query),
4747
Mutation = DeriveOperationType(schemaInfo.Mutation),
4848
Subscription = DeriveOperationType(schemaInfo.Subscription),
49-
};
49+
};
5050
schema.RegisterTypes(possibleTypes);
51+
5152
return schema;
5253
}
5354

@@ -162,7 +163,7 @@ private Type GetPrimitiveType(GraphTypeInfo typeInfo)
162163
return typeof(DateTimeOffsetGraphType);
163164

164165
case TypeNames.Id:
165-
return typeof(Types.IdGraphType);
166+
return typeof(IdGraphType);
166167

167168
case TypeNames.Cursor:
168169
return typeof(Types.Relay.CursorGraphType);
@@ -329,9 +330,9 @@ private IGraphType ConstructOutputType(GraphTypeInfo typeInfo)
329330

330331
private static object UnwrapObject(object obj)
331332
{
332-
if (obj is INonNull @null)
333+
if (obj is INonNull nonnull)
333334
{
334-
obj = @null.ObjectValue;
335+
obj = nonnull.ObjectValue;
335336
}
336337
if (obj is Union union)
337338
{
@@ -348,4 +349,4 @@ private void DeriveFields(GraphTypeInfo typeInfo, IComplexGraphType graphType)
348349
}
349350
}
350351
}
351-
}
352+
}

src/GraphQL.Conventions/Adapters/ResolutionContext.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using System.Threading;
45
using GraphQL.Conventions.Execution;
56
using GraphQL.Conventions.Types.Descriptors;
@@ -57,15 +58,15 @@ public void SetArgument(string name, object value)
5758

5859
public object RootValue => FieldContext.RootValue;
5960

60-
public IUserContext UserContext => (FieldContext.UserContext as IUserContextAccessor)?.UserContext;
61+
public IUserContext UserContext => FieldContext.GetUserContext();
6162

62-
public IDependencyInjector DependencyInjector => (FieldContext.UserContext as IDependencyInjectorAccessor)?.DependencyInjector;
63+
public IDependencyInjector DependencyInjector => FieldContext.GetDependencyInjector();
6364

6465
public GraphFieldInfo FieldInfo { get; private set; }
6566

6667
public CancellationToken CancellationToken => FieldContext.CancellationToken;
6768

68-
public IEnumerable<string> Path => FieldContext.Path;
69+
public IEnumerable<string> Path => FieldContext.Path.Select(o => o?.ToString());
6970

7071
public ResolveFieldContext<object> FieldContext { get; private set; }
7172
}

0 commit comments

Comments
 (0)