Browse Source

Get all RoleNames of users

pull/18283/head
liangshiwei 3 years ago
parent
commit
71bba01966
  1. 21
      modules/identity/src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EntityFrameworkCore/EfCoreIdentityUserRepository.cs
  2. 57
      modules/identity/src/Volo.Abp.Identity.MongoDB/Volo/Abp/Identity/MongoDB/MongoIdentityUserRepository.cs
  3. 11
      modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/IdentityUserRepository_Tests.cs

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

@ -61,7 +61,7 @@ public class EfCoreIdentityUserRepository : EfCoreRepository<IIdentityDbContext,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
var dbContext = await GetDbContextAsync(); var dbContext = await GetDbContextAsync();
return await (from userRole in dbContext.Set<IdentityUserRole>() var userRoles = await (from userRole in dbContext.Set<IdentityUserRole>()
join role in dbContext.Roles on userRole.RoleId equals role.Id join role in dbContext.Roles on userRole.RoleId equals role.Id
where userIds.Contains(userRole.UserId) where userIds.Contains(userRole.UserId)
group new group new
@ -73,7 +73,24 @@ public class EfCoreIdentityUserRepository : EfCoreRepository<IIdentityDbContext,
select new IdentityUserIdWithRoleNames select new IdentityUserIdWithRoleNames
{ {
Id = gp.Key, RoleNames = gp.Select(x => x.Name).ToArray() Id = gp.Key, RoleNames = gp.Select(x => x.Name).ToArray()
}).ToListAsync(GetCancellationToken(cancellationToken)); }).ToListAsync(cancellationToken: cancellationToken);
var orgUnitRoles = await (from userOu in dbContext.Set<IdentityUserOrganizationUnit>()
join roleOu in dbContext.Set<OrganizationUnitRole>() on userOu.OrganizationUnitId equals roleOu.OrganizationUnitId
join role in dbContext.Roles on roleOu.RoleId equals role.Id
where userIds.Contains(userOu.UserId)
group new
{
userOu.UserId,
role.Name
} by userOu.UserId
into gp
select new IdentityUserIdWithRoleNames
{
Id = gp.Key, RoleNames = gp.Select(x => x.Name).ToArray()
}).ToListAsync(cancellationToken: cancellationToken);
return userRoles.Concat(orgUnitRoles).GroupBy(x => x.Id).Select(x => new IdentityUserIdWithRoleNames {Id = x.Key, RoleNames = x.SelectMany(y => y.RoleNames).Distinct().ToArray()}).ToList();
} }
public virtual async Task<List<string>> GetRoleNamesInOrganizationUnitAsync( public virtual async Task<List<string>> GetRoleNamesInOrganizationUnitAsync(

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

@ -377,26 +377,47 @@ public class MongoIdentityUserRepository : MongoDbRepository<IAbpIdentityMongoDb
IEnumerable<Guid> userIds, IEnumerable<Guid> userIds,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
cancellationToken = GetCancellationToken(cancellationToken); var users = await GetListByIdsAsync(userIds, cancellationToken: cancellationToken);
var userAndRoleIds = (await GetMongoQueryableAsync<IdentityUser>(cancellationToken)) var userAndRoleIds = users.SelectMany(u => u.Roles)
.Where(u => userIds.Contains(u.Id)) .Select(userRole => new { userRole.UserId, userRole.RoleId })
.SelectMany(u => u.Roles) .GroupBy(x => x.UserId).ToDictionary(x => x.Key, x => x.Select(r => r.RoleId).ToList());
.Select(userRole => new var userAndOrganizationUnitIds = users.SelectMany(u => u.OrganizationUnits)
{ .Select(userOrganizationUnit => new { userOrganizationUnit.UserId, userOrganizationUnit.OrganizationUnitId })
userRole.UserId, .GroupBy(x => x.UserId).ToDictionary(x => x.Key, x => x.Select(r => r.OrganizationUnitId).ToList());
userRole.RoleId
}).GroupBy(x => x.UserId).ToDictionary(x => x.Key, x => x.Select(r => r.RoleId).ToList()); var organizationUnitIds = userAndOrganizationUnitIds.SelectMany(x => x.Value);
var roleIds = userAndRoleIds.SelectMany(x => x.Value); var roleIds = userAndRoleIds.SelectMany(x => x.Value);
var roles = await (await GetMongoQueryableAsync<IdentityRole>(cancellationToken)).Where(r => roleIds.Contains(r.Id)).Select(r => new
var organizationUnitAndRoleIds = await (await GetMongoQueryableAsync<OrganizationUnit>(cancellationToken)).Where(ou => organizationUnitIds.Contains(ou.Id))
.Select(userOrganizationUnit => new
{
userOrganizationUnit.Id,
userOrganizationUnit.Roles
}).ToListAsync(cancellationToken: cancellationToken);
var allOrganizationUnitRoleIds = organizationUnitAndRoleIds.SelectMany(x => x.Roles.Select(r => r.RoleId)).ToList();
var allRoleIds = roleIds.Union(allOrganizationUnitRoleIds);
var roles = await (await GetMongoQueryableAsync<IdentityRole>(cancellationToken)).Where(r => allRoleIds.Contains(r.Id)).Select(r => new{ r.Id, r.Name }).ToListAsync(cancellationToken);
var userRoles = userAndRoleIds.ToDictionary(x => x.Key, x => roles.Where(r => x.Value.Contains(r.Id)).Select(r => r.Name).ToArray());
var result = userRoles.Select(x => new IdentityUserIdWithRoleNames { Id = x.Key, RoleNames = x.Value }).ToList();
foreach (var userAndOrganizationUnitId in userAndOrganizationUnitIds)
{ {
r.Id, var user = result.FirstOrDefault(x => x.Id == userAndOrganizationUnitId.Key);
r.Name var organizationUnitRoleIds = organizationUnitAndRoleIds.Where(x => userAndOrganizationUnitId.Value.Contains(x.Id)).SelectMany(x => x.Roles.Select(r => r.RoleId)).ToList();
}).ToListAsync(cancellationToken); var roleNames = roles.Where(x => organizationUnitRoleIds.Contains(x.Id)).Select(r => r.Name).ToArray();
if (user != null && roleNames.Any())
var result = userAndRoleIds.ToDictionary(x => x.Key, x => roles.Where(r => x.Value.Contains(r.Id)).Select(r => r.Name).ToArray()); {
user.RoleNames = user.RoleNames.Union(roleNames).ToArray();
}
else if(roleNames.Any())
{
result.Add(new IdentityUserIdWithRoleNames { Id = userAndOrganizationUnitId.Key, RoleNames = roleNames});
}
}
return result.Select(x => new IdentityUserIdWithRoleNames() { Id = x.Key, RoleNames = x.Value }).ToList(); return result;
} }
} }

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

@ -73,15 +73,16 @@ public abstract class IdentityUserRepository_Tests<TStartupModule> : AbpIdentity
userBob.RoleNames[0].ShouldBe("manager"); userBob.RoleNames[0].ShouldBe("manager");
var userJohn = userRoleNames.First(x => x.Id == TestData.UserJohnId); var userJohn = userRoleNames.First(x => x.Id == TestData.UserJohnId);
userJohn.RoleNames.Length.ShouldBe(2); userJohn.RoleNames.Length.ShouldBe(3);
userJohn.RoleNames.ShouldContain("moderator"); userJohn.RoleNames.ShouldContain("moderator");
userJohn.RoleNames.ShouldContain("supporter"); userJohn.RoleNames.ShouldContain("supporter");
userJohn.RoleNames.ShouldContain("manager");
var userNeo = userRoleNames.First(x => x.Id == TestData.UserNeoId); var userNeo = userRoleNames.First(x => x.Id == TestData.UserNeoId);
userNeo.RoleNames.Length.ShouldBe(1); userNeo.RoleNames.Length.ShouldBe(3);
userNeo.RoleNames[0].ShouldBe("supporter"); userNeo.RoleNames.ShouldContain("supporter");
userJohn.RoleNames.ShouldContain("moderator");
userRoleNames.ShouldNotContain(x => x.Id == TestData.UserDavidId); userJohn.RoleNames.ShouldContain("manager");
} }
[Fact] [Fact]

Loading…
Cancel
Save