diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDefinitionRecord.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDefinitionRecord.cs index f2a9173140..7421866869 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDefinitionRecord.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionDefinitionRecord.cs @@ -61,4 +61,107 @@ public class PermissionDefinitionRecord : BasicAggregateRoot, IHasExtraPro ExtraProperties = new ExtraPropertyDictionary(); this.SetDefaultsForExtraProperties(); } + + public bool HasSameData(PermissionDefinitionRecord otherRecord) + { + if (Name != otherRecord.Name) + { + return false; + } + + if (GroupName != otherRecord.GroupName) + { + return false; + } + + if (ParentName != otherRecord.ParentName) + { + return false; + } + + if (DisplayName != otherRecord.DisplayName) + { + return false; + } + + if (IsEnabled != otherRecord.IsEnabled) + { + return false; + } + + if (MultiTenancySide != otherRecord.MultiTenancySide) + { + return false; + } + + if (Providers != otherRecord.Providers) + { + return false; + } + + if (StateCheckers != otherRecord.StateCheckers) + { + return false; + } + + if (!this.HasSameExtraProperties(otherRecord)) + { + return false; + } + + return true; + } + + public void Patch(PermissionDefinitionRecord otherRecord) + { + if (Name != otherRecord.Name) + { + Name = otherRecord.Name; + } + + if (GroupName != otherRecord.GroupName) + { + GroupName = otherRecord.GroupName; + } + + if (ParentName != otherRecord.ParentName) + { + ParentName = otherRecord.ParentName; + } + + if (DisplayName != otherRecord.DisplayName) + { + DisplayName = otherRecord.DisplayName; + } + + if (IsEnabled != otherRecord.IsEnabled) + { + IsEnabled = otherRecord.IsEnabled; + } + + if (MultiTenancySide != otherRecord.MultiTenancySide) + { + MultiTenancySide = otherRecord.MultiTenancySide; + } + + if (Providers != otherRecord.Providers) + { + Providers = otherRecord.Providers; + } + + if (StateCheckers != otherRecord.StateCheckers) + { + StateCheckers = otherRecord.StateCheckers; + } + + if (!this.HasSameExtraProperties(otherRecord)) + { + this.ExtraProperties.Clear(); + + foreach (var property in otherRecord.ExtraProperties) + { + this.ExtraProperties.Add(property.Key, property.Value); + } + } + } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGroupDefinitionRecord.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGroupDefinitionRecord.cs index c1f9656e2c..7666b1ded8 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGroupDefinitionRecord.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionGroupDefinitionRecord.cs @@ -51,23 +51,23 @@ public class PermissionGroupDefinitionRecord : BasicAggregateRoot, IHasExt return true; } - public void Patch(PermissionGroupDefinitionRecord record) + public void Patch(PermissionGroupDefinitionRecord otherRecord) { - if (Name != record.Name) + if (Name != otherRecord.Name) { - Name = record.Name; + Name = otherRecord.Name; } - if (DisplayName != record.DisplayName) + if (DisplayName != otherRecord.DisplayName) { - DisplayName = record.DisplayName; + DisplayName = otherRecord.DisplayName; } - if (!this.HasSameExtraProperties(record)) + if (!this.HasSameExtraProperties(otherRecord)) { this.ExtraProperties.Clear(); - foreach (var property in record.ExtraProperties) + foreach (var property in otherRecord.ExtraProperties) { this.ExtraProperties.Add(property.Key, property.Value); } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs index c6ecfa2a2b..94d332ccdb 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs @@ -78,7 +78,8 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc return; } - await UpdateChangedGroupsAsync(permissionGroupRecords); + await UpdateChangedPermissionGroupsAsync(permissionGroupRecords); + await UpdateChangedPermissionsAsync(permissionRecords); await Cache.SetStringAsync( cacheKey, @@ -89,7 +90,7 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc ); } - private async Task UpdateChangedGroupsAsync(PermissionGroupDefinitionRecord[] permissionGroupRecords) + private async Task UpdateChangedPermissionGroupsAsync(IEnumerable permissionGroupRecords) { var newRecords = new List(); var changedRecords = new List(); @@ -127,6 +128,45 @@ public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependenc await PermissionGroupRepository.UpdateManyAsync(changedRecords); await PermissionGroupRepository.DeleteManyAsync(deletedRecords); } + + private async Task UpdateChangedPermissionsAsync(IEnumerable permissionRecords) + { + var newRecords = new List(); + var changedRecords = new List(); + + var permissionRecordsInDatabase = (await PermissionRepository.GetListAsync()) + .ToDictionary(x => x.Name); + + foreach (var permissionRecord in permissionRecords) + { + var permissionRecordInDatabase = permissionRecordsInDatabase.GetOrDefault(permissionRecord.Name); + if (permissionRecordInDatabase == null) + { + /* New group */ + newRecords.Add(permissionRecord); + continue; + } + + if (permissionRecord.HasSameData(permissionRecordInDatabase)) + { + /* Not changed */ + continue; + } + + /* Changed */ + permissionRecordInDatabase.Patch(permissionRecord); + changedRecords.Add(permissionRecordInDatabase); + } + + /* Deleted */ + var deletedRecords = permissionRecordsInDatabase.Values + .Where(x => PermissionManagementOptions.DeletedPermissions.Contains(x.Name)) + .ToArray(); + + await PermissionRepository.InsertManyAsync(newRecords); + await PermissionRepository.UpdateManyAsync(changedRecords); + await PermissionRepository.DeleteManyAsync(deletedRecords); + } private string GetDistributedLockKey() {