Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add GraphQL support to UserPickerField #15389

Merged
merged 27 commits into from
Apr 24, 2024
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
f35d133
Add UserPickerField
Feb 22, 2024
cb7bdae
Merge branch 'main' into UserPickerField
Feb 22, 2024
d85bc64
fix query
hyzx86 Feb 22, 2024
0974367
Merge branch 'UserPickerField' of https://github.com/hyzx86/OrchardCo…
Feb 23, 2024
1418b06
update dependency
Feb 23, 2024
52cc64b
Merge branch 'main' into UserPickerField
hyzx86 Mar 17, 2024
cd0d788
Merge branch 'main' into UserPickerField
hyzx86 Mar 18, 2024
c2645ae
Merge branch 'main' into UserPickerField
hyzx86 Mar 19, 2024
da29f40
Merge branch 'main' into UserPickerField
hyzx86 Mar 21, 2024
6f3a722
Merge branch 'main' into UserPickerField
hyzx86 Apr 1, 2024
74a2ae2
Merge branch 'main' into UserPickerField
hyzx86 Apr 2, 2024
e18892e
Makes the GraphQL user type reusable.
gvkries Apr 8, 2024
e3cc0af
Merge branch 'main' into UserPickerField
hyzx86 Apr 8, 2024
6c7a4cd
merge pr 15691
hyzx86 Apr 9, 2024
a210ba0
update with pr 15691
hyzx86 Apr 9, 2024
ab50f42
Merge branch 'UserPickerField' of https://github.com/hyzx86/OrchardCo…
hyzx86 Apr 9, 2024
dbbeb8e
Merge branch 'main' into UserPickerField
hyzx86 Apr 9, 2024
92cddfe
Merge branch 'main' into UserPickerField
hyzx86 Apr 12, 2024
0ce1bae
Merge branch 'main' into UserPickerField
Piedone Apr 21, 2024
c949c59
Merge branch 'main' into UserPickerField
hyzx86 Apr 22, 2024
7b22445
Merge branch 'main' into UserPickerField
hishamco Apr 23, 2024
6adcd22
Update src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Type…
hyzx86 Apr 24, 2024
2d57d5d
Update src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Type…
hyzx86 Apr 24, 2024
7cb2e44
Merge branch 'main' into UserPickerField
hyzx86 Apr 24, 2024
10d3d04
fix code
Apr 24, 2024
3d6a459
Update src/OrchardCore.Modules/OrchardCore.ContentFields/GraphQL/Type…
hyzx86 Apr 24, 2024
5e360be
remove firstUser field
hyzx86 Apr 24, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public override void ConfigureServices(IServiceCollection services)
services.AddObjectGraphType<LinkField, LinkFieldQueryObjectType>();
services.AddObjectGraphType<HtmlField, HtmlFieldQueryObjectType>();
services.AddObjectGraphType<ContentPickerField, ContentPickerFieldQueryObjectType>();
services.AddObjectGraphType<UserPickerField, UserPickerFieldQueryObjectType>();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
using System.Collections.Generic;
using System.Linq;
using GraphQL;
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;
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<UserPickerField>
{
public UserPickerFieldQueryObjectType(IStringLocalizer<UserPickerFieldQueryObjectType> S)
{
Name = nameof(UserPickerField);

Field<ListGraphType<StringGraphType>, IEnumerable<string>>("userIds")
.Description(S["user ids"])
.PagingArguments()
.Resolve(resolve =>
{
return resolve.Page(resolve.Source.UserIds);
});

Field<ListGraphType<UserType>, IEnumerable<User>>("users")
.Description(S["the user items"])
.PagingArguments()
.ResolveAsync(resolve =>
{
var userLoader = GetOrAddUserProfileByIdDataLoader(resolve);
return userLoader.LoadAsync(resolve.Page(resolve.Source.UserIds)).Then(itemResultSet =>
{
return itemResultSet.SelectMany(x => x);
hyzx86 marked this conversation as resolved.
Show resolved Hide resolved
});
});

Field<UserType, User>("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<string, IEnumerable<User>> GetOrAddUserProfileByIdDataLoader<T>(IResolveFieldContext<T> context)
{
var dataLoaderContextAccessor = context.RequestServices.GetRequiredService<IDataLoaderContextAccessor>();

return dataLoaderContextAccessor.Context.GetOrAddCollectionBatchLoader("GetOrAddUserByIds", async (IEnumerable<string> userIds) =>
{
if (userIds == null || !userIds.Any())
{
return default;
}

var session = context.RequestServices.GetService<ISession>();
var users = await session.Query<User, UserIndex>(user => user.UserId.IsIn(userIds)).ListAsync();

return users.ToLookup(user => user.UserId);
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
<ProjectReference Include="..\..\OrchardCore\OrchardCore.Shortcodes.Abstractions\OrchardCore.Shortcodes.Abstractions.csproj" />
<ProjectReference Include="..\..\OrchardCore\OrchardCore.ResourceManagement\OrchardCore.ResourceManagement.csproj" />
<ProjectReference Include="..\..\OrchardCore\OrchardCore.Users.Core\OrchardCore.Users.Core.csproj" />
<ProjectReference Include="..\OrchardCore.Users\OrchardCore.Users.csproj" />
</ItemGroup>

</Project>