From 510335cce6cb8cfc5a24ee4113eaf3dce1af866d Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 13 Sep 2023 22:40:37 +0800 Subject: [PATCH] Add GetRoleNames by user ids Method --- .../Abp/Identity/IIdentityUserRepository.cs | 4 +++ .../EfCoreIdentityUserRepository.cs | 21 +++++++++++++++ .../MongoDB/MongoIdentityUserRepository.cs | 27 ++++++++++++++++++- .../Identity/IdentityUserRepository_Tests.cs | 20 ++++++++++++++ 4 files changed, 71 insertions(+), 1 deletion(-) diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs index 29d6af4e3f..196c26da35 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs @@ -143,4 +143,8 @@ public interface IIdentityUserRepository : IBasicRepository Guid? targetOrganizationId, CancellationToken cancellationToken = default ); + + Task>> GetRoleNamesAsync( + IEnumerable userIds, + CancellationToken cancellationToken = default); } diff --git a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs index 8e6e9cba6c..28a3277d3d 100644 --- a/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs @@ -56,6 +56,27 @@ public class EfCoreIdentityUserRepository : EfCoreRepository>> GetRoleNamesAsync( + IEnumerable userIds, + CancellationToken cancellationToken = default) + { + var dbContext = await GetDbContextAsync(); + var query = from userRole in dbContext.Set() + join role in dbContext.Roles on userRole.RoleId equals role.Id + where userIds.Contains(userRole.UserId) + select new + { + userRole.UserId, + role.Name + }; + + var result = await query + .GroupBy(x => x.UserId) + .ToDictionaryAsync(x => x.Key, x => x.Select(r => r.Name).ToList(), cancellationToken: cancellationToken); + + return result; + } + public virtual async Task> GetRoleNamesInOrganizationUnitAsync( Guid id, CancellationToken cancellationToken = default) diff --git a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs index d478687f7b..0ecb801f93 100644 --- a/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs +++ b/modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs @@ -131,7 +131,7 @@ public class MongoIdentityUserRepository : MongoDbRepository u.Roles.Any(r => r.RoleId == role.Id)) .ToListAsync(cancellationToken); } - + public virtual async Task> GetListAsync( string sorting = null, int maxResultCount = int.MaxValue, @@ -360,4 +360,29 @@ public class MongoIdentityUserRepository : MongoDbRepository>> GetRoleNamesAsync( + IEnumerable userIds, + CancellationToken cancellationToken = default) + { + cancellationToken = GetCancellationToken(cancellationToken); + + var userAndRoleIds = (await GetMongoQueryableAsync(cancellationToken)) + .Where(u => userIds.Contains(u.Id)) + .SelectMany(u => u.Roles) + .Select(userRole => new + { + userRole.UserId, + userRole.RoleId + }).GroupBy(x => x.UserId).ToDictionary(x => x.Key, x => x.Select(r => r.RoleId).ToList()); + + var roleIds = userAndRoleIds.SelectMany(x => x.Value); + var roles = await (await GetMongoQueryableAsync(cancellationToken)).Where(r => roleIds.Contains(r.Id)).Select(r => new + { + r.Id, + r.Name + }).ToListAsync(cancellationToken); + + return userAndRoleIds.ToDictionary(x => x.Key, x => roles.Where(r => x.Value.Contains(r.Id)).Select(r => r.Name).ToList()); + } } diff --git a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs index cb08fad60d..091dae0449 100644 --- a/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs +++ b/modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs @@ -53,6 +53,26 @@ public abstract class IdentityUserRepository_Tests : AbpIdentity roles.ShouldContain("supporter"); roles.ShouldContain("manager"); } + + [Fact] + public async Task GetRoleNames_By_UserIds_Async() + { + var userRoleNames = await UserRepository.GetRoleNamesAsync(new [] { + TestData.UserBobId, + TestData.UserJohnId, + TestData.UserNeoId, + TestData.UserDavidId + }); + + userRoleNames[TestData.UserBobId].Count.ShouldBe(1); + userRoleNames[TestData.UserBobId][0].ShouldBe("manager"); + userRoleNames[TestData.UserJohnId].Count.ShouldBe(2); + userRoleNames[TestData.UserJohnId].ShouldContain("moderator"); + userRoleNames[TestData.UserJohnId].ShouldContain("supporter"); + userRoleNames[TestData.UserNeoId].Count.ShouldBe(1); + userRoleNames[TestData.UserNeoId][0].ShouldBe("supporter"); + userRoleNames.ShouldNotContainKey(TestData.UserDavidId); + } [Fact] public async Task FindByLoginAsync()