From 987b4b90b25aaa5ec766f5034bc0a8937867c7b5 Mon Sep 17 00:00:00 2001 From: PascalSenn Date: Thu, 19 May 2022 06:50:19 +0200 Subject: [PATCH] Fixed node resolver and entities resolver (#5080) --- .../Helpers/EntitiesResolver.cs | 4 +- .../Types/Helpers/ResolverContextProxy.cs | 111 ++++++++++++++++++ .../Types/Relay/NodeFieldTypeInterceptor.cs | 15 +-- 3 files changed, 117 insertions(+), 13 deletions(-) create mode 100644 src/HotChocolate/Core/src/Types/Types/Helpers/ResolverContextProxy.cs diff --git a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Helpers/EntitiesResolver.cs b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Helpers/EntitiesResolver.cs index 5ae07ae3198..f2597377eec 100644 --- a/src/HotChocolate/ApolloFederation/src/ApolloFederation/Helpers/EntitiesResolver.cs +++ b/src/HotChocolate/ApolloFederation/src/ApolloFederation/Helpers/EntitiesResolver.cs @@ -34,7 +34,7 @@ internal static class EntitiesResolver context.SetLocalState(TypeField, objectType); context.SetLocalState(DataField, current.Data); - tasks[i] = resolver.Invoke(context).AsTask(); + tasks[i] = resolver.Invoke(new ResolverContextProxy(context)).AsTask(); } else { @@ -83,7 +83,7 @@ internal static class EntitiesResolver private static void ReportError(IResolverContext context, int item, Exception ex) { - Path itemPath = context.Path.Append(item); + Path itemPath = PathFactory.Instance.Append(context.Path, item); context.ReportError(ex, error => error.SetPath(itemPath)); } } diff --git a/src/HotChocolate/Core/src/Types/Types/Helpers/ResolverContextProxy.cs b/src/HotChocolate/Core/src/Types/Types/Helpers/ResolverContextProxy.cs new file mode 100644 index 00000000000..626232b2dd8 --- /dev/null +++ b/src/HotChocolate/Core/src/Types/Types/Helpers/ResolverContextProxy.cs @@ -0,0 +1,111 @@ +#nullable enable +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading; +using HotChocolate.Language; +using HotChocolate.Resolvers; +using HotChocolate.Types; + +namespace HotChocolate.Execution; + +internal sealed class ResolverContextProxy : IResolverContext +{ + private readonly IResolverContext _resolverContext; + + public ResolverContextProxy(IResolverContext resolverContext) + { + _resolverContext = resolverContext; + ScopedContextData = resolverContext.ScopedContextData; + LocalContextData = resolverContext.LocalContextData; + } + + public IDictionary ContextData => _resolverContext.ContextData; + + public ISchema Schema => _resolverContext.Schema; + + public IObjectType RootType => _resolverContext.RootType; + + public IObjectType ObjectType => _resolverContext.ObjectType; + + public IServiceProvider Services + { + get => _resolverContext.Services; + set => _resolverContext.Services = value; + } + + [Obsolete] + public IObjectField Field => _resolverContext.Field; + + public DocumentNode Document => _resolverContext.Document; + + public OperationDefinitionNode Operation => _resolverContext.Operation; + + [Obsolete] + public FieldNode FieldSelection => _resolverContext.FieldSelection; + + public NameString ResponseName => _resolverContext.ResponseName; + + public Path Path => _resolverContext.Path; + + public bool HasErrors => _resolverContext.HasErrors; + + public IFieldSelection Selection => _resolverContext.Selection; + + public IVariableValueCollection Variables => _resolverContext.Variables; + + + public IImmutableDictionary ScopedContextData + { + get; + set; + } + + public IImmutableDictionary LocalContextData + { + get; + set; + } + + public CancellationToken RequestAborted => _resolverContext.RequestAborted; + + [Obsolete("Use ArgumentValue(name) or " + + "ArgumentLiteral(name) or " + + "ArgumentOptional(name).")] + public T? Argument(NameString name) => _resolverContext.Argument(name); + + public object Service(Type service) => _resolverContext.Service(service); + + public void ReportError(string errorMessage) => _resolverContext.ReportError(errorMessage); + + public void ReportError(IError error) => _resolverContext.ReportError(error); + + public void ReportError(Exception exception, Action? configure = null) + => _resolverContext.ReportError(exception, configure); + + public IReadOnlyList GetSelections( + ObjectType typeContext, + SelectionSetNode? selectionSet = null, + bool allowInternals = false) + => _resolverContext.GetSelections(typeContext, selectionSet, allowInternals); + + public T GetQueryRoot() + => _resolverContext.GetQueryRoot(); + + public T Parent() => _resolverContext.Parent(); + + public T ArgumentValue(NameString name) => _resolverContext.ArgumentValue(name); + + public TValueNode ArgumentLiteral(NameString name) + where TValueNode : IValueNode + => _resolverContext.ArgumentLiteral(name); + + public Optional ArgumentOptional(NameString name) + => _resolverContext.ArgumentOptional(name); + + public ValueKind ArgumentKind(NameString name) => _resolverContext.ArgumentKind(name); + + public T Service() => _resolverContext.Service(); + + public T Resolver() => _resolverContext.Resolver(); +} diff --git a/src/HotChocolate/Core/src/Types/Types/Relay/NodeFieldTypeInterceptor.cs b/src/HotChocolate/Core/src/Types/Types/Relay/NodeFieldTypeInterceptor.cs index 7b1daddff1e..1993e7e97be 100644 --- a/src/HotChocolate/Core/src/Types/Types/Relay/NodeFieldTypeInterceptor.cs +++ b/src/HotChocolate/Core/src/Types/Types/Relay/NodeFieldTypeInterceptor.cs @@ -1,5 +1,3 @@ - - #nullable enable using System; @@ -20,6 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using static HotChocolate.Properties.TypeResources; using static HotChocolate.Types.WellKnownContextData; + namespace HotChocolate.Types.Relay; internal sealed class NodeFieldTypeInterceptor : TypeInterceptor @@ -66,10 +65,7 @@ internal sealed class NodeFieldTypeInterceptor : TypeInterceptor Node, Relay_NodeField_Description, node, - ResolveNodeAsync) - { - Arguments = { new(Id, Relay_NodeField_Id_Description, id) } - }; + ResolveNodeAsync) { Arguments = { new(Id, Relay_NodeField_Id_Description, id) } }; fields.Insert(index, field); @@ -89,10 +85,7 @@ internal sealed class NodeFieldTypeInterceptor : TypeInterceptor Nodes, Relay_NodesField_Description, nodes, - ResolveNodeAsync) - { - Arguments = { new(Ids, Relay_NodesField_Ids_Description, ids) } - }; + ResolveNodeAsync) { Arguments = { new(Ids, Relay_NodesField_Ids_Description, ids) } }; fields.Insert(index, field); @@ -155,7 +148,7 @@ internal sealed class NodeFieldTypeInterceptor : TypeInterceptor context.Schema.TryGetType(typeName, out ObjectType? type) && type.ContextData.TryGetValue(NodeResolver, out var o) && o is FieldResolverDelegate resolver - ? resolver.Invoke(context).AsTask() + ? resolver.Invoke(new ResolverContextProxy(context)).AsTask() : _nullTask; }