Browse Source

MongoDb not updating user organization data bug fix

pull/5243/head
Galip Tolga Erdem 6 years ago
parent
commit
7fc3e560db
  1. 49
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs
  2. 63
      modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/OrganizationUnitRepository_Tests.cs

49
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs

@ -43,15 +43,15 @@ namespace Volo.Abp.Identity
IOrganizationUnitRepository organizationUnitRepository, IOrganizationUnitRepository organizationUnitRepository,
ISettingProvider settingProvider) ISettingProvider settingProvider)
: base( : base(
store, store,
optionsAccessor, optionsAccessor,
passwordHasher, passwordHasher,
userValidators, userValidators,
passwordValidators, passwordValidators,
keyNormalizer, keyNormalizer,
errors, errors,
services, services,
logger) logger)
{ {
OrganizationUnitRepository = organizationUnitRepository; OrganizationUnitRepository = organizationUnitRepository;
SettingProvider = settingProvider; SettingProvider = settingProvider;
@ -71,7 +71,8 @@ namespace Volo.Abp.Identity
return user; return user;
} }
public virtual async Task<IdentityResult> SetRolesAsync([NotNull] IdentityUser user, [NotNull] IEnumerable<string> roleNames) public virtual async Task<IdentityResult> SetRolesAsync([NotNull] IdentityUser user,
[NotNull] IEnumerable<string> roleNames)
{ {
Check.NotNull(user, nameof(user)); Check.NotNull(user, nameof(user));
Check.NotNull(roleNames, nameof(roleNames)); Check.NotNull(roleNames, nameof(roleNames));
@ -101,7 +102,8 @@ namespace Volo.Abp.Identity
public virtual async Task<bool> IsInOrganizationUnitAsync(IdentityUser user, OrganizationUnit ou) public virtual async Task<bool> IsInOrganizationUnitAsync(IdentityUser user, OrganizationUnit ou)
{ {
await UserRepository.EnsureCollectionLoadedAsync(user, u => u.OrganizationUnits, CancellationTokenProvider.Token); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.OrganizationUnits,
CancellationTokenProvider.Token);
return user.IsInOrganizationUnit(ou.Id); return user.IsInOrganizationUnit(ou.Id);
} }
@ -110,12 +112,13 @@ namespace Volo.Abp.Identity
await AddToOrganizationUnitAsync( await AddToOrganizationUnitAsync(
await UserRepository.GetAsync(userId, cancellationToken: CancellationToken), await UserRepository.GetAsync(userId, cancellationToken: CancellationToken),
await OrganizationUnitRepository.GetAsync(ouId, cancellationToken: CancellationToken) await OrganizationUnitRepository.GetAsync(ouId, cancellationToken: CancellationToken)
); );
} }
public virtual async Task AddToOrganizationUnitAsync(IdentityUser user, OrganizationUnit ou) public virtual async Task AddToOrganizationUnitAsync(IdentityUser user, OrganizationUnit ou)
{ {
await UserRepository.EnsureCollectionLoadedAsync(user, u => u.OrganizationUnits, CancellationTokenProvider.Token); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.OrganizationUnits,
CancellationTokenProvider.Token);
if (user.OrganizationUnits.Any(cou => cou.OrganizationUnitId == ou.Id)) if (user.OrganizationUnits.Any(cou => cou.OrganizationUnitId == ou.Id))
{ {
@ -125,19 +128,23 @@ namespace Volo.Abp.Identity
await CheckMaxUserOrganizationUnitMembershipCountAsync(user.OrganizationUnits.Count + 1); await CheckMaxUserOrganizationUnitMembershipCountAsync(user.OrganizationUnits.Count + 1);
user.AddOrganizationUnit(ou.Id); user.AddOrganizationUnit(ou.Id);
await UserRepository.UpdateAsync(user, cancellationToken: CancellationToken);
} }
public virtual async Task RemoveFromOrganizationUnitAsync(Guid userId, Guid ouId) public virtual async Task RemoveFromOrganizationUnitAsync(Guid userId, Guid ouId)
{ {
var user = await UserRepository.GetAsync(userId, cancellationToken: CancellationToken); var user = await UserRepository.GetAsync(userId, cancellationToken: CancellationToken);
user.RemoveOrganizationUnit(ouId); user.RemoveOrganizationUnit(ouId);
await UserRepository.UpdateAsync(user, cancellationToken: CancellationToken);
} }
public virtual async Task RemoveFromOrganizationUnitAsync(IdentityUser user, OrganizationUnit ou) public virtual async Task RemoveFromOrganizationUnitAsync(IdentityUser user, OrganizationUnit ou)
{ {
await UserRepository.EnsureCollectionLoadedAsync(user, u => u.OrganizationUnits, CancellationTokenProvider.Token); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.OrganizationUnits,
CancellationTokenProvider.Token);
user.RemoveOrganizationUnit(ou.Id); user.RemoveOrganizationUnit(ou.Id);
await UserRepository.UpdateAsync(user, cancellationToken: CancellationToken);
} }
public virtual async Task SetOrganizationUnitsAsync(Guid userId, params Guid[] organizationUnitIds) public virtual async Task SetOrganizationUnitsAsync(Guid userId, params Guid[] organizationUnitIds)
@ -155,7 +162,8 @@ namespace Volo.Abp.Identity
await CheckMaxUserOrganizationUnitMembershipCountAsync(organizationUnitIds.Length); await CheckMaxUserOrganizationUnitMembershipCountAsync(organizationUnitIds.Length);
await UserRepository.EnsureCollectionLoadedAsync(user, u => u.OrganizationUnits, CancellationTokenProvider.Token); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.OrganizationUnits,
CancellationTokenProvider.Token);
//Remove from removed OUs //Remove from removed OUs
foreach (var ouId in user.OrganizationUnits.Select(uou => uou.OrganizationUnitId).ToArray()) foreach (var ouId in user.OrganizationUnits.Select(uou => uou.OrganizationUnitId).ToArray())
@ -174,11 +182,14 @@ namespace Volo.Abp.Identity
user.AddOrganizationUnit(organizationUnitId); user.AddOrganizationUnit(organizationUnitId);
} }
} }
await UserRepository.UpdateAsync(user, cancellationToken: CancellationToken);
} }
private async Task CheckMaxUserOrganizationUnitMembershipCountAsync(int requestedCount) private async Task CheckMaxUserOrganizationUnitMembershipCountAsync(int requestedCount)
{ {
var maxCount = await SettingProvider.GetAsync<int>(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount); var maxCount =
await SettingProvider.GetAsync<int>(IdentitySettingNames.OrganizationUnit.MaxUserMembershipCount);
if (requestedCount > maxCount) if (requestedCount > maxCount)
{ {
throw new BusinessException(IdentityErrorCodes.MaxAllowedOuMembership) throw new BusinessException(IdentityErrorCodes.MaxAllowedOuMembership)
@ -187,9 +198,11 @@ namespace Volo.Abp.Identity
} }
[UnitOfWork] [UnitOfWork]
public virtual async Task<List<OrganizationUnit>> GetOrganizationUnitsAsync(IdentityUser user, bool includeDetails = false) public virtual async Task<List<OrganizationUnit>> GetOrganizationUnitsAsync(IdentityUser user,
bool includeDetails = false)
{ {
await UserRepository.EnsureCollectionLoadedAsync(user, u => u.OrganizationUnits, CancellationTokenProvider.Token); await UserRepository.EnsureCollectionLoadedAsync(user, u => u.OrganizationUnits,
CancellationTokenProvider.Token);
return await OrganizationUnitRepository.GetListAsync( return await OrganizationUnitRepository.GetListAsync(
user.OrganizationUnits.Select(t => t.OrganizationUnitId), user.OrganizationUnits.Select(t => t.OrganizationUnitId),

63
modules/identity/test/Volo.Abp.Identity.TestBase/Volo/Abp/Identity/OrganizationUnitRepository_Tests.cs

@ -20,7 +20,7 @@ namespace Volo.Abp.Identity
private readonly IdentityTestData _testData; private readonly IdentityTestData _testData;
private readonly IGuidGenerator _guidGenerator; private readonly IGuidGenerator _guidGenerator;
private readonly OrganizationUnitManager _organizationUnitManager; private readonly OrganizationUnitManager _organizationUnitManager;
private readonly IIdentityRoleRepository _identityRoleRepository; private readonly IdentityUserManager _identityUserManager;
private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly IIdentityUserRepository _identityUserRepository; private readonly IIdentityUserRepository _identityUserRepository;
@ -31,7 +31,7 @@ namespace Volo.Abp.Identity
_testData = GetRequiredService<IdentityTestData>(); _testData = GetRequiredService<IdentityTestData>();
_guidGenerator = GetRequiredService<IGuidGenerator>(); _guidGenerator = GetRequiredService<IGuidGenerator>();
_organizationUnitManager = GetRequiredService<OrganizationUnitManager>(); _organizationUnitManager = GetRequiredService<OrganizationUnitManager>();
_identityRoleRepository = GetRequiredService<IIdentityRoleRepository>(); _identityUserManager = GetRequiredService<IdentityUserManager>();
_unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>(); _unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>();
_identityUserRepository = GetRequiredService<IIdentityUserRepository>(); _identityUserRepository = GetRequiredService<IIdentityUserRepository>();
} }
@ -45,19 +45,63 @@ namespace Volo.Abp.Identity
[Fact] [Fact]
public async Task GetAllChildrenWithParentCodeAsync() public async Task GetAllChildrenWithParentCodeAsync()
{ {
(await _organizationUnitRepository.GetAllChildrenWithParentCodeAsync(OrganizationUnit.CreateCode(0), _guidGenerator.Create())).ShouldNotBeNull(); (await _organizationUnitRepository.GetAllChildrenWithParentCodeAsync(OrganizationUnit.CreateCode(0),
_guidGenerator.Create())).ShouldNotBeNull();
} }
[Fact] [Fact]
public async Task GetListAsync() public async Task GetListAsync()
{ {
var ouIds = (await _organizationUnitRepository.GetListAsync(includeDetails: true)) var ouIds = (await _organizationUnitRepository.GetListAsync(includeDetails: true))
.Select(ou => ou.Id).Take(2); .Select(ou => ou.Id).Take(2);
var ous = await _organizationUnitRepository.GetListAsync(ouIds); var ous = await _organizationUnitRepository.GetListAsync(ouIds);
ous.Count.ShouldBe(2); ous.Count.ShouldBe(2);
ous.ShouldContain(ou => ou.Id == ouIds.First()); ous.ShouldContain(ou => ou.Id == ouIds.First());
} }
[Fact]
public async Task AddMemberToOrganizationUnit()
{
using (var uow = _unitOfWorkManager.Begin())
{
var ou111 = await _organizationUnitRepository.GetAsync(
_lookupNormalizer.NormalizeName("OU111"));
var user = await _identityUserRepository.FindByNormalizedUserNameAsync(
_lookupNormalizer.NormalizeName("david"));
user.ShouldNotBeNull();
user.OrganizationUnits.Count.ShouldBe(1);
await _identityUserManager.AddToOrganizationUnitAsync(user.Id, ou111.Id);
await uow.CompleteAsync();
}
var updatedUser = await _identityUserRepository.FindByNormalizedUserNameAsync(
_lookupNormalizer.NormalizeName("david"));
updatedUser.OrganizationUnits.Count.ShouldBe(2);
}
[Fact]
public async Task RemoveOrganizationUnitFromUser()
{
using (var uow = _unitOfWorkManager.Begin())
{
var ou112 = await _organizationUnitRepository.GetAsync(
_lookupNormalizer.NormalizeName("OU112"));
var user = await _identityUserRepository.FindByNormalizedUserNameAsync(
_lookupNormalizer.NormalizeName("david"));
user.OrganizationUnits.Count.ShouldBe(1);
user.OrganizationUnits.ShouldContain(q=>q.OrganizationUnitId == ou112.Id);
await _identityUserManager.RemoveFromOrganizationUnitAsync(user.Id, ou112.Id);
await uow.CompleteAsync();
}
var updatedUser = await _identityUserRepository.FindByNormalizedUserNameAsync(
_lookupNormalizer.NormalizeName("david"));
updatedUser.OrganizationUnits.Count.ShouldBe(0);
}
[Fact] [Fact]
public async Task GetOrganizationUnitAsync() public async Task GetOrganizationUnitAsync()
{ {
@ -79,6 +123,7 @@ namespace Volo.Abp.Identity
ou.Roles.ShouldNotBeNull(); ou.Roles.ShouldNotBeNull();
ou.Roles.Any().ShouldBeTrue(); ou.Roles.Any().ShouldBeTrue();
} }
[Fact] [Fact]
public async Task GetOrganizationUnitRolesAsync() public async Task GetOrganizationUnitRolesAsync()
{ {
@ -95,7 +140,8 @@ namespace Volo.Abp.Identity
{ {
OrganizationUnit ou = await _organizationUnitRepository.GetAsync("OU111", includeDetails: true); OrganizationUnit ou = await _organizationUnitRepository.GetAsync("OU111", includeDetails: true);
var ou111Roles = await _organizationUnitRepository.GetRolesAsync(ou, sorting: "name desc", maxResultCount: 1, includeDetails: true); var ou111Roles = await _organizationUnitRepository.GetRolesAsync(ou, sorting: "name desc",
maxResultCount: 1, includeDetails: true);
ou111Roles.Count.ShouldBe(1); ou111Roles.Count.ShouldBe(1);
ou111Roles.ShouldContain(n => n.Name == "moderator"); ou111Roles.ShouldContain(n => n.Name == "moderator");
} }
@ -105,9 +151,10 @@ namespace Volo.Abp.Identity
{ {
OrganizationUnit ou1 = await _organizationUnitRepository.GetAsync("OU111", true); OrganizationUnit ou1 = await _organizationUnitRepository.GetAsync("OU111", true);
OrganizationUnit ou2 = await _organizationUnitRepository.GetAsync("OU112", true); OrganizationUnit ou2 = await _organizationUnitRepository.GetAsync("OU112", true);
var users = await _identityUserRepository.GetUsersInOrganizationsListAsync(new List<Guid> { ou1.Id, ou2.Id }); var users = await _identityUserRepository.GetUsersInOrganizationsListAsync(new List<Guid> {ou1.Id, ou2.Id});
users.Count.ShouldBeGreaterThan(0); users.Count.ShouldBeGreaterThan(0);
} }
[Fact] [Fact]
public async Task GetMembersInOrganizationUnitWithParamsAsync() public async Task GetMembersInOrganizationUnitWithParamsAsync()
{ {
@ -147,12 +194,12 @@ namespace Volo.Abp.Identity
public async Task GetMembersCountOfOrganizationUnitWithParamsAsync() public async Task GetMembersCountOfOrganizationUnitWithParamsAsync()
{ {
OrganizationUnit ou = await _organizationUnitRepository.GetAsync("OU111", true); OrganizationUnit ou = await _organizationUnitRepository.GetAsync("OU111", true);
var usersCount = await _organizationUnitRepository.GetMembersCountAsync(ou,"n"); var usersCount = await _organizationUnitRepository.GetMembersCountAsync(ou, "n");
usersCount.ShouldBeGreaterThan(1); usersCount.ShouldBeGreaterThan(1);
usersCount.ShouldBeLessThanOrEqualTo(5); usersCount.ShouldBeLessThanOrEqualTo(5);
usersCount = await _organizationUnitRepository.GetMembersCountAsync(ou,"undefined-username"); usersCount = await _organizationUnitRepository.GetMembersCountAsync(ou, "undefined-username");
usersCount.ShouldBe(0); usersCount.ShouldBe(0);
} }

Loading…
Cancel
Save