Browse Source

Add GetRoleNames by user ids Method

pull/17627/head
liangshiwei 3 years ago
parent
commit
510335cce6
  1. 4
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs
  2. 21
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs
  3. 27
      modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs
  4. 20
      modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs

4
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityUserRepository.cs

@ -143,4 +143,8 @@ public interface IIdentityUserRepository : IBasicRepository<IdentityUser, Guid>
Guid? targetOrganizationId,
CancellationToken cancellationToken = default
);
Task<Dictionary<Guid, List<string>>> GetRoleNamesAsync(
IEnumerable<Guid> userIds,
CancellationToken cancellationToken = default);
}

21
modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs

@ -56,6 +56,27 @@ public class EfCoreIdentityUserRepository : EfCoreRepository<IIdentityDbContext,
return await resultQuery.ToListAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<Dictionary<Guid, List<string>>> GetRoleNamesAsync(
IEnumerable<Guid> userIds,
CancellationToken cancellationToken = default)
{
var dbContext = await GetDbContextAsync();
var query = from userRole in dbContext.Set<IdentityUserRole>()
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<List<string>> GetRoleNamesInOrganizationUnitAsync(
Guid id,
CancellationToken cancellationToken = default)

27
modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs

@ -131,7 +131,7 @@ public class MongoIdentityUserRepository : MongoDbRepository<IAbpIdentityMongoDb
.Where(u => u.Roles.Any(r => r.RoleId == role.Id))
.ToListAsync(cancellationToken);
}
public virtual async Task<List<IdentityUser>> GetListAsync(
string sorting = null,
int maxResultCount = int.MaxValue,
@ -360,4 +360,29 @@ public class MongoIdentityUserRepository : MongoDbRepository<IAbpIdentityMongoDb
await UpdateManyAsync(users, cancellationToken: cancellationToken);
}
public virtual async Task<Dictionary<Guid, List<string>>> GetRoleNamesAsync(
IEnumerable<Guid> userIds,
CancellationToken cancellationToken = default)
{
cancellationToken = GetCancellationToken(cancellationToken);
var userAndRoleIds = (await GetMongoQueryableAsync<IdentityUser>(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<IdentityRole>(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());
}
}

20
modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs

@ -53,6 +53,26 @@ public abstract class IdentityUserRepository_Tests<TStartupModule> : 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()

Loading…
Cancel
Save