From 8df5cc358217eb2f8f92d8b6c072db5aebf29faf Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 9 Sep 2019 20:26:28 +0800 Subject: [PATCH] Add IIdentityStoreAutoSaveChanges. --- .../Abp/Identity/IdentityRoleAppService.cs | 48 ++++++++++------- .../Abp/Identity/IdentityUserAppService.cs | 54 +++++++++++-------- .../Identity/IIdentityStoreAutoSaveChanges.cs | 7 +++ .../Volo/Abp/Identity/IdentityRoleManager.cs | 15 ++++++ .../Volo/Abp/Identity/IdentityRoleStore.cs | 1 + .../Volo/Abp/Identity/IdentityUserManager.cs | 15 ++++++ .../Volo/Abp/Identity/IdentityUserStore.cs | 1 + 7 files changed, 100 insertions(+), 41 deletions(-) create mode 100644 modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityStoreAutoSaveChanges.cs diff --git a/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityRoleAppService.cs b/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityRoleAppService.cs index 939d9739d2..a56b78ca2a 100644 --- a/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityRoleAppService.cs +++ b/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityRoleAppService.cs @@ -41,44 +41,54 @@ namespace Volo.Abp.Identity [Authorize(IdentityPermissions.Roles.Create)] public async Task CreateAsync(IdentityRoleCreateDto input) { - var role = new IdentityRole(GuidGenerator.Create(), input.Name, CurrentTenant.Id); + using (_roleManager.AutoSaveRoleChanges(false)) + { + var role = new IdentityRole(GuidGenerator.Create(), input.Name, CurrentTenant.Id); - role.IsDefault = input.IsDefault; - role.IsPublic = input.IsPublic; + role.IsDefault = input.IsDefault; + role.IsPublic = input.IsPublic; - (await _roleManager.CreateAsync(role)).CheckErrors(); - await CurrentUnitOfWork.SaveChangesAsync(); + (await _roleManager.CreateAsync(role)).CheckErrors(); + await CurrentUnitOfWork.SaveChangesAsync(); - return ObjectMapper.Map(role); + return ObjectMapper.Map(role); + } } [Authorize(IdentityPermissions.Roles.Update)] public async Task UpdateAsync(Guid id, IdentityRoleUpdateDto input) { - var role = await _roleManager.GetByIdAsync(id); - role.ConcurrencyStamp = input.ConcurrencyStamp; + using (_roleManager.AutoSaveRoleChanges(false)) + { + var role = await _roleManager.GetByIdAsync(id); + role.ConcurrencyStamp = input.ConcurrencyStamp; - (await _roleManager.SetRoleNameAsync(role, input.Name)).CheckErrors(); + (await _roleManager.SetRoleNameAsync(role, input.Name)).CheckErrors(); - role.IsDefault = input.IsDefault; - role.IsPublic = input.IsPublic; + role.IsDefault = input.IsDefault; + role.IsPublic = input.IsPublic; - (await _roleManager.UpdateAsync(role)).CheckErrors(); - await CurrentUnitOfWork.SaveChangesAsync(); + (await _roleManager.UpdateAsync(role)).CheckErrors(); + await CurrentUnitOfWork.SaveChangesAsync(); - return ObjectMapper.Map(role); + return ObjectMapper.Map(role); + } } [Authorize(IdentityPermissions.Roles.Delete)] public async Task DeleteAsync(Guid id) { - var role = await _roleManager.FindByIdAsync(id.ToString()); - if (role == null) + using (_roleManager.AutoSaveRoleChanges(false)) { - return; + var role = await _roleManager.FindByIdAsync(id.ToString()); + if (role == null) + { + return; + } + + (await _roleManager.DeleteAsync(role)).CheckErrors(); + await CurrentUnitOfWork.SaveChangesAsync(); } - - (await _roleManager.DeleteAsync(role)).CheckErrors(); } } } diff --git a/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs b/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs index ad87b0041f..df22e1b985 100644 --- a/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs +++ b/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs @@ -53,45 +53,55 @@ namespace Volo.Abp.Identity [Authorize(IdentityPermissions.Users.Create)] public async Task CreateAsync(IdentityUserCreateDto input) { - var user = new IdentityUser(GuidGenerator.Create(), input.UserName, input.Email, CurrentTenant.Id); + using (_userManager.AutoSaveUserChanges(false)) + { + var user = new IdentityUser(GuidGenerator.Create(), input.UserName, input.Email, CurrentTenant.Id); - (await _userManager.CreateAsync(user, input.Password)).CheckErrors(); - await UpdateUserByInput(user, input); + (await _userManager.CreateAsync(user, input.Password)).CheckErrors(); + await UpdateUserByInput(user, input); - await CurrentUnitOfWork.SaveChangesAsync(); + await CurrentUnitOfWork.SaveChangesAsync(); - return ObjectMapper.Map(user); + return ObjectMapper.Map(user); + } } [Authorize(IdentityPermissions.Users.Update)] public async Task UpdateAsync(Guid id, IdentityUserUpdateDto input) { - var user = await _userManager.GetByIdAsync(id); - user.ConcurrencyStamp = input.ConcurrencyStamp; + using (_userManager.AutoSaveUserChanges(false)) + { + var user = await _userManager.GetByIdAsync(id); + user.ConcurrencyStamp = input.ConcurrencyStamp; - (await _userManager.SetUserNameAsync(user, input.UserName)).CheckErrors(); - await UpdateUserByInput(user, input); - (await _userManager.UpdateAsync(user)).CheckErrors(); - await CurrentUnitOfWork.SaveChangesAsync(); + (await _userManager.SetUserNameAsync(user, input.UserName)).CheckErrors(); + await UpdateUserByInput(user, input); + (await _userManager.UpdateAsync(user)).CheckErrors(); + await CurrentUnitOfWork.SaveChangesAsync(); - return ObjectMapper.Map(user); + return ObjectMapper.Map(user); + } } [Authorize(IdentityPermissions.Users.Delete)] public async Task DeleteAsync(Guid id) { - if (CurrentUser.Id == id) + using (_userManager.AutoSaveUserChanges(false)) { - throw new BusinessException(code: IdentityErrorCodes.UserSelfDeletion); + if (CurrentUser.Id == id) + { + throw new BusinessException(code: IdentityErrorCodes.UserSelfDeletion); + } + + var user = await _userManager.FindByIdAsync(id.ToString()); + if (user == null) + { + return; + } + + (await _userManager.DeleteAsync(user)).CheckErrors(); + await CurrentUnitOfWork.SaveChangesAsync(); } - - var user = await _userManager.FindByIdAsync(id.ToString()); - if (user == null) - { - return; - } - - (await _userManager.DeleteAsync(user)).CheckErrors(); } [Authorize(IdentityPermissions.Users.Update)] diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityStoreAutoSaveChanges.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityStoreAutoSaveChanges.cs new file mode 100644 index 0000000000..af4cb3362f --- /dev/null +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IIdentityStoreAutoSaveChanges.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.Identity +{ + public interface IIdentityStoreAutoSaveChanges + { + bool AutoSaveChanges { get; set; } + } +} \ No newline at end of file diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleManager.cs index c66d501146..429012bfca 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleManager.cs @@ -69,5 +69,20 @@ namespace Volo.Abp.Identity return await base.DeleteAsync(role); } + + public IDisposable AutoSaveRoleChanges(bool autoSaveChanges) + { + if (!(Store is IIdentityStoreAutoSaveChanges store)) + { + throw new InvalidOperationException(Store.GetType().FullName + " does not support AutoSaveChanges"); + } + + var currentAutoSaveChanges = store.AutoSaveChanges; + store.AutoSaveChanges = autoSaveChanges; + return new DisposeAction(() => + { + store.AutoSaveChanges = currentAutoSaveChanges; + }); + } } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleStore.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleStore.cs index 175b051a48..60c41ab0a8 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleStore.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityRoleStore.cs @@ -20,6 +20,7 @@ namespace Volo.Abp.Identity public class IdentityRoleStore : IRoleStore, IRoleClaimStore, + IIdentityStoreAutoSaveChanges, ITransientDependency { private readonly IIdentityRoleRepository _roleRepository; diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs index dc4b2fe4b2..7212b8f0d2 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserManager.cs @@ -75,5 +75,20 @@ namespace Volo.Abp.Identity return IdentityResult.Success; } + + public IDisposable AutoSaveUserChanges(bool autoSaveChanges) + { + if (!(Store is IIdentityStoreAutoSaveChanges store)) + { + throw new InvalidOperationException(Store.GetType().FullName + " does not support AutoSaveChanges"); + } + + var currentAutoSaveChanges = store.AutoSaveChanges; + store.AutoSaveChanges = autoSaveChanges; + return new DisposeAction(() => + { + store.AutoSaveChanges = currentAutoSaveChanges; + }); + } } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserStore.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserStore.cs index bac63a0c11..9e302ef6c9 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserStore.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserStore.cs @@ -31,6 +31,7 @@ namespace Volo.Abp.Identity IUserAuthenticationTokenStore, IUserAuthenticatorKeyStore, IUserTwoFactorRecoveryCodeStore, + IIdentityStoreAutoSaveChanges, ITransientDependency { private const string InternalLoginProvider = "[AspNetUserStore]";