diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreCache.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreCache.cs index 5a53a62884..002121aeb3 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreCache.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStoreCache.cs @@ -9,6 +9,7 @@ using Volo.Abp.SimpleStateChecking; namespace Volo.Abp.PermissionManagement; +//TODO: Extract interface public class DynamicPermissionDefinitionStoreCache : ISingletonDependency { public string CacheStamp { get; set; } @@ -25,7 +26,7 @@ public class DynamicPermissionDefinitionStoreCache : ISingletonDependency PermissionDefinitions = new Dictionary(); } - public async Task FillAsync( + public Task FillAsync( List permissionGroupRecords, List permissionRecords) { @@ -35,7 +36,7 @@ public class DynamicPermissionDefinitionStoreCache : ISingletonDependency { var permissionGroup = context.AddGroup( permissionGroupRecord.Name, - new FixedLocalizableString(permissionGroupRecord.DisplayName) + new FixedLocalizableString(permissionGroupRecord.DisplayName) //TODO: Consider localization ); foreach (var property in permissionGroupRecord.ExtraProperties) @@ -43,40 +44,54 @@ public class DynamicPermissionDefinitionStoreCache : ISingletonDependency permissionGroup[property.Key] = property.Value; } - var permissionRecordsInThisGroup = permissionRecords.Where(p => p.GroupName == permissionGroup.Name); + var permissionRecordsInThisGroup = permissionRecords + .Where(p => p.GroupName == permissionGroup.Name); + foreach (var permissionRecord in permissionRecordsInThisGroup) { - var permission = permissionGroup.AddPermission( - permissionRecord.Name, - new FixedLocalizableString(permissionRecord.DisplayName), - permissionRecord.MultiTenancySide, - permissionRecord.IsEnabled - ); - - if (!permissionRecord.Providers.IsNullOrWhiteSpace()) - { - permission.Providers.AddRange(permissionRecord.Providers.Split(',')); - } - - if (!permissionRecord.StateCheckers.IsNullOrWhiteSpace()) - { - var checkers = StateCheckerSerializer - .DeserializeArray( - permissionRecord.StateCheckers - ); - permission.StateCheckers.AddRange(checkers); - } - - foreach (var property in permissionRecord.ExtraProperties) - { - permission[property.Key] = property.Value; - } - - //TODO: Child permissions! (with parent name setting) + AddPermissionRecursively(permissionGroup, permissionRecord, permissionRecords); } } + + return Task.CompletedTask; } - + + private void AddPermissionRecursively(ICanAddChildPermission permissionContainer, + PermissionDefinitionRecord permissionRecord, + List allPermissionRecords) + { + var permission = permissionContainer.AddPermission( + permissionRecord.Name, + new FixedLocalizableString(permissionRecord.DisplayName), + permissionRecord.MultiTenancySide, + permissionRecord.IsEnabled + ); + + if (!permissionRecord.Providers.IsNullOrWhiteSpace()) + { + permission.Providers.AddRange(permissionRecord.Providers.Split(',')); + } + + if (!permissionRecord.StateCheckers.IsNullOrWhiteSpace()) + { + var checkers = StateCheckerSerializer + .DeserializeArray( + permissionRecord.StateCheckers + ); + permission.StateCheckers.AddRange(checkers); + } + + foreach (var property in permissionRecord.ExtraProperties) + { + permission[property.Key] = property.Value; + } + + foreach (var subPermission in allPermissionRecords.Where(p => p.ParentName == permissionRecord.Name)) + { + AddPermissionRecursively(permission, subPermission, allPermissionRecords); + } + } + protected virtual Dictionary CreatePermissionDefinitions() { var permissions = new Dictionary();