diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainModule.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainModule.cs index 6dff7bf663..de5c7a0559 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainModule.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/AbpPermissionManagementDomainModule.cs @@ -1,8 +1,10 @@ -using System.Collections.Generic; +using System; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; +using Microsoft.Extensions.Logging; using Volo.Abp.Authorization; using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; using Volo.Abp.Domain; using Volo.Abp.Json; using Volo.Abp.Modularity; @@ -16,5 +18,30 @@ namespace Volo.Abp.PermissionManagement; [DependsOn(typeof(AbpJsonModule))] public class AbpPermissionManagementDomainModule : AbpModule { - -} + public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context) + { + Task.Run(async () => + { + using var scope = context + .ServiceProvider + .GetRequiredService() + .CreateScope(); + + try + { + await scope + .ServiceProvider + .GetRequiredService() + .SaveAsync(); + } + catch (Exception ex) + { + //TODO: We should retry until it's successful! + + scope.ServiceProvider + .GetService>() + .LogException(ex); + } + }); + } +} \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStore.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStore.cs new file mode 100644 index 0000000000..6c4ea1fdec --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/DynamicPermissionDefinitionStore.cs @@ -0,0 +1,79 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.PermissionManagement; + +/* + +[Dependency(ReplaceServices = true)] +public class DynamicPermissionDefinitionStore : IDynamicPermissionDefinitionStore, ITransientDependency +{ + protected IPermissionGroupDefinitionRecordRepository PermissionGroupRepository { get; } + protected IPermissionDefinitionRecordRepository PermissionRepository { get; } + protected IPermissionDefinitionSerializer PermissionDefinitionSerializer { get; } + + public DynamicPermissionDefinitionStore( + IPermissionGroupDefinitionRecordRepository permissionGroupRepository, + IPermissionDefinitionRecordRepository permissionRepository, + IPermissionDefinitionSerializer permissionDefinitionSerializer) + { + PermissionGroupRepository = permissionGroupRepository; + PermissionRepository = permissionRepository; + PermissionDefinitionSerializer = permissionDefinitionSerializer; + } + + public virtual async Task GetOrNullAsync(string name) + { + var permissionRecord = await PermissionRepository.FindByNameAsync(name); + if (permissionRecord == null) + { + return null; + } + + return await PermissionDefinitionSerializer.DeserializeAsync(permissionRecord); + } + + public virtual async Task> GetPermissionsAsync() + { + var permissionRecords = await PermissionRepository.GetListAsync(); + if(permissionRecords.Count == 0) + { + return Array.Empty(); + } + + var permissionDefinitions = new PermissionDefinition[permissionRecords.Count]; + for (var i = 0; i < permissionRecords.Count; i++) + { + permissionDefinitions[i] = await PermissionDefinitionSerializer.DeserializeAsync(permissionRecords[i]); + } + + return permissionDefinitions; + } + + public virtual async Task> GetGroupsAsync() + { + var permissionGroupRecords = await PermissionGroupRepository.GetListAsync(); + if(permissionGroupRecords.Count == 0) + { + return Array.Empty(); + } + + var permissionGroupDefinitions = new PermissionGroupDefinition[permissionGroupRecords.Count]; + for (var i = 0; i < permissionGroupRecords.Count; i++) + { + permissionGroupDefinitions[i] = await PermissionDefinitionSerializer.DeserializeAsync(permissionGroupRecords[i]); + } + + return permissionGroupDefinitions; + } + + public virtual async Task StoreStaticPermissionsAsync() + { + throw new NotImplementedException(); + } +} + +*/ \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IStaticPermissionSaver.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IStaticPermissionSaver.cs new file mode 100644 index 0000000000..5c91636c3d --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IStaticPermissionSaver.cs @@ -0,0 +1,8 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.PermissionManagement; + +public interface IStaticPermissionSaver +{ + Task SaveAsync(); +} \ No newline at end of file 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 new file mode 100644 index 0000000000..34f8752253 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/StaticPermissionSaver.cs @@ -0,0 +1,47 @@ +using System.Threading.Tasks; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Uow; + +namespace Volo.Abp.PermissionManagement; + +public class StaticPermissionSaver : IStaticPermissionSaver, ITransientDependency +{ + protected IStaticPermissionDefinitionStore StaticStore { get; } + protected IPermissionGroupDefinitionRecordRepository PermissionGroupRepository { get; } + protected IPermissionDefinitionRecordRepository PermissionRepository { get; } + protected IPermissionDefinitionSerializer PermissionSerializer { get; } + + public StaticPermissionSaver( + IStaticPermissionDefinitionStore staticStore, + IPermissionGroupDefinitionRecordRepository permissionGroupRepository, + IPermissionDefinitionRecordRepository permissionRepository, + IPermissionDefinitionSerializer permissionSerializer) + { + StaticStore = staticStore; + PermissionGroupRepository = permissionGroupRepository; + PermissionRepository = permissionRepository; + PermissionSerializer = permissionSerializer; + } + + [UnitOfWork] + public virtual async Task SaveAsync() + { + // TODO: Save only changed permissions & groups + /* - get all groups + * - compare and update or insert groups + * - get all permissions + * - compare and update or insert permissions + * - set in-memory cache using the latest group and permission data + */ + + var permissionGroups = await StaticStore.GetGroupsAsync(); + foreach (var permissionGroup in permissionGroups) + { + foreach (var permission in permissionGroup.GetPermissionsWithChildren()) + { + + } + } + } +} \ No newline at end of file