From b765e1f18bc080eba1dc6114a288ce4d3dc3985d Mon Sep 17 00:00:00 2001 From: PascalSenn Date: Mon, 6 May 2024 08:00:30 +0200 Subject: [PATCH] Adds support for generic ID Attribute (#7086) --- .../Convention/FilterTypeInterceptor.cs | 4 +++- .../IdFilterTypeInterceptorTests.cs | 19 ++++++++++++++++++ ...d_InfereType_When_AnnotatedGeneric.graphql | 20 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/HotChocolate/Data/test/Data.Filters.Tests/__snapshots__/IdFilterTypeInterceptorTests.Filtering_Should_InfereType_When_AnnotatedGeneric.graphql diff --git a/src/HotChocolate/Data/src/Data/Filters/Convention/FilterTypeInterceptor.cs b/src/HotChocolate/Data/src/Data/Filters/Convention/FilterTypeInterceptor.cs index 22f319bd0d0..b4d61fa8e3a 100644 --- a/src/HotChocolate/Data/src/Data/Filters/Convention/FilterTypeInterceptor.cs +++ b/src/HotChocolate/Data/src/Data/Filters/Convention/FilterTypeInterceptor.cs @@ -40,7 +40,9 @@ public override void OnBeforeRegisterDependencies( foreach (var field in def.Fields) { if (field is FilterFieldDefinition filterField && - filterField.Member?.GetCustomAttribute(typeof(IDAttribute)) != null) + filterField.Member is { } member && + (member.GetCustomAttribute(typeof(IDAttribute)) is { } || + member.GetCustomAttribute(typeof(IDAttribute<>)) is { })) { filterField.Type = discoveryContext.TypeInspector.GetTypeRef( typeof(IdOperationFilterInputType), diff --git a/src/HotChocolate/Data/test/Data.Filters.Tests/IdFilterTypeInterceptorTests.cs b/src/HotChocolate/Data/test/Data.Filters.Tests/IdFilterTypeInterceptorTests.cs index d65090ecf3d..cf76a95cd85 100644 --- a/src/HotChocolate/Data/test/Data.Filters.Tests/IdFilterTypeInterceptorTests.cs +++ b/src/HotChocolate/Data/test/Data.Filters.Tests/IdFilterTypeInterceptorTests.cs @@ -36,6 +36,19 @@ public async Task Filtering_Should_InfereType_When_Annotated() schema.MatchSnapshot(); } + [Fact] + public async Task Filtering_Should_InferType_When_AnnotatedGeneric() + { + var schema = await new ServiceCollection() + .AddGraphQL() + .AddQueryType(x => x.Name("Query").Field("test").Resolve("a")) + .AddType(new FilterInputType()) + .AddFiltering() + .BuildSchemaAsync(); + + schema.MatchSnapshot(); + } + public class Foo { public string? Bar { get; } @@ -46,4 +59,10 @@ public class FooId [ID] public string? Bar { get; } } + + public class FooIdGeneric + { + [ID] + public string? Bar { get; } + } } diff --git a/src/HotChocolate/Data/test/Data.Filters.Tests/__snapshots__/IdFilterTypeInterceptorTests.Filtering_Should_InfereType_When_AnnotatedGeneric.graphql b/src/HotChocolate/Data/test/Data.Filters.Tests/__snapshots__/IdFilterTypeInterceptorTests.Filtering_Should_InfereType_When_AnnotatedGeneric.graphql new file mode 100644 index 00000000000..d918bf24bba --- /dev/null +++ b/src/HotChocolate/Data/test/Data.Filters.Tests/__snapshots__/IdFilterTypeInterceptorTests.Filtering_Should_InfereType_When_AnnotatedGeneric.graphql @@ -0,0 +1,20 @@ +schema { + query: Query +} + +type Query { + test: String +} + +input FooIdGenericFilterInput { + and: [FooIdGenericFilterInput!] + or: [FooIdGenericFilterInput!] + bar: IdOperationFilterInput +} + +input IdOperationFilterInput { + eq: ID + neq: ID + in: [ID] + nin: [ID] +} \ No newline at end of file