From f35d133e610a800f747789cad2e113572bab8717 Mon Sep 17 00:00:00 2001 From: hyzx86 Date: Thu, 22 Feb 2024 14:39:48 +0800 Subject: [PATCH 01/10] Add UserPickerField --- .../GraphQL/Startup.cs | 3 +- .../Types/UserPickerFieldQueryObjectType.cs | 71 +++++++++++++++++++ .../OrchardCore.ContentFields.csproj | 1 + .../OrchardCore.Users/GraphQL/Startup.cs | 2 +- 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Startup.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Startup.cs index 7baaf362ede..c13376033b8 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Startup.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Startup.cs @@ -8,7 +8,7 @@ namespace OrchardCore.ContentFields.GraphQL { - [RequireFeatures("OrchardCore.Apis.GraphQL")] + [RequireFeatures("OrchardCore.Apis.GraphQL","OrchardCore.Users")] public class Startup : StartupBase { public override void ConfigureServices(IServiceCollection services) @@ -19,6 +19,7 @@ public override void ConfigureServices(IServiceCollection services) services.AddObjectGraphType(); services.AddObjectGraphType(); services.AddObjectGraphType(); + services.AddObjectGraphType(); } } } diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs new file mode 100644 index 00000000000..fec5a347625 --- /dev/null +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs @@ -0,0 +1,71 @@ +using System.Collections.Generic; +using System.Linq; +using GraphQL; +using GraphQL.DataLoader; +using GraphQL.Types; +using Microsoft.Extensions.DependencyInjection; +using OrchardCore.Apis.GraphQL; +using OrchardCore.ContentFields.Fields; +using OrchardCore.ContentManagement; +using OrchardCore.Users.GraphQL; +using OrchardCore.Users.Indexes; +using OrchardCore.Users.Models; +using YesSql; +using YesSql.Services; + +namespace OrchardCore.ContentFields.GraphQL +{ + public class UserPickerFieldQueryObjectType : ObjectGraphType + { + public UserPickerFieldQueryObjectType() + { + Name = nameof(UserPickerField); + + Field, IEnumerable>("userIds") + .Description("user ids") + .PagingArguments() + .Resolve(x => + { + return x.Page(x.Source.UserIds); + }); + + Field, IEnumerable>("users") + .Description("the user items") + .PagingArguments() + .ResolveAsync(x => + { + var userLoader = GetOrAddUserProfileByIdDataLoader(x); + return userLoader.LoadAsync(x.Page(x.Source.UserIds)).Then(itemResultSet => + { + return itemResultSet.SelectMany(x => x); + }); + }); + Field("user") + .Description("the first user") + .ResolveAsync(x => + { + var userLoader = GetOrAddUserProfileByIdDataLoader(x); + return userLoader.LoadAsync(x.Source.UserIds.FirstOrDefault()).Then(itemResultSet => + { + return itemResultSet.FirstOrDefault(); + }); + }); + } + + public static IDataLoader> GetOrAddUserProfileByIdDataLoader(IResolveFieldContext context) + { + IDataLoaderContextAccessor requiredService = context.RequestServices.GetRequiredService(); + var session = context.RequestServices.GetService(); + return requiredService.Context.GetOrAddCollectionBatchLoader("GetOrAddUserByIds", async (IEnumerable userIds) => + { + if (userIds == null || !userIds.Any()) + { + return null; + } + var users = await session.Query(y => y.UserId.IsIn(userIds)).ListAsync(); + + return users.ToLookup((User k) => k.UserId, (User user) => user); + }); + } + } +} diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/OrchardCore.ContentFields.csproj b/src/OrchardCore.Modules/OrchardCore.ContentFields/OrchardCore.ContentFields.csproj index d50cedac85f..1e75bfb884f 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/OrchardCore.ContentFields.csproj +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/OrchardCore.ContentFields.csproj @@ -29,6 +29,7 @@ + diff --git a/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/Startup.cs b/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/Startup.cs index 4dba4a80de3..90ff703ac1d 100644 --- a/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/Startup.cs +++ b/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/Startup.cs @@ -10,6 +10,6 @@ public class Startup : StartupBase public override void ConfigureServices(IServiceCollection services) { services.AddSingleton(); - services.AddTransient(); + services.AddSingleton(); } } From d85bc64a50064ad9e419bbf33432b752fb8c19ff Mon Sep 17 00:00:00 2001 From: hyzx86 Date: Fri, 23 Feb 2024 01:36:33 +0800 Subject: [PATCH 02/10] fix query --- .../Types/UserPickerFieldQueryObjectType.cs | 4 ++- .../OrchardCore.Users/GraphQL/Startup.cs | 2 +- .../OrchardCore.Users/GraphQL/UserType.cs | 36 ++++++++++--------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs index fec5a347625..07f253d4a85 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs @@ -17,7 +17,7 @@ namespace OrchardCore.ContentFields.GraphQL { public class UserPickerFieldQueryObjectType : ObjectGraphType { - public UserPickerFieldQueryObjectType() + public UserPickerFieldQueryObjectType(UserType userType) { Name = nameof(UserPickerField); @@ -30,6 +30,7 @@ public UserPickerFieldQueryObjectType() }); Field, IEnumerable>("users") + .Type(new ListGraphType(userType)) .Description("the user items") .PagingArguments() .ResolveAsync(x => @@ -41,6 +42,7 @@ public UserPickerFieldQueryObjectType() }); }); Field("user") + .Type(userType) .Description("the first user") .ResolveAsync(x => { diff --git a/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/Startup.cs b/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/Startup.cs index 90ff703ac1d..85daf5d706f 100644 --- a/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/Startup.cs +++ b/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/Startup.cs @@ -10,6 +10,6 @@ public class Startup : StartupBase public override void ConfigureServices(IServiceCollection services) { services.AddSingleton(); - services.AddSingleton(); + services.AddScoped(); } } diff --git a/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/UserType.cs b/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/UserType.cs index f5d1818a94a..c1c09a4de73 100644 --- a/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/UserType.cs +++ b/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/UserType.cs @@ -3,6 +3,8 @@ using GraphQL.Types; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; +using OrchardCore.ContentManagement; +using OrchardCore.ContentManagement.GraphQL.Queries.Types; using OrchardCore.ContentManagement.Metadata.Models; using OrchardCore.Users.Models; using OrchardCore.Users.Services; @@ -30,27 +32,29 @@ public UserType(IStringLocalizer localizer) internal void AddField(ISchema schema, ContentTypeDefinition typeDefinition) { var contentItemType = schema.AdditionalTypeInstances.SingleOrDefault(t => t.Name == typeDefinition.Name); - + if (contentItemType == null) { // This error would indicate that this graph type is build too early. throw new InvalidOperationException("ContentTypeDefinition has not been registered in GraphQL"); } - var field = Field(typeDefinition.Name, contentItemType.GetType()) - .Description(S["Custom user settings of {0}.", typeDefinition.DisplayName]) - .ResolveAsync(static async context => { - // We don't want to create an empty content item if it does not exist. - if (context.Source is User user && - user.Properties.ContainsKey(context.FieldDefinition.ResolvedType.Name)) - { - var customUserSettingsService = context.RequestServices!.GetRequiredService(); - var settingsType = await customUserSettingsService.GetSettingsTypeAsync(context.FieldDefinition.ResolvedType.Name); - - return await customUserSettingsService.GetSettingsAsync(user, settingsType); - } - - return null; - }); + Field(typeDefinition.Name) + .Type(contentItemType) + .Description(S["Custom user settings of {0}.", typeDefinition.DisplayName]) + .ResolveAsync(static async context => + { + // We don't want to create an empty content item if it does not exist. + if (context.Source is User user && + user.Properties.ContainsKey(context.FieldDefinition.ResolvedType.Name)) + { + var customUserSettingsService = context.RequestServices!.GetRequiredService(); + var settingsType = await customUserSettingsService.GetSettingsTypeAsync(context.FieldDefinition.ResolvedType.Name); + + return await customUserSettingsService.GetSettingsAsync(user, settingsType); + } + + return null; + }); } } From 1418b06fce7d8e69262d6b1fb0912971cb8de60d Mon Sep 17 00:00:00 2001 From: hyzx86 Date: Fri, 23 Feb 2024 10:04:42 +0800 Subject: [PATCH 03/10] update dependency --- .../OrchardCore.ContentFields/GraphQL/Startup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Startup.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Startup.cs index c13376033b8..6eff7d9ab16 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Startup.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Startup.cs @@ -8,7 +8,7 @@ namespace OrchardCore.ContentFields.GraphQL { - [RequireFeatures("OrchardCore.Apis.GraphQL","OrchardCore.Users")] + [RequireFeatures("OrchardCore.Apis.GraphQL")] public class Startup : StartupBase { public override void ConfigureServices(IServiceCollection services) From e18892ed26a8281d7c89a8b30a175b0d1ddd8672 Mon Sep 17 00:00:00 2001 From: Georg von Kries Date: Mon, 8 Apr 2024 14:03:00 +0200 Subject: [PATCH 04/10] Makes the GraphQL user type reusable. Fixes #15540 --- .../GraphQL/CurrentUserQuery.cs | 32 ++----------- .../OrchardCore.Users/GraphQL/UserType.cs | 47 +++++++++---------- .../Queries/ContentTypeQuery.cs | 5 ++ 3 files changed, 31 insertions(+), 53 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/CurrentUserQuery.cs b/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/CurrentUserQuery.cs index f07f713ebbf..bcfe5b9ea72 100644 --- a/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/CurrentUserQuery.cs +++ b/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/CurrentUserQuery.cs @@ -1,15 +1,11 @@ -using System.Linq; using System.Threading.Tasks; using GraphQL.Resolvers; using GraphQL.Types; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; -using Microsoft.Extensions.Options; using OrchardCore.Apis.GraphQL; -using OrchardCore.ContentManagement.GraphQL.Options; using OrchardCore.ContentManagement.Metadata; -using OrchardCore.ContentManagement.Metadata.Models; using OrchardCore.Users.Models; using OrchardCore.Users.Services; @@ -21,45 +17,23 @@ namespace OrchardCore.Users.GraphQL; internal sealed class CurrentUserQuery : ISchemaBuilder { private readonly IHttpContextAccessor _httpContextAccessor; - private readonly IOptions _contentOptionsAccessor; private readonly IStringLocalizer S; public CurrentUserQuery( IHttpContextAccessor httpContextAccessor, - IOptions contentOptionsAccessor, IStringLocalizer localizer) { _httpContextAccessor = httpContextAccessor; - _contentOptionsAccessor = contentOptionsAccessor; S = localizer; } - public async Task BuildAsync(ISchema schema) + public Task BuildAsync(ISchema schema) { - // Build a user type that includes all custom user settings. - var serviceProvider = _httpContextAccessor.HttpContext.RequestServices; - var contentDefinitionManager = serviceProvider.GetRequiredService(); - var contentTypes = await contentDefinitionManager.ListTypeDefinitionsAsync(); - - var userType = serviceProvider.GetRequiredService(); - - // Note: The content types are already added to GraphQL by the ContentTypeQuery. Just add them to the user type. - foreach (var typeDefinition in contentTypes.Where(t => t.StereotypeEquals("CustomUserSettings"))) - { - // Skip hidden types - if (_contentOptionsAccessor.Value.ShouldHide(typeDefinition)) - { - continue; - } - - userType.AddField(schema, typeDefinition); - } - var currentUserField = new FieldType { Name = "me", Description = S["Gets the currently authenticated user."], - ResolvedType = userType, + Type = typeof(UserType), Resolver = new FuncFieldResolver(async context => { var userService = context.RequestServices!.GetRequiredService(); @@ -70,6 +44,8 @@ public async Task BuildAsync(ISchema schema) }; schema.Query.AddField(currentUserField); + + return Task.CompletedTask; } public Task GetIdentifierAsync() diff --git a/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/UserType.cs b/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/UserType.cs index f5d1818a94a..dba4e121c11 100644 --- a/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/UserType.cs +++ b/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/UserType.cs @@ -1,9 +1,7 @@ -using System; using System.Linq; using GraphQL.Types; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; -using OrchardCore.ContentManagement.Metadata.Models; using OrchardCore.Users.Models; using OrchardCore.Users.Services; @@ -18,7 +16,7 @@ public UserType(IStringLocalizer localizer) S = localizer; Name = "User"; - Description = S["Represents the currently authenticated user."]; + Description = S["Represents a user."]; Field(u => u.UserId).Description(S["The id of the user."]); Field(u => u.UserName).Description(S["The name of the user."]); @@ -26,31 +24,30 @@ public UserType(IStringLocalizer localizer) Field(u => u.PhoneNumber, nullable: true).Description(S["The phone number of the user."]); } - // Adds a custom user settings field - internal void AddField(ISchema schema, ContentTypeDefinition typeDefinition) + public override void Initialize(ISchema schema) { - var contentItemType = schema.AdditionalTypeInstances.SingleOrDefault(t => t.Name == typeDefinition.Name); - - if (contentItemType == null) + // Add custom user settings by reusing previously registered content types with the + // stereotype "CustomUserSettings". + foreach (var contentItemType in schema.AdditionalTypeInstances.Where(t => t.Metadata.TryGetValue("Stereotype", out var stereotype) && stereotype as string == "CustomUserSettings")) { - // This error would indicate that this graph type is build too early. - throw new InvalidOperationException("ContentTypeDefinition has not been registered in GraphQL"); - } - - var field = Field(typeDefinition.Name, contentItemType.GetType()) - .Description(S["Custom user settings of {0}.", typeDefinition.DisplayName]) - .ResolveAsync(static async context => { - // We don't want to create an empty content item if it does not exist. - if (context.Source is User user && - user.Properties.ContainsKey(context.FieldDefinition.ResolvedType.Name)) + Field(contentItemType.Name, contentItemType) + .Description(S["Custom user settings of {0}.", contentItemType.Name]) + .ResolveAsync(static async context => { - var customUserSettingsService = context.RequestServices!.GetRequiredService(); - var settingsType = await customUserSettingsService.GetSettingsTypeAsync(context.FieldDefinition.ResolvedType.Name); - - return await customUserSettingsService.GetSettingsAsync(user, settingsType); - } + // We don't want to create an empty content item if it does not exist. + if (context.Source is User user && + user.Properties.ContainsKey(context.FieldDefinition.ResolvedType.Name)) + { + var customUserSettingsService = context.RequestServices!.GetRequiredService(); + var settingsType = await customUserSettingsService.GetSettingsTypeAsync(context.FieldDefinition.ResolvedType.Name); + + return await customUserSettingsService.GetSettingsAsync(user, settingsType); + } + + return null; + }); + } - return null; - }); + base.Initialize(schema); } } diff --git a/src/OrchardCore/OrchardCore.ContentManagement.GraphQL/Queries/ContentTypeQuery.cs b/src/OrchardCore/OrchardCore.ContentManagement.GraphQL/Queries/ContentTypeQuery.cs index 4c4b80e1c83..4da8b2dd550 100644 --- a/src/OrchardCore/OrchardCore.ContentManagement.GraphQL/Queries/ContentTypeQuery.cs +++ b/src/OrchardCore/OrchardCore.ContentManagement.GraphQL/Queries/ContentTypeQuery.cs @@ -85,6 +85,11 @@ public async Task BuildAsync(ISchema schema) // Register the content item type explicitly since it won't be discovered from the root 'query' type. schema.RegisterType(typeType); } + + if (!string.IsNullOrEmpty(stereotype)) + { + typeType.Metadata["Stereotype"] = stereotype; + } } foreach (var builder in contentTypeBuilders) From a210ba0769301836a6a649f70e367cf777b00139 Mon Sep 17 00:00:00 2001 From: Tony Han Date: Tue, 9 Apr 2024 14:14:35 +0800 Subject: [PATCH 05/10] update with pr 15691 --- .../GraphQL/Types/UserPickerFieldQueryObjectType.cs | 6 ++---- .../OrchardCore.Users/GraphQL/Startup.cs | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs index 07f253d4a85..19e6e86aa65 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs @@ -17,7 +17,7 @@ namespace OrchardCore.ContentFields.GraphQL { public class UserPickerFieldQueryObjectType : ObjectGraphType { - public UserPickerFieldQueryObjectType(UserType userType) + public UserPickerFieldQueryObjectType() { Name = nameof(UserPickerField); @@ -30,7 +30,6 @@ public UserPickerFieldQueryObjectType(UserType userType) }); Field, IEnumerable>("users") - .Type(new ListGraphType(userType)) .Description("the user items") .PagingArguments() .ResolveAsync(x => @@ -41,8 +40,8 @@ public UserPickerFieldQueryObjectType(UserType userType) return itemResultSet.SelectMany(x => x); }); }); + Field("user") - .Type(userType) .Description("the first user") .ResolveAsync(x => { @@ -53,7 +52,6 @@ public UserPickerFieldQueryObjectType(UserType userType) }); }); } - public static IDataLoader> GetOrAddUserProfileByIdDataLoader(IResolveFieldContext context) { IDataLoaderContextAccessor requiredService = context.RequestServices.GetRequiredService(); diff --git a/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/Startup.cs b/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/Startup.cs index 85daf5d706f..4dba4a80de3 100644 --- a/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/Startup.cs +++ b/src/OrchardCore.Modules/OrchardCore.Users/GraphQL/Startup.cs @@ -10,6 +10,6 @@ public class Startup : StartupBase public override void ConfigureServices(IServiceCollection services) { services.AddSingleton(); - services.AddScoped(); + services.AddTransient(); } } From 6adcd22c26a386c7bcd6ab028dc374eb1b0b0afd Mon Sep 17 00:00:00 2001 From: Tony Han Date: Wed, 24 Apr 2024 16:49:27 +0800 Subject: [PATCH 06/10] Update src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Zoltán Lehóczky --- .../GraphQL/Types/UserPickerFieldQueryObjectType.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs index 19e6e86aa65..f0314dee0df 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs @@ -52,20 +52,22 @@ public UserPickerFieldQueryObjectType() }); }); } - public static IDataLoader> GetOrAddUserProfileByIdDataLoader(IResolveFieldContext context) + + private static IDataLoader> GetOrAddUserProfileByIdDataLoader(IResolveFieldContext context) { - IDataLoaderContextAccessor requiredService = context.RequestServices.GetRequiredService(); - var session = context.RequestServices.GetService(); - return requiredService.Context.GetOrAddCollectionBatchLoader("GetOrAddUserByIds", async (IEnumerable userIds) => + var dataLoaderContextAccessor = context.RequestServices.GetRequiredService(); + + return dataLoaderContextAccessor.Context.GetOrAddCollectionBatchLoader("GetOrAddUserByIds", async (IEnumerable userIds) => { if (userIds == null || !userIds.Any()) { return null; } + + var session = context.RequestServices.GetService(); var users = await session.Query(y => y.UserId.IsIn(userIds)).ListAsync(); return users.ToLookup((User k) => k.UserId, (User user) => user); }); } - } } From 2d57d5d1b2b28b84621e8a85e921bd0aa9ab36ab Mon Sep 17 00:00:00 2001 From: Tony Han Date: Wed, 24 Apr 2024 16:49:35 +0800 Subject: [PATCH 07/10] Update src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Zoltán Lehóczky --- .../GraphQL/Types/UserPickerFieldQueryObjectType.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs index f0314dee0df..c324dbdaec9 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs @@ -41,7 +41,7 @@ public UserPickerFieldQueryObjectType() }); }); - Field("user") + Field("firstUser") .Description("the first user") .ResolveAsync(x => { From 10d3d04ba86a459f35327479356abe0f91485e7c Mon Sep 17 00:00:00 2001 From: hyzx86 Date: Wed, 24 Apr 2024 17:35:38 +0800 Subject: [PATCH 08/10] fix code --- .../Types/UserPickerFieldQueryObjectType.cs | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs index c324dbdaec9..25353f3ef0f 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs @@ -4,6 +4,7 @@ using GraphQL.DataLoader; using GraphQL.Types; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Localization; using OrchardCore.Apis.GraphQL; using OrchardCore.ContentFields.Fields; using OrchardCore.ContentManagement; @@ -17,36 +18,36 @@ namespace OrchardCore.ContentFields.GraphQL { public class UserPickerFieldQueryObjectType : ObjectGraphType { - public UserPickerFieldQueryObjectType() + public UserPickerFieldQueryObjectType(IStringLocalizer S) { Name = nameof(UserPickerField); Field, IEnumerable>("userIds") - .Description("user ids") + .Description(S["user ids"]) .PagingArguments() - .Resolve(x => + .Resolve(resolve => { - return x.Page(x.Source.UserIds); + return resolve.Page(resolve.Source.UserIds); }); Field, IEnumerable>("users") - .Description("the user items") + .Description(S["the user items"]) .PagingArguments() - .ResolveAsync(x => + .ResolveAsync(resolve => { - var userLoader = GetOrAddUserProfileByIdDataLoader(x); - return userLoader.LoadAsync(x.Page(x.Source.UserIds)).Then(itemResultSet => + var userLoader = GetOrAddUserProfileByIdDataLoader(resolve); + return userLoader.LoadAsync(resolve.Page(resolve.Source.UserIds)).Then(itemResultSet => { return itemResultSet.SelectMany(x => x); }); }); Field("firstUser") - .Description("the first user") - .ResolveAsync(x => + .Description(S["the first user"]) + .ResolveAsync(resolve => { - var userLoader = GetOrAddUserProfileByIdDataLoader(x); - return userLoader.LoadAsync(x.Source.UserIds.FirstOrDefault()).Then(itemResultSet => + var userLoader = GetOrAddUserProfileByIdDataLoader(resolve); + return userLoader.LoadAsync(resolve.Source.UserIds.FirstOrDefault()).Then(itemResultSet => { return itemResultSet.FirstOrDefault(); }); @@ -61,13 +62,14 @@ private static IDataLoader> GetOrAddUserProfileByIdDat { if (userIds == null || !userIds.Any()) { - return null; + return default; } var session = context.RequestServices.GetService(); - var users = await session.Query(y => y.UserId.IsIn(userIds)).ListAsync(); + var users = await session.Query(user => user.UserId.IsIn(userIds)).ListAsync(); - return users.ToLookup((User k) => k.UserId, (User user) => user); + return users.ToLookup(user => user.UserId); }); } + } } From 3d6a4596af80412c7ea691c8e1c4453adfdebe8b Mon Sep 17 00:00:00 2001 From: Tony Han Date: Thu, 25 Apr 2024 00:47:07 +0800 Subject: [PATCH 09/10] Update src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs Co-authored-by: Georg von Kries --- .../GraphQL/Types/UserPickerFieldQueryObjectType.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs index 25353f3ef0f..c7a25ab670f 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs @@ -38,7 +38,7 @@ public UserPickerFieldQueryObjectType(IStringLocalizer { - return itemResultSet.SelectMany(x => x); + return itemResultSet.SelectMany(users => users); }); }); From 5e360be29bc2cb427ef9ba7949caa9c0c14bfdd6 Mon Sep 17 00:00:00 2001 From: Tony Han Date: Thu, 25 Apr 2024 01:23:48 +0800 Subject: [PATCH 10/10] remove firstUser field --- .../GraphQL/Types/UserPickerFieldQueryObjectType.cs | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs index c7a25ab670f..8f64ae91467 100644 --- a/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs +++ b/src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Types/UserPickerFieldQueryObjectType.cs @@ -41,17 +41,6 @@ public UserPickerFieldQueryObjectType(IStringLocalizer users); }); }); - - Field("firstUser") - .Description(S["the first user"]) - .ResolveAsync(resolve => - { - var userLoader = GetOrAddUserProfileByIdDataLoader(resolve); - return userLoader.LoadAsync(resolve.Source.UserIds.FirstOrDefault()).Then(itemResultSet => - { - return itemResultSet.FirstOrDefault(); - }); - }); } private static IDataLoader> GetOrAddUserProfileByIdDataLoader(IResolveFieldContext context)