From 27af060eba01394037ecc31b686d4388becda0be Mon Sep 17 00:00:00 2001 From: PascalSenn Date: Mon, 5 Jul 2021 10:32:18 +0200 Subject: [PATCH] Added TypeConverter for RelayId (#3917) --- .../Relay/Descriptors/NodeDescriptor~2.cs | 30 ++++--- .../MongoDbRelayTests.cs | 87 +++++++++++++++++++ ...etPagingFindFluentTests.Return_BsonId.snap | 7 ++ ...fsetPagingFindFluentTests.Return_Node.snap | 5 ++ 4 files changed, 118 insertions(+), 11 deletions(-) create mode 100644 src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbRelayTests.cs create mode 100644 src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/__snapshots__/MongoDbOffsetPagingFindFluentTests.Return_BsonId.snap create mode 100644 src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/__snapshots__/MongoDbOffsetPagingFindFluentTests.Return_Node.snap diff --git a/src/HotChocolate/Core/src/Types/Types/Relay/Descriptors/NodeDescriptor~2.cs b/src/HotChocolate/Core/src/Types/Types/Relay/Descriptors/NodeDescriptor~2.cs index 3f176c5c97c..4e1a07c913b 100644 --- a/src/HotChocolate/Core/src/Types/Types/Relay/Descriptors/NodeDescriptor~2.cs +++ b/src/HotChocolate/Core/src/Types/Types/Relay/Descriptors/NodeDescriptor~2.cs @@ -29,12 +29,10 @@ public NodeDescriptor( private NodeDefinition Definition { get; } - public IObjectFieldDescriptor NodeResolver( - NodeResolverDelegate nodeResolver) => + public IObjectFieldDescriptor NodeResolver(NodeResolverDelegate nodeResolver) => ResolveNode(nodeResolver); - public IObjectFieldDescriptor ResolveNode( - FieldResolverDelegate fieldResolver) + public IObjectFieldDescriptor ResolveNode(FieldResolverDelegate fieldResolver) { Definition.Resolver = fieldResolver ?? throw new ArgumentNullException(nameof(fieldResolver)); @@ -42,19 +40,30 @@ public IObjectFieldDescriptor ResolveNode( return _configureNodeField(); } - public IObjectFieldDescriptor ResolveNode( - NodeResolverDelegate fieldResolver) => - ResolveNode(async ctx => + public IObjectFieldDescriptor ResolveNode(NodeResolverDelegate fieldResolver) + { + ITypeConverter? typeConverter = null; + + return ResolveNode(async ctx => { if (ctx.LocalContextData.TryGetValue( WellKnownContextData.InternalId, - out object? o) && o is TId id) + out object? id)) { - return await fieldResolver(ctx, id).ConfigureAwait(false); + if (id is TId c) + { + return await fieldResolver(ctx, c).ConfigureAwait(false); + } + + typeConverter ??= ctx.GetTypeConverter(); + c = typeConverter.Convert(id); + return await fieldResolver(ctx, c).ConfigureAwait(false); } return null; + }); + } public IObjectFieldDescriptor ResolveNodeWith( Expression> method) @@ -82,8 +91,7 @@ public IObjectFieldDescriptor ResolveNodeWith( nameof(member)); } - public IObjectFieldDescriptor ResolveNodeWith( - MethodInfo method) + public IObjectFieldDescriptor ResolveNodeWith(MethodInfo method) { if (method is null) { diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbRelayTests.cs b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbRelayTests.cs new file mode 100644 index 00000000000..56fb374870a --- /dev/null +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/MongoDbRelayTests.cs @@ -0,0 +1,87 @@ +using HotChocolate.Execution; +using HotChocolate.Data.MongoDb.Filters; +using HotChocolate.Types; +using HotChocolate.Types.Pagination; +using Microsoft.Extensions.DependencyInjection; +using MongoDB.Bson.Serialization.Attributes; +using Snapshooter.Xunit; +using System.Threading.Tasks; +using MongoDB.Bson; +using Xunit; + +namespace HotChocolate.Data.MongoDb.Paging +{ + public class MongoDbRelayTests + { + [Fact] + public async Task Return_BsonId() + { + Snapshot.FullName(); + + IRequestExecutor executor = await new ServiceCollection() + .AddTransient() + .AddGraphQL() + .AddQueryType() + .AddType() + .AddTypeConverter(x => x.ToString()) + .BuildRequestExecutorAsync(); + + IExecutionResult result = await executor + .ExecuteAsync(@" + { + foo { + id + } + }"); + + result.ToJson().MatchSnapshot(); + } + + [Fact] + public async Task Return_Node() + { + Snapshot.FullName(); + + IRequestExecutor executor = await new ServiceCollection() + .AddTransient() + .AddGraphQL() + .AddQueryType() + .AddType() + .AddTypeConverter(x => x.ToString()) + .AddTypeConverter(x => ObjectId.Parse(x.ToString())) + .EnableRelaySupport() + .BuildRequestExecutorAsync(); + + IExecutionResult result = await executor + .ExecuteAsync(@" + { + node(id:""Rm9vCmQ2MGRmMTYyZWQwNzY2ZTE1Y2NlNmIxMGU="") { + id + } + }"); + + result.ToJson().MatchSnapshot(); + } + + public class Query + { + public Foo GetFoo() => new Foo { Id = ObjectId.Parse("507f191e810c19729de860ea") }; + } + + public class FooType : ObjectType + { + protected override void Configure(IObjectTypeDescriptor descriptor) + { + descriptor.ImplementsNode() + .IdField(x => x.Id) + .ResolveNode((_, objectId) => Task.FromResult(new Foo { Id = objectId })); + } + } + + public class Foo + { + [BsonId] + public ObjectId Id { get; set; } + } + } +} diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/__snapshots__/MongoDbOffsetPagingFindFluentTests.Return_BsonId.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/__snapshots__/MongoDbOffsetPagingFindFluentTests.Return_BsonId.snap new file mode 100644 index 00000000000..4f8b3bfa57e --- /dev/null +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/__snapshots__/MongoDbOffsetPagingFindFluentTests.Return_BsonId.snap @@ -0,0 +1,7 @@ +{ + "data": { + "foo": { + "id": "Rm9vCmQ1MDdmMTkxZTgxMGMxOTcyOWRlODYwZWE=" + } + } +} diff --git a/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/__snapshots__/MongoDbOffsetPagingFindFluentTests.Return_Node.snap b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/__snapshots__/MongoDbOffsetPagingFindFluentTests.Return_Node.snap new file mode 100644 index 00000000000..3c05841f9e6 --- /dev/null +++ b/src/HotChocolate/MongoDb/test/Data.MongoDb.Paging.Tests/__snapshots__/MongoDbOffsetPagingFindFluentTests.Return_Node.snap @@ -0,0 +1,5 @@ +{ + "data": { + "node": null + } +}