Browse Source

Merge pull request #18051 from abpframework/issue-18042

Remove Permissions and other user-related data when deleting a user.
update-doc
Halil İbrahim Kalkan 3 years ago
committed by GitHub
parent
commit
f1a2bff23e
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityLinkUserInfo.cs
  2. 21
      modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs
  3. 1
      modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj
  4. 6
      modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/AbpPermissionManagementDomainIdentityModule.cs
  5. 4
      modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleDeletedEventHandler.cs
  6. 27
      modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs
  7. 22
      modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityRoleAppService_Tests.cs
  8. 20
      modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs
  9. 79
      modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs
  10. 1
      modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj
  11. 4
      modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/AbpSettingManagementApplicationModule.cs
  12. 27
      modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs
  13. 2
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManager.cs
  14. 14
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs
  15. 12
      modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_User_Tests.cs

2
modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityLinkUserInfo.cs

@ -8,7 +8,7 @@ public class IdentityLinkUserInfo
public virtual Guid? TenantId { get; set; } public virtual Guid? TenantId { get; set; }
public IdentityLinkUserInfo(Guid userId, Guid? tenantId) public IdentityLinkUserInfo(Guid userId, Guid? tenantId = null)
{ {
UserId = userId; UserId = userId;
TenantId = tenantId; TenantId = tenantId;

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

@ -11,10 +11,10 @@ using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Repositories;
using Volo.Abp.Domain.Services; using Volo.Abp.Domain.Services;
using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Distributed;
using Volo.Abp.EventBus.Local;
using Volo.Abp.Identity.Settings; using Volo.Abp.Identity.Settings;
using Volo.Abp.Settings; using Volo.Abp.Settings;
using Volo.Abp.Threading; using Volo.Abp.Threading;
using Volo.Abp.Timing;
using Volo.Abp.Uow; using Volo.Abp.Uow;
namespace Volo.Abp.Identity; namespace Volo.Abp.Identity;
@ -27,7 +27,7 @@ public class IdentityUserManager : UserManager<IdentityUser>, IDomainService
protected ISettingProvider SettingProvider { get; } protected ISettingProvider SettingProvider { get; }
protected ICancellationTokenProvider CancellationTokenProvider { get; } protected ICancellationTokenProvider CancellationTokenProvider { get; }
protected IDistributedEventBus DistributedEventBus { get; } protected IDistributedEventBus DistributedEventBus { get; }
protected IIdentityLinkUserRepository IdentityLinkUserRepository { get; }
protected override CancellationToken CancellationToken => CancellationTokenProvider.Token; protected override CancellationToken CancellationToken => CancellationTokenProvider.Token;
public IdentityUserManager( public IdentityUserManager(
@ -45,7 +45,8 @@ public class IdentityUserManager : UserManager<IdentityUser>, IDomainService
ICancellationTokenProvider cancellationTokenProvider, ICancellationTokenProvider cancellationTokenProvider,
IOrganizationUnitRepository organizationUnitRepository, IOrganizationUnitRepository organizationUnitRepository,
ISettingProvider settingProvider, ISettingProvider settingProvider,
IDistributedEventBus distributedEventBus) IDistributedEventBus distributedEventBus,
IIdentityLinkUserRepository identityLinkUserRepository)
: base( : base(
store, store,
optionsAccessor, optionsAccessor,
@ -62,6 +63,7 @@ public class IdentityUserManager : UserManager<IdentityUser>, IDomainService
DistributedEventBus = distributedEventBus; DistributedEventBus = distributedEventBus;
RoleRepository = roleRepository; RoleRepository = roleRepository;
UserRepository = userRepository; UserRepository = userRepository;
IdentityLinkUserRepository = identityLinkUserRepository;
CancellationTokenProvider = cancellationTokenProvider; CancellationTokenProvider = cancellationTokenProvider;
} }
@ -76,6 +78,19 @@ public class IdentityUserManager : UserManager<IdentityUser>, IDomainService
return await CreateAsync(user); return await CreateAsync(user);
} }
public async override Task<IdentityResult> DeleteAsync(IdentityUser user)
{
user.Claims.Clear();
user.Roles.Clear();
user.Tokens.Clear();
user.Logins.Clear();
user.OrganizationUnits.Clear();
await IdentityLinkUserRepository.DeleteAsync(new IdentityLinkUserInfo(user.Id, user.TenantId), CancellationToken);
await UpdateAsync(user);
return await base.DeleteAsync(user);
}
public virtual async Task<IdentityUser> GetByIdAsync(Guid id) public virtual async Task<IdentityUser> GetByIdAsync(Guid id)
{ {
var user = await Store.FindByIdAsync(id.ToString(), CancellationToken); var user = await Store.FindByIdAsync(id.ToString(), CancellationToken);

1
modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo.Abp.PermissionManagement.Domain.Identity.csproj

@ -16,6 +16,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Volo.Abp.Identity.Domain.Shared\Volo.Abp.Identity.Domain.Shared.csproj" /> <ProjectReference Include="..\Volo.Abp.Identity.Domain.Shared\Volo.Abp.Identity.Domain.Shared.csproj" />
<ProjectReference Include="..\..\..\users\src\Volo.Abp.Users.Abstractions\Volo.Abp.Users.Abstractions.csproj" />
<ProjectReference Include="..\..\..\permission-management\src\Volo.Abp.PermissionManagement.Domain\Volo.Abp.PermissionManagement.Domain.csproj" /> <ProjectReference Include="..\..\..\permission-management\src\Volo.Abp.PermissionManagement.Domain\Volo.Abp.PermissionManagement.Domain.csproj" />
</ItemGroup> </ItemGroup>

6
modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/AbpPermissionManagementDomainIdentityModule.cs

@ -1,13 +1,15 @@
using Volo.Abp.Authorization.Permissions; using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Identity; using Volo.Abp.Identity;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Users;
namespace Volo.Abp.PermissionManagement.Identity; namespace Volo.Abp.PermissionManagement.Identity;
[DependsOn( [DependsOn(
typeof(AbpIdentityDomainSharedModule), typeof(AbpIdentityDomainSharedModule),
typeof(AbpPermissionManagementDomainModule) typeof(AbpPermissionManagementDomainModule),
)] typeof(AbpUsersAbstractionModule)
)]
public class AbpPermissionManagementDomainIdentityModule : AbpModule public class AbpPermissionManagementDomainIdentityModule : AbpModule
{ {
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)

4
modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/RoleDeletedEventHandler.cs

@ -5,6 +5,7 @@ using Volo.Abp.Domain.Entities.Events.Distributed;
using Volo.Abp.EventBus; using Volo.Abp.EventBus;
using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Distributed;
using Volo.Abp.Identity; using Volo.Abp.Identity;
using Volo.Abp.Uow;
namespace Volo.Abp.PermissionManagement.Identity; namespace Volo.Abp.PermissionManagement.Identity;
@ -19,7 +20,8 @@ public class RoleDeletedEventHandler :
PermissionManager = permissionManager; PermissionManager = permissionManager;
} }
public async Task HandleEventAsync(EntityDeletedEto<IdentityRoleEto> eventData) [UnitOfWork]
public virtual async Task HandleEventAsync(EntityDeletedEto<IdentityRoleEto> eventData)
{ {
await PermissionManager.DeleteAsync(RolePermissionValueProvider.ProviderName, eventData.Entity.Name); await PermissionManager.DeleteAsync(RolePermissionValueProvider.ProviderName, eventData.Entity.Name);
} }

27
modules/identity/src/Volo.Abp.PermissionManagement.Domain.Identity/Volo/Abp/PermissionManagement/Identity/UserDeletedEventHandler.cs

@ -0,0 +1,27 @@
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities.Events.Distributed;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.Uow;
using Volo.Abp.Users;
namespace Volo.Abp.PermissionManagement.Identity;
public class UserDeletedEventHandler :
IDistributedEventHandler<EntityDeletedEto<UserEto>>,
ITransientDependency
{
protected IPermissionManager PermissionManager { get; }
public UserDeletedEventHandler(IPermissionManager permissionManager)
{
PermissionManager = permissionManager;
}
[UnitOfWork]
public virtual async Task HandleEventAsync(EntityDeletedEto<UserEto> eventData)
{
await PermissionManager.DeleteAsync(UserPermissionValueProvider.ProviderName, eventData.Entity.Id.ToString());
}
}

22
modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityRoleAppService_Tests.cs

@ -4,6 +4,9 @@ using System.Threading.Tasks;
using Xunit; using Xunit;
using Shouldly; using Shouldly;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.PermissionManagement;
using Volo.Abp.PermissionManagement.Identity;
namespace Volo.Abp.Identity; namespace Volo.Abp.Identity;
@ -11,11 +14,14 @@ public class IdentityRoleAppService_Tests : AbpIdentityApplicationTestBase
{ {
private readonly IIdentityRoleAppService _roleAppService; private readonly IIdentityRoleAppService _roleAppService;
private readonly IIdentityRoleRepository _roleRepository; private readonly IIdentityRoleRepository _roleRepository;
private readonly IPermissionManager _permissionManager;
private readonly RolePermissionManagementProvider _rolePermissionManagementProvider;
public IdentityRoleAppService_Tests() public IdentityRoleAppService_Tests()
{ {
_roleAppService = GetRequiredService<IIdentityRoleAppService>(); _roleAppService = GetRequiredService<IIdentityRoleAppService>();
_roleRepository = GetRequiredService<IIdentityRoleRepository>(); _roleRepository = GetRequiredService<IIdentityRoleRepository>();
_permissionManager = GetRequiredService<IPermissionManager>();
_rolePermissionManagementProvider = GetRequiredService<RolePermissionManagementProvider>();
} }
[Fact] [Fact]
@ -125,6 +131,20 @@ public class IdentityRoleAppService_Tests : AbpIdentityApplicationTestBase
(await FindRoleAsync("moderator")).ShouldBeNull(); (await FindRoleAsync("moderator")).ShouldBeNull();
} }
[Fact]
public async Task Role_Permissions_Should_Deleted_If_Role_Deleted()
{
var moderator = await GetRoleAsync("moderator");
(await _rolePermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, RolePermissionValueProvider.ProviderName, moderator.Name)).IsGranted.ShouldBeFalse();
await _permissionManager.SetForRoleAsync(moderator.Name, IdentityPermissions.Users.Create, true);
(await _rolePermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, RolePermissionValueProvider.ProviderName, moderator.Name)).IsGranted.ShouldBeTrue();
await _roleAppService.DeleteAsync(moderator.Id);
(await _rolePermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, RolePermissionValueProvider.ProviderName, moderator.Name)).IsGranted.ShouldBeFalse();
}
private async Task<IdentityRole> GetRoleAsync(string roleName) private async Task<IdentityRole> GetRoleAsync(string roleName)
{ {
return (await _roleRepository.GetListAsync()).First(u => u.Name == roleName); return (await _roleRepository.GetListAsync()).First(u => u.Name == roleName);

20
modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs

@ -1,7 +1,10 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Shouldly; using Shouldly;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.PermissionManagement;
using Volo.Abp.PermissionManagement.Identity;
using Xunit; using Xunit;
namespace Volo.Abp.Identity; namespace Volo.Abp.Identity;
@ -10,12 +13,16 @@ public class IdentityUserAppService_Tests : AbpIdentityApplicationTestBase
{ {
private readonly IIdentityUserAppService _userAppService; private readonly IIdentityUserAppService _userAppService;
private readonly IIdentityUserRepository _userRepository; private readonly IIdentityUserRepository _userRepository;
private readonly IPermissionManager _permissionManager;
private readonly UserPermissionManagementProvider _userPermissionManagementProvider;
private readonly IdentityTestData _testData; private readonly IdentityTestData _testData;
public IdentityUserAppService_Tests() public IdentityUserAppService_Tests()
{ {
_userAppService = GetRequiredService<IIdentityUserAppService>(); _userAppService = GetRequiredService<IIdentityUserAppService>();
_userRepository = GetRequiredService<IIdentityUserRepository>(); _userRepository = GetRequiredService<IIdentityUserRepository>();
_permissionManager = GetRequiredService<IPermissionManager>();
_userPermissionManagementProvider = GetRequiredService<UserPermissionManagementProvider>();
_testData = GetRequiredService<IdentityTestData>(); _testData = GetRequiredService<IdentityTestData>();
} }
@ -174,6 +181,19 @@ public class IdentityUserAppService_Tests : AbpIdentityApplicationTestBase
FindUser("john.nash").ShouldBeNull(); FindUser("john.nash").ShouldBeNull();
} }
[Fact]
public async Task User_Permissions_Should_Deleted_If_User_Deleted()
{
var johnNash = GetUser("john.nash");
(await _userPermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, UserPermissionValueProvider.ProviderName, johnNash.Id.ToString())).IsGranted.ShouldBeFalse();
await _permissionManager.SetForUserAsync(johnNash.Id, IdentityPermissions.Users.Create, true);
(await _userPermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, UserPermissionValueProvider.ProviderName, johnNash.Id.ToString())).IsGranted.ShouldBeTrue();
await _userAppService.DeleteAsync(johnNash.Id);
(await _userPermissionManagementProvider.CheckAsync(IdentityPermissions.Users.Create, UserPermissionValueProvider.ProviderName, johnNash.Id.ToString())).IsGranted.ShouldBeFalse();
}
[Fact] [Fact]
public async Task GetRolesAsync() public async Task GetRolesAsync()
{ {

79
modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
@ -26,8 +27,10 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase
private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly IdentityTestData _testData; private readonly IdentityTestData _testData;
private readonly ICurrentTenant _currentTenant; private readonly ICurrentTenant _currentTenant;
protected IOptions<IdentityOptions> _identityOptions { get; } private readonly IOptions<IdentityOptions> _identityOptions;
protected IDistributedEventBus DistributedEventBus { get; set; } private readonly IdentityLinkUserManager _identityLinkUserManager;
private IDistributedEventBus _distributedEventBus { get; set; }
public IdentityUserManager_Tests() public IdentityUserManager_Tests()
{ {
@ -40,12 +43,13 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase
_unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>(); _unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>();
_currentTenant = GetRequiredService<ICurrentTenant>(); _currentTenant = GetRequiredService<ICurrentTenant>();
_identityOptions = GetRequiredService<IOptions<IdentityOptions>>(); _identityOptions = GetRequiredService<IOptions<IdentityOptions>>();
_identityLinkUserManager = GetRequiredService<IdentityLinkUserManager>();
} }
protected override void AfterAddApplication(IServiceCollection services) protected override void AfterAddApplication(IServiceCollection services)
{ {
DistributedEventBus = Substitute.For<IDistributedEventBus>(); _distributedEventBus = Substitute.For<IDistributedEventBus>();
services.Replace(ServiceDescriptor.Singleton(DistributedEventBus)); services.Replace(ServiceDescriptor.Singleton(_distributedEventBus));
} }
[Fact] [Fact]
@ -270,7 +274,7 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase
(await _identityUserManager.CreateAsync(user)).CheckErrors(); (await _identityUserManager.CreateAsync(user)).CheckErrors();
await DistributedEventBus.DidNotReceive() await _distributedEventBus.DidNotReceive()
.PublishAsync(Arg.Any<IdentityUserUserNameChangedEto>(), Arg.Any<bool>(), Arg.Any<bool>()); .PublishAsync(Arg.Any<IdentityUserUserNameChangedEto>(), Arg.Any<bool>(), Arg.Any<bool>());
var newUser = await _identityUserManager.FindByIdAsync(user.Id.ToString()); var newUser = await _identityUserManager.FindByIdAsync(user.Id.ToString());
@ -280,16 +284,16 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase
{ {
var oldUsername = newUser.UserName; var oldUsername = newUser.UserName;
await _identityUserManager.SetUserNameAsync(newUser, "newUserName"); await _identityUserManager.SetUserNameAsync(newUser, "newUserName");
await DistributedEventBus.Received() await _distributedEventBus.Received()
.PublishAsync( .PublishAsync(
Arg.Is<IdentityUserUserNameChangedEto>(x => Arg.Is<IdentityUserUserNameChangedEto>(x =>
x.Id == newUser.Id && x.TenantId == newUser.TenantId && x.OldUserName == oldUsername && x.UserName == "newUserName"), x.Id == newUser.Id && x.TenantId == newUser.TenantId && x.OldUserName == oldUsername && x.UserName == "newUserName"),
Arg.Any<bool>(), Arg.Any<bool>()); Arg.Any<bool>(), Arg.Any<bool>());
} }
DistributedEventBus.ClearReceivedCalls(); _distributedEventBus.ClearReceivedCalls();
await _identityUserManager.SetUserNameAsync(newUser, newUser.UserName); await _identityUserManager.SetUserNameAsync(newUser, newUser.UserName);
await DistributedEventBus.DidNotReceive() await _distributedEventBus.DidNotReceive()
.PublishAsync(Arg.Any<IdentityUserUserNameChangedEto>(), Arg.Any<bool>(), Arg.Any<bool>()); .PublishAsync(Arg.Any<IdentityUserUserNameChangedEto>(), Arg.Any<bool>(), Arg.Any<bool>());
} }
@ -300,7 +304,7 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase
(await _identityUserManager.CreateAsync(user)).CheckErrors(); (await _identityUserManager.CreateAsync(user)).CheckErrors();
await DistributedEventBus.DidNotReceive() await _distributedEventBus.DidNotReceive()
.PublishAsync(Arg.Any<IdentityUserEmailChangedEto>(), Arg.Any<bool>(), Arg.Any<bool>()); .PublishAsync(Arg.Any<IdentityUserEmailChangedEto>(), Arg.Any<bool>(), Arg.Any<bool>());
var newUser = await _identityUserManager.FindByIdAsync(user.Id.ToString()); var newUser = await _identityUserManager.FindByIdAsync(user.Id.ToString());
@ -310,19 +314,70 @@ public class IdentityUserManager_Tests : AbpIdentityDomainTestBase
{ {
var oldEmail = newUser.Email; var oldEmail = newUser.Email;
await _identityUserManager.SetEmailAsync(newUser, "newEmail@abp.io"); await _identityUserManager.SetEmailAsync(newUser, "newEmail@abp.io");
await DistributedEventBus.Received() await _distributedEventBus.Received()
.PublishAsync( .PublishAsync(
Arg.Is<IdentityUserEmailChangedEto>(x => Arg.Is<IdentityUserEmailChangedEto>(x =>
x.Id == newUser.Id && x.TenantId == newUser.TenantId && x.OldEmail == oldEmail && x.Email == "newEmail@abp.io"), x.Id == newUser.Id && x.TenantId == newUser.TenantId && x.OldEmail == oldEmail && x.Email == "newEmail@abp.io"),
Arg.Any<bool>(), Arg.Any<bool>()); Arg.Any<bool>(), Arg.Any<bool>());
} }
DistributedEventBus.ClearReceivedCalls(); _distributedEventBus.ClearReceivedCalls();
await _identityUserManager.SetEmailAsync(newUser, newUser.Email); await _identityUserManager.SetEmailAsync(newUser, newUser.Email);
await DistributedEventBus.DidNotReceive() await _distributedEventBus.DidNotReceive()
.PublishAsync(Arg.Any<IdentityUserEmailChangedEto>(), Arg.Any<bool>(), Arg.Any<bool>()); .PublishAsync(Arg.Any<IdentityUserEmailChangedEto>(), Arg.Any<bool>(), Arg.Any<bool>());
} }
[Fact]
public async Task DeleteAsync()
{
await CreateRandomDefaultRoleAsync();
var user = CreateRandomUser();
(await _identityUserManager.CreateAsync(user)).CheckErrors();
var user2 = CreateRandomUser();
(await _identityUserManager.CreateAsync(user2)).CheckErrors();
using (var uow = _unitOfWorkManager.Begin())
{
user = await _identityUserManager.FindByIdAsync(user.Id.ToString());
user.ShouldNotBeNull();
await _identityUserManager.AddClaimAsync(user, new Claim("test", "test"));
await _identityUserManager.AddLoginAsync(user, new UserLoginInfo("test", "test", "test"));
await _identityUserManager.AddDefaultRolesAsync(user);
user.SetToken("test", "test", "test");
var ou = await _organizationUnitRepository.GetAsync(_lookupNormalizer.NormalizeName("OU11"));
await _identityUserManager.AddToOrganizationUnitAsync(user, ou);
await _identityLinkUserManager.LinkAsync(new IdentityLinkUserInfo(user.Id), new IdentityLinkUserInfo(user2.Id));
await uow.CompleteAsync();
}
using (var uow = _unitOfWorkManager.Begin())
{
user = await _identityUserManager.FindByIdAsync(user.Id.ToString());
user.ShouldNotBeNull();
user.Claims.Count.ShouldBeGreaterThan(0);
user.Logins.Count.ShouldBeGreaterThan(0);
user.Roles.Count.ShouldBeGreaterThan(0);
user.Tokens.Count.ShouldBeGreaterThan(0);
user.OrganizationUnits.Count.ShouldBeGreaterThan(0);
(await _identityLinkUserManager.IsLinkedAsync(new IdentityLinkUserInfo(user.Id), new IdentityLinkUserInfo(user2.Id))).ShouldBeTrue();
await _identityUserManager.DeleteAsync(user);
user.Claims.Count.ShouldBe(0);
user.Logins.Count.ShouldBe(0);
user.Roles.Count.ShouldBe(0);
user.Tokens.Count.ShouldBe(0);
user.OrganizationUnits.Count.ShouldBe(0);
(await _identityLinkUserManager.IsLinkedAsync(new IdentityLinkUserInfo(user.Id), new IdentityLinkUserInfo(user2.Id))).ShouldBeFalse();
await uow.CompleteAsync();
}
}
private async Task CreateRandomDefaultRoleAsync() private async Task CreateRandomDefaultRoleAsync()
{ {
await _identityRoleRepository.InsertAsync( await _identityRoleRepository.InsertAsync(

1
modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo.Abp.SettingManagement.Application.csproj

@ -13,6 +13,7 @@
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Ddd.Application\Volo.Abp.Ddd.Application.csproj" /> <ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Ddd.Application\Volo.Abp.Ddd.Application.csproj" />
<ProjectReference Include="..\Volo.Abp.SettingManagement.Application.Contracts\Volo.Abp.SettingManagement.Application.Contracts.csproj" /> <ProjectReference Include="..\Volo.Abp.SettingManagement.Application.Contracts\Volo.Abp.SettingManagement.Application.Contracts.csproj" />
<ProjectReference Include="..\Volo.Abp.SettingManagement.Domain\Volo.Abp.SettingManagement.Domain.csproj" /> <ProjectReference Include="..\Volo.Abp.SettingManagement.Domain\Volo.Abp.SettingManagement.Domain.csproj" />
<ProjectReference Include="..\..\..\users\src\Volo.Abp.Users.Abstractions\Volo.Abp.Users.Abstractions.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

4
modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/AbpSettingManagementApplicationModule.cs

@ -2,6 +2,7 @@
using Volo.Abp.Emailing; using Volo.Abp.Emailing;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Timing; using Volo.Abp.Timing;
using Volo.Abp.Users;
namespace Volo.Abp.SettingManagement; namespace Volo.Abp.SettingManagement;
@ -10,7 +11,8 @@ namespace Volo.Abp.SettingManagement;
typeof(AbpSettingManagementDomainModule), typeof(AbpSettingManagementDomainModule),
typeof(AbpSettingManagementApplicationContractsModule), typeof(AbpSettingManagementApplicationContractsModule),
typeof(AbpEmailingModule), typeof(AbpEmailingModule),
typeof(AbpTimingModule) typeof(AbpTimingModule),
typeof(AbpUsersAbstractionModule)
)] )]
public class AbpSettingManagementApplicationModule : AbpModule public class AbpSettingManagementApplicationModule : AbpModule
{ {

27
modules/setting-management/src/Volo.Abp.SettingManagement.Application/Volo/Abp/SettingManagement/UserDeletedEventHandler.cs

@ -0,0 +1,27 @@
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities.Events.Distributed;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.Settings;
using Volo.Abp.Uow;
using Volo.Abp.Users;
namespace Volo.Abp.SettingManagement;
public class UserDeletedEventHandler :
IDistributedEventHandler<EntityDeletedEto<UserEto>>,
ITransientDependency
{
protected ISettingManager SettingManager { get; }
public UserDeletedEventHandler(ISettingManager settingManager)
{
SettingManager = settingManager;
}
[UnitOfWork]
public virtual async Task HandleEventAsync(EntityDeletedEto<UserEto> eventData)
{
await SettingManager.DeleteAsync(UserSettingValueProvider.ProviderName, eventData.Entity.Id.ToString());
}
}

2
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManager.cs

@ -12,4 +12,6 @@ public interface ISettingManager
Task<List<SettingValue>> GetAllAsync([NotNull] string providerName, [CanBeNull] string providerKey, bool fallback = true); Task<List<SettingValue>> GetAllAsync([NotNull] string providerName, [CanBeNull] string providerKey, bool fallback = true);
Task SetAsync([NotNull] string name, [CanBeNull] string value, [NotNull] string providerName, [CanBeNull] string providerKey, bool forceToSet = false); Task SetAsync([NotNull] string name, [CanBeNull] string value, [NotNull] string providerName, [CanBeNull] string providerKey, bool forceToSet = false);
Task DeleteAsync(string providerName, string providerKey);
} }

14
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs

@ -13,6 +13,7 @@ public class SettingManager : ISettingManager, ISingletonDependency
{ {
protected ISettingDefinitionManager SettingDefinitionManager { get; } protected ISettingDefinitionManager SettingDefinitionManager { get; }
protected ISettingEncryptionService SettingEncryptionService { get; } protected ISettingEncryptionService SettingEncryptionService { get; }
protected ISettingManagementStore SettingManagementStore { get; }
protected List<ISettingManagementProvider> Providers => _lazyProviders.Value; protected List<ISettingManagementProvider> Providers => _lazyProviders.Value;
protected SettingManagementOptions Options { get; } protected SettingManagementOptions Options { get; }
private readonly Lazy<List<ISettingManagementProvider>> _lazyProviders; private readonly Lazy<List<ISettingManagementProvider>> _lazyProviders;
@ -21,10 +22,12 @@ public class SettingManager : ISettingManager, ISingletonDependency
IOptions<SettingManagementOptions> options, IOptions<SettingManagementOptions> options,
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
ISettingDefinitionManager settingDefinitionManager, ISettingDefinitionManager settingDefinitionManager,
ISettingEncryptionService settingEncryptionService) ISettingEncryptionService settingEncryptionService,
ISettingManagementStore settingManagementStore)
{ {
SettingDefinitionManager = settingDefinitionManager; SettingDefinitionManager = settingDefinitionManager;
SettingEncryptionService = settingEncryptionService; SettingEncryptionService = settingEncryptionService;
SettingManagementStore = settingManagementStore;
Options = options.Value; Options = options.Value;
//TODO: Instead, use IServiceScopeFactory and create a scope..? //TODO: Instead, use IServiceScopeFactory and create a scope..?
@ -160,6 +163,15 @@ public class SettingManager : ISettingManager, ISingletonDependency
} }
} }
public virtual async Task DeleteAsync(string providerName, string providerKey)
{
var settings = await SettingManagementStore.GetListAsync(providerName, providerKey);
foreach (var setting in settings)
{
await SettingManagementStore.DeleteAsync(setting.Name, providerName, providerKey);
}
}
protected virtual async Task<string> GetOrNullInternalAsync(string name, string providerName, string providerKey, bool fallback = true) protected virtual async Task<string> GetOrNullInternalAsync(string name, string providerName, string providerKey, bool fallback = true)
{ {
var setting = await SettingDefinitionManager.GetAsync(name); var setting = await SettingDefinitionManager.GetAsync(name);

12
modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_User_Tests.cs

@ -186,4 +186,16 @@ public class SettingManager_User_Tests : SettingsTestBase
(await _settingManager.GetOrNullForUserAsync("MySettingWithoutInherit", _testData.User2Id)).ShouldBeNull(); //Does not inherit! (await _settingManager.GetOrNullForUserAsync("MySettingWithoutInherit", _testData.User2Id)).ShouldBeNull(); //Does not inherit!
(await _settingManager.GetOrNullGlobalAsync("MySettingWithoutInherit")).ShouldBe("default-store-value"); (await _settingManager.GetOrNullGlobalAsync("MySettingWithoutInherit")).ShouldBe("default-store-value");
} }
[Fact]
public async Task DeleteAsync()
{
(await _settingManager.GetOrNullForUserAsync("MySetting2", _testData.User1Id)).ShouldBe("user1-store-value");
(await _settingManager.GetOrNullForUserAsync("MySettingWithoutInherit", _testData.User1Id)).ShouldBe("user1-store-value");
await _settingManager.DeleteAsync(UserSettingValueProvider.ProviderName, _testData.User1Id.ToString());
(await _settingManager.GetOrNullForUserAsync("MySetting2", _testData.User1Id)).ShouldNotBe("user1-store-value");
(await _settingManager.GetOrNullForUserAsync("MySettingWithoutInherit", _testData.User1Id)).ShouldNotBe("user1-store-value");
}
} }

Loading…
Cancel
Save