From 10bf53dbece5846f608162f43c3bb6cf26873b3a Mon Sep 17 00:00:00 2001 From: colin Date: Wed, 26 Aug 2026 09:09:47 +0800 Subject: [PATCH 01/10] feat: Add DynamicsCore Module --- .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 +++ ...INGYUN.Abp.Dynamic.Definitions.Core.csproj | 20 ++ .../AbpDynamicDefinitionsCoreModule.cs | 8 + .../AbpDynamicDefinitionsOptions.cs | 35 +++ .../Definitions/DynamicDefinitionManager.cs | 240 ++++++++++++++++++ .../Definitions/DynamicDefinitionStrategy.cs | 8 + 7 files changed, 344 insertions(+) create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/FodyWeavers.xml create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/FodyWeavers.xsd create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN.Abp.Dynamic.Definitions.Core.csproj create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsCoreModule.cs create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsOptions.cs create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/DynamicDefinitionManager.cs create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/DynamicDefinitionStrategy.cs diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/FodyWeavers.xml b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/FodyWeavers.xml new file mode 100644 index 000000000..1715698cc --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/FodyWeavers.xsd b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN.Abp.Dynamic.Definitions.Core.csproj b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN.Abp.Dynamic.Definitions.Core.csproj new file mode 100644 index 000000000..906978d01 --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN.Abp.Dynamic.Definitions.Core.csproj @@ -0,0 +1,20 @@ + + + + + + + netstandard2.0;netstandard2.1;net8.0;net9.0;net10.0 + LINGYUN.Abp.Dynamic.Definitions.Core + LINGYUN.Abp.Dynamic.Definitions.Core + false + false + false + + + + + + + + diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsCoreModule.cs b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsCoreModule.cs new file mode 100644 index 000000000..e410761b4 --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsCoreModule.cs @@ -0,0 +1,8 @@ +using Volo.Abp.Modularity; + +namespace LINGYUN.Abp.Dynamic.Definitions; + +public class AbpDynamicDefinitionsCoreModule : AbpModule +{ + +} diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsOptions.cs b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsOptions.cs new file mode 100644 index 000000000..cdd9c0f8c --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsOptions.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; + +namespace LINGYUN.Abp.Dynamic.Definitions; + +public class AbpDynamicDefinitionsOptions +{ + public DynamicDefinitionStrategy DefaultStrategy { get; set; } + public Dictionary DefinitionStrategy { get; set; } + public AbpDynamicDefinitionsOptions() + { + DefaultStrategy = DynamicDefinitionStrategy.Static; + DefinitionStrategy = new Dictionary(); + } + + public void MapStrategy(DynamicDefinitionStrategy strategy = DynamicDefinitionStrategy.Static) + { + DefinitionStrategy[typeof(T)] = strategy; + } + + public DynamicDefinitionStrategy GetStrategy() + { + return GetStrategy(typeof(T)); + } + + public DynamicDefinitionStrategy GetStrategy(Type type) + { + if (DefinitionStrategy.TryGetValue(type, out var strategy)) + { + return strategy; + } + + return DefaultStrategy; + } +} diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/DynamicDefinitionManager.cs b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/DynamicDefinitionManager.cs new file mode 100644 index 000000000..81de2a518 --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/DynamicDefinitionManager.cs @@ -0,0 +1,240 @@ +using Microsoft.Extensions.Options; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.Dynamic.Definitions; + +public abstract class DynamicDefinitionManager : DynamicDefinitionManager +{ + protected DynamicDefinitionManager( + IOptions options) : base(options) + { + } + + public async virtual Task GetGroupDefinitionAsync( + TGroupDefinition? staticGroupDefinition, + TGroupDefinition? dynamicGroupDefinition) + { + if (staticGroupDefinition != null && dynamicGroupDefinition != null) + { + var strategy = Options.GetStrategy(); + switch (strategy) + { + case DynamicDefinitionStrategy.Dynamic: + return dynamicGroupDefinition; + case DynamicDefinitionStrategy.Merge: + await MergeGroupDefinitionAsync(staticGroupDefinition, dynamicGroupDefinition); + return staticGroupDefinition; + case DynamicDefinitionStrategy.Static: + default: + return staticGroupDefinition; + } + } + + return staticGroupDefinition ?? dynamicGroupDefinition; + } + + public async virtual Task> GetGroupDefinitionsAsync( + IReadOnlyList staticGroupDefinitions, + IReadOnlyList dynamicGroupDefinitions) + { + var strategy = Options.GetStrategy(); + return strategy switch + { + DynamicDefinitionStrategy.Dynamic => await GetDynamicGroupDefinitionsAsync(staticGroupDefinitions, dynamicGroupDefinitions), + DynamicDefinitionStrategy.Merge => await GetMergedGroupDefinitionsAsync(staticGroupDefinitions, dynamicGroupDefinitions), + _ => await GetStaticGroupDefinitionsAsync(staticGroupDefinitions, dynamicGroupDefinitions), + }; + } + + protected virtual Task> GetStaticGroupDefinitionsAsync( + IReadOnlyList staticGroupDefinitions, + IReadOnlyList dynamicGroupDefinitions) + { + var staticDefinitionKeys = staticGroupDefinitions + .Select(GetGroupDefinitionKey) + .ToImmutableHashSet(); + + return Task.FromResult>( + staticGroupDefinitions + .Concat(dynamicGroupDefinitions.Where(d => !staticDefinitionKeys.Contains(GetGroupDefinitionKey(d)))) + .ToImmutableList() + ); + } + + protected virtual Task> GetDynamicGroupDefinitionsAsync( + IReadOnlyList staticGroupDefinitions, + IReadOnlyList dynamicGroupDefinitions) + { + var dynamicDefinitionKeys = dynamicGroupDefinitions + .Select(GetGroupDefinitionKey) + .ToImmutableHashSet(); + + return Task.FromResult>( + dynamicGroupDefinitions + .Concat(staticGroupDefinitions.Where(s => !dynamicDefinitionKeys.Contains(GetGroupDefinitionKey(s)))) + .ToImmutableList() + ); + } + + protected async virtual Task> GetMergedGroupDefinitionsAsync( + IReadOnlyList staticGroupDefinitions, + IReadOnlyList dynamicGroupDefinitions) + { + var mergedGroups = new Dictionary(); + + foreach (var staticGroup in staticGroupDefinitions) + { + mergedGroups[GetGroupDefinitionKey(staticGroup)] = staticGroup; + } + + foreach (var dynamicGroup in dynamicGroupDefinitions) + { + if (mergedGroups.TryGetValue(GetGroupDefinitionKey(dynamicGroup), out var existingGroup)) + { + await BeforeMergeGroupDefinitionAsync(existingGroup, dynamicGroup); + await MergeGroupDefinitionAsync(existingGroup, dynamicGroup); + await AfterMergeGroupDefinitionAsync(existingGroup, dynamicGroup); + } + else + { + mergedGroups[GetGroupDefinitionKey(dynamicGroup)] = dynamicGroup; + } + } + + await AfterMergedGroupDefinitionsAsync(mergedGroups); + + return mergedGroups.Values.ToImmutableList(); + } + + protected abstract string GetGroupDefinitionKey(TGroupDefinition groupDefinition); + + protected abstract Task MergeGroupDefinitionAsync(TGroupDefinition targetGroupDefinition, TGroupDefinition sourceGroupDefinition); + + protected virtual Task BeforeMergeGroupDefinitionAsync(TGroupDefinition targetGroupDefinition, TGroupDefinition sourceGroupDefinition) + { + return Task.CompletedTask; + } + + protected virtual Task AfterMergeGroupDefinitionAsync(TGroupDefinition targetGroupDefinition, TGroupDefinition sourceGroupDefinition) + { + return Task.CompletedTask; + } + + protected virtual Task AfterMergedGroupDefinitionsAsync(Dictionary mergedDefinitions) + { + return Task.CompletedTask; + } +} + +public abstract class DynamicDefinitionManager +{ + protected AbpDynamicDefinitionsOptions Options { get; } + protected DynamicDefinitionManager(IOptions options) + { + Options = options.Value; + } + + public async virtual Task GetDefinitionAsync(TDefinition? staticDefinition, TDefinition? dynamicDefinition) + { + if (staticDefinition != null && dynamicDefinition != null) + { + var strategy = Options.GetStrategy(); + return strategy switch + { + DynamicDefinitionStrategy.Static => staticDefinition, + DynamicDefinitionStrategy.Dynamic => dynamicDefinition, + DynamicDefinitionStrategy.Merge => await MergeDefinitionAsync(staticDefinition, dynamicDefinition), + _ => staticDefinition + }; + } + + return staticDefinition ?? dynamicDefinition; + } + + public async virtual Task> GetDefinitionsAsync(IReadOnlyList staticDefinitions, IReadOnlyList dynamicDefinitions) + { + var strategy = Options.GetStrategy(); + return strategy switch + { + DynamicDefinitionStrategy.Dynamic => await GetDynamicDefinitionsAsync(staticDefinitions, dynamicDefinitions), + DynamicDefinitionStrategy.Merge => await GetMergedDefinitionsAsync(staticDefinitions, dynamicDefinitions), + _ => await GetStaticDefinitionsAsync(staticDefinitions, dynamicDefinitions), + }; + } + + protected virtual Task> GetStaticDefinitionsAsync(IReadOnlyList staticDefinitions, IReadOnlyList dynamicDefinitions) + { + var staticDefinitionKeys = staticDefinitions + .Select(GetDefinitionKey) + .ToImmutableHashSet(); + + return Task.FromResult>( + staticDefinitions + .Concat(dynamicDefinitions.Where(d => !staticDefinitionKeys.Contains(GetDefinitionKey(d)))) + .ToImmutableList() + ); + } + + protected virtual Task> GetDynamicDefinitionsAsync(IReadOnlyList staticDefinitions, IReadOnlyList dynamicDefinitions) + { + var dynamicDefinitionKeys = dynamicDefinitions + .Select(GetDefinitionKey) + .ToImmutableHashSet(); + + return Task.FromResult>( + dynamicDefinitions + .Concat(staticDefinitions.Where(s => !dynamicDefinitionKeys.Contains(GetDefinitionKey(s)))) + .ToImmutableList() + ); + } + + protected async virtual Task> GetMergedDefinitionsAsync(IReadOnlyList staticDefinitions, IReadOnlyList dynamicDefinitions) + { + var mergedDefinitions = new Dictionary(); + + foreach (var staticDefinition in staticDefinitions) + { + mergedDefinitions[GetDefinitionKey(staticDefinition)] = staticDefinition; + } + + foreach (var dynamicDefinition in dynamicDefinitions) + { + if (mergedDefinitions.TryGetValue(GetDefinitionKey(dynamicDefinition), out var existingDefinition)) + { + await BeforeMergeDefinitionAsync(existingDefinition, dynamicDefinition); + await MergeDefinitionAsync(existingDefinition, dynamicDefinition); + await AfterMergeDefinitionAsync(existingDefinition, dynamicDefinition); + } + else + { + mergedDefinitions[GetDefinitionKey(dynamicDefinition)] = dynamicDefinition; + } + } + + await AfterMergedDefinitionsAsync(mergedDefinitions); + + return mergedDefinitions.Values.ToImmutableList(); + } + + protected abstract string GetDefinitionKey(TDefinition definition); + + protected abstract Task MergeDefinitionAsync(TDefinition targetDefinition, TDefinition sourceDefinition); + + protected virtual Task BeforeMergeDefinitionAsync(TDefinition targetDefinition, TDefinition sourceDefinition) + { + return Task.CompletedTask; + } + + protected virtual Task AfterMergeDefinitionAsync(TDefinition targetDefinition, TDefinition sourceDefinition) + { + return Task.CompletedTask; + } + + protected virtual Task AfterMergedDefinitionsAsync(Dictionary mergedDefinitions) + { + return Task.CompletedTask; + } +} diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/DynamicDefinitionStrategy.cs b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/DynamicDefinitionStrategy.cs new file mode 100644 index 000000000..44e54e07e --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions.Core/LINGYUN/Abp/Dynamic/Definitions/DynamicDefinitionStrategy.cs @@ -0,0 +1,8 @@ +namespace LINGYUN.Abp.Dynamic.Definitions; + +public enum DynamicDefinitionStrategy +{ + Static = 0, + Dynamic = 1, + Merge = 2, +} From f3113a8a479b4402dd299df79bc451478b37edad Mon Sep 17 00:00:00 2001 From: colin Date: Wed, 26 Aug 2026 09:11:52 +0800 Subject: [PATCH 02/10] feat: Rewrite the default xxxDefinitionManager of abp --- .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 +++ .../LINGYUN.Abp.Dynamic.Definitions.csproj | 27 ++ .../AbpDynamicDefinitionsModule.cs | 32 +++ .../FeatureDynamicDefinitionManager.cs | 253 ++++++++++++++++++ .../PermissionDynamicDefinitionManager.cs | 249 +++++++++++++++++ .../SettingDynamicDefinitionManager.cs | 82 ++++++ .../TemplateDynamicDefinitionManager.cs | 99 +++++++ 8 files changed, 775 insertions(+) create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/FodyWeavers.xml create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/FodyWeavers.xsd create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN.Abp.Dynamic.Definitions.csproj create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsModule.cs create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/FeatureDynamicDefinitionManager.cs create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/PermissionDynamicDefinitionManager.cs create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/SettingDynamicDefinitionManager.cs create mode 100644 aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/TemplateDynamicDefinitionManager.cs diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/FodyWeavers.xml b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/FodyWeavers.xml new file mode 100644 index 000000000..1715698cc --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/FodyWeavers.xsd b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/FodyWeavers.xsd new file mode 100644 index 000000000..3f3946e28 --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN.Abp.Dynamic.Definitions.csproj b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN.Abp.Dynamic.Definitions.csproj new file mode 100644 index 000000000..1e16ed5b0 --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN.Abp.Dynamic.Definitions.csproj @@ -0,0 +1,27 @@ + + + + + + + netstandard2.0;netstandard2.1;net8.0;net9.0;net10.0 + LINGYUN.Abp.Dynamic.Definitions + LINGYUN.Abp.Dynamic.Definitions + false + false + false + + + + + + + + + + + + + + + diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsModule.cs b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsModule.cs new file mode 100644 index 000000000..47fd99517 --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/AbpDynamicDefinitionsModule.cs @@ -0,0 +1,32 @@ +using Volo.Abp.Authorization; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Features; +using Volo.Abp.Modularity; +using Volo.Abp.Settings; +using Volo.Abp.TextTemplating; + +namespace LINGYUN.Abp.Dynamic.Definitions; + +[DependsOn( + typeof(AbpFeaturesModule), + typeof(AbpAuthorizationModule), + typeof(AbpTextTemplatingCoreModule), + typeof(AbpDynamicDefinitionsCoreModule))] +public class AbpDynamicDefinitionsModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.MapStrategy(DynamicDefinitionStrategy.Merge); + options.MapStrategy(DynamicDefinitionStrategy.Merge); + + options.MapStrategy(DynamicDefinitionStrategy.Merge); + options.MapStrategy(DynamicDefinitionStrategy.Merge); + + options.MapStrategy(DynamicDefinitionStrategy.Merge); + + options.MapStrategy(DynamicDefinitionStrategy.Merge); + }); + } +} diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/FeatureDynamicDefinitionManager.cs b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/FeatureDynamicDefinitionManager.cs new file mode 100644 index 000000000..8075a3665 --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/FeatureDynamicDefinitionManager.cs @@ -0,0 +1,253 @@ +using JetBrains.Annotations; +using Microsoft.Extensions.Options; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; + +namespace LINGYUN.Abp.Dynamic.Definitions; + +[Dependency(ReplaceServices = true)] +[ExposeServices( + typeof(IFeatureDefinitionManager), + typeof(FeatureDynamicDefinitionManager))] +public class FeatureDynamicDefinitionManager : + DynamicDefinitionManager, + IFeatureDefinitionManager, + ISingletonDependency +{ + protected IStaticFeatureDefinitionStore StaticStore { get; } + protected IDynamicFeatureDefinitionStore DynamicStore { get; } + public FeatureDynamicDefinitionManager( + IStaticFeatureDefinitionStore staticStore, + IDynamicFeatureDefinitionStore dynamicStore, + IOptions options) + : base(options) + { + StaticStore = staticStore; + DynamicStore = dynamicStore; + } + + public async virtual Task> GetAllAsync() + { + var staticDefinitions = await StaticStore.GetFeaturesAsync(); + var dynamicDefinitions = await DynamicStore.GetFeaturesAsync(); + + return await GetDefinitionsAsync(staticDefinitions, dynamicDefinitions); + } + + public async virtual Task GetAsync(string name) + { + return await GetOrNullAsync(name) ?? throw new AbpException("Undefined feature: " + name); + } + + public async virtual Task> GetGroupsAsync() + { + var staticGroupDefinitions = await StaticStore.GetGroupsAsync(); + var dynamicGroupDefinitions = await DynamicStore.GetGroupsAsync(); + + return await GetGroupDefinitionsAsync(staticGroupDefinitions, dynamicGroupDefinitions); + } + + public async virtual Task GetOrNullAsync(string name) + { + Check.NotNull(name, nameof(name)); + + var staticDefinition = await StaticStore.GetOrNullAsync(name); + var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); + + return await GetDefinitionAsync(staticDefinition, dynamicDefinition); + } + + protected override string GetDefinitionKey(FeatureDefinition definition) + { + return definition.Name; + } + + protected override string GetGroupDefinitionKey(FeatureGroupDefinition groupDefinition) + { + return groupDefinition.Name; + } + + protected override Task MergeDefinitionAsync(FeatureDefinition targetDefinition, FeatureDefinition sourceDefinition) + { + targetDefinition.DisplayName = sourceDefinition.DisplayName; + + if (sourceDefinition.Description != null) + { + targetDefinition.Description = sourceDefinition.Description; + } + + if (sourceDefinition.DefaultValue != null) + { + targetDefinition.DefaultValue = sourceDefinition.DefaultValue; + } + + if (sourceDefinition.ValueType != null) + { + targetDefinition.ValueType = sourceDefinition.ValueType; + } + + targetDefinition.IsVisibleToClients = targetDefinition.IsVisibleToClients || sourceDefinition.IsVisibleToClients; + targetDefinition.IsAvailableToHost = targetDefinition.IsAvailableToHost || sourceDefinition.IsAvailableToHost; + + CopyFeatureDetails(targetDefinition, sourceDefinition); + + return Task.FromResult(targetDefinition); + } + + protected async override Task AfterMergeDefinitionAsync(FeatureDefinition targetDefinition, FeatureDefinition sourceDefinition) + { + foreach (var child in sourceDefinition.Children) + { + await MergeChildFeature(targetDefinition, child); + } + } + + protected async override Task MergeGroupDefinitionAsync(FeatureGroupDefinition targetGroupDefinition, FeatureGroupDefinition sourceGroupDefinition) + { + if (sourceGroupDefinition.DisplayName != null) + { + targetGroupDefinition.DisplayName = sourceGroupDefinition.DisplayName; + } + foreach (var property in sourceGroupDefinition.Properties) + { + targetGroupDefinition.Properties[property.Key] = property.Value; + } + + foreach (var sourceFeature in sourceGroupDefinition.Features) + { + var existingFeature = GetFeatureOrNull(targetGroupDefinition, sourceFeature.Name); + + if (existingFeature == null) + { + var newFeature = targetGroupDefinition.AddFeature( + sourceFeature.Name, + sourceFeature.DefaultValue, + sourceFeature.DisplayName, + sourceFeature.Description, + sourceFeature.ValueType, + sourceFeature.IsVisibleToClients, + sourceFeature.IsAvailableToHost + ); + + CopyFeatureDetails(sourceFeature, newFeature); + + foreach (var child in sourceFeature.Children) + { + AddChildFeatureRecursively(newFeature, child); + } + } + else + { + await MergeDefinitionAsync(existingFeature, sourceFeature); + + foreach (var child in sourceFeature.Children) + { + await MergeChildFeature(existingFeature, child); + } + } + } + } + + private async Task MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) + { + var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); + + if (existingChild == null) + { + var newChild = parent.CreateChild( + sourceChild.Name, + sourceChild.DefaultValue, + sourceChild.DisplayName, + sourceChild.Description, + sourceChild.ValueType, + sourceChild.IsVisibleToClients, + sourceChild.IsAvailableToHost + ); + CopyFeatureDetails(sourceChild, newChild); + + foreach (var grandchild in sourceChild.Children) + { + AddChildFeatureRecursively(newChild, grandchild); + } + } + else + { + await MergeDefinitionAsync(existingChild, sourceChild); + + foreach (var grandchild in sourceChild.Children) + { + await MergeChildFeature(existingChild, grandchild); + } + } + } + + private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) + { + var newChild = parent.CreateChild( + sourceChild.Name, + sourceChild.DefaultValue, + sourceChild.DisplayName, + sourceChild.Description, + sourceChild.ValueType, + sourceChild.IsVisibleToClients, + sourceChild.IsAvailableToHost + ); + + CopyFeatureDetails(sourceChild, newChild); + + foreach (var grandchild in sourceChild.Children) + { + AddChildFeatureRecursively(newChild, grandchild); + } + } + + private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) + { + foreach (var property in source.Properties) + { + target.Properties[property.Key] = property.Value; + } + + foreach (var provider in source.AllowedProviders) + { + if (!target.AllowedProviders.Contains(provider)) + { + target.AllowedProviders.Add(provider); + } + } + } + + public static FeatureDefinition? GetFeatureOrNull( + FeatureGroupDefinition group, + [NotNull] string name) + { + Check.NotNull(name, nameof(name)); + + return GetFeatureOrNullRecursively(group.Features, name); + } + + private static FeatureDefinition? GetFeatureOrNullRecursively( + IReadOnlyList features, + string name) + { + foreach (var feature in features) + { + if (feature.Name == name) + { + return feature; + } + + var childFeature = GetFeatureOrNullRecursively(feature.Children, name); + if (childFeature != null) + { + return childFeature; + } + } + + return null; + } +} diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/PermissionDynamicDefinitionManager.cs b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/PermissionDynamicDefinitionManager.cs new file mode 100644 index 000000000..36eaa06c1 --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/PermissionDynamicDefinitionManager.cs @@ -0,0 +1,249 @@ +using Microsoft.Extensions.Options; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; + +namespace LINGYUN.Abp.Dynamic.Definitions; + +[Dependency(ReplaceServices = true)] +[ExposeServices( + typeof(IPermissionDefinitionManager), + typeof(PermissionDynamicDefinitionManager))] +public class PermissionDynamicDefinitionManager : + DynamicDefinitionManager, + IPermissionDefinitionManager, + ITransientDependency +{ + protected IStaticPermissionDefinitionStore StaticStore { get; } + protected IDynamicPermissionDefinitionStore DynamicStore { get; } + public PermissionDynamicDefinitionManager( + IStaticPermissionDefinitionStore staticStore, + IDynamicPermissionDefinitionStore dynamicStore, + IOptions options) : base(options) + { + StaticStore = staticStore; + DynamicStore = dynamicStore; + } + + public async virtual Task GetAsync(string name) + { + return await GetOrNullAsync(name) ?? throw new AbpException("Undefined permission: " + name); + } + + public async virtual Task> GetGroupsAsync() + { + var staticGroupDefinitions = await StaticStore.GetGroupsAsync(); + var dynamicGroupDefinitions = await DynamicStore.GetGroupsAsync(); + + return await GetGroupDefinitionsAsync(staticGroupDefinitions, dynamicGroupDefinitions); + } + + public async virtual Task GetOrNullAsync(string name) + { + Check.NotNull(name, nameof(name)); + + var staticDefinition = await StaticStore.GetOrNullAsync(name); + var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); + + return await GetDefinitionAsync(staticDefinition, dynamicDefinition); + } + + public async virtual Task> GetPermissionsAsync() + { + var staticDefinitions = await StaticStore.GetPermissionsAsync(); + var dynamicDefinitions = await DynamicStore.GetPermissionsAsync(); + + return await GetDefinitionsAsync(staticDefinitions, dynamicDefinitions); + } + + public async virtual Task GetResourcePermissionAsync(string resourceName, string name) + { + return await GetResourcePermissionOrNullAsync(resourceName, name) + ?? throw new AbpException($"Undefined resource permission: {name} for resource: {resourceName}"); + } + + public async virtual Task GetResourcePermissionOrNullAsync(string resourceName, string name) + { + Check.NotNull(name, nameof(name)); + + var staticDefinition = await StaticStore.GetResourcePermissionOrNullAsync(resourceName, name); + var dynamicDefinition = await DynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); + + return await GetDefinitionAsync(staticDefinition, dynamicDefinition); + } + + public async virtual Task> GetResourcePermissionsAsync() + { + var staticDefinitions = await StaticStore.GetResourcePermissionsAsync(); + var dynamicDefinitions = await DynamicStore.GetResourcePermissionsAsync(); + + return await GetDefinitionsAsync(staticDefinitions, dynamicDefinitions); + } + + protected override string GetDefinitionKey(PermissionDefinition definition) + { + return definition.Name; + } + + protected override string GetGroupDefinitionKey(PermissionGroupDefinition groupDefinition) + { + return groupDefinition.Name; + } + + protected override Task MergeDefinitionAsync(PermissionDefinition targetDefinition, PermissionDefinition sourceDefinition) + { + targetDefinition.DisplayName = sourceDefinition.DisplayName; + if (sourceDefinition.ResourceName != null) + { + targetDefinition.ResourceName = sourceDefinition.ResourceName; + } + if (sourceDefinition.ManagementPermissionName != null) + { + targetDefinition.ManagementPermissionName = sourceDefinition.ManagementPermissionName; + } + + if (sourceDefinition.MultiTenancySide != MultiTenancySides.Both) + { + targetDefinition.MultiTenancySide |= sourceDefinition.MultiTenancySide; + } + + targetDefinition.IsEnabled = targetDefinition.IsEnabled || sourceDefinition.IsEnabled; + + CopyPermissionDetails(targetDefinition, sourceDefinition); + + return Task.FromResult(targetDefinition); + } + + protected async override Task MergeGroupDefinitionAsync(PermissionGroupDefinition targetGroupDefinition, PermissionGroupDefinition sourceGroupDefinition) + { + if (sourceGroupDefinition.DisplayName != null) + { + targetGroupDefinition.DisplayName = sourceGroupDefinition.DisplayName; + } + foreach (var property in sourceGroupDefinition.Properties) + { + targetGroupDefinition.Properties[property.Key] = property.Value; + } + + foreach (var sourcePermission in sourceGroupDefinition.Permissions) + { + var existingPermission = targetGroupDefinition.GetPermissionOrNull(sourcePermission.Name); + + if (existingPermission == null) + { + var newPermission = targetGroupDefinition.AddPermission( + sourcePermission.Name, + sourcePermission.DisplayName, + sourcePermission.MultiTenancySide, + sourcePermission.IsEnabled + ); + newPermission.ResourceName = sourcePermission.ResourceName; + newPermission.ManagementPermissionName = sourcePermission.ManagementPermissionName; + + CopyPermissionDetails(sourcePermission, newPermission); + + foreach (var child in sourcePermission.Children) + { + AddChildPermissionRecursively(newPermission, child); + } + } + else + { + await MergeDefinitionAsync(existingPermission, sourcePermission); + + foreach (var sourceChild in sourcePermission.Children) + { + await MergeChildPermissions(existingPermission, sourceChild); + } + } + } + } + + protected async override Task AfterMergeDefinitionAsync(PermissionDefinition targetDefinition, PermissionDefinition sourceDefinition) + { + foreach (var child in sourceDefinition.Children) + { + await MergeChildPermissions(targetDefinition, child); + } + } + + private async Task MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) + { + var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); + + if (existingChild == null) + { + var newChild = parent.AddChild( + sourceChild.Name, + sourceChild.DisplayName, + sourceChild.MultiTenancySide, + sourceChild.IsEnabled + ); + newChild.ResourceName = sourceChild.ResourceName; + newChild.ManagementPermissionName = sourceChild.ManagementPermissionName; + + CopyPermissionDetails(sourceChild, newChild); + + foreach (var grandchild in sourceChild.Children) + { + AddChildPermissionRecursively(newChild, grandchild); + } + } + else + { + await MergeDefinitionAsync(existingChild, sourceChild); + + foreach (var grandchild in sourceChild.Children) + { + await MergeChildPermissions(existingChild, grandchild); + } + } + } + + private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) + { + var newChild = parent.AddChild( + sourceChild.Name, + sourceChild.DisplayName, + sourceChild.MultiTenancySide, + sourceChild.IsEnabled + ); + newChild.ResourceName = sourceChild.ResourceName; + newChild.ManagementPermissionName = sourceChild.ManagementPermissionName; + + CopyPermissionDetails(sourceChild, newChild); + + foreach (var grandchild in sourceChild.Children) + { + AddChildPermissionRecursively(newChild, grandchild); + } + } + + private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) + { + foreach (var property in source.Properties) + { + target.Properties[property.Key] = property.Value; + } + + foreach (var provider in source.Providers) + { + if (!target.Providers.Contains(provider)) + { + target.Providers.Add(provider); + } + } + + foreach (var checker in source.StateCheckers) + { + if (!target.StateCheckers.Contains(checker)) + { + target.StateCheckers.Add(checker); + } + } + } +} diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/SettingDynamicDefinitionManager.cs b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/SettingDynamicDefinitionManager.cs new file mode 100644 index 000000000..833f90f99 --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/SettingDynamicDefinitionManager.cs @@ -0,0 +1,82 @@ +using Microsoft.Extensions.Options; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Settings; + +namespace LINGYUN.Abp.Dynamic.Definitions; + +[Dependency(ReplaceServices = true)] +[ExposeServices( + typeof(ISettingDefinitionManager), + typeof(SettingDynamicDefinitionManager))] +public class SettingDynamicDefinitionManager : + DynamicDefinitionManager, + ISettingDefinitionManager, + ISingletonDependency +{ + protected IStaticSettingDefinitionStore StaticStore { get; } + protected IDynamicSettingDefinitionStore DynamicStore { get; } + public SettingDynamicDefinitionManager( + IStaticSettingDefinitionStore staticStore, + IDynamicSettingDefinitionStore dynamicStore, + IOptions options) : base(options) + { + StaticStore = staticStore; + DynamicStore = dynamicStore; + } + + public async virtual Task> GetAllAsync() + { + var staticDefinitions = await StaticStore.GetAllAsync(); + var dynamicDefinitions = await DynamicStore.GetAllAsync(); + + return await GetDefinitionsAsync(staticDefinitions, dynamicDefinitions); + } + + public async virtual Task GetAsync(string name) + { + return await GetOrNullAsync(name) ?? throw new AbpException("Undefined setting: " + name); + } + + public async virtual Task GetOrNullAsync(string name) + { + Check.NotNull(name, nameof(name)); + + var staticDefinition = await StaticStore.GetOrNullAsync(name); + var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); + + return await GetDefinitionAsync(staticDefinition, dynamicDefinition); + } + + protected override string GetDefinitionKey(SettingDefinition definition) + { + return definition.Name; + } + + protected override Task MergeDefinitionAsync(SettingDefinition targetDefinition, SettingDefinition sourceDefinition) + { + targetDefinition.DisplayName = sourceDefinition.DisplayName; + targetDefinition.Description = sourceDefinition.Description ?? targetDefinition.Description; + targetDefinition.DefaultValue = sourceDefinition.DefaultValue ?? targetDefinition.DefaultValue; + targetDefinition.IsVisibleToClients = targetDefinition.IsVisibleToClients || sourceDefinition.IsVisibleToClients; + targetDefinition.IsInherited = targetDefinition.IsInherited || sourceDefinition.IsInherited; + targetDefinition.IsEncrypted = targetDefinition.IsEncrypted || sourceDefinition.IsEncrypted; + + foreach (var property in sourceDefinition.Properties) + { + targetDefinition.Properties[property.Key] = property.Value; + } + + foreach (var provider in sourceDefinition.Providers) + { + if (!targetDefinition.Providers.Contains(provider)) + { + targetDefinition.Providers.Add(provider); + } + } + + return Task.FromResult(targetDefinition); + } +} diff --git a/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/TemplateDynamicDefinitionManager.cs b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/TemplateDynamicDefinitionManager.cs new file mode 100644 index 000000000..e489cb542 --- /dev/null +++ b/aspnet-core/framework/dynamic-definition/LINGYUN.Abp.Dynamic.Definitions/LINGYUN/Abp/Dynamic/Definitions/TemplateDynamicDefinitionManager.cs @@ -0,0 +1,99 @@ +using Microsoft.Extensions.Options; +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp; +using Volo.Abp.DependencyInjection; +using Volo.Abp.TextTemplating; + +namespace LINGYUN.Abp.Dynamic.Definitions; + +[Dependency(ReplaceServices = true)] +[ExposeServices( + typeof(ITemplateDefinitionManager), + typeof(TemplateDynamicDefinitionManager))] +public class TemplateDynamicDefinitionManager : + DynamicDefinitionManager, + ITemplateDefinitionManager, + ISingletonDependency +{ + protected IStaticTemplateDefinitionStore StaticStore { get; } + protected IDynamicTemplateDefinitionStore DynamicStore { get; } + + public TemplateDynamicDefinitionManager( + IStaticTemplateDefinitionStore staticStore, + IDynamicTemplateDefinitionStore dynamicStore, + IOptions options) : base(options) + { + StaticStore = staticStore; + DynamicStore = dynamicStore; + } + + public async virtual Task> GetAllAsync() + { + var staticDefinitions = await StaticStore.GetAllAsync(); + var dynamicDefinitions = await DynamicStore.GetAllAsync(); + + return await GetDefinitionsAsync(staticDefinitions, dynamicDefinitions); + } + + public async virtual Task GetAsync(string name) + { + return await GetOrNullAsync(name) ?? throw new AbpException("Undefined Template: " + name); + } + + public async virtual Task GetOrNullAsync(string name) + { + Check.NotNull(name, nameof(name)); + + var staticDefinition = await StaticStore.GetOrNullAsync(name); + var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); + + return await GetDefinitionAsync(staticDefinition, dynamicDefinition); + } + + protected override string GetDefinitionKey(TemplateDefinition definition) + { + return definition.Name; + } + + protected override Task MergeDefinitionAsync(TemplateDefinition targetDefinition, TemplateDefinition sourceDefinition) + { + var localizationResourceName = sourceDefinition.LocalizationResourceName ?? targetDefinition.LocalizationResourceName; + var defaultCultureName = sourceDefinition.DefaultCultureName ?? targetDefinition.DefaultCultureName; + var displayName = sourceDefinition.DisplayName ?? targetDefinition.DisplayName; + var isLayout = sourceDefinition.IsLayout || targetDefinition.IsLayout; + var layout = sourceDefinition.Layout ?? targetDefinition.Layout; + + var mergedTemplate = new TemplateDefinition( + targetDefinition.Name, + localizationResourceName, + displayName, + isLayout, + layout, + defaultCultureName + ); + + foreach (var property in targetDefinition.Properties) + { + mergedTemplate.Properties[property.Key] = property.Value; + } + + foreach (var property in sourceDefinition.Properties) + { + mergedTemplate.Properties[property.Key] = property.Value; + } + + if (!string.IsNullOrEmpty(sourceDefinition.RenderEngine)) + { + mergedTemplate.RenderEngine = sourceDefinition.RenderEngine; + } + else if (!string.IsNullOrEmpty(targetDefinition.RenderEngine)) + { + mergedTemplate.RenderEngine = targetDefinition.RenderEngine; + } + + mergedTemplate.IsInlineLocalized = sourceDefinition.IsInlineLocalized || targetDefinition.IsInlineLocalized; + + return Task.FromResult(mergedTemplate); + } +} From 290e3f36c8a29fd567dd71e16c37eba374458b28 Mon Sep 17 00:00:00 2001 From: colin Date: Wed, 26 Aug 2026 09:19:05 +0800 Subject: [PATCH 03/10] feat: Remove duplicate xxxDefinitionManager rewrites --- aspnet-core/LINGYUN.MicroService.All.slnx | 4 + aspnet-core/LINGYUN.MicroService.Aspire.slnx | 4 + .../LINGYUN.MicroService.SingleProject.slnx | 4 + .../AIServiceModule.cs | 2 + .../LINGYUN.Abp.MicroService.AIService.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../AdminServiceModule.cs | 2 + ...NGYUN.Abp.MicroService.AdminService.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../AuthServerModule.cs | 2 + ...LINGYUN.Abp.MicroService.AuthServer.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../IdentityServiceModule.cs | 2 + ...UN.Abp.MicroService.IdentityService.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- ...bp.MicroService.LocalizationService.csproj | 1 + .../LocalizationServiceModule.cs | 2 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- ...YUN.Abp.MicroService.MessageService.csproj | 1 + .../MessageServiceModule.cs | 2 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- ...UN.Abp.MicroService.PlatformService.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../PlatformServiceModule.cs | 2 + ...INGYUN.Abp.MicroService.TaskService.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../TaskServiceModule.cs | 2 + ...GYUN.Abp.MicroService.WeChatService.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../WeChatServiceModule.cs | 2 + ...YUN.Abp.MicroService.WebhookService.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../WebhookServiceModule.cs | 2 + ...UN.Abp.MicroService.WorkflowService.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../WorkflowServiceModule.cs | 2 + ...LY.MicroService.Applications.Single.csproj | 1 + .../MicroServiceApplicationsSingleModule.cs | 2 + .../MergeFeatureDefinitionManager.cs | 274 ----------------- .../MergePermissionDefinitionManager.cs | 272 ----------------- .../MergeSettingDefinitionManager.cs | 84 ------ .../MergeTemplateDefinitionManager.cs | 102 ------- .../AuthServerHttpApiHostModule.cs | 2 + ...icroService.AuthServer.HttpApi.Host.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../AuthServerModule.cs | 3 +- .../LY.MicroService.AuthServer.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../BackendAdminHttpApiHostModule.cs | 2 + ...roService.BackendAdmin.HttpApi.Host.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- ...LocalizationManagement.HttpApi.Host.csproj | 1 + ...LocalizationManagementHttpApiHostModule.cs | 2 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- ...ice.PlatformManagement.HttpApi.Host.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../PlatformManagementHttpApiHostModule.cs | 2 + ...ervice.RealtimeMessage.HttpApi.Host.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../RealtimeMessageHttpApiHostModule.cs | 2 + ...Service.TaskManagement.HttpApi.Host.csproj | 12 +- .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../TaskManagementHttpApiHostModule.cs | 2 + ...ice.WebhooksManagement.HttpApi.Host.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../WebhooksManagementHttpApiHostModule.cs | 2 + ...rvice.WechatManagement.HttpApi.Host.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../WechatManagementHttpApiHostModule.cs | 2 + ...ice.WorkflowManagement.HttpApi.Host.csproj | 1 + .../MergeFeatureDefinitionManager.cs | 277 ------------------ .../MergePermissionDefinitionManager.cs | 276 ----------------- .../MergeSettingDefinitionManager.cs | 86 ------ .../MergeTemplateDefinitionManager.cs | 104 ------- .../WorkflowManagementHttpApiHostModule.cs | 2 + 135 files changed, 85 insertions(+), 16340 deletions(-) delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs delete mode 100644 aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs diff --git a/aspnet-core/LINGYUN.MicroService.All.slnx b/aspnet-core/LINGYUN.MicroService.All.slnx index 88ae80f90..ba443cdec 100644 --- a/aspnet-core/LINGYUN.MicroService.All.slnx +++ b/aspnet-core/LINGYUN.MicroService.All.slnx @@ -146,6 +146,10 @@ + + + + diff --git a/aspnet-core/LINGYUN.MicroService.Aspire.slnx b/aspnet-core/LINGYUN.MicroService.Aspire.slnx index f49cd2dd6..b00ca5382 100644 --- a/aspnet-core/LINGYUN.MicroService.Aspire.slnx +++ b/aspnet-core/LINGYUN.MicroService.Aspire.slnx @@ -129,6 +129,10 @@ + + + + diff --git a/aspnet-core/LINGYUN.MicroService.SingleProject.slnx b/aspnet-core/LINGYUN.MicroService.SingleProject.slnx index 68b68b630..f06a24209 100644 --- a/aspnet-core/LINGYUN.MicroService.SingleProject.slnx +++ b/aspnet-core/LINGYUN.MicroService.SingleProject.slnx @@ -48,6 +48,10 @@ + + + + diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/AIServiceModule.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/AIServiceModule.cs index 22b489085..f79ca31ac 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/AIServiceModule.cs +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/AIServiceModule.cs @@ -8,6 +8,7 @@ using LINGYUN.Abp.AspNetCore.Mvc.Wrapper; using LINGYUN.Abp.AuditLogging.Elasticsearch; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling.Emailing; @@ -67,6 +68,7 @@ namespace LINGYUN.Abp.MicroService.AIService; typeof(AbpLocalizationCultureMapModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpClaimsMappingModule), typeof(AbpSwashbuckleModule), typeof(AbpAutofacModule) diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/LINGYUN.Abp.MicroService.AIService.csproj b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/LINGYUN.Abp.MicroService.AIService.csproj index 32f03e030..30335f0d9 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/LINGYUN.Abp.MicroService.AIService.csproj +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/LINGYUN.Abp.MicroService.AIService.csproj @@ -45,6 +45,7 @@ + diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AIService/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/AdminServiceModule.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/AdminServiceModule.cs index e3a4d08aa..f2b32418c 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/AdminServiceModule.cs +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/AdminServiceModule.cs @@ -9,6 +9,7 @@ using LINGYUN.Abp.CachingManagement.StackExchangeRedis; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Data.DbMigrator; using LINGYUN.Abp.DataProtectionManagement; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling.Emailing; @@ -98,6 +99,7 @@ namespace LINGYUN.Abp.MicroService.AdminService; typeof(AbpLocalizationCultureMapModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpClaimsMappingModule), typeof(AbpSwashbuckleModule), typeof(AbpAutofacModule) diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/LINGYUN.Abp.MicroService.AdminService.csproj b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/LINGYUN.Abp.MicroService.AdminService.csproj index 821e59f73..d70d63fba 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/LINGYUN.Abp.MicroService.AdminService.csproj +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/LINGYUN.Abp.MicroService.AdminService.csproj @@ -46,6 +46,7 @@ + diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AdminService/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/AuthServerModule.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/AuthServerModule.cs index f91aea66c..99e2cf8c0 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/AuthServerModule.cs +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/AuthServerModule.cs @@ -7,6 +7,7 @@ using LINGYUN.Abp.AspNetCore.Mvc.Wrapper; using LINGYUN.Abp.AuditLogging.Elasticsearch; using LINGYUN.Abp.BlobStoring.BlobManagement; using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.Exporter.MiniSoftware; @@ -74,6 +75,7 @@ namespace LINGYUN.Abp.MicroService.AuthServer; typeof(AbpAspNetCoreMultiTenancyModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpHttpClientIdentityModelWebModule), typeof(AbpExporterMiniSoftwareModule), typeof(AbpEmailingPlatformModule), diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/LINGYUN.Abp.MicroService.AuthServer.csproj b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/LINGYUN.Abp.MicroService.AuthServer.csproj index e6fa3dfda..874fd1b04 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/LINGYUN.Abp.MicroService.AuthServer.csproj +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/LINGYUN.Abp.MicroService.AuthServer.csproj @@ -42,6 +42,7 @@ + diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.AuthServer/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/IdentityServiceModule.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/IdentityServiceModule.cs index 697976eac..d26bce271 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/IdentityServiceModule.cs +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/IdentityServiceModule.cs @@ -5,6 +5,7 @@ using LINGYUN.Abp.AuditLogging.Elasticsearch; using LINGYUN.Abp.Authorization.OrganizationUnits; using LINGYUN.Abp.BlobStoring.BlobManagement; using LINGYUN.Abp.Claims.Mapping; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling.Emailing; @@ -81,6 +82,7 @@ namespace LINGYUN.Abp.MicroService.IdentityService; typeof(AbpIdentitySessionAspNetCoreModule), typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpAspNetCoreMvcWrapperModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpExporterMiniSoftwareModule), typeof(AbpClaimsMappingModule), typeof(AbpSwashbuckleModule), diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/LINGYUN.Abp.MicroService.IdentityService.csproj b/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/LINGYUN.Abp.MicroService.IdentityService.csproj index 2e4b4dd64..3e48b7a45 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/LINGYUN.Abp.MicroService.IdentityService.csproj +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/LINGYUN.Abp.MicroService.IdentityService.csproj @@ -48,6 +48,7 @@ + diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.IdentityService/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/LINGYUN.Abp.MicroService.LocalizationService.csproj b/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/LINGYUN.Abp.MicroService.LocalizationService.csproj index 47841785d..4e9db5189 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/LINGYUN.Abp.MicroService.LocalizationService.csproj +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/LINGYUN.Abp.MicroService.LocalizationService.csproj @@ -42,6 +42,7 @@ + diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/LocalizationServiceModule.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/LocalizationServiceModule.cs index 57775d94d..9c281e19c 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/LocalizationServiceModule.cs +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/LocalizationServiceModule.cs @@ -4,6 +4,7 @@ using LINGYUN.Abp.AuditLogging.Elasticsearch; using LINGYUN.Abp.Authorization.OrganizationUnits; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.Identity.Session.AspNetCore; @@ -57,6 +58,7 @@ namespace LINGYUN.Abp.MicroService.LocalizationService; typeof(AbpEmailingPlatformModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpClaimsMappingModule), typeof(AbpSwashbuckleModule), typeof(AbpAutofacModule) diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.LocalizationService/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/LINGYUN.Abp.MicroService.MessageService.csproj b/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/LINGYUN.Abp.MicroService.MessageService.csproj index 278615940..a60e6da90 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/LINGYUN.Abp.MicroService.MessageService.csproj +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/LINGYUN.Abp.MicroService.MessageService.csproj @@ -45,6 +45,7 @@ + diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/MessageServiceModule.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/MessageServiceModule.cs index 553806c7f..7c22d3376 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/MessageServiceModule.cs +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/MessageServiceModule.cs @@ -6,6 +6,7 @@ using LINGYUN.Abp.BackgroundTasks.DistributedLocking; using LINGYUN.Abp.BackgroundTasks.Quartz; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling.Notifications; @@ -118,6 +119,7 @@ namespace LINGYUN.Abp.MicroService.MessageService; typeof(AbpClaimsMappingModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpSwashbuckleModule), typeof(AbpAutofacModule) )] diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.MessageService/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/LINGYUN.Abp.MicroService.PlatformService.csproj b/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/LINGYUN.Abp.MicroService.PlatformService.csproj index 534783bde..4519d7e06 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/LINGYUN.Abp.MicroService.PlatformService.csproj +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/LINGYUN.Abp.MicroService.PlatformService.csproj @@ -49,6 +49,7 @@ + diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/PlatformServiceModule.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/PlatformServiceModule.cs index 8cfdadd60..549c19f9b 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/PlatformServiceModule.cs +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.PlatformService/PlatformServiceModule.cs @@ -11,6 +11,7 @@ using LINGYUN.Abp.BlobManagement.Tencent; using LINGYUN.Abp.BlobStoring.BlobManagement; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.Features.LimitValidation.Redis; @@ -95,6 +96,7 @@ namespace LINGYUN.Abp.MicroService.PlatformService; typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpClaimsMappingModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpSwashbuckleModule), typeof(AbpAutofacModule) )] diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/LINGYUN.Abp.MicroService.TaskService.csproj b/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/LINGYUN.Abp.MicroService.TaskService.csproj index 9cf70539f..4d8cf5679 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/LINGYUN.Abp.MicroService.TaskService.csproj +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/LINGYUN.Abp.MicroService.TaskService.csproj @@ -45,6 +45,7 @@ + diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/TaskServiceModule.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/TaskServiceModule.cs index c9ce2e0ff..63d2a79fd 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/TaskServiceModule.cs +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.TaskService/TaskServiceModule.cs @@ -9,6 +9,7 @@ using LINGYUN.Abp.BackgroundTasks.Quartz; using LINGYUN.Abp.BlobStoring.BlobManagement; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Elasticsearch.Jobs; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EventBus.CAP; @@ -83,6 +84,7 @@ namespace LINGYUN.Abp.MicroService.TaskService; typeof(AbpLocalizationCultureMapModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpClaimsMappingModule), typeof(AbpCAPEventBusModule), typeof(AbpAutofacModule) diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/LINGYUN.Abp.MicroService.WeChatService.csproj b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/LINGYUN.Abp.MicroService.WeChatService.csproj index 67df88e96..dd35cd959 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/LINGYUN.Abp.MicroService.WeChatService.csproj +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/LINGYUN.Abp.MicroService.WeChatService.csproj @@ -46,6 +46,7 @@ + diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/WeChatServiceModule.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/WeChatServiceModule.cs index 172e0fa57..2f07ff509 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/WeChatServiceModule.cs +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WeChatService/WeChatServiceModule.cs @@ -3,6 +3,7 @@ using LINGYUN.Abp.AspNetCore.Mvc.Wrapper; using LINGYUN.Abp.AuditLogging.Elasticsearch; using LINGYUN.Abp.Authorization.OrganizationUnits; using LINGYUN.Abp.Claims.Mapping; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.Http.Client.Wrapper; @@ -79,6 +80,7 @@ namespace LINGYUN.Abp.MicroService.WeChatService; typeof(AbpClaimsMappingModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpIdentitySessionAspNetCoreModule), typeof(AbpAutofacModule) )] diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/LINGYUN.Abp.MicroService.WebhookService.csproj b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/LINGYUN.Abp.MicroService.WebhookService.csproj index b7c147c12..954443798 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/LINGYUN.Abp.MicroService.WebhookService.csproj +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/LINGYUN.Abp.MicroService.WebhookService.csproj @@ -41,6 +41,7 @@ + diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/WebhookServiceModule.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/WebhookServiceModule.cs index 581a35fae..eaeb56588 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/WebhookServiceModule.cs +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WebhookService/WebhookServiceModule.cs @@ -6,6 +6,7 @@ using LINGYUN.Abp.BackgroundTasks.DistributedLocking; using LINGYUN.Abp.BackgroundTasks.Quartz; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Dapr.Client.Wrapper; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling.Emailing; @@ -62,6 +63,7 @@ namespace LINGYUN.Abp.MicroService.WebhookService; typeof(AbpSmsPlatformModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpIdentitySessionAspNetCoreModule), typeof(AbpAutofacModule) )] diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/LINGYUN.Abp.MicroService.WorkflowService.csproj b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/LINGYUN.Abp.MicroService.WorkflowService.csproj index 6a8af9143..df5920d1a 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/LINGYUN.Abp.MicroService.WorkflowService.csproj +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/LINGYUN.Abp.MicroService.WorkflowService.csproj @@ -52,6 +52,7 @@ + diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/WorkflowServiceModule.cs b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/WorkflowServiceModule.cs index 830665db6..dc23b98f5 100644 --- a/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/WorkflowServiceModule.cs +++ b/aspnet-core/aspire/LINGYUN.Abp.MicroService.WorkflowService/WorkflowServiceModule.cs @@ -7,6 +7,7 @@ using LINGYUN.Abp.BackgroundTasks.Quartz; using LINGYUN.Abp.BlobStoring.BlobManagement; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Elsa; using LINGYUN.Abp.Elsa.Activities; using LINGYUN.Abp.Elsa.EntityFrameworkCore.PostgreSql; @@ -84,6 +85,7 @@ namespace LINGYUN.Abp.MicroService.WorkflowService; typeof(AbpClaimsMappingModule), typeof(AbpAspNetCoreMvcNewtonsoftModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpIdentitySessionAspNetCoreModule), typeof(AbpAutofacModule) )] diff --git a/aspnet-core/services/LY.MicroService.Applications.Single/LY.MicroService.Applications.Single.csproj b/aspnet-core/services/LY.MicroService.Applications.Single/LY.MicroService.Applications.Single.csproj index 41a8398ab..d8162eedb 100644 --- a/aspnet-core/services/LY.MicroService.Applications.Single/LY.MicroService.Applications.Single.csproj +++ b/aspnet-core/services/LY.MicroService.Applications.Single/LY.MicroService.Applications.Single.csproj @@ -88,6 +88,7 @@ + diff --git a/aspnet-core/services/LY.MicroService.Applications.Single/MicroServiceApplicationsSingleModule.cs b/aspnet-core/services/LY.MicroService.Applications.Single/MicroServiceApplicationsSingleModule.cs index 98f7a4524..f4d6e2e0d 100644 --- a/aspnet-core/services/LY.MicroService.Applications.Single/MicroServiceApplicationsSingleModule.cs +++ b/aspnet-core/services/LY.MicroService.Applications.Single/MicroServiceApplicationsSingleModule.cs @@ -1,4 +1,5 @@ using LINGYUN.Abp.BlobManagement.MimeCheck; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Identity.AspNetCore; using LINGYUN.Abp.Identity.Jobs; using LINGYUN.Abp.Logging.Serilog.Elasticsearch; @@ -408,6 +409,7 @@ namespace LY.MicroService.Applications.Single; typeof(AbpAspNetCoreHttpOverridesModule), typeof(AbpHttpClientIdentityModelWebModule), typeof(AbpAspNetCoreMvcUiMultiTenancyModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpSwashbuckleModule), typeof(AbpMailKitModule), typeof(AbpAutofacModule), diff --git a/aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 276ca1889..000000000 --- a/aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,274 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Immutable; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 007bbe01f..000000000 --- a/aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,272 +0,0 @@ -using System.Collections.Immutable; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index f4269d56e..000000000 --- a/aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System.Collections.Immutable; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 03a2c2f0d..000000000 --- a/aspnet-core/services/LY.MicroService.Applications.Single/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System.Collections.Immutable; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/AuthServerHttpApiHostModule.cs b/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/AuthServerHttpApiHostModule.cs index 7162da4ef..784ca039b 100644 --- a/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/AuthServerHttpApiHostModule.cs +++ b/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/AuthServerHttpApiHostModule.cs @@ -5,6 +5,7 @@ using LINGYUN.Abp.AuditLogging.Elasticsearch; using LINGYUN.Abp.Authorization.OrganizationUnits; using LINGYUN.Abp.BlobStoring.BlobManagement; using LINGYUN.Abp.Claims.Mapping; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EntityFrameworkCore.MySQL; using LINGYUN.Abp.EventBus.CAP; @@ -81,6 +82,7 @@ namespace LY.MicroService.AuthServer; typeof(AbpHttpClientIdentityModelWebModule), typeof(AbpIdentitySessionAspNetCoreModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpTelemetryOpenTelemetryModule), typeof(AbpTelemetrySkyWalkingModule), diff --git a/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/LY.MicroService.AuthServer.HttpApi.Host.csproj b/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/LY.MicroService.AuthServer.HttpApi.Host.csproj index b1841e797..6288562b5 100644 --- a/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/LY.MicroService.AuthServer.HttpApi.Host.csproj +++ b/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/LY.MicroService.AuthServer.HttpApi.Host.csproj @@ -48,6 +48,7 @@ + diff --git a/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/services/LY.MicroService.AuthServer.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/services/LY.MicroService.AuthServer/AuthServerModule.cs b/aspnet-core/services/LY.MicroService.AuthServer/AuthServerModule.cs index b0eb45961..0f6e35750 100644 --- a/aspnet-core/services/LY.MicroService.AuthServer/AuthServerModule.cs +++ b/aspnet-core/services/LY.MicroService.AuthServer/AuthServerModule.cs @@ -7,6 +7,7 @@ using LINGYUN.Abp.AspNetCore.Mvc.Wrapper; using LINGYUN.Abp.AuditLogging.Elasticsearch; using LINGYUN.Abp.BlobStoring.BlobManagement; using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.Exporter.MiniSoftware; @@ -28,7 +29,6 @@ using LINGYUN.Abp.Serilog.Enrichers.UniqueId; using LINGYUN.Abp.Sms.Platform; using LINGYUN.Abp.Telemetry.OpenTelemetry; using LINGYUN.Abp.Telemetry.SkyWalking; -using LINGYUN.Platform.EntityFrameworkCore; using LY.MicroService.AuthServer.EntityFrameworkCore; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -78,6 +78,7 @@ namespace LY.MicroService.AuthServer; typeof(AbpAspNetCoreMultiTenancyModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpHttpClientIdentityModelWebModule), typeof(AbpTelemetryOpenTelemetryModule), typeof(AbpTelemetrySkyWalkingModule), diff --git a/aspnet-core/services/LY.MicroService.AuthServer/LY.MicroService.AuthServer.csproj b/aspnet-core/services/LY.MicroService.AuthServer/LY.MicroService.AuthServer.csproj index f3b2708a7..8fe2eca9a 100644 --- a/aspnet-core/services/LY.MicroService.AuthServer/LY.MicroService.AuthServer.csproj +++ b/aspnet-core/services/LY.MicroService.AuthServer/LY.MicroService.AuthServer.csproj @@ -47,6 +47,7 @@ + diff --git a/aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/services/LY.MicroService.AuthServer/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/BackendAdminHttpApiHostModule.cs b/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/BackendAdminHttpApiHostModule.cs index 0082e1eea..9788fc44a 100644 --- a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/BackendAdminHttpApiHostModule.cs +++ b/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/BackendAdminHttpApiHostModule.cs @@ -9,6 +9,7 @@ using LINGYUN.Abp.CachingManagement.StackExchangeRedis; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Data.DbMigrator; using LINGYUN.Abp.DataProtectionManagement; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling.Emailing; @@ -123,6 +124,7 @@ namespace LY.MicroService.BackendAdmin; typeof(AbpLocalizationCultureMapModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpClaimsMappingModule), typeof(AbpSwashbuckleModule), typeof(AbpAutofacModule) diff --git a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/LY.MicroService.BackendAdmin.HttpApi.Host.csproj b/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/LY.MicroService.BackendAdmin.HttpApi.Host.csproj index 4d2d1ef5b..43847c52d 100644 --- a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/LY.MicroService.BackendAdmin.HttpApi.Host.csproj +++ b/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/LY.MicroService.BackendAdmin.HttpApi.Host.csproj @@ -52,6 +52,7 @@ + diff --git a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/services/LY.MicroService.BackendAdmin.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LY.MicroService.LocalizationManagement.HttpApi.Host.csproj b/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LY.MicroService.LocalizationManagement.HttpApi.Host.csproj index d2d221c06..0ee5c1e64 100644 --- a/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LY.MicroService.LocalizationManagement.HttpApi.Host.csproj +++ b/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LY.MicroService.LocalizationManagement.HttpApi.Host.csproj @@ -43,6 +43,7 @@ + diff --git a/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LocalizationManagementHttpApiHostModule.cs b/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LocalizationManagementHttpApiHostModule.cs index 42a571c24..c6a713e39 100644 --- a/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LocalizationManagementHttpApiHostModule.cs +++ b/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/LocalizationManagementHttpApiHostModule.cs @@ -4,6 +4,7 @@ using LINGYUN.Abp.AuditLogging.Elasticsearch; using LINGYUN.Abp.Authorization.OrganizationUnits; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling.Emailing; @@ -65,6 +66,7 @@ namespace LY.MicroService.LocalizationManagement; typeof(AbpEmailingPlatformModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpClaimsMappingModule), typeof(AbpSwashbuckleModule), typeof(AbpAutofacModule) diff --git a/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/services/LY.MicroService.LocalizationManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/LY.MicroService.PlatformManagement.HttpApi.Host.csproj b/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/LY.MicroService.PlatformManagement.HttpApi.Host.csproj index 37afc9c3c..91f1f2bf3 100644 --- a/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/LY.MicroService.PlatformManagement.HttpApi.Host.csproj +++ b/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/LY.MicroService.PlatformManagement.HttpApi.Host.csproj @@ -50,6 +50,7 @@ + diff --git a/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/PlatformManagementHttpApiHostModule.cs b/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/PlatformManagementHttpApiHostModule.cs index bc94f3a97..6f168a4f9 100644 --- a/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/PlatformManagementHttpApiHostModule.cs +++ b/aspnet-core/services/LY.MicroService.PlatformManagement.HttpApi.Host/PlatformManagementHttpApiHostModule.cs @@ -12,6 +12,7 @@ using LINGYUN.Abp.BlobManagement.Tencent; using LINGYUN.Abp.BlobStoring.BlobManagement; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling.Emailing; using LINGYUN.Abp.Features.LimitValidation.Redis; @@ -110,6 +111,7 @@ namespace LY.MicroService.PlatformManagement; typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpClaimsMappingModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpSwashbuckleModule), typeof(AbpAutofacModule) )] diff --git a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/LY.MicroService.RealtimeMessage.HttpApi.Host.csproj b/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/LY.MicroService.RealtimeMessage.HttpApi.Host.csproj index 81e194097..26d2502c3 100644 --- a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/LY.MicroService.RealtimeMessage.HttpApi.Host.csproj +++ b/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/LY.MicroService.RealtimeMessage.HttpApi.Host.csproj @@ -50,6 +50,7 @@ + diff --git a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.cs b/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.cs index 13cee7f30..c1deb04c3 100644 --- a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.cs +++ b/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.cs @@ -6,6 +6,7 @@ using LINGYUN.Abp.BackgroundTasks.DistributedLocking; using LINGYUN.Abp.BackgroundTasks.Quartz; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling.Notifications; @@ -125,6 +126,7 @@ namespace LY.MicroService.RealtimeMessage; typeof(AbpTelemetrySkyWalkingModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpSwashbuckleModule), typeof(AbpAutofacModule) )] diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/LY.MicroService.TaskManagement.HttpApi.Host.csproj b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/LY.MicroService.TaskManagement.HttpApi.Host.csproj index 13cafbe15..0a7da1a61 100644 --- a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/LY.MicroService.TaskManagement.HttpApi.Host.csproj +++ b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/LY.MicroService.TaskManagement.HttpApi.Host.csproj @@ -7,6 +7,13 @@ LY.MicroService.TaskManagement + + + + + + + @@ -44,6 +51,7 @@ + @@ -77,8 +85,4 @@ - - - - diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.cs index 42b73945b..58f216176 100644 --- a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.cs +++ b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.cs @@ -9,6 +9,7 @@ using LINGYUN.Abp.BackgroundTasks.Quartz; using LINGYUN.Abp.BlobManagement; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Elasticsearch.Jobs; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EventBus.CAP; @@ -88,6 +89,7 @@ namespace LY.MicroService.TaskManagement; typeof(AbpLocalizationCultureMapModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpTelemetryOpenTelemetryModule), typeof(AbpTelemetrySkyWalkingModule), typeof(AbpClaimsMappingModule), diff --git a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/LY.MicroService.WebhooksManagement.HttpApi.Host.csproj b/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/LY.MicroService.WebhooksManagement.HttpApi.Host.csproj index e5babebad..c013775fe 100644 --- a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/LY.MicroService.WebhooksManagement.HttpApi.Host.csproj +++ b/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/LY.MicroService.WebhooksManagement.HttpApi.Host.csproj @@ -43,6 +43,7 @@ + diff --git a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/WebhooksManagementHttpApiHostModule.cs b/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/WebhooksManagementHttpApiHostModule.cs index c650f4247..c129bce1a 100644 --- a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/WebhooksManagementHttpApiHostModule.cs +++ b/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/WebhooksManagementHttpApiHostModule.cs @@ -6,6 +6,7 @@ using LINGYUN.Abp.BackgroundTasks.DistributedLocking; using LINGYUN.Abp.BackgroundTasks.Quartz; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Dapr.Client.Wrapper; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Emailing.Platform; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling.Emailing; @@ -85,6 +86,7 @@ namespace LY.MicroService.WebhooksManagement; typeof(AbpTelemetrySkyWalkingModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpIdentitySessionAspNetCoreModule), typeof(AbpAutofacModule) )] diff --git a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/LY.MicroService.WechatManagement.HttpApi.Host.csproj b/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/LY.MicroService.WechatManagement.HttpApi.Host.csproj index 7e506c867..9600daaa7 100644 --- a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/LY.MicroService.WechatManagement.HttpApi.Host.csproj +++ b/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/LY.MicroService.WechatManagement.HttpApi.Host.csproj @@ -44,6 +44,7 @@ + diff --git a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/WechatManagementHttpApiHostModule.cs b/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/WechatManagementHttpApiHostModule.cs index 488c26fd9..695de72fe 100644 --- a/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/WechatManagementHttpApiHostModule.cs +++ b/aspnet-core/services/LY.MicroService.WechatManagement.HttpApi.Host/WechatManagementHttpApiHostModule.cs @@ -3,6 +3,7 @@ using LINGYUN.Abp.AspNetCore.Mvc.Wrapper; using LINGYUN.Abp.AuditLogging.Elasticsearch; using LINGYUN.Abp.Authorization.OrganizationUnits; using LINGYUN.Abp.Claims.Mapping; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.EntityFrameworkCore.MySQL; using LINGYUN.Abp.EventBus.CAP; using LINGYUN.Abp.ExceptionHandling.Emailing; @@ -83,6 +84,7 @@ namespace LY.MicroService.WechatManagement; typeof(AbpTelemetrySkyWalkingModule), typeof(AbpAspNetCoreMvcWrapperModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpIdentitySessionAspNetCoreModule), typeof(AbpAutofacModule) )] diff --git a/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/LY.MicroService.WorkflowManagement.HttpApi.Host.csproj b/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/LY.MicroService.WorkflowManagement.HttpApi.Host.csproj index 49d3ab7ca..1d9180042 100644 --- a/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/LY.MicroService.WorkflowManagement.HttpApi.Host.csproj +++ b/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/LY.MicroService.WorkflowManagement.HttpApi.Host.csproj @@ -53,6 +53,7 @@ + diff --git a/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs b/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs deleted file mode 100644 index 498ac24fe..000000000 --- a/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergeFeatureDefinitionManager.cs +++ /dev/null @@ -1,277 +0,0 @@ -using JetBrains.Annotations; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Features; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeFeatureDefinitionManager : FeatureDefinitionManager -{ - public MergeFeatureDefinitionManager( - IStaticFeatureDefinitionStore staticStore, - IDynamicFeatureDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeFeatureMetadata(staticDefinition, dynamicDefinition); - - foreach (var child in dynamicDefinition.Children) - { - MergeChildFeature(staticDefinition, child); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticFeatures = await StaticStore.GetFeaturesAsync(); - var dynamicFeatures = await DynamicStore.GetFeaturesAsync(); - - var mergedFeatures = new Dictionary(); - - foreach (var staticFeature in staticFeatures) - { - mergedFeatures[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicFeature in dynamicFeatures) - { - if (mergedFeatures.TryGetValue(dynamicFeature.Name, out var existingFeature)) - { - MergeFeatureMetadata(existingFeature, dynamicFeature); - - foreach (var child in dynamicFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - else - { - mergedFeatures[dynamicFeature.Name] = dynamicFeature; - } - } - - return mergedFeatures.Values.ToImmutableList(); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await StaticStore.GetGroupsAsync(); - var dynamicGroups = await DynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupFeatures(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupFeatures(FeatureGroupDefinition target, FeatureGroupDefinition source) - { - foreach (var sourceFeature in source.Features) - { - var existingFeature = GetFeatureOrNull(target, sourceFeature.Name); - - if (existingFeature == null) - { - var newFeature = target.AddFeature( - sourceFeature.Name, - sourceFeature.DefaultValue, - sourceFeature.DisplayName, - sourceFeature.Description, - sourceFeature.ValueType, - sourceFeature.IsVisibleToClients, - sourceFeature.IsAvailableToHost - ); - - CopyFeatureDetails(sourceFeature, newFeature); - - foreach (var child in sourceFeature.Children) - { - AddChildFeatureRecursively(newFeature, child); - } - } - else - { - MergeFeatureMetadata(existingFeature, sourceFeature); - - foreach (var child in sourceFeature.Children) - { - MergeChildFeature(existingFeature, child); - } - } - } - } - - private static void AddChildFeatureRecursively(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - - private static void MergeChildFeature(FeatureDefinition parent, FeatureDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.CreateChild( - sourceChild.Name, - sourceChild.DefaultValue, - sourceChild.DisplayName, - sourceChild.Description, - sourceChild.ValueType, - sourceChild.IsVisibleToClients, - sourceChild.IsAvailableToHost - ); - CopyFeatureDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildFeatureRecursively(newChild, grandchild); - } - } - else - { - MergeFeatureMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildFeature(existingChild, grandchild); - } - } - } - - private static void CopyFeatureDetails(FeatureDefinition source, FeatureDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - } - - private static void MergeFeatureMetadata(FeatureDefinition target, FeatureDefinition source) - { - if (source.DisplayName != null) - { - target.DisplayName = source.DisplayName; - } - - if (source.Description != null) - { - target.Description = source.Description; - } - - if (source.DefaultValue != null) - { - target.DefaultValue = source.DefaultValue; - } - - if (source.ValueType != null) - { - target.ValueType = source.ValueType; - } - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.AllowedProviders) - { - if (!target.AllowedProviders.Contains(provider)) - { - target.AllowedProviders.Add(provider); - } - } - - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsAvailableToHost = target.IsAvailableToHost || source.IsAvailableToHost; - } - - - public static FeatureDefinition? GetFeatureOrNull( - FeatureGroupDefinition group, - [NotNull] string name) - { - Check.NotNull(name, nameof(name)); - - return GetFeatureOrNullRecursively(group.Features, name); - } - - private static FeatureDefinition? GetFeatureOrNullRecursively( - IReadOnlyList features, - string name) - { - foreach (var feature in features) - { - if (feature.Name == name) - { - return feature; - } - - var childFeature = GetFeatureOrNullRecursively(feature.Children, name); - if (childFeature != null) - { - return childFeature; - } - } - - return null; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs b/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs deleted file mode 100644 index 027e7f1c4..000000000 --- a/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergePermissionDefinitionManager.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; - -namespace Volo.Abp.Authorization.Permissions; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergePermissionDefinitionManager : PermissionDefinitionManager -{ - private readonly IStaticPermissionDefinitionStore _staticStore; - private readonly IDynamicPermissionDefinitionStore _dynamicStore; - - public MergePermissionDefinitionManager( - IStaticPermissionDefinitionStore staticStore, - IDynamicPermissionDefinitionStore dynamicStore) : base(staticStore, dynamicStore) - { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task GetResourcePermissionOrNullAsync(string resourceName, string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetResourcePermissionOrNullAsync(resourceName, name); - var dynamicDefinition = await _dynamicStore.GetResourcePermissionOrNullAsync(resourceName, name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergePermissionMetadata(staticDefinition, dynamicDefinition); - - foreach (var grandchild in dynamicDefinition.Children) - { - MergeChildPermissions(staticDefinition, grandchild); - } - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetPermissionsAsync() - { - var staticPermissions = await _staticStore.GetPermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetPermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetResourcePermissionsAsync() - { - var staticPermissions = await _staticStore.GetResourcePermissionsAsync(); - var dynamicPermissions = await _dynamicStore.GetResourcePermissionsAsync(); - - return MergePermissions(staticPermissions, dynamicPermissions); - } - - public async override Task> GetGroupsAsync() - { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); - - var mergedGroups = new Dictionary(); - - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - MergeGroupPermissions(existingGroup, dynamicGroup); - } - else - { - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return mergedGroups.Values.ToImmutableList(); - } - - private static void MergeGroupPermissions(PermissionGroupDefinition target, PermissionGroupDefinition source) - { - foreach (var sourcePermission in source.Permissions) - { - var existingPermission = target.GetPermissionOrNull(sourcePermission.Name); - - if (existingPermission == null) - { - var newPermission = target.AddPermission( - sourcePermission.Name, - sourcePermission.DisplayName, - sourcePermission.MultiTenancySide, - sourcePermission.IsEnabled - ); - - CopyPermissionDetails(sourcePermission, newPermission); - - foreach (var child in sourcePermission.Children) - { - AddChildPermissionRecursively(newPermission, child); - } - } - else - { - MergePermissionMetadata(existingPermission, sourcePermission); - - foreach (var sourceChild in sourcePermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - } - } - - private static void AddChildPermissionRecursively(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - - private static IReadOnlyList MergePermissions(IReadOnlyList staticPermissions, IReadOnlyList dynamicPermissions) - { - var mergedPermissions = new Dictionary(); - - foreach (var staticFeature in staticPermissions) - { - mergedPermissions[staticFeature.Name] = staticFeature; - } - - foreach (var dynamicPermission in dynamicPermissions) - { - if (mergedPermissions.TryGetValue(dynamicPermission.Name, out var existingPermission)) - { - MergePermissionMetadata(existingPermission, dynamicPermission); - - foreach (var sourceChild in dynamicPermission.Children) - { - MergeChildPermissions(existingPermission, sourceChild); - } - } - else - { - mergedPermissions[dynamicPermission.Name] = dynamicPermission; - } - } - - return mergedPermissions.Values.ToImmutableList(); - } - - private static void MergeChildPermissions(PermissionDefinition parent, PermissionDefinition sourceChild) - { - var existingChild = parent.Children.FirstOrDefault(c => c.Name == sourceChild.Name); - - if (existingChild == null) - { - var newChild = parent.AddChild( - sourceChild.Name, - sourceChild.DisplayName, - sourceChild.MultiTenancySide, - sourceChild.IsEnabled - ); - CopyPermissionDetails(sourceChild, newChild); - - foreach (var grandchild in sourceChild.Children) - { - AddChildPermissionRecursively(newChild, grandchild); - } - } - else - { - MergePermissionMetadata(existingChild, sourceChild); - - foreach (var grandchild in sourceChild.Children) - { - MergeChildPermissions(existingChild, grandchild); - } - } - } - - private static void CopyPermissionDetails(PermissionDefinition source, PermissionDefinition target) - { - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - } - - private static void MergePermissionMetadata(PermissionDefinition target, PermissionDefinition source) - { - target.DisplayName = source.DisplayName; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - - foreach (var checker in source.StateCheckers) - { - if (!target.StateCheckers.Contains(checker)) - { - target.StateCheckers.Add(checker); - } - } - - if (source.MultiTenancySide != MultiTenancySides.Both) - { - target.MultiTenancySide |= source.MultiTenancySide; - } - - target.IsEnabled = target.IsEnabled || source.IsEnabled; - } -} -#nullable disable \ No newline at end of file diff --git a/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs b/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs deleted file mode 100644 index 2fe64a566..000000000 --- a/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergeSettingDefinitionManager.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Settings; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeSettingDefinitionManager : SettingDefinitionManager -{ - public MergeSettingDefinitionManager( - IStaticSettingDefinitionStore staticStore, - IDynamicSettingDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeSetting(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticSettings = await StaticStore.GetAllAsync(); - var dynamicSettings = await DynamicStore.GetAllAsync(); - - var mergedSettings = new Dictionary(); - - foreach (var staticSetting in staticSettings) - { - mergedSettings[staticSetting.Name] = staticSetting; - } - - foreach (var dynamicSetting in dynamicSettings) - { - if (mergedSettings.TryGetValue(dynamicSetting.Name, out var existingSetting)) - { - MergeSetting(existingSetting, dynamicSetting); - } - else - { - mergedSettings[dynamicSetting.Name] = dynamicSetting; - } - } - - return mergedSettings.Values.ToImmutableList(); - } - - private static void MergeSetting(SettingDefinition target, SettingDefinition source) - { - target.DisplayName = source.DisplayName; - target.Description = source.Description ?? target.Description; - target.DefaultValue = source.DefaultValue ?? target.DefaultValue; - target.IsVisibleToClients = target.IsVisibleToClients || source.IsVisibleToClients; - target.IsInherited = target.IsInherited || source.IsInherited; - target.IsEncrypted = target.IsEncrypted || source.IsEncrypted; - - foreach (var property in source.Properties) - { - target.Properties[property.Key] = property.Value; - } - - foreach (var provider in source.Providers) - { - if (!target.Providers.Contains(provider)) - { - target.Providers.Add(provider); - } - } - } -} -#nullable disable - diff --git a/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs b/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs deleted file mode 100644 index 5cb3137cd..000000000 --- a/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/Overrides/MergeTemplateDefinitionManager.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.TextTemplating; - -namespace Volo.Abp.TextTemplatin; - -#nullable enable - -[Dependency(ReplaceServices = true)] -public class MergeTemplateDefinitionManager : TemplateDefinitionManager -{ - public MergeTemplateDefinitionManager( - IStaticTemplateDefinitionStore staticStore, - IDynamicTemplateDefinitionStore dynamicStore) - : base(staticStore, dynamicStore) - { - } - - public async override Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - MergeTemplate(staticDefinition, dynamicDefinition); - } - - return staticDefinition ?? dynamicDefinition; - } - - public async override Task> GetAllAsync() - { - var staticTemplates = await StaticStore.GetAllAsync(); - var dynamicTemplates = await DynamicStore.GetAllAsync(); - - var mergedTemplates = new Dictionary(); - - foreach (var staticTemplate in staticTemplates) - { - mergedTemplates[staticTemplate.Name] = staticTemplate; - } - - foreach (var dynamicTemplate in dynamicTemplates) - { - if (mergedTemplates.TryGetValue(dynamicTemplate.Name, out var existingTemplate)) - { - MergeTemplate(existingTemplate, dynamicTemplate); - } - else - { - mergedTemplates[dynamicTemplate.Name] = dynamicTemplate; - } - } - - return mergedTemplates.Values.ToImmutableList(); - } - - private static TemplateDefinition MergeTemplate(TemplateDefinition staticTemplate, TemplateDefinition dynamicTemplate) - { - var localizationResourceName = dynamicTemplate.LocalizationResourceName ?? staticTemplate.LocalizationResourceName; - var defaultCultureName = dynamicTemplate.DefaultCultureName ?? staticTemplate.DefaultCultureName; - var displayName = dynamicTemplate.DisplayName ?? staticTemplate.DisplayName; - var isLayout = dynamicTemplate.IsLayout || staticTemplate.IsLayout; - var layout = dynamicTemplate.Layout ?? staticTemplate.Layout; - - var mergedTemplate = new TemplateDefinition( - staticTemplate.Name, - localizationResourceName, - displayName, - isLayout, - layout, - defaultCultureName - ); - - foreach (var property in staticTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - foreach (var property in dynamicTemplate.Properties) - { - mergedTemplate.Properties[property.Key] = property.Value; - } - - if (!string.IsNullOrEmpty(dynamicTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = dynamicTemplate.RenderEngine; - } - else if (!string.IsNullOrEmpty(staticTemplate.RenderEngine)) - { - mergedTemplate.RenderEngine = staticTemplate.RenderEngine; - } - - mergedTemplate.IsInlineLocalized = dynamicTemplate.IsInlineLocalized || staticTemplate.IsInlineLocalized; - - return mergedTemplate; - } -} -#nullable disable diff --git a/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/WorkflowManagementHttpApiHostModule.cs b/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/WorkflowManagementHttpApiHostModule.cs index 5f3194e9d..b315946a3 100644 --- a/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/WorkflowManagementHttpApiHostModule.cs +++ b/aspnet-core/services/LY.MicroService.WorkflowManagement.HttpApi.Host/WorkflowManagementHttpApiHostModule.cs @@ -7,6 +7,7 @@ using LINGYUN.Abp.BackgroundTasks.Quartz; using LINGYUN.Abp.BlobStoring.BlobManagement; using LINGYUN.Abp.Claims.Mapping; using LINGYUN.Abp.Data.DbMigrator; +using LINGYUN.Abp.Dynamic.Definitions; using LINGYUN.Abp.Elsa; using LINGYUN.Abp.Elsa.Activities; using LINGYUN.Abp.Elsa.EntityFrameworkCore.MySql; @@ -87,6 +88,7 @@ namespace LY.MicroService.WorkflowManagement; typeof(AbpTelemetrySkyWalkingModule), typeof(AbpAspNetCoreMvcNewtonsoftModule), typeof(AbpAspNetCoreHttpOverridesModule), + typeof(AbpDynamicDefinitionsModule), typeof(AbpIdentitySessionAspNetCoreModule), typeof(AbpAutofacModule) )] From 6580a3957844935d439c8000915c3ac7fb136ecf Mon Sep 17 00:00:00 2001 From: colin Date: Wed, 26 Aug 2026 09:23:13 +0800 Subject: [PATCH 04/10] feat: Rewrite part of the interface using DynamicDefinitionManager --- .../LINGYUN.Abp.AI.Core.csproj | 4 + .../LINGYUN/Abp/AI/AbpAICoreModule.cs | 9 +- .../LINGYUN/Abp/AI/AbpAICoreOptions.cs | 2 - .../AI/Workspaces/DynamicWorkspaceStrategy.cs | 21 - .../Abp/AI/Workspaces/WorkspaceDefinition.cs | 3 +- .../Workspaces/WorkspaceDefinitionManager.cs | 252 ++++-------- .../Abp/AI/Tools/AIToolDefinitionManager.cs | 197 +++------- .../LINGYUN/Abp/AI/Tools/AbpAIToolsModule.cs | 7 +- .../LINGYUN/Abp/AI/Tools/AbpAIToolsOptions.cs | 2 - .../Abp/AI/Tools/DynamicAItoolStrategy.cs | 19 - .../LINGYUN.Abp.Notifications.Core.csproj | 1 + .../AbpNotificationsCoreModule.cs | 10 +- .../Notifications/AbpNotificationsOptions.cs | 3 - .../DynamicNotificationStrategy.cs | 19 - .../NotificationDefinitionManager.cs | 346 ++++------------- .../LINGYUN.Abp.Webhooks.Core.csproj | 4 + .../Abp/Webhooks/AbpWebhooksCoreModule.cs | 16 +- .../Abp/Webhooks/AbpWebhooksOptions.cs | 5 - .../Abp/Webhooks/DynamicWebhookStrategy.cs | 19 - .../Abp/Webhooks/WebhookDefinitionManager.cs | 360 ++++-------------- 20 files changed, 297 insertions(+), 1002 deletions(-) delete mode 100644 aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Workspaces/DynamicWorkspaceStrategy.cs delete mode 100644 aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/DynamicAItoolStrategy.cs delete mode 100644 aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/DynamicNotificationStrategy.cs delete mode 100644 aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/DynamicWebhookStrategy.cs diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN.Abp.AI.Core.csproj b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN.Abp.AI.Core.csproj index b6e35c892..ba6d8dc63 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN.Abp.AI.Core.csproj +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN.Abp.AI.Core.csproj @@ -26,4 +26,8 @@ + + + + diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/AbpAICoreModule.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/AbpAICoreModule.cs index 9bd80e7b7..f4569ce83 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/AbpAICoreModule.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/AbpAICoreModule.cs @@ -1,6 +1,7 @@ using LINGYUN.Abp.AI.Internal; using LINGYUN.Abp.AI.Localization; using LINGYUN.Abp.AI.Workspaces; +using LINGYUN.Abp.Dynamic.Definitions; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; @@ -18,7 +19,8 @@ namespace LINGYUN.Abp.AI; typeof(AbpAIModule), typeof(AbpGuidsModule), typeof(AbpTimingModule), - typeof(AbpLocalizationModule))] + typeof(AbpLocalizationModule), + typeof(AbpDynamicDefinitionsCoreModule))] public class AbpAICoreModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) @@ -53,6 +55,11 @@ public class AbpAICoreModule : AbpModule { options.MapCodeNamespace(AbpAIErrorCodes.Namespace, typeof(AbpAIResource)); }); + + Configure(options => + { + options.MapStrategy(DynamicDefinitionStrategy.Merge); + }); } private static void AutoAddDefinitionProviders(IServiceCollection services) diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/AbpAICoreOptions.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/AbpAICoreOptions.cs index 3a4a78b8d..3b25830bd 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/AbpAICoreOptions.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/AbpAICoreOptions.cs @@ -9,7 +9,6 @@ using Volo.Abp.Collections; namespace LINGYUN.Abp.AI; public class AbpAICoreOptions { - public DynamicWorkspaceStrategy DynamicWorkspaceStrategy { get; set; } public ITypeList DefinitionProviders { get; } public ITypeList ChatClientProviders { get; } public ITypeList KernelProviders { get; } @@ -21,7 +20,6 @@ public class AbpAICoreOptions public AbpAICoreOptions() { - DynamicWorkspaceStrategy = DynamicWorkspaceStrategy.Merge; DefinitionProviders = new TypeList(); ChatClientProviders = new TypeList(); KernelProviders = new TypeList(); diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Workspaces/DynamicWorkspaceStrategy.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Workspaces/DynamicWorkspaceStrategy.cs deleted file mode 100644 index 6aa754874..000000000 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Workspaces/DynamicWorkspaceStrategy.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace LINGYUN.Abp.AI.Workspaces; -/// -/// 动态工作区策略 -/// -public enum DynamicWorkspaceStrategy -{ - /// - /// 忽略动态工作区(静态优先) - /// - Ignore, - - /// - /// 动态覆盖静态 - /// - Covering, - - /// - /// 合并策略 - /// - Merge -} diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Workspaces/WorkspaceDefinition.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Workspaces/WorkspaceDefinition.cs index 9b6d9c431..a59c636df 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Workspaces/WorkspaceDefinition.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Workspaces/WorkspaceDefinition.cs @@ -147,8 +147,7 @@ public class WorkspaceDefinition : IHasSimpleStateCheckers Name = name; Provider = provider; ModelName = modelName; - _displayName = displayName; - _displayName = displayName; + DisplayName = displayName; Description = description; SystemPrompt = systemPrompt; Instructions = instructions; diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Workspaces/WorkspaceDefinitionManager.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Workspaces/WorkspaceDefinitionManager.cs index 0a4ef9102..2d48aa041 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Workspaces/WorkspaceDefinitionManager.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Workspaces/WorkspaceDefinitionManager.cs @@ -1,231 +1,117 @@ -using Microsoft.Extensions.Options; +using JetBrains.Annotations; +using LINGYUN.Abp.Dynamic.Definitions; +using Microsoft.Extensions.Options; using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.DependencyInjection; namespace LINGYUN.Abp.AI.Workspaces; -public class WorkspaceDefinitionManager : IWorkspaceDefinitionManager, ISingletonDependency + +public class WorkspaceDefinitionManager : + DynamicDefinitionManager, + IWorkspaceDefinitionManager, + ITransientDependency { - protected readonly AbpAICoreOptions Options; - protected readonly IStaticWorkspaceDefinitionStore StaticStore; - protected readonly IDynamicWorkspaceDefinitionStore DynamicStore; + protected IStaticWorkspaceDefinitionStore StaticStore { get; } + protected IDynamicWorkspaceDefinitionStore DynamicStore { get; } + protected AbpAICoreOptions AIOptions { get; } public WorkspaceDefinitionManager( IStaticWorkspaceDefinitionStore staticStore, IDynamicWorkspaceDefinitionStore dynamicStore, - IOptions options) + IOptions options, + IOptions aIOptions) + : base(options) { StaticStore = staticStore; DynamicStore = dynamicStore; - Options = options.Value; + AIOptions = aIOptions.Value; } - public virtual async Task GetAsync(string name) + public async virtual Task> GetAllAsync() { - var workspace = await GetOrNullAsync(name); - if (workspace == null) - { - throw new AbpException("Undefined Workspace: " + name); - } + var staticDefinitions = await StaticStore.GetAllAsync(); + var dynamicDefinitions = await DynamicStore.GetAllAsync(); - return workspace; + return await GetDefinitionsAsync(staticDefinitions, dynamicDefinitions); } - public virtual async Task GetOrNullAsync(string name) + public async virtual Task GetAsync([NotNull] string name) { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - return Options.DynamicWorkspaceStrategy switch - { - DynamicWorkspaceStrategy.Ignore => staticDefinition, - DynamicWorkspaceStrategy.Covering => dynamicDefinition, - DynamicWorkspaceStrategy.Merge => MergeWorkspace(staticDefinition, dynamicDefinition), - _ => MergeWorkspace(staticDefinition, dynamicDefinition) - }; - } - - return staticDefinition ?? dynamicDefinition; + return await GetOrNullAsync(name) ?? throw new AbpException("Undefined Workspace: " + name); } - public virtual async Task> GetAllAsync() + public async virtual Task GetOrNullAsync([NotNull] string name) { - var staticWorkspaces = await StaticStore.GetAllAsync(); - var dynamicWorkspaces = await DynamicStore.GetAllAsync(); - - // 根据策略处理工作区定义 - return Options.DynamicWorkspaceStrategy switch - { - DynamicWorkspaceStrategy.Ignore => await GetWorkspacesWithIgnoreStrategy(staticWorkspaces, dynamicWorkspaces), - DynamicWorkspaceStrategy.Covering => await GetWorkspacesWithCoveringStrategy(staticWorkspaces, dynamicWorkspaces), - DynamicWorkspaceStrategy.Merge => await GetWorkspacesWithMergeStrategy(staticWorkspaces, dynamicWorkspaces), - _ => await GetWorkspacesWithMergeStrategy(staticWorkspaces, dynamicWorkspaces) // 默认使用合并策略 - }; - } - - #region 工作区定义策略 + Check.NotNull(name, nameof(name)); - /// - /// 忽略策略:静态优先,过滤掉同名的动态工作区 - /// - protected virtual Task> GetWorkspacesWithIgnoreStrategy( - IReadOnlyList staticWorkspaces, - IReadOnlyList dynamicWorkspaces) - { - var staticWorkspaceNames = staticWorkspaces - .Select(p => p.Name) - .ToImmutableHashSet(); + var staticDefinition = await StaticStore.GetOrNullAsync(name); + var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - return Task.FromResult>( - staticWorkspaces - .Concat(dynamicWorkspaces.Where(d => !staticWorkspaceNames.Contains(d.Name))) - .ToImmutableList() - ); + return await GetDefinitionAsync(staticDefinition, dynamicDefinition); } - /// - /// 覆盖策略:动态完全覆盖静态工作区 - /// - protected virtual Task> GetWorkspacesWithCoveringStrategy( - IReadOnlyList staticWorkspaces, - IReadOnlyList dynamicWorkspaces) + protected override string GetDefinitionKey(WorkspaceDefinition definition) { - var dynamicWorkspaceNames = dynamicWorkspaces - .Select(p => p.Name) - .ToImmutableHashSet(); - - // 动态工作区完全覆盖静态工作区 - var result = dynamicWorkspaces - .Concat(staticWorkspaces.Where(s => !dynamicWorkspaceNames.Contains(s.Name))) - .ToImmutableList(); - - return Task.FromResult>(result); + return definition.Name; } - /// - /// 合并策略:合并静态和动态工作区,创建新实例 - /// - protected virtual Task> GetWorkspacesWithMergeStrategy( - IReadOnlyList staticWorkspaces, - IReadOnlyList dynamicWorkspaces) + protected override Task AfterMergedDefinitionsAsync(Dictionary mergedDefinitions) { - var mergedWorkspaces = new Dictionary(); - - // 先添加所有静态工作区 - foreach (var staticWorkspace in staticWorkspaces) - { - mergedWorkspaces[staticWorkspace.Name] = staticWorkspace; - } - - // 合并动态工作区 - foreach (var dynamicWorkspace in dynamicWorkspaces) + foreach (var deletedWorkspaceName in AIOptions.DeletedWorkspaces) { - if (mergedWorkspaces.TryGetValue(dynamicWorkspace.Name, out var existingWorkspace)) - { - // 工作区已存在,创建新的合并工作区 - var mergedWorkspace = MergeWorkspace(existingWorkspace, dynamicWorkspace); - mergedWorkspaces[dynamicWorkspace.Name] = mergedWorkspace; - } - else - { - // 添加新的动态工作区 - mergedWorkspaces[dynamicWorkspace.Name] = dynamicWorkspace; - } + mergedDefinitions.Remove(deletedWorkspaceName); } - // 处理被删除的工作区 - foreach (var deletedWorkspaceName in Options.DeletedWorkspaces) - { - if (mergedWorkspaces.ContainsKey(deletedWorkspaceName)) - { - mergedWorkspaces.Remove(deletedWorkspaceName); - } - } - - return Task.FromResult>(mergedWorkspaces.Values.ToImmutableList()); + return Task.CompletedTask; } - /// - /// 合并两个工作区定义,返回新的 WorkspaceDefinition 实例 - /// - protected virtual WorkspaceDefinition MergeWorkspace( - WorkspaceDefinition staticWorkspace, - WorkspaceDefinition dynamicWorkspace) + protected override Task MergeDefinitionAsync(WorkspaceDefinition targetDefinition, WorkspaceDefinition sourceDefinition) { - // 决定使用哪个提供者(优先使用动态的) - var provider = !string.IsNullOrEmpty(dynamicWorkspace.Provider) - ? dynamicWorkspace.Provider - : staticWorkspace.Provider; - - // 决定使用哪个模型名称(优先使用动态的) - var modelName = !string.IsNullOrEmpty(dynamicWorkspace.ModelName) - ? dynamicWorkspace.ModelName - : staticWorkspace.ModelName; - - // 决定使用哪个显示名称(优先使用动态的) - var displayName = dynamicWorkspace.DisplayName ?? staticWorkspace.DisplayName; - - // 创建新的工作区实例(Name是只读的) + var provider = !string.IsNullOrEmpty(sourceDefinition.Provider) + ? sourceDefinition.Provider + : targetDefinition.Provider; + var modelName = !string.IsNullOrEmpty(sourceDefinition.ModelName) + ? sourceDefinition.ModelName + : targetDefinition.ModelName; + var displayName = sourceDefinition.DisplayName ?? targetDefinition.DisplayName; var mergedWorkspace = new WorkspaceDefinition( - staticWorkspace.Name, // 保持名称不变 + targetDefinition.Name, provider, modelName, displayName - ); - - // 设置描述(优先使用动态的) - mergedWorkspace.Description = dynamicWorkspace.Description ?? staticWorkspace.Description; + ) + { + Description = sourceDefinition.Description ?? targetDefinition.Description + }; - // 设置API密钥(优先使用动态的) - if (!string.IsNullOrEmpty(dynamicWorkspace.ApiKey)) + if (!string.IsNullOrEmpty(sourceDefinition.ApiKey)) { - mergedWorkspace.WithApiKey(dynamicWorkspace.ApiKey!); + mergedWorkspace.WithApiKey(sourceDefinition.ApiKey!); } - else if (!string.IsNullOrEmpty(staticWorkspace.ApiKey)) + else if (!string.IsNullOrEmpty(targetDefinition.ApiKey)) { - mergedWorkspace.WithApiKey(staticWorkspace.ApiKey!); + mergedWorkspace.WithApiKey(targetDefinition.ApiKey!); } - // 设置API基础URL(优先使用动态的) - if (!string.IsNullOrEmpty(dynamicWorkspace.ApiBaseUrl)) + if (!string.IsNullOrEmpty(sourceDefinition.ApiBaseUrl)) { - mergedWorkspace.WithApiBaseUrl(dynamicWorkspace.ApiBaseUrl!); + mergedWorkspace.WithApiBaseUrl(sourceDefinition.ApiBaseUrl!); } - else if (!string.IsNullOrEmpty(staticWorkspace.ApiBaseUrl)) + else if (!string.IsNullOrEmpty(targetDefinition.ApiBaseUrl)) { - mergedWorkspace.WithApiBaseUrl(staticWorkspace.ApiBaseUrl!); + mergedWorkspace.WithApiBaseUrl(targetDefinition.ApiBaseUrl!); } + mergedWorkspace.SystemPrompt = sourceDefinition.SystemPrompt ?? targetDefinition.SystemPrompt; + mergedWorkspace.Instructions = sourceDefinition.Instructions ?? targetDefinition.Instructions; + mergedWorkspace.Temperature = sourceDefinition.Temperature ?? targetDefinition.Temperature; + mergedWorkspace.MaxOutputTokens = sourceDefinition.MaxOutputTokens ?? targetDefinition.MaxOutputTokens; + mergedWorkspace.FrequencyPenalty = sourceDefinition.FrequencyPenalty ?? targetDefinition.FrequencyPenalty; + mergedWorkspace.PresencePenalty = sourceDefinition.PresencePenalty ?? targetDefinition.PresencePenalty; + mergedWorkspace.IsEnabled = targetDefinition.IsEnabled || sourceDefinition.IsEnabled; - // 设置系统提示词(优先使用动态的) - mergedWorkspace.SystemPrompt = dynamicWorkspace.SystemPrompt ?? staticWorkspace.SystemPrompt; - - // 设置附加系统提示词(优先使用动态的) - mergedWorkspace.Instructions = dynamicWorkspace.Instructions ?? staticWorkspace.Instructions; - - // 设置温度值(优先使用动态的) - mergedWorkspace.Temperature = dynamicWorkspace.Temperature ?? staticWorkspace.Temperature; - - // 设置最大输出token数(优先使用动态的) - mergedWorkspace.MaxOutputTokens = dynamicWorkspace.MaxOutputTokens ?? staticWorkspace.MaxOutputTokens; - - // 设置频率惩罚(优先使用动态的) - mergedWorkspace.FrequencyPenalty = dynamicWorkspace.FrequencyPenalty ?? staticWorkspace.FrequencyPenalty; - - // 设置存在惩罚(优先使用动态的) - mergedWorkspace.PresencePenalty = dynamicWorkspace.PresencePenalty ?? staticWorkspace.PresencePenalty; - - // 设置是否启用(只要有一方启用,结果就是启用) - mergedWorkspace.IsEnabled = staticWorkspace.IsEnabled || dynamicWorkspace.IsEnabled; - - // 合并状态检查器 - foreach (var checker in staticWorkspace.StateCheckers) + foreach (var checker in targetDefinition.StateCheckers) { if (!mergedWorkspace.StateCheckers.Contains(checker)) { @@ -233,7 +119,7 @@ public class WorkspaceDefinitionManager : IWorkspaceDefinitionManager, ISingleto } } - foreach (var checker in dynamicWorkspace.StateCheckers) + foreach (var checker in sourceDefinition.StateCheckers) { if (!mergedWorkspace.StateCheckers.Contains(checker)) { @@ -241,8 +127,7 @@ public class WorkspaceDefinitionManager : IWorkspaceDefinitionManager, ISingleto } } - // 合并工具列表(去重) - foreach (var tool in staticWorkspace.Tools) + foreach (var tool in targetDefinition.Tools) { if (!mergedWorkspace.Tools.Contains(tool)) { @@ -250,7 +135,7 @@ public class WorkspaceDefinitionManager : IWorkspaceDefinitionManager, ISingleto } } - foreach (var tool in dynamicWorkspace.Tools) + foreach (var tool in sourceDefinition.Tools) { if (!mergedWorkspace.Tools.Contains(tool)) { @@ -258,19 +143,16 @@ public class WorkspaceDefinitionManager : IWorkspaceDefinitionManager, ISingleto } } - // 合并属性(动态覆盖静态) - foreach (var property in staticWorkspace.Properties) + foreach (var property in targetDefinition.Properties) { mergedWorkspace.Properties[property.Key] = property.Value; } - foreach (var property in dynamicWorkspace.Properties) + foreach (var property in sourceDefinition.Properties) { mergedWorkspace.Properties[property.Key] = property.Value; } - return mergedWorkspace; + return Task.FromResult(mergedWorkspace); } - - #endregion } diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AIToolDefinitionManager.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AIToolDefinitionManager.cs index 630842b08..70179c0b7 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AIToolDefinitionManager.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AIToolDefinitionManager.cs @@ -1,188 +1,90 @@ -using Microsoft.Extensions.Options; +using JetBrains.Annotations; +using LINGYUN.Abp.Dynamic.Definitions; +using Microsoft.Extensions.Options; using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.DependencyInjection; namespace LINGYUN.Abp.AI.Tools; -public class AIToolDefinitionManager : IAIToolDefinitionManager, ISingletonDependency +public class AIToolDefinitionManager : + DynamicDefinitionManager, + IAIToolDefinitionManager, + ITransientDependency { - protected readonly AbpAIToolsOptions AIToolOptions; - protected readonly IStaticAIToolDefinitionStore StaticStore; - protected readonly IDynamicAIToolDefinitionStore DynamicStore; + protected IStaticAIToolDefinitionStore StaticStore { get; } + protected IDynamicAIToolDefinitionStore DynamicStore { get; } + protected AbpAIToolsOptions AIToolsOptions { get; } public AIToolDefinitionManager( IStaticAIToolDefinitionStore staticStore, IDynamicAIToolDefinitionStore dynamicStore, - IOptions aiToolOptions) + IOptions options, + IOptions aIToolsOptions) + : base(options) { StaticStore = staticStore; DynamicStore = dynamicStore; - AIToolOptions = aiToolOptions.Value; + AIToolsOptions = aIToolsOptions.Value; } - public virtual async Task GetAsync(string name) + public async virtual Task GetAsync([NotNull] string name) { - var workspace = await GetOrNullAsync(name); - if (workspace == null) - { - throw new AbpException("Undefined AITool: " + name); - } - - return workspace; + return await GetOrNullAsync(name) ?? throw new AbpException("Undefined AITool: " + name); } - public virtual async Task GetOrNullAsync(string name) + public async virtual Task> GetAllAsync() { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await StaticStore.GetOrNullAsync(name); - var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - return AIToolOptions.DynamicAItoolStrategy switch - { - DynamicAItoolStrategy.Ignore => staticDefinition, - DynamicAItoolStrategy.Covering => dynamicDefinition, - DynamicAItoolStrategy.Merge => MergeAITool(staticDefinition, dynamicDefinition), - _ => MergeAITool(staticDefinition, dynamicDefinition) - }; - } + var staticDefinitions = await StaticStore.GetAllAsync(); + var dynamicDefinitions = await DynamicStore.GetAllAsync(); - return staticDefinition ?? dynamicDefinition; + return await GetDefinitionsAsync(staticDefinitions, dynamicDefinitions); } - public virtual async Task> GetAllAsync() + public async virtual Task GetOrNullAsync([NotNull] string name) { - var staticAITools = await StaticStore.GetAllAsync(); - var dynamicAITools = await DynamicStore.GetAllAsync(); - - // 根据策略处理AI工具定义 - return AIToolOptions.DynamicAItoolStrategy switch - { - DynamicAItoolStrategy.Ignore => await GetAIToolsWithIgnoreStrategy(staticAITools, dynamicAITools), - DynamicAItoolStrategy.Covering => await GetAIToolsWithCoveringStrategy(staticAITools, dynamicAITools), - DynamicAItoolStrategy.Merge => await GetAIToolsWithMergeStrategy(staticAITools, dynamicAITools), - _ => await GetAIToolsWithMergeStrategy(staticAITools, dynamicAITools) // 默认使用合并策略 - }; - } + Check.NotNull(name, nameof(name)); - #region AI工具定义策略 + var staticDefinition = await StaticStore.GetOrNullAsync(name); + var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - /// - /// 忽略策略:静态优先,过滤掉同名的动态AI工具 - /// - protected virtual Task> GetAIToolsWithIgnoreStrategy( - IReadOnlyList staticAITools, - IReadOnlyList dynamicAITools) - { - var staticAIToolNames = staticAITools - .Select(p => p.Name) - .ToImmutableHashSet(); - - return Task.FromResult>( - staticAITools - .Concat(dynamicAITools.Where(d => !staticAIToolNames.Contains(d.Name))) - .ToImmutableList() - ); + return await GetDefinitionAsync(staticDefinition, dynamicDefinition); } - /// - /// 覆盖策略:动态完全覆盖静态AI工具 - /// - protected virtual Task> GetAIToolsWithCoveringStrategy( - IReadOnlyList staticAITools, - IReadOnlyList dynamicAITools) + protected override string GetDefinitionKey(AIToolDefinition definition) { - var dynamicAIToolNames = dynamicAITools - .Select(p => p.Name) - .ToImmutableHashSet(); - - // 动态AI工具完全覆盖静态AI工具 - var result = dynamicAITools - .Concat(staticAITools.Where(s => !dynamicAIToolNames.Contains(s.Name))) - .ToImmutableList(); - - return Task.FromResult>(result); + return definition.Name; } - /// - /// 合并策略:合并静态和动态AI工具,创建新实例 - /// - protected virtual Task> GetAIToolsWithMergeStrategy( - IReadOnlyList staticAITools, - IReadOnlyList dynamicAITools) + protected override Task AfterMergedDefinitionsAsync(Dictionary mergedDefinitions) { - var mergedAITools = new Dictionary(); - - // 先添加所有静态AI工具 - foreach (var staticAITool in staticAITools) - { - mergedAITools[staticAITool.Name] = staticAITool; - } - - // 合并动态AI工具 - foreach (var dynamicAITool in dynamicAITools) - { - if (mergedAITools.TryGetValue(dynamicAITool.Name, out var existingAITool)) - { - // AI工具已存在,创建新的合并AI工具 - var mergedAITool = MergeAITool(existingAITool, dynamicAITool); - mergedAITools[dynamicAITool.Name] = mergedAITool; - } - else - { - // 添加新的动态AI工具 - mergedAITools[dynamicAITool.Name] = dynamicAITool; - } - } - - // 处理被删除的AI工具 - foreach (var deletedToolName in AIToolOptions.DeletedAITools) + foreach (var deletedToolName in AIToolsOptions.DeletedAITools) { - if (mergedAITools.ContainsKey(deletedToolName)) - { - mergedAITools.Remove(deletedToolName); - } + mergedDefinitions.Remove(deletedToolName); } - return Task.FromResult>(mergedAITools.Values.ToImmutableList()); + return Task.CompletedTask; } - /// - /// 合并两个AI工具定义,返回新的 AIToolDefinition 实例 - /// - protected virtual AIToolDefinition MergeAITool( - AIToolDefinition staticAITool, - AIToolDefinition dynamicAITool) + protected override Task MergeDefinitionAsync(AIToolDefinition targetDefinition, AIToolDefinition sourceDefinition) { - // 决定使用哪个提供者(优先使用动态的) - var provider = !string.IsNullOrEmpty(dynamicAITool.Provider) - ? dynamicAITool.Provider - : staticAITool.Provider; - - // 决定使用哪个描述(优先使用动态的) - var description = dynamicAITool.Description ?? staticAITool.Description; + var provider = !string.IsNullOrEmpty(sourceDefinition.Provider) + ? sourceDefinition.Provider + : targetDefinition.Provider; + var description = sourceDefinition.Description ?? targetDefinition.Description; - // 创建新的AI工具实例(Name是只读的) var mergedAITool = new AIToolDefinition( - staticAITool.Name, // 保持名称不变 + targetDefinition.Name, provider, description - ); - - // 设置是否启用(只要有一方启用,结果就是启用) - mergedAITool.IsEnabled = staticAITool.IsEnabled || dynamicAITool.IsEnabled; - - // 设置是否为全局工具(只要有一方是全局,结果就是全局) - mergedAITool.IsGlobal = staticAITool.IsGlobal || dynamicAITool.IsGlobal; + ) + { + IsEnabled = targetDefinition.IsEnabled || sourceDefinition.IsEnabled, + IsGlobal = targetDefinition.IsGlobal || sourceDefinition.IsGlobal + }; - // 合并状态检查器 - foreach (var checker in staticAITool.StateCheckers) + foreach (var checker in targetDefinition.StateCheckers) { if (!mergedAITool.StateCheckers.Contains(checker)) { @@ -190,7 +92,7 @@ public class AIToolDefinitionManager : IAIToolDefinitionManager, ISingletonDepen } } - foreach (var checker in dynamicAITool.StateCheckers) + foreach (var checker in sourceDefinition.StateCheckers) { if (!mergedAITool.StateCheckers.Contains(checker)) { @@ -198,19 +100,16 @@ public class AIToolDefinitionManager : IAIToolDefinitionManager, ISingletonDepen } } - // 合并属性(动态覆盖静态) - foreach (var property in staticAITool.Properties) + foreach (var property in targetDefinition.Properties) { mergedAITool.Properties[property.Key] = property.Value; } - foreach (var property in dynamicAITool.Properties) + foreach (var property in sourceDefinition.Properties) { mergedAITool.Properties[property.Key] = property.Value; } - return mergedAITool; + return Task.FromResult(mergedAITool); } - - #endregion -} \ No newline at end of file +} diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AbpAIToolsModule.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AbpAIToolsModule.cs index 2da4d9526..7f702e323 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AbpAIToolsModule.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AbpAIToolsModule.cs @@ -1,7 +1,7 @@ using LINGYUN.Abp.AI.Localization; +using LINGYUN.Abp.Dynamic.Definitions; using Microsoft.Extensions.AI; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using Volo.Abp.Localization; @@ -58,6 +58,11 @@ public class AbpAIToolsModule : AbpModule .Get() .AddVirtualJson("/LINGYUN/Abp/AI/Tools/Localization/Resources"); }); + + Configure(options => + { + options.MapStrategy(DynamicDefinitionStrategy.Merge); + }); } private static void AutoAddDefinitionProviders(IServiceCollection services) diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AbpAIToolsOptions.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AbpAIToolsOptions.cs index e1bd082c1..fa552fa29 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AbpAIToolsOptions.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/AbpAIToolsOptions.cs @@ -5,12 +5,10 @@ namespace LINGYUN.Abp.AI.Tools; public class AbpAIToolsOptions { public ITypeList DefinitionProviders { get; } - public DynamicAItoolStrategy DynamicAItoolStrategy { get; set; } public ITypeList AIToolProviders { get; } public HashSet DeletedAITools { get; } public AbpAIToolsOptions() { - DynamicAItoolStrategy = DynamicAItoolStrategy.Merge; DefinitionProviders = new TypeList(); AIToolProviders = new TypeList(); DeletedAITools = new HashSet(); diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/DynamicAItoolStrategy.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/DynamicAItoolStrategy.cs deleted file mode 100644 index 3435eb580..000000000 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Tools/LINGYUN/Abp/AI/Tools/DynamicAItoolStrategy.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace LINGYUN.Abp.AI.Tools; -/// -/// 动态工具策略 -/// -public enum DynamicAItoolStrategy : byte -{ - /// - /// 忽略 - /// - Ignore = 0, - /// - /// 覆盖 - /// - Covering =1, - /// - /// 合并 - /// - Merge = 2 -} diff --git a/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN.Abp.Notifications.Core.csproj b/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN.Abp.Notifications.Core.csproj index a9cf1bbb2..147ebdd44 100644 --- a/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN.Abp.Notifications.Core.csproj +++ b/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN.Abp.Notifications.Core.csproj @@ -22,6 +22,7 @@ + diff --git a/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/AbpNotificationsCoreModule.cs b/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/AbpNotificationsCoreModule.cs index 18ad47fe2..dc3d5484b 100644 --- a/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/AbpNotificationsCoreModule.cs +++ b/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/AbpNotificationsCoreModule.cs @@ -1,4 +1,5 @@ -using LINGYUN.Abp.Notifications.Localization; +using LINGYUN.Abp.Dynamic.Definitions; +using LINGYUN.Abp.Notifications.Localization; using LINGYUN.Abp.RealTime; using Microsoft.Extensions.DependencyInjection; using System; @@ -12,6 +13,7 @@ using Volo.Abp.TextTemplating; namespace LINGYUN.Abp.Notifications; [DependsOn( + typeof(AbpDynamicDefinitionsCoreModule), typeof(AbpTextTemplatingCoreModule), typeof(AbpRealTimeModule), typeof(AbpLocalizationModule), @@ -36,6 +38,12 @@ public class AbpNotificationsCoreModule : AbpModule { preActions.Configure(options); }); + + Configure(options => + { + options.MapStrategy(DynamicDefinitionStrategy.Merge); + options.MapStrategy(DynamicDefinitionStrategy.Merge); + }); } private void AutoAddDefinitionProviders(IServiceCollection services) diff --git a/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/AbpNotificationsOptions.cs b/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/AbpNotificationsOptions.cs index d158f25c5..a88701015 100644 --- a/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/AbpNotificationsOptions.cs +++ b/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/AbpNotificationsOptions.cs @@ -10,15 +10,12 @@ public class AbpNotificationsOptions /// public ITypeList DefinitionProviders { get; } - public DynamicNotificationStrategy DynamicNotificationStrategy { get; set; } - public HashSet DeletedNotifications { get; } public HashSet DeletedNotificationGroups { get; } public AbpNotificationsOptions() { - DynamicNotificationStrategy = DynamicNotificationStrategy.Merge; DefinitionProviders = new TypeList(); DeletedNotifications = new HashSet(); diff --git a/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/DynamicNotificationStrategy.cs b/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/DynamicNotificationStrategy.cs deleted file mode 100644 index f473fed87..000000000 --- a/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/DynamicNotificationStrategy.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace LINGYUN.Abp.Notifications; -/// -/// 动态通知策略 -/// -public enum DynamicNotificationStrategy : byte -{ - /// - /// 忽略 - /// - Ignore = 0, - /// - /// 覆盖 - /// - Covering =1, - /// - /// 合并 - /// - Merge = 2 -} diff --git a/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/NotificationDefinitionManager.cs b/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/NotificationDefinitionManager.cs index 0fa26ae5e..7d6b4a24d 100644 --- a/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/NotificationDefinitionManager.cs +++ b/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Core/LINGYUN/Abp/Notifications/NotificationDefinitionManager.cs @@ -1,224 +1,93 @@ -using Microsoft.Extensions.Options; +using JetBrains.Annotations; +using LINGYUN.Abp.Dynamic.Definitions; +using Microsoft.Extensions.Options; using System.Collections.Generic; -using System.Collections.Immutable; -using System.Linq; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.DependencyInjection; namespace LINGYUN.Abp.Notifications; -public class NotificationDefinitionManager : INotificationDefinitionManager, ITransientDependency +public class NotificationDefinitionManager : + DynamicDefinitionManager, + INotificationDefinitionManager, + ITransientDependency { - private readonly AbpNotificationsOptions _notificationsOptions; - private readonly IStaticNotificationDefinitionStore _staticStore; - private readonly IDynamicNotificationDefinitionStore _dynamicStore; + protected IStaticNotificationDefinitionStore StaticStore { get; } + protected IDynamicNotificationDefinitionStore DynamicStore { get; } public NotificationDefinitionManager( IStaticNotificationDefinitionStore staticStore, IDynamicNotificationDefinitionStore dynamicStore, - IOptions notificationsOptions) + IOptions options) : base(options) { - _staticStore = staticStore; - _dynamicStore = dynamicStore; - _notificationsOptions = notificationsOptions.Value; + StaticStore = staticStore; + DynamicStore = dynamicStore; } - public async virtual Task GetAsync(string name) + public async virtual Task GetAsync([NotNull] string name) { - var notification = await GetOrNullAsync(name); - if (notification == null) - { - throw new AbpException("Undefined notification: " + name); - } - - return notification; - } - - public async virtual Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - return _notificationsOptions.DynamicNotificationStrategy switch - { - DynamicNotificationStrategy.Ignore => staticDefinition, - DynamicNotificationStrategy.Covering => dynamicDefinition, - DynamicNotificationStrategy.Merge => MergeNotification(staticDefinition, dynamicDefinition), - _ => staticDefinition - }; - } - - return staticDefinition ?? dynamicDefinition; - } - - public async virtual Task> GetNotificationsAsync() - { - var staticNotifications = await _staticStore.GetNotificationsAsync(); - var dynamicNotifications = await _dynamicStore.GetNotificationsAsync(); - - // 根据策略处理通知定义 - return _notificationsOptions.DynamicNotificationStrategy switch - { - DynamicNotificationStrategy.Ignore => await GetNotificationsWithIgnoreStrategy(staticNotifications, dynamicNotifications), - DynamicNotificationStrategy.Covering => await GetNotificationsWithCoveringStrategy(staticNotifications, dynamicNotifications), - DynamicNotificationStrategy.Merge => await GetNotificationsWithMergeStrategy(staticNotifications, dynamicNotifications), - _ => await GetNotificationsWithIgnoreStrategy(staticNotifications, dynamicNotifications) - }; + return await GetOrNullAsync(name) ?? throw new AbpException("Undefined notification: " + name); } public async virtual Task GetGroupOrNullAsync(string name) { Check.NotNull(name, nameof(name)); - var staticDefinition = await _staticStore.GetGroupOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetGroupOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - switch (_notificationsOptions.DynamicNotificationStrategy) - { - case DynamicNotificationStrategy.Ignore: - return staticDefinition; - case DynamicNotificationStrategy.Covering: - return dynamicDefinition; - case DynamicNotificationStrategy.Merge: - MergeGroupNotifications(staticDefinition, dynamicDefinition); - return staticDefinition; - default: - return staticDefinition; - } - } + var staticGroupDefinition = await StaticStore.GetGroupOrNullAsync(name); + var dynamicGroupDefinition = await DynamicStore.GetGroupOrNullAsync(name); - return staticDefinition ?? dynamicDefinition; + return await GetGroupDefinitionAsync(staticGroupDefinition, dynamicGroupDefinition); } public async virtual Task> GetGroupsAsync() { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); + var staticGroupDefinitions = await StaticStore.GetGroupsAsync(); + var dynamicGroupDefinitions = await DynamicStore.GetGroupsAsync(); - // 根据策略处理分组定义 - return _notificationsOptions.DynamicNotificationStrategy switch - { - DynamicNotificationStrategy.Ignore => await GetGroupsWithIgnoreStrategy(staticGroups, dynamicGroups), - DynamicNotificationStrategy.Covering => await GetGroupsWithCoveringStrategy(staticGroups, dynamicGroups), - DynamicNotificationStrategy.Merge => await GetGroupsWithMergeStrategy(staticGroups, dynamicGroups), - _ => await GetGroupsWithIgnoreStrategy(staticGroups, dynamicGroups) - }; + return await GetGroupDefinitionsAsync(staticGroupDefinitions, dynamicGroupDefinitions); } - #region 通知定义策略 - - /// - /// 忽略策略:静态优先,过滤掉同名的动态通知 - /// - protected virtual Task> GetNotificationsWithIgnoreStrategy( - IReadOnlyList staticNotifications, - IReadOnlyList dynamicNotifications) + public async virtual Task> GetNotificationsAsync() { - var staticNotificationNames = staticNotifications - .Select(p => p.Name) - .ToImmutableHashSet(); - - return Task.FromResult>( - staticNotifications - .Concat(dynamicNotifications.Where(d => !staticNotificationNames.Contains(d.Name))) - .ToImmutableList() - ); + var staticDefinitions = await StaticStore.GetNotificationsAsync(); + var dynamicDefinitions = await DynamicStore.GetNotificationsAsync(); + + return await GetDefinitionsAsync(staticDefinitions, dynamicDefinitions); } - /// - /// 覆盖策略:动态完全覆盖静态通知 - /// - protected virtual Task> GetNotificationsWithCoveringStrategy( - IReadOnlyList staticNotifications, - IReadOnlyList dynamicNotifications) + public async virtual Task GetOrNullAsync(string name) { - var dynamicNotificationNames = dynamicNotifications - .Select(p => p.Name) - .ToImmutableHashSet(); + Check.NotNull(name, nameof(name)); - // 动态通知完全覆盖静态通知 - var result = dynamicNotifications - .Concat(staticNotifications.Where(s => !dynamicNotificationNames.Contains(s.Name))) - .ToImmutableList(); + var staticDefinition = await StaticStore.GetOrNullAsync(name); + var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); - return Task.FromResult>(result); + return await GetDefinitionAsync(staticDefinition, dynamicDefinition); } - /// - /// 合并策略:合并静态和动态通知,创建新实例 - /// - protected virtual Task> GetNotificationsWithMergeStrategy( - IReadOnlyList staticNotifications, - IReadOnlyList dynamicNotifications) + protected override string GetDefinitionKey(NotificationDefinition definition) { - var mergedNotifications = new Dictionary(); - - // 先添加所有静态通知 - foreach (var staticNotification in staticNotifications) - { - mergedNotifications[staticNotification.Name] = staticNotification; - } - - // 合并动态通知 - foreach (var dynamicNotification in dynamicNotifications) - { - if (mergedNotifications.TryGetValue(dynamicNotification.Name, out var existingNotification)) - { - // 通知已存在,创建新的合并通知 - var mergedNotification = MergeNotification(existingNotification, dynamicNotification); - mergedNotifications[dynamicNotification.Name] = mergedNotification; - } - else - { - // 添加新的动态通知 - mergedNotifications[dynamicNotification.Name] = dynamicNotification; - } - } - - return Task.FromResult>(mergedNotifications.Values.ToImmutableList()); + return definition.Name; } - /// - /// 合并两个通知定义,返回新的 NotificationDefinition 实例 - /// - protected virtual NotificationDefinition MergeNotification( - NotificationDefinition staticNotification, - NotificationDefinition dynamicNotification) + protected override Task MergeDefinitionAsync(NotificationDefinition targetDefinition, NotificationDefinition sourceDefinition) { - // 决定使用哪个显示名称(优先使用动态的) - var displayName = dynamicNotification.DisplayName ?? staticNotification.DisplayName; - - // 决定使用哪个描述(优先使用动态的) - var description = dynamicNotification.Description ?? staticNotification.Description; - - // 决定通知类型(优先使用动态的) - var notificationType = dynamicNotification.NotificationType != NotificationType.Application - ? dynamicNotification.NotificationType - : staticNotification.NotificationType; - - // 决定存活类型(优先使用动态的) - var lifetime = dynamicNotification.NotificationLifetime != NotificationLifetime.Persistent - ? dynamicNotification.NotificationLifetime - : staticNotification.NotificationLifetime; - - // 决定内容类型(优先使用动态的) - var contentType = dynamicNotification.ContentType != NotificationContentType.Text - ? dynamicNotification.ContentType - : staticNotification.ContentType; + var displayName = sourceDefinition.DisplayName ?? targetDefinition.DisplayName; + var description = sourceDefinition.Description ?? targetDefinition.Description; + var notificationType = sourceDefinition.NotificationType != NotificationType.Application + ? sourceDefinition.NotificationType + : targetDefinition.NotificationType; + var lifetime = sourceDefinition.NotificationLifetime != NotificationLifetime.Persistent + ? sourceDefinition.NotificationLifetime + : targetDefinition.NotificationLifetime; + var contentType = sourceDefinition.ContentType != NotificationContentType.Text + ? sourceDefinition.ContentType + : targetDefinition.ContentType; + var allowSubscriptionToClients = sourceDefinition.AllowSubscriptionToClients || targetDefinition.AllowSubscriptionToClients; - // 决定是否允许客户端订阅(优先使用动态的) - var allowSubscriptionToClients = dynamicNotification.AllowSubscriptionToClients || staticNotification.AllowSubscriptionToClients; - - // 创建新的通知实例 var mergedNotification = new NotificationDefinition( - staticNotification.Name, // 保持名称不变 + targetDefinition.Name, displayName, description, notificationType, @@ -227,20 +96,17 @@ public class NotificationDefinitionManager : INotificationDefinitionManager, ITr allowSubscriptionToClients ); - // 复制静态通知的属性 - foreach (var property in staticNotification.Properties) + foreach (var property in targetDefinition.Properties) { mergedNotification.Properties[property.Key] = property.Value; } - // 复制动态通知的属性(覆盖同名的静态属性) - foreach (var property in dynamicNotification.Properties) + foreach (var property in sourceDefinition.Properties) { mergedNotification.Properties[property.Key] = property.Value; } - // 合并提供者 - foreach (var provider in staticNotification.Providers) + foreach (var provider in targetDefinition.Providers) { if (!mergedNotification.Providers.Contains(provider)) { @@ -248,7 +114,7 @@ public class NotificationDefinitionManager : INotificationDefinitionManager, ITr } } - foreach (var provider in dynamicNotification.Providers) + foreach (var provider in sourceDefinition.Providers) { if (!mergedNotification.Providers.Contains(provider)) { @@ -256,107 +122,32 @@ public class NotificationDefinitionManager : INotificationDefinitionManager, ITr } } - // 合并模板(优先使用动态的) - if (dynamicNotification.Template != null) + if (sourceDefinition.Template != null) { - mergedNotification.WithTemplate(dynamicNotification.Template); + mergedNotification.WithTemplate(sourceDefinition.Template); } - else if (staticNotification.Template != null) + else if (targetDefinition.Template != null) { - mergedNotification.WithTemplate(staticNotification.Template); + mergedNotification.WithTemplate(targetDefinition.Template); } - return mergedNotification; + return Task.FromResult(mergedNotification); } - #endregion - - #region 分组定义策略 - - /// - /// 忽略策略:静态优先,过滤掉同名的动态分组 - /// - protected virtual Task> GetGroupsWithIgnoreStrategy( - IReadOnlyList staticGroups, - IReadOnlyList dynamicGroups) + protected override string GetGroupDefinitionKey(NotificationGroupDefinition groupDefinition) { - var staticGroupNames = staticGroups - .Select(p => p.Name) - .ToImmutableHashSet(); - - return Task.FromResult>( - staticGroups - .Concat(dynamicGroups.Where(d => !staticGroupNames.Contains(d.Name))) - .ToImmutableList() - ); - } - - /// - /// 覆盖策略:动态完全覆盖静态分组 - /// - protected virtual Task> GetGroupsWithCoveringStrategy( - IReadOnlyList staticGroups, - IReadOnlyList dynamicGroups) - { - var dynamicGroupNames = dynamicGroups - .Select(p => p.Name) - .ToImmutableHashSet(); - - var result = dynamicGroups - .Concat(staticGroups.Where(s => !dynamicGroupNames.Contains(s.Name))) - .ToImmutableList(); - - return Task.FromResult>(result); + return groupDefinition.Name; } - /// - /// 合并策略:合并静态和动态分组 - /// - protected virtual Task> GetGroupsWithMergeStrategy( - IReadOnlyList staticGroups, - IReadOnlyList dynamicGroups) + protected override Task MergeGroupDefinitionAsync(NotificationGroupDefinition targetGroupDefinition, NotificationGroupDefinition sourceGroupDefinition) { - var mergedGroups = new Dictionary(); - - // 先添加所有静态分组 - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - // 合并动态分组 - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - // 分组已存在,合并通知 - MergeGroupNotifications(existingGroup, dynamicGroup); - } - else - { - // 添加新的动态分组 - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return Task.FromResult>( - mergedGroups.Values.ToImmutableList() - ); - } - - /// - /// 合并分组的通知列表 - /// - private static void MergeGroupNotifications(NotificationGroupDefinition target, NotificationGroupDefinition source) - { - foreach (var sourceNotification in source.Notifications) + foreach (var sourceNotification in sourceGroupDefinition.Notifications) { - var existingNotification = target.GetNotificationOrNull(sourceNotification.Name); + var existingNotification = targetGroupDefinition.GetNotificationOrNull(sourceNotification.Name); if (existingNotification == null) { - // 通知不存在,直接添加 - var newNotification = target.AddNotification( + var newNotification = targetGroupDefinition.AddNotification( sourceNotification.Name, sourceNotification.DisplayName, sourceNotification.Description, @@ -366,7 +157,6 @@ public class NotificationDefinitionManager : INotificationDefinitionManager, ITr sourceNotification.AllowSubscriptionToClients ); - // 复制提供者 foreach (var provider in sourceNotification.Providers) { if (!newNotification.Providers.Contains(provider)) @@ -375,13 +165,11 @@ public class NotificationDefinitionManager : INotificationDefinitionManager, ITr } } - // 复制属性 foreach (var property in sourceNotification.Properties) { newNotification.Properties[property.Key] = property.Value; } - // 复制模板 if (sourceNotification.Template != null) { newNotification.WithTemplate(sourceNotification.Template); @@ -389,13 +177,11 @@ public class NotificationDefinitionManager : INotificationDefinitionManager, ITr } else { - // 通知已存在,合并属性 foreach (var property in sourceNotification.Properties) { existingNotification.Properties[property.Key] = property.Value; } - // 合并提供者 foreach (var provider in sourceNotification.Providers) { if (!existingNotification.Providers.Contains(provider)) @@ -404,30 +190,26 @@ public class NotificationDefinitionManager : INotificationDefinitionManager, ITr } } - // 更新显示名称(如果源提供了) if (sourceNotification.DisplayName != null) { existingNotification.DisplayName = sourceNotification.DisplayName; } - // 更新描述(如果源提供了) if (sourceNotification.Description != null) { existingNotification.Description = sourceNotification.Description; } - // 更新模板(优先使用动态的) if (sourceNotification.Template != null) { existingNotification.WithTemplate(sourceNotification.Template); } - // 更新允许客户端订阅 existingNotification.AllowSubscriptionToClients = existingNotification.AllowSubscriptionToClients || sourceNotification.AllowSubscriptionToClients; } } - } - #endregion -} \ No newline at end of file + return Task.CompletedTask; + } +} diff --git a/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN.Abp.Webhooks.Core.csproj b/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN.Abp.Webhooks.Core.csproj index e84bed9d0..35748da90 100644 --- a/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN.Abp.Webhooks.Core.csproj +++ b/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN.Abp.Webhooks.Core.csproj @@ -17,4 +17,8 @@ + + + + diff --git a/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/AbpWebhooksCoreModule.cs b/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/AbpWebhooksCoreModule.cs index 75854f5a8..925829424 100644 --- a/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/AbpWebhooksCoreModule.cs +++ b/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/AbpWebhooksCoreModule.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.DependencyInjection; +using LINGYUN.Abp.Dynamic.Definitions; +using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using Volo.Abp.Features; @@ -6,7 +7,9 @@ using Volo.Abp.Modularity; namespace LINGYUN.Abp.Webhooks; -[DependsOn(typeof(AbpFeaturesModule))] +[DependsOn( + typeof(AbpDynamicDefinitionsCoreModule), + typeof(AbpFeaturesModule))] public class AbpWebhooksCoreModule : AbpModule { public override void PreConfigureServices(ServiceConfigurationContext context) @@ -14,6 +17,15 @@ public class AbpWebhooksCoreModule : AbpModule AutoAddDefinitionProviders(context.Services); } + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.MapStrategy(DynamicDefinitionStrategy.Merge); + options.MapStrategy(DynamicDefinitionStrategy.Merge); + }); + } + private static void AutoAddDefinitionProviders(IServiceCollection services) { var definitionProviders = new List(); diff --git a/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/AbpWebhooksOptions.cs b/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/AbpWebhooksOptions.cs index 15435e52c..421e24331 100644 --- a/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/AbpWebhooksOptions.cs +++ b/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/AbpWebhooksOptions.cs @@ -12,10 +12,6 @@ public class AbpWebhooksOptions /// public TimeSpan TimeoutDuration { get; set; } /// - /// 动态Webhook策略 - /// - public DynamicWebhookStrategy DynamicWebhookStrategy { get; set; } - /// /// 默认最大发送次数 /// public int MaxSendAttemptCount { get; set; } @@ -43,7 +39,6 @@ public class AbpWebhooksOptions public string DefaultAgentIdentifier { get; set; } public AbpWebhooksOptions() { - DynamicWebhookStrategy = DynamicWebhookStrategy.Merge; TimeoutDuration = TimeSpan.FromSeconds(60); MaxSendAttemptCount = 5; MaxConsecutiveFailCountBeforeDeactivateSubscription = MaxSendAttemptCount * 3; diff --git a/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/DynamicWebhookStrategy.cs b/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/DynamicWebhookStrategy.cs deleted file mode 100644 index 4e505be32..000000000 --- a/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/DynamicWebhookStrategy.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace LINGYUN.Abp.Webhooks; -/// -/// 动态Webhook策略 -/// -public enum DynamicWebhookStrategy : byte -{ - /// - /// 忽略 - /// - Ignore = 0, - /// - /// 覆盖 - /// - Covering =1, - /// - /// 合并 - /// - Merge = 2 -} diff --git a/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/WebhookDefinitionManager.cs b/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/WebhookDefinitionManager.cs index ac6c4ab3f..14facda43 100644 --- a/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/WebhookDefinitionManager.cs +++ b/aspnet-core/modules/webhooks/LINGYUN.Abp.Webhooks.Core/LINGYUN/Abp/Webhooks/WebhookDefinitionManager.cs @@ -1,8 +1,8 @@ -using Microsoft.Extensions.DependencyInjection; +using LINGYUN.Abp.Dynamic.Definitions; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.Linq; using System.Threading.Tasks; using Volo.Abp; @@ -12,127 +12,76 @@ using Volo.Abp.MultiTenancy; namespace LINGYUN.Abp.Webhooks; -internal class WebhookDefinitionManager : IWebhookDefinitionManager, ISingletonDependency +public class WebhookDefinitionManager : + DynamicDefinitionManager, + IWebhookDefinitionManager, + ITransientDependency { - private readonly AbpWebhooksOptions _webhooksOptions; - private readonly IServiceProvider _serviceProvider; - private readonly IStaticWebhookDefinitionStore _staticStore; - private readonly IDynamicWebhookDefinitionStore _dynamicStore; + protected IServiceProvider ServiceProvider { get; } + protected IStaticWebhookDefinitionStore StaticStore { get; } + protected IDynamicWebhookDefinitionStore DynamicStore { get; } public WebhookDefinitionManager( IServiceProvider serviceProvider, - IStaticWebhookDefinitionStore staticStore, - IDynamicWebhookDefinitionStore dynamicStore, - IOptions webhooksOptions) + IStaticWebhookDefinitionStore staticStore, + IDynamicWebhookDefinitionStore dynamicStore, + IOptions options) + : base(options) { - _serviceProvider = serviceProvider; - _staticStore = staticStore; - _dynamicStore = dynamicStore; - _webhooksOptions = webhooksOptions.Value; - } - - public async virtual Task GetOrNullAsync(string name) - { - Check.NotNull(name, nameof(name)); - - var staticDefinition = await _staticStore.GetOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetOrNullAsync(name); - - if (staticDefinition != null && dynamicDefinition != null) - { - return _webhooksOptions.DynamicWebhookStrategy switch - { - DynamicWebhookStrategy.Ignore => staticDefinition, - DynamicWebhookStrategy.Covering => dynamicDefinition, - DynamicWebhookStrategy.Merge => MergeWebhook(staticDefinition, dynamicDefinition), - _ => staticDefinition - }; - } - - return staticDefinition ?? dynamicDefinition; + ServiceProvider = serviceProvider; + StaticStore = staticStore; + DynamicStore = dynamicStore; } public async virtual Task GetAsync(string name) { - var webhook = await GetOrNullAsync(name); - if (webhook == null) - { - throw new AbpException("Undefined webhook: " + name); - } - - return webhook; + return await GetOrNullAsync(name) ?? throw new AbpException("Undefined webhook: " + name); } - public async virtual Task> GetWebhooksAsync() + public async virtual Task GetGroupAsync(string name) { - var staticWebhooks = await _staticStore.GetWebhooksAsync(); - var dynamicWebhooks = await _dynamicStore.GetWebhooksAsync(); - - // 根据策略处理Webhook定义 - return _webhooksOptions.DynamicWebhookStrategy switch - { - DynamicWebhookStrategy.Ignore => await GetWebhooksWithIgnoreStrategy(staticWebhooks, dynamicWebhooks), - DynamicWebhookStrategy.Covering => await GetWebhooksWithCoveringStrategy(staticWebhooks, dynamicWebhooks), - DynamicWebhookStrategy.Merge => await GetWebhooksWithMergeStrategy(staticWebhooks, dynamicWebhooks), - _ => await GetWebhooksWithIgnoreStrategy(staticWebhooks, dynamicWebhooks) - }; + return await GetGroupOrNullAsync(name) ?? throw new AbpException("Undefined webhook group: " + name); } public async virtual Task GetGroupOrNullAsync(string name) { Check.NotNull(name, nameof(name)); - var staticDefinition = await _staticStore.GetGroupOrNullAsync(name); - var dynamicDefinition = await _dynamicStore.GetGroupOrNullAsync(name); + var staticGroupDefinition = await StaticStore.GetGroupOrNullAsync(name); + var dynamicGroupDefinition = await DynamicStore.GetGroupOrNullAsync(name); - if (staticDefinition != null && dynamicDefinition != null) - { - switch (_webhooksOptions.DynamicWebhookStrategy) - { - case DynamicWebhookStrategy.Ignore: - return staticDefinition; - case DynamicWebhookStrategy.Covering: - return dynamicDefinition; - case DynamicWebhookStrategy.Merge: - MergeGroupWebhooks(staticDefinition, dynamicDefinition); - return staticDefinition; - default: - return staticDefinition; - } - } + return await GetGroupDefinitionAsync(staticGroupDefinition, dynamicGroupDefinition); + } + + public async virtual Task> GetGroupsAsync() + { + var staticGroupDefinitions = await StaticStore.GetGroupsAsync(); + var dynamicGroupDefinitions = await DynamicStore.GetGroupsAsync(); - return staticDefinition ?? dynamicDefinition; + return await GetGroupDefinitionsAsync(staticGroupDefinitions, dynamicGroupDefinitions); } - public async virtual Task GetGroupAsync(string name) + public async virtual Task GetOrNullAsync(string name) { - var webhookGroup = await GetGroupOrNullAsync(name); - if (webhookGroup == null) - { - throw new AbpException("Undefined webhook group: " + name); - } + Check.NotNull(name, nameof(name)); - return webhookGroup; + var staticDefinition = await StaticStore.GetOrNullAsync(name); + var dynamicDefinition = await DynamicStore.GetOrNullAsync(name); + + return await GetDefinitionAsync(staticDefinition, dynamicDefinition); } - public async virtual Task> GetGroupsAsync() + public async virtual Task> GetWebhooksAsync() { - var staticGroups = await _staticStore.GetGroupsAsync(); - var dynamicGroups = await _dynamicStore.GetGroupsAsync(); + var staticDefinitions = await StaticStore.GetWebhooksAsync(); + var dynamicDefinitions = await DynamicStore.GetWebhooksAsync(); - // 根据策略处理分组定义 - return _webhooksOptions.DynamicWebhookStrategy switch - { - DynamicWebhookStrategy.Ignore => await GetGroupsWithIgnoreStrategy(staticGroups, dynamicGroups), - DynamicWebhookStrategy.Covering => await GetGroupsWithCoveringStrategy(staticGroups, dynamicGroups), - DynamicWebhookStrategy.Merge => await GetGroupsWithMergeStrategy(staticGroups, dynamicGroups), - _ => await GetGroupsWithIgnoreStrategy(staticGroups, dynamicGroups) - }; + return await GetDefinitionsAsync(staticDefinitions, dynamicDefinitions); } - public async Task IsAvailableAsync(Guid? tenantId, string name) + public async virtual Task IsAvailableAsync(Guid? tenantId, string name) { - if (tenantId == null) // host allowed to subscribe all webhooks + if (tenantId == null) { return true; } @@ -149,8 +98,8 @@ internal class WebhookDefinitionManager : IWebhookDefinitionManager, ISingletonD return true; } - var currentTenant = _serviceProvider.GetRequiredService(); - var featureChecker = _serviceProvider.GetRequiredService(); + var currentTenant = ServiceProvider.GetRequiredService(); + var featureChecker = ServiceProvider.GetRequiredService(); using (currentTenant.Change(tenantId)) { if (!await featureChecker.IsEnabledAsync(true, webhookDefinition.RequiredFeatures.ToArray())) @@ -162,111 +111,34 @@ internal class WebhookDefinitionManager : IWebhookDefinitionManager, ISingletonD return true; } - #region Webhook定义策略 - - /// - /// 忽略策略:静态优先,过滤掉同名的动态Webhook - /// - protected virtual Task> GetWebhooksWithIgnoreStrategy( - IReadOnlyList staticWebhooks, - IReadOnlyList dynamicWebhooks) + protected override string GetDefinitionKey(WebhookDefinition definition) { - var staticWebhookNames = staticWebhooks - .Select(p => p.Name) - .ToImmutableHashSet(); - - return Task.FromResult>( - staticWebhooks - .Concat(dynamicWebhooks.Where(d => !staticWebhookNames.Contains(d.Name))) - .ToImmutableList() - ); + return definition.Name; } - /// - /// 覆盖策略:动态完全覆盖静态Webhook - /// - protected virtual Task> GetWebhooksWithCoveringStrategy( - IReadOnlyList staticWebhooks, - IReadOnlyList dynamicWebhooks) + protected override string GetGroupDefinitionKey(WebhookGroupDefinition groupDefinition) { - var dynamicWebhookNames = dynamicWebhooks - .Select(p => p.Name) - .ToImmutableHashSet(); - - // 动态Webhook完全覆盖静态Webhook - var result = dynamicWebhooks - .Concat(staticWebhooks.Where(s => !dynamicWebhookNames.Contains(s.Name))) - .ToImmutableList(); - - return Task.FromResult>(result); + return groupDefinition.Name; } - /// - /// 合并策略:合并静态和动态Webhook,创建新实例 - /// - protected virtual Task> GetWebhooksWithMergeStrategy( - IReadOnlyList staticWebhooks, - IReadOnlyList dynamicWebhooks) + protected override Task MergeDefinitionAsync(WebhookDefinition targetDefinition, WebhookDefinition sourceDefinition) { - var mergedWebhooks = new Dictionary(); + var displayName = sourceDefinition.DisplayName ?? targetDefinition.DisplayName; + var description = sourceDefinition.Description ?? targetDefinition.Description; - // 先添加所有静态Webhook - foreach (var staticWebhook in staticWebhooks) - { - mergedWebhooks[staticWebhook.Name] = staticWebhook; - } - - // 合并动态Webhook - foreach (var dynamicWebhook in dynamicWebhooks) - { - if (mergedWebhooks.TryGetValue(dynamicWebhook.Name, out var existingWebhook)) - { - // Webhook已存在,创建新的合并Webhook - var mergedWebhook = MergeWebhook(existingWebhook, dynamicWebhook); - mergedWebhooks[dynamicWebhook.Name] = mergedWebhook; - } - else - { - // 添加新的动态Webhook - mergedWebhooks[dynamicWebhook.Name] = dynamicWebhook; - } - } - - return Task.FromResult>(mergedWebhooks.Values.ToImmutableList()); - } - - /// - /// 合并两个Webhook定义,返回新的 WebhookDefinition 实例 - /// - protected virtual WebhookDefinition MergeWebhook( - WebhookDefinition staticWebhook, - WebhookDefinition dynamicWebhook) - { - // 决定使用哪个显示名称(优先使用动态的) - var displayName = dynamicWebhook.DisplayName ?? staticWebhook.DisplayName; - - // 决定使用哪个描述(优先使用动态的) - var description = dynamicWebhook.Description ?? staticWebhook.Description; - - // 创建新的Webhook实例(WebhookDefinition的Name是只读的) var mergedWebhook = new WebhookDefinition( - staticWebhook.Name, // 保持名称不变 + targetDefinition.Name, displayName, description - ); - - // 设置分组名称(优先使用动态的) - if (!string.IsNullOrEmpty(dynamicWebhook.GroupName)) - { - mergedWebhook.GroupName = dynamicWebhook.GroupName; - } - else if (!string.IsNullOrEmpty(staticWebhook.GroupName)) + ) { - mergedWebhook.GroupName = staticWebhook.GroupName; - } + GroupName = + !string.IsNullOrWhiteSpace(sourceDefinition.GroupName) + ? sourceDefinition.GroupName + : targetDefinition.GroupName + }; - // 合并必需的功能特性 - foreach (var feature in staticWebhook.RequiredFeatures) + foreach (var feature in targetDefinition.RequiredFeatures) { if (!mergedWebhook.RequiredFeatures.Contains(feature)) { @@ -274,125 +146,42 @@ internal class WebhookDefinitionManager : IWebhookDefinitionManager, ISingletonD } } - foreach (var feature in dynamicWebhook.RequiredFeatures) + foreach (var feature in sourceDefinition.RequiredFeatures) { if (!mergedWebhook.RequiredFeatures.Contains(feature)) { mergedWebhook.RequiredFeatures.Add(feature); } } - - // 合并属性(动态覆盖静态) - foreach (var property in staticWebhook.Properties) + + foreach (var property in targetDefinition.Properties) { mergedWebhook.Properties[property.Key] = property.Value; } - foreach (var property in dynamicWebhook.Properties) + foreach (var property in sourceDefinition.Properties) { mergedWebhook.Properties[property.Key] = property.Value; } - return mergedWebhook; - } - - #endregion - - #region 分组定义策略 - - /// - /// 忽略策略:静态优先,过滤掉同名的动态分组 - /// - protected virtual Task> GetGroupsWithIgnoreStrategy( - IReadOnlyList staticGroups, - IReadOnlyList dynamicGroups) - { - var staticGroupNames = staticGroups - .Select(p => p.Name) - .ToImmutableHashSet(); - - return Task.FromResult>( - staticGroups - .Concat(dynamicGroups.Where(d => !staticGroupNames.Contains(d.Name))) - .ToImmutableList() - ); - } - - /// - /// 覆盖策略:动态完全覆盖静态分组 - /// - protected virtual Task> GetGroupsWithCoveringStrategy( - IReadOnlyList staticGroups, - IReadOnlyList dynamicGroups) - { - var dynamicGroupNames = dynamicGroups - .Select(p => p.Name) - .ToImmutableHashSet(); - - var result = dynamicGroups - .Concat(staticGroups.Where(s => !dynamicGroupNames.Contains(s.Name))) - .ToImmutableList(); - - return Task.FromResult>(result); - } - - /// - /// 合并策略:合并静态和动态分组 - /// - protected virtual Task> GetGroupsWithMergeStrategy( - IReadOnlyList staticGroups, - IReadOnlyList dynamicGroups) - { - var mergedGroups = new Dictionary(); - - // 先添加所有静态分组 - foreach (var staticGroup in staticGroups) - { - mergedGroups[staticGroup.Name] = staticGroup; - } - - // 合并动态分组 - foreach (var dynamicGroup in dynamicGroups) - { - if (mergedGroups.TryGetValue(dynamicGroup.Name, out var existingGroup)) - { - // 分组已存在,合并Webhook - MergeGroupWebhooks(existingGroup, dynamicGroup); - } - else - { - // 添加新的动态分组 - mergedGroups[dynamicGroup.Name] = dynamicGroup; - } - } - - return Task.FromResult>( - mergedGroups.Values.ToImmutableList() - ); + return Task.FromResult(mergedWebhook); } - /// - /// 合并分组的Webhook列表 - /// - private void MergeGroupWebhooks(WebhookGroupDefinition target, WebhookGroupDefinition source) + protected override Task MergeGroupDefinitionAsync(WebhookGroupDefinition targetGroupDefinition, WebhookGroupDefinition sourceGroupDefinition) { - foreach (var sourceWebhook in source.Webhooks) + foreach (var sourceWebhook in sourceGroupDefinition.Webhooks) { - var existingWebhook = target.GetWebhookOrNull(sourceWebhook.Name); + var existingWebhook = targetGroupDefinition.GetWebhookOrNull(sourceWebhook.Name); if (existingWebhook == null) { - // Webhook不存在,直接添加 - var newWebhook = target.AddWebhook( + var newWebhook = targetGroupDefinition.AddWebhook( sourceWebhook.Name, sourceWebhook.DisplayName, sourceWebhook.Description ); + newWebhook.GroupName = targetGroupDefinition.Name; - // 设置分组名称 - newWebhook.GroupName = target.Name; - - // 复制必需的功能特性 foreach (var feature in sourceWebhook.RequiredFeatures) { if (!newWebhook.RequiredFeatures.Contains(feature)) @@ -401,7 +190,6 @@ internal class WebhookDefinitionManager : IWebhookDefinitionManager, ISingletonD } } - // 复制属性 foreach (var property in sourceWebhook.Properties) { newWebhook.Properties[property.Key] = property.Value; @@ -409,13 +197,11 @@ internal class WebhookDefinitionManager : IWebhookDefinitionManager, ISingletonD } else { - // Webhook已存在,合并属性 foreach (var property in sourceWebhook.Properties) { existingWebhook.Properties[property.Key] = property.Value; } - // 合并必需的功能特性 foreach (var feature in sourceWebhook.RequiredFeatures) { if (!existingWebhook.RequiredFeatures.Contains(feature)) @@ -424,23 +210,19 @@ internal class WebhookDefinitionManager : IWebhookDefinitionManager, ISingletonD } } - // 更新显示名称(如果源提供了) if (sourceWebhook.DisplayName != null) { existingWebhook.DisplayName = sourceWebhook.DisplayName; } - // 更新描述(如果源提供了) if (sourceWebhook.Description != null) { existingWebhook.Description = sourceWebhook.Description; } - // 更新分组名称(确保保持一致) - existingWebhook.GroupName = target.Name; + existingWebhook.GroupName = targetGroupDefinition.Name; } } + return Task.CompletedTask; } - - #endregion -} \ No newline at end of file +} From 7a94d0fe23b710d61d9b072713eecc61b2b78b6a Mon Sep 17 00:00:00 2001 From: colin Date: Wed, 26 Aug 2026 09:27:04 +0800 Subject: [PATCH 05/10] feat: After the feature definition is changed, a local event is triggered. --- .../Definitions/FeatureDefinitionAppService.cs | 10 ++++++++++ .../Definitions/FeatureGroupDefinitionAppService.cs | 11 +++++++++++ 2 files changed, 21 insertions(+) diff --git a/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureDefinitionAppService.cs b/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureDefinitionAppService.cs index fa07c7ad2..3fa0cdaa9 100644 --- a/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureDefinitionAppService.cs +++ b/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureDefinitionAppService.cs @@ -11,6 +11,7 @@ using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus.Local; using Volo.Abp.FeatureManagement; using Volo.Abp.Features; using Volo.Abp.Validation; @@ -20,6 +21,7 @@ namespace LINGYUN.Abp.FeatureManagement.Definitions; [Authorize(FeatureManagementPermissionNames.Definition.Default)] public class FeatureDefinitionAppService : FeatureManagementAppServiceBase, IFeatureDefinitionAppService { + private readonly ILocalEventBus _eventBus; private readonly StringValueTypeSerializer _stringValueTypeSerializer; private readonly IFeatureValueProviderManager _featureValueProviderManager; private readonly IFeatureDefinitionRecordRepository _definitionRepository; @@ -27,12 +29,14 @@ public class FeatureDefinitionAppService : FeatureManagementAppServiceBase, IFea private readonly IRepository _groupDefinitionBasicRepository; public FeatureDefinitionAppService( + ILocalEventBus eventBus, StringValueTypeSerializer stringValueTypeSerializer, IFeatureValueProviderManager featureValueProviderManager, IFeatureDefinitionRecordRepository definitionRepository, IRepository definitionBasicRepository, IRepository groupDefinitionBasicRepository) { + _eventBus = eventBus; _stringValueTypeSerializer = stringValueTypeSerializer; _featureValueProviderManager = featureValueProviderManager; _definitionRepository = definitionRepository; @@ -89,6 +93,8 @@ public class FeatureDefinitionAppService : FeatureManagementAppServiceBase, IFea await CurrentUnitOfWork!.SaveChangesAsync(); + await _eventBus.PublishAsync(new StaticFeatureDefinitionChangedEvent()); + return DefinitionRecordToDto(definitionRecord); } @@ -104,6 +110,8 @@ public class FeatureDefinitionAppService : FeatureManagementAppServiceBase, IFea await _definitionRepository.DeleteAsync(definitionRecord); await CurrentUnitOfWork!.SaveChangesAsync(); + + await _eventBus.PublishAsync(new StaticFeatureDefinitionChangedEvent()); } public async virtual Task GetAsync(string name) @@ -142,6 +150,8 @@ public class FeatureDefinitionAppService : FeatureManagementAppServiceBase, IFea await CurrentUnitOfWork!.SaveChangesAsync(); + await _eventBus.PublishAsync(new StaticFeatureDefinitionChangedEvent()); + return DefinitionRecordToDto(definitionRecord); } diff --git a/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureGroupDefinitionAppService.cs b/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureGroupDefinitionAppService.cs index d5cb16b55..88787d877 100644 --- a/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureGroupDefinitionAppService.cs +++ b/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureGroupDefinitionAppService.cs @@ -10,20 +10,25 @@ using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus.Local; using Volo.Abp.FeatureManagement; +using Volo.Abp.Features; namespace LINGYUN.Abp.FeatureManagement.Definitions; [Authorize(FeatureManagementPermissionNames.GroupDefinition.Default)] public class FeatureGroupDefinitionAppService : FeatureManagementAppServiceBase, IFeatureGroupDefinitionAppService { + private readonly ILocalEventBus _eventBus; private readonly IFeatureGroupDefinitionRecordRepository _groupDefinitionRepository; private readonly IRepository _groupDefinitionBasicRepository; public FeatureGroupDefinitionAppService( + ILocalEventBus eventBus, IFeatureGroupDefinitionRecordRepository groupDefinitionRepository, IRepository groupDefinitionBasicRepository) { + _eventBus = eventBus; _groupDefinitionRepository = groupDefinitionRepository; _groupDefinitionBasicRepository = groupDefinitionBasicRepository; } @@ -51,6 +56,8 @@ public class FeatureGroupDefinitionAppService : FeatureManagementAppServiceBase, await CurrentUnitOfWork!.SaveChangesAsync(); + await _eventBus.PublishAsync(new StaticFeatureDefinitionChangedEvent()); + return GroupDefinitionRecordToDto(groupDefinitionRecord); } @@ -66,6 +73,8 @@ public class FeatureGroupDefinitionAppService : FeatureManagementAppServiceBase, await _groupDefinitionRepository.DeleteAsync(groupDefinitionRecord); await CurrentUnitOfWork!.SaveChangesAsync(); + + await _eventBus.PublishAsync(new StaticFeatureDefinitionChangedEvent()); } public async virtual Task GetAsync(string name) @@ -106,6 +115,8 @@ public class FeatureGroupDefinitionAppService : FeatureManagementAppServiceBase, await CurrentUnitOfWork!.SaveChangesAsync(); + await _eventBus.PublishAsync(new StaticFeatureDefinitionChangedEvent()); + return GroupDefinitionRecordToDto(groupDefinitionRecord); } From 8996a974d89d981bccbdbc0b5e8635943aa281b0 Mon Sep 17 00:00:00 2001 From: colin Date: Wed, 26 Aug 2026 09:27:20 +0800 Subject: [PATCH 06/10] feat: After the permission definition is changed, a local event is triggered. --- .../Definitions/PermissionDefinitionAppService.cs | 10 ++++++++++ .../PermissionGroupDefinitionAppService.cs | 11 +++++++++++ 2 files changed, 21 insertions(+) diff --git a/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionDefinitionAppService.cs b/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionDefinitionAppService.cs index 74b4a8222..04859c389 100644 --- a/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionDefinitionAppService.cs +++ b/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionDefinitionAppService.cs @@ -12,6 +12,7 @@ using Volo.Abp.Application.Dtos; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Data; using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus.Local; using Volo.Abp.PermissionManagement; using Volo.Abp.SimpleStateChecking; using Volo.Abp.Validation; @@ -21,6 +22,7 @@ namespace LINGYUN.Abp.PermissionManagement.Definitions; [Authorize(PermissionManagementPermissionNames.Definition.Default)] public class PermissionDefinitionAppService : PermissionManagementAppServiceBase, IPermissionDefinitionAppService { + private readonly ILocalEventBus _eventBus; private readonly ISimpleStateCheckerSerializer _simpleStateCheckerSerializer; private readonly IStaticPermissionDefinitionStore _staticPermissionDefinitionStore; private readonly IPermissionValueProviderManager _permissionValueProviderManager; @@ -29,6 +31,7 @@ public class PermissionDefinitionAppService : PermissionManagementAppServiceBase private readonly IRepository _groupDefinitionBasicRepository; public PermissionDefinitionAppService( + ILocalEventBus eventBus, IStaticPermissionDefinitionStore staticPermissionDefinitionStore, IPermissionValueProviderManager permissionValueProviderManager, ISimpleStateCheckerSerializer simpleStateCheckerSerializer, @@ -36,6 +39,7 @@ public class PermissionDefinitionAppService : PermissionManagementAppServiceBase IRepository definitionBasicRepository, IRepository groupDefinitionBasicRepository) { + _eventBus = eventBus; _staticPermissionDefinitionStore = staticPermissionDefinitionStore; _permissionValueProviderManager = permissionValueProviderManager; _simpleStateCheckerSerializer = simpleStateCheckerSerializer; @@ -91,6 +95,8 @@ public class PermissionDefinitionAppService : PermissionManagementAppServiceBase await CurrentUnitOfWork!.SaveChangesAsync(); + await _eventBus.PublishAsync(new StaticPermissionDefinitionChangedEvent()); + return DefinitionRecordToDto(definitionRecord); } @@ -106,6 +112,8 @@ public class PermissionDefinitionAppService : PermissionManagementAppServiceBase await _definitionRepository.DeleteAsync(definitionRecord); await CurrentUnitOfWork!.SaveChangesAsync(); + + await _eventBus.PublishAsync(new StaticPermissionDefinitionChangedEvent()); } public async virtual Task GetAsync(string name) @@ -146,6 +154,8 @@ public class PermissionDefinitionAppService : PermissionManagementAppServiceBase await CurrentUnitOfWork!.SaveChangesAsync(); + await _eventBus.PublishAsync(new StaticPermissionDefinitionChangedEvent()); + return DefinitionRecordToDto(definitionRecord); } diff --git a/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionGroupDefinitionAppService.cs b/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionGroupDefinitionAppService.cs index ab5bf9006..13b0e1bf3 100644 --- a/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionGroupDefinitionAppService.cs +++ b/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionGroupDefinitionAppService.cs @@ -8,8 +8,10 @@ using System.Linq.Expressions; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Application.Dtos; +using Volo.Abp.Authorization.Permissions; using Volo.Abp.Data; using Volo.Abp.Domain.Repositories; +using Volo.Abp.EventBus.Local; using Volo.Abp.PermissionManagement; namespace LINGYUN.Abp.PermissionManagement.Definitions; @@ -17,13 +19,16 @@ namespace LINGYUN.Abp.PermissionManagement.Definitions; [Authorize(PermissionManagementPermissionNames.GroupDefinition.Default)] public class PermissionGroupDefinitionAppService : PermissionManagementAppServiceBase, IPermissionGroupDefinitionAppService { + private readonly ILocalEventBus _eventBus; private readonly IPermissionGroupDefinitionRecordRepository _groupDefinitionRepository; private readonly IRepository _groupDefinitionBasicRepository; public PermissionGroupDefinitionAppService( + ILocalEventBus eventBus, IPermissionGroupDefinitionRecordRepository groupDefinitionRepository, IRepository groupDefinitionBasicRepository) { + _eventBus = eventBus; _groupDefinitionRepository = groupDefinitionRepository; _groupDefinitionBasicRepository = groupDefinitionBasicRepository; } @@ -53,6 +58,8 @@ public class PermissionGroupDefinitionAppService : PermissionManagementAppServic await CurrentUnitOfWork!.SaveChangesAsync(); + await _eventBus.PublishAsync(new StaticPermissionDefinitionChangedEvent()); + return DefinitionRecordToDto(groupDefinitionRecord); } @@ -68,6 +75,8 @@ public class PermissionGroupDefinitionAppService : PermissionManagementAppServic await _groupDefinitionRepository.DeleteAsync(groupDefinitionRecord); await CurrentUnitOfWork!.SaveChangesAsync(); + + await _eventBus.PublishAsync(new StaticPermissionDefinitionChangedEvent()); } public async virtual Task GetAsync(string name) @@ -109,6 +118,8 @@ public class PermissionGroupDefinitionAppService : PermissionManagementAppServic await CurrentUnitOfWork!.SaveChangesAsync(); + await _eventBus.PublishAsync(new StaticPermissionDefinitionChangedEvent()); + return DefinitionRecordToDto(groupDefinitionRecord); } From d5c56f68a5d14e2a31d6aeb5f030594b6a4bbc0b Mon Sep 17 00:00:00 2001 From: colin Date: Wed, 26 Aug 2026 09:27:48 +0800 Subject: [PATCH 07/10] feat: After the setting definition is changed, a local event is triggered. --- ...INGYUN.Abp.SettingManagement.Application.csproj | 1 + .../AbpSettingManagementApplicationModule.cs | 2 ++ .../SettingDefinitionAppService.cs | 14 ++++++++++---- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN.Abp.SettingManagement.Application.csproj b/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN.Abp.SettingManagement.Application.csproj index cdf9bb431..64df2c01d 100644 --- a/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN.Abp.SettingManagement.Application.csproj +++ b/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN.Abp.SettingManagement.Application.csproj @@ -22,6 +22,7 @@ + diff --git a/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/AbpSettingManagementApplicationModule.cs b/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/AbpSettingManagementApplicationModule.cs index 04bcf3254..b8f17b1d4 100644 --- a/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/AbpSettingManagementApplicationModule.cs +++ b/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/AbpSettingManagementApplicationModule.cs @@ -4,6 +4,7 @@ using LINGYUN.Abp.Account.OAuth.Localization; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Application; using Volo.Abp.Emailing; +using Volo.Abp.EventBus; using Volo.Abp.Localization; using Volo.Abp.Modularity; using Volo.Abp.SettingManagement; @@ -20,6 +21,7 @@ namespace LINGYUN.Abp.SettingManagement; typeof(VoloAbpSettingManagementApplicationContractsModule), typeof(AbpAccountApplicationContractsModule), typeof(AbpAccountOAuthModule), + typeof(AbpEventBusModule), typeof(AbpEmailingModule), typeof(AbpTimingModule), typeof(AbpLocalizationModule), diff --git a/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/SettingDefinitionAppService.cs b/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/SettingDefinitionAppService.cs index 819369b5a..f454a0ef3 100644 --- a/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/SettingDefinitionAppService.cs +++ b/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/SettingDefinitionAppService.cs @@ -8,7 +8,7 @@ using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; using Volo.Abp.Domain.Repositories; -using Volo.Abp.Localization; +using Volo.Abp.EventBus.Local; using Volo.Abp.Security.Encryption; using Volo.Abp.SettingManagement; using Volo.Abp.Settings; @@ -18,19 +18,19 @@ namespace LINGYUN.Abp.SettingManagement; [Authorize(SettingManagementPermissions.Definition.Default)] public class SettingDefinitionAppService : SettingManagementAppServiceBase, ISettingDefinitionAppService { + private readonly ILocalEventBus _eventBus; private readonly IStringEncryptionService _stringEncryptionService; private readonly ISettingValueProviderManager _settingValueProviderManager; - private readonly ILocalizableStringSerializer _localizableStringSerializer; private readonly IRepository _settingRepository; public SettingDefinitionAppService( + ILocalEventBus eventBus, IStringEncryptionService stringEncryptionService, - ILocalizableStringSerializer localizableStringSerializer, IRepository settingRepository, ISettingValueProviderManager settingValueProviderManager) { + _eventBus = eventBus; _stringEncryptionService = stringEncryptionService; - _localizableStringSerializer = localizableStringSerializer; _settingRepository = settingRepository; _settingValueProviderManager = settingValueProviderManager; } @@ -70,6 +70,8 @@ public class SettingDefinitionAppService : SettingManagementAppServiceBase, ISet await CurrentUnitOfWork!.SaveChangesAsync(); + await _eventBus.PublishAsync(new StaticSettingDefinitionChangedEvent()); + return DefinitionRecordToDto(settingDefinitionRecord); } @@ -84,6 +86,8 @@ public class SettingDefinitionAppService : SettingManagementAppServiceBase, ISet await _settingRepository.DeleteAsync(definitionRecord); + await _eventBus.PublishAsync(new StaticSettingDefinitionChangedEvent()); + await CurrentUnitOfWork!.SaveChangesAsync(); } @@ -149,6 +153,8 @@ public class SettingDefinitionAppService : SettingManagementAppServiceBase, ISet await CurrentUnitOfWork!.SaveChangesAsync(); + await _eventBus.PublishAsync(new StaticSettingDefinitionChangedEvent()); + return DefinitionRecordToDto(definitionRecord); } From 25ae6e53b5c7a7a580558ba499f648b63a2d30a3 Mon Sep 17 00:00:00 2001 From: colin Date: Wed, 26 Aug 2026 14:19:39 +0800 Subject: [PATCH 08/10] feat: Optimize the definition interface --- .../AI/Internal/DeepSeekChatClientProvider.cs | 5 +++-- .../AI/Internal/OpenAIChatClientProvider.cs | 11 +++++------ .../Tools/Dtos/AIToolDefinitionRecordDto.cs | 2 ++ .../Dtos/WorkspaceDefinitionRecordDto.cs | 2 ++ .../AbpAIManagementApplicationMappers.cs | 16 ++++++++++++++++ .../Tools/AIToolDefinitionAppService.cs | 7 ++++++- .../WorkspaceDefinitionAppService.cs | 7 ++++++- .../Localization/Resources/en.json | 3 ++- .../Localization/Resources/zh-Hans.json | 3 ++- .../Definitions/FeatureDefinitionAppService.cs | 15 ++++++++++++--- .../FeatureGroupDefinitionAppService.cs | 15 ++++++++++++--- .../PermissionDefinitionAppService.cs | 15 +++++++++++---- .../PermissionGroupDefinitionAppService.cs | 14 +++++++++++--- .../NotificationGroupDefinitionAppService.cs | 18 +++++++++++++----- .../NotificationDefinitionAppService.cs | 14 +++++++++++--- .../SettingDefinitionAppService.cs | 15 +++++++++++---- .../Localization/Resources/en.json | 2 +- .../Localization/Resources/zh-Hans.json | 2 +- .../Definitions/WebhookDefinitionAppService.cs | 14 ++++++++++++-- .../WebhookGroupDefinitionAppService.cs | 15 ++++++++++++--- 20 files changed, 151 insertions(+), 44 deletions(-) diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/DeepSeekChatClientProvider.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/DeepSeekChatClientProvider.cs index d2af9d566..4e1a895da 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/DeepSeekChatClientProvider.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/DeepSeekChatClientProvider.cs @@ -17,8 +17,9 @@ public class DeepSeekChatClientProvider : OpenAIChatClientProvider public override ChatModel[] GetModels() { return [ - new ChatModel("deepseek-chat", "DeepSeek-V3", "DeepSeek-Chat是全能高效的“快枪手”,擅长日常对话与通用任务"), - new ChatModel("deepseek-reasoner", "DeepSeek-R1", "DeepSeek-Reasoner是深思熟虑的“解题家”,专攻复杂推理与逻辑难题"), + new ChatModel("deepseek-v4-flash", "deepseek-v4-flash"), + new ChatModel("deepseek-v4-pro", "deepseek-v4-pro"), + new ChatModel("deepseek-v4-flash-vision-exp", "deepseek-v4-flash-vision-exp"), ]; } } diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/OpenAIChatClientProvider.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/OpenAIChatClientProvider.cs index 3502539de..1b57e603e 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/OpenAIChatClientProvider.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AI.Core/LINGYUN/Abp/AI/Internal/OpenAIChatClientProvider.cs @@ -24,12 +24,11 @@ public class OpenAIChatClientProvider : ChatClientProvider public override ChatModel[] GetModels() { return [ - new ChatModel("gpt-4.1", "GPT-4.1", "Smartest non-reasoning model"), - new ChatModel("gpt-5", "GPT-5", "Previous intelligent reasoning model for coding and agentic tasks with configurable reasoning effort"), - new ChatModel("gpt-5-nano", "GPT-5 nano", "Fastest, most cost-efficient version of GPT-5"), - new ChatModel("gpt-5-mini", "GPT-5 mini", "Near-frontier intelligence for cost sensitive, low latency, high volume workloads"), - new ChatModel("gpt-5.4", "GPT-5.4", "Best intelligence at scale for agentic, coding, and professional workflows"), - new ChatModel("gpt-5.4-pro", "GPT-5.4 pro", "Version of GPT-5.4 that produces smarter and more precise responses."), + new ChatModel("gpt-5.4", "gpt-5.4"), + new ChatModel("gpt-5.4-mini", "gpt-5.4-mini"), + new ChatModel("gpt-5.4-nano", "gpt-5.4-nano"), + new ChatModel("gpt-5.5", "gpt-5.5"), + new ChatModel("gpt-5.5-pro", "gpt-5.5-pro"), ]; } diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Tools/Dtos/AIToolDefinitionRecordDto.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Tools/Dtos/AIToolDefinitionRecordDto.cs index e6281f7b4..c47b0d83c 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Tools/Dtos/AIToolDefinitionRecordDto.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Tools/Dtos/AIToolDefinitionRecordDto.cs @@ -19,6 +19,8 @@ public class AIToolDefinitionRecordDto : ExtensibleAuditedEntityDto, IHasC public bool IsGlobal { get; set; } + public bool IsStatic { get; set; } + public string? StateCheckers { get; set; } public string ConcurrencyStamp { get; set; } = default!; diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Workspaces/Dtos/WorkspaceDefinitionRecordDto.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Workspaces/Dtos/WorkspaceDefinitionRecordDto.cs index 1e62f15d5..ddf5f6fe8 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Workspaces/Dtos/WorkspaceDefinitionRecordDto.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application.Contracts/LINGYUN/Abp/AIManagement/Workspaces/Dtos/WorkspaceDefinitionRecordDto.cs @@ -35,6 +35,8 @@ public class WorkspaceDefinitionRecordDto : ExtensibleAuditedEntityDto, IH public bool IsSystem { get; set; } + public bool IsStatic { get; set; } + public string[]? Tools { get; set; } public string? StateCheckers { get; set; } diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/AbpAIManagementApplicationMappers.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/AbpAIManagementApplicationMappers.cs index dc0e6377b..1016cdff8 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/AbpAIManagementApplicationMappers.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/AbpAIManagementApplicationMappers.cs @@ -6,6 +6,7 @@ using LINGYUN.Abp.AIManagement.Workspaces; using LINGYUN.Abp.AIManagement.Workspaces.Dtos; using Riok.Mapperly.Abstractions; using System; +using Volo.Abp.Data; using Volo.Abp.Mapperly; using Volo.Abp.ObjectExtending; @@ -16,9 +17,11 @@ namespace LINGYUN.Abp.AIManagement; public partial class WorkspaceDefinitionRecordToWorkspaceDefinitionRecordDtoMapper : MapperBase { [MapPropertyFromSource(nameof(WorkspaceDefinitionRecordDto.Tools), Use = nameof(ConvertTools))] + [MapperIgnoreTarget(nameof(WorkspaceDefinitionRecordDto.IsStatic))] public override partial WorkspaceDefinitionRecordDto Map(WorkspaceDefinitionRecord source); [MapPropertyFromSource(nameof(WorkspaceDefinitionRecordDto.Tools), Use = nameof(ConvertTools))] + [MapperIgnoreTarget(nameof(WorkspaceDefinitionRecordDto.IsStatic))] public override partial void Map(WorkspaceDefinitionRecord source, WorkspaceDefinitionRecordDto destination); [UserMapping(Default = false)] @@ -26,6 +29,11 @@ public partial class WorkspaceDefinitionRecordToWorkspaceDefinitionRecordDtoMapp { return !record.Tools.IsNullOrWhiteSpace() ? record.Tools.Split(",") : []; } + + public override void AfterMap(WorkspaceDefinitionRecord source, WorkspaceDefinitionRecordDto destination) + { + destination.IsStatic = source.GetProperty(nameof(WorkspaceDefinitionRecordDto.IsStatic), true); + } } [Mapper(RequiredMappingStrategy = RequiredMappingStrategy.Target)] @@ -49,6 +57,14 @@ public partial class TextChatMessageRecordToTextChatMessageDtoMapper : MapperBas [MapExtraProperties(DefinitionChecks = MappingPropertyDefinitionChecks.None)] public partial class AIToolDefinitionRecordToAIToolDefinitionRecordDtoMapper : MapperBase { + [MapperIgnoreTarget(nameof(AIToolDefinitionRecordDto.IsStatic))] public override partial AIToolDefinitionRecordDto Map(AIToolDefinitionRecord source); + + [MapperIgnoreTarget(nameof(AIToolDefinitionRecordDto.IsStatic))] public override partial void Map(AIToolDefinitionRecord source, AIToolDefinitionRecordDto destination); + + public override void AfterMap(AIToolDefinitionRecord source, AIToolDefinitionRecordDto destination) + { + destination.IsStatic = source.GetProperty(nameof(AIToolDefinitionRecordDto.IsStatic), true); + } } diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Tools/AIToolDefinitionAppService.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Tools/AIToolDefinitionAppService.cs index 7b4265a97..bbab08b6c 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Tools/AIToolDefinitionAppService.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Tools/AIToolDefinitionAppService.cs @@ -2,6 +2,7 @@ using LINGYUN.Abp.AIManagement.Localization; using LINGYUN.Abp.AIManagement.Permissions; using LINGYUN.Abp.AIManagement.Tools.Dtos; +using LINGYUN.Abp.AIManagement.Workspaces.Dtos; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using System; @@ -12,7 +13,6 @@ using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Data; -using Volo.Abp.Domain.Entities; namespace LINGYUN.Abp.AIManagement.Tools; public class AIToolDefinitionAppService : @@ -133,6 +133,7 @@ public class AIToolDefinitionAppService : entity.ExtraProperties.Add(property.Key, property.Value); } } + entity.SetProperty(nameof(AIToolDefinitionRecordDto.IsStatic), false); return entity; } @@ -156,12 +157,16 @@ public class AIToolDefinitionAppService : if (!entity.HasSameExtraProperties(updateInput)) { + var isStatic = entity.GetProperty(nameof(AIToolDefinitionRecordDto.IsStatic), true); + entity.ExtraProperties.Clear(); foreach (var property in updateInput.ExtraProperties) { entity.ExtraProperties.Add(property.Key, property.Value); } + + entity.SetProperty(nameof(AIToolDefinitionRecordDto.IsStatic), isStatic); } entity.SetConcurrencyStampIfNotNull(updateInput.ConcurrencyStamp); diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Workspaces/WorkspaceDefinitionAppService.cs b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Workspaces/WorkspaceDefinitionAppService.cs index f4337fb02..76d98874a 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Workspaces/WorkspaceDefinitionAppService.cs +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Application/LINGYUN/Abp/AIManagement/Workspaces/WorkspaceDefinitionAppService.cs @@ -13,7 +13,6 @@ using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Data; -using Volo.Abp.Domain.Entities; using Volo.Abp.Security.Encryption; namespace LINGYUN.Abp.AIManagement.Workspaces; @@ -137,6 +136,8 @@ public class WorkspaceDefinitionAppService : } } + entity.SetProperty(nameof(WorkspaceDefinitionRecordDto.IsStatic), false); + return entity; } @@ -210,12 +211,16 @@ public class WorkspaceDefinitionAppService : if (!entity.HasSameExtraProperties(updateInput)) { + var isStatic = entity.GetProperty(nameof(WorkspaceDefinitionRecordDto.IsStatic), true); + entity.ExtraProperties.Clear(); foreach (var property in updateInput.ExtraProperties) { entity.ExtraProperties.Add(property.Key, property.Value); } + + entity.SetProperty(nameof(WorkspaceDefinitionRecordDto.IsStatic), isStatic); } entity.SetConcurrencyStampIfNotNull(updateInput.ConcurrencyStamp); diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/en.json b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/en.json index 5eb375163..f8d407937 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/en.json +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/en.json @@ -62,6 +62,7 @@ "Tools:Edit": "Edit Tool", "DesignConversationNamePrompt": "Based on the user's question, generate a concise and descriptive conversation title, with the length limited to {0} characters or less.", "Settings:AIManagement": "Artificia Intelligence", - "Settings:AIManagement.ChatMessage": "Chats" + "Settings:AIManagement.ChatMessage": "Chats", + "ResetApiKey": "Reset Api Key" } } \ No newline at end of file diff --git a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/zh-Hans.json b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/zh-Hans.json index 5c97079d8..d647d728c 100644 --- a/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/zh-Hans.json +++ b/aspnet-core/modules/ai/LINGYUN.Abp.AIManagement.Domain.Shared/LINGYUN/Abp/AIManagement/Localization/Resources/zh-Hans.json @@ -62,6 +62,7 @@ "Tools:Edit": "编辑工具", "DesignConversationNamePrompt": "根据用户的提问, 生成一个简短且具有描述性的对话名称, 长度必须控制在 {0} 个字符以内.", "Settings:AIManagement": "人工智能", - "Settings:AIManagement.ChatMessage": "对话管理" + "Settings:AIManagement.ChatMessage": "对话管理", + "ResetApiKey": "重置Api Key" } } \ No newline at end of file diff --git a/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureDefinitionAppService.cs b/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureDefinitionAppService.cs index 3fa0cdaa9..f08c1b017 100644 --- a/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureDefinitionAppService.cs +++ b/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureDefinitionAppService.cs @@ -193,10 +193,19 @@ public class FeatureDefinitionAppService : FeatureManagementAppServiceBase, IFea { record.AllowedProviders = allowedProviders; } - record.ExtraProperties.Clear(); - foreach (var property in input.ExtraProperties) + + if (!record.HasSameExtraProperties(input)) { - record.SetProperty(property.Key, property.Value); + var isStatic = record.GetProperty(nameof(FeatureDefinitionDto.IsStatic), true); + + record.ExtraProperties.Clear(); + + foreach (var property in input.ExtraProperties) + { + record.ExtraProperties.Add(property.Key, property.Value); + } + + record.SetProperty(nameof(FeatureDefinitionDto.IsStatic), isStatic); } try { diff --git a/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureGroupDefinitionAppService.cs b/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureGroupDefinitionAppService.cs index 88787d877..75be6f304 100644 --- a/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureGroupDefinitionAppService.cs +++ b/aspnet-core/modules/feature-management/LINGYUN.Abp.FeatureManagement.Application/LINGYUN/Abp/FeatureManagement/Definitions/FeatureGroupDefinitionAppService.cs @@ -131,11 +131,20 @@ public class FeatureGroupDefinitionAppService : FeatureManagementAppServiceBase, protected virtual void UpdateByInput(FeatureGroupDefinitionRecord record, FeatureGroupDefinitionCreateOrUpdateDto input) { - record.ExtraProperties.Clear(); - foreach (var property in input.ExtraProperties) + if (!record.HasSameExtraProperties(input)) { - record.SetProperty(property.Key, property.Value); + var isStatic = record.GetProperty(nameof(FeatureGroupDefinitionDto.IsStatic), true); + + record.ExtraProperties.Clear(); + + foreach (var property in input.ExtraProperties) + { + record.ExtraProperties.Add(property.Key, property.Value); + } + + record.SetProperty(nameof(FeatureGroupDefinitionDto.IsStatic), isStatic); } + if (!string.Equals(record.DisplayName, input.DisplayName, StringComparison.InvariantCultureIgnoreCase)) { record.DisplayName = input.DisplayName; diff --git a/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionDefinitionAppService.cs b/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionDefinitionAppService.cs index 04859c389..eefdeada3 100644 --- a/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionDefinitionAppService.cs +++ b/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionDefinitionAppService.cs @@ -197,11 +197,18 @@ public class PermissionDefinitionAppService : PermissionManagementAppServiceBase { record.Providers = providers; } - - record.ExtraProperties.Clear(); - foreach (var property in input.ExtraProperties) + if (!record.HasSameExtraProperties(input)) { - record.SetProperty(property.Key, property.Value); + var isStatic = record.GetProperty(nameof(PermissionDefinitionDto.IsStatic), true); + + record.ExtraProperties.Clear(); + + foreach (var property in input.ExtraProperties) + { + record.ExtraProperties.Add(property.Key, property.Value); + } + + record.SetProperty(nameof(PermissionDefinitionDto.IsStatic), isStatic); } try diff --git a/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionGroupDefinitionAppService.cs b/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionGroupDefinitionAppService.cs index 13b0e1bf3..535a91d8c 100644 --- a/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionGroupDefinitionAppService.cs +++ b/aspnet-core/modules/permissions-management/LINGYUN.Abp.PermissionManagement.Application/LINGYUN/Abp/PermissionManagement/Definitions/PermissionGroupDefinitionAppService.cs @@ -144,10 +144,18 @@ public class PermissionGroupDefinitionAppService : PermissionManagementAppServic protected virtual void UpdateByInput(PermissionGroupDefinitionRecord record, PermissionGroupDefinitionCreateOrUpdateDto input) { - record.ExtraProperties.Clear(); - foreach (var property in input.ExtraProperties) + if (!record.HasSameExtraProperties(input)) { - record.SetProperty(property.Key, property.Value); + var isStatic = record.GetProperty(nameof(PermissionGroupDefinitionDto.IsStatic), true); + + record.ExtraProperties.Clear(); + + foreach (var property in input.ExtraProperties) + { + record.ExtraProperties.Add(property.Key, property.Value); + } + + record.SetProperty(nameof(PermissionGroupDefinitionDto.IsStatic), isStatic); } if (!string.Equals(record.DisplayName, input.DisplayName, StringComparison.InvariantCultureIgnoreCase)) { diff --git a/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Application/LINGYUN/Abp/Notifications/Definitions/Groups/NotificationGroupDefinitionAppService.cs b/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Application/LINGYUN/Abp/Notifications/Definitions/Groups/NotificationGroupDefinitionAppService.cs index c392dc17e..b7f2b8ffe 100644 --- a/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Application/LINGYUN/Abp/Notifications/Definitions/Groups/NotificationGroupDefinitionAppService.cs +++ b/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Application/LINGYUN/Abp/Notifications/Definitions/Groups/NotificationGroupDefinitionAppService.cs @@ -120,11 +120,6 @@ public class NotificationGroupDefinitionAppService : AbpNotificationsApplication protected virtual void UpdateByInput(NotificationDefinitionGroupRecord record, NotificationGroupDefinitionCreateOrUpdateDto input) { record.AllowSubscriptionToClients = input.AllowSubscriptionToClients; - record.ExtraProperties.Clear(); - foreach (var property in input.ExtraProperties) - { - record.SetProperty(property.Key, property.Value); - } if (!string.Equals(record.DisplayName, input.DisplayName, StringComparison.InvariantCultureIgnoreCase)) { @@ -134,6 +129,19 @@ public class NotificationGroupDefinitionAppService : AbpNotificationsApplication { record.Description = input.Description; } + if (!record.HasSameExtraProperties(input)) + { + var isStatic = record.GetProperty(nameof(NotificationGroupDefinitionDto.IsStatic), true); + + record.ExtraProperties.Clear(); + + foreach (var property in input.ExtraProperties) + { + record.ExtraProperties.Add(property.Key, property.Value); + } + + record.SetProperty(nameof(NotificationGroupDefinitionDto.IsStatic), isStatic); + } } protected async virtual Task FindByNameAsync(string name) diff --git a/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Application/LINGYUN/Abp/Notifications/Definitions/Notifications/NotificationDefinitionAppService.cs b/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Application/LINGYUN/Abp/Notifications/Definitions/Notifications/NotificationDefinitionAppService.cs index ecddbef2f..4922c3d6a 100644 --- a/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Application/LINGYUN/Abp/Notifications/Definitions/Notifications/NotificationDefinitionAppService.cs +++ b/aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Application/LINGYUN/Abp/Notifications/Definitions/Notifications/NotificationDefinitionAppService.cs @@ -172,10 +172,18 @@ public class NotificationDefinitionAppService : AbpNotificationsApplicationServi { record.Providers = allowedProviders; } - record.ExtraProperties.Clear(); - foreach (var property in input.ExtraProperties) + if (!record.HasSameExtraProperties(input)) { - record.SetProperty(property.Key, property.Value); + var isStatic = record.GetProperty(nameof(NotificationDefinitionDto.IsStatic), true); + + record.ExtraProperties.Clear(); + + foreach (var property in input.ExtraProperties) + { + record.ExtraProperties.Add(property.Key, property.Value); + } + + record.SetProperty(nameof(NotificationDefinitionDto.IsStatic), isStatic); } } diff --git a/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/SettingDefinitionAppService.cs b/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/SettingDefinitionAppService.cs index f454a0ef3..a2a8af0e0 100644 --- a/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/SettingDefinitionAppService.cs +++ b/aspnet-core/modules/settings/LINGYUN.Abp.SettingManagement.Application/LINGYUN/Abp/SettingManagement/SettingDefinitionAppService.cs @@ -196,11 +196,18 @@ public class SettingDefinitionAppService : SettingManagementAppServiceBase, ISet record.IsEncrypted = input.IsEncrypted; record.IsVisibleToClients = input.IsVisibleToClients; record.Providers = input.Providers?.JoinAsString(","); - record.ExtraProperties.Clear(); - - foreach (var property in input.ExtraProperties) + if (!record.HasSameExtraProperties(input)) { - record.ExtraProperties.Add(property.Key, property.Value); + var isStatic = record.GetProperty(nameof(SettingDefinitionDto.IsStatic), true); + + record.ExtraProperties.Clear(); + + foreach (var property in input.ExtraProperties) + { + record.ExtraProperties.Add(property.Key, property.Value); + } + + record.SetProperty(nameof(SettingDefinitionDto.IsStatic), isStatic); } } diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/en.json b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/en.json index c879c78e1..002a90b9b 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/en.json +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/en.json @@ -38,7 +38,7 @@ "TemplateContentUpdated": "The template content has been updated", "TemplateContentRestoredToDefault": "The template content is restored to the default value.", "CustomizePerCulture": "Customize per culture", - "InlineContentDescription": "This template uses inline localization. You can use the L<\/b> function to localize a text, like {{L \"Hello\"}}<\/b>. If you still want to define a completely new template for a culture, use the \"Customize per culture\" button.
To get more information about syntax and other details, please check the Text Templates documentation<\/a>..", + "InlineContentDescription": "This template uses inline localization. You can use the **L** function to localize a text, like **{{L \"Hello\"}}**. If you still want to define a completely new template for a culture, use the \"Customize per culture\" button. \nTo get more information about syntax and other details, please check the [Text Templates documentation](https://docs.abp.io/en/abp/latest/Text-Templating).", "RestoreTemplateToDefault": "Revert to the default template", "RestoreTemplateToDefaultMessage": "Are you sure? This is a built-in template. This operation restores the template to its default properties.", "TemplateUpdated": "Template properties have been updated", diff --git a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/zh-Hans.json b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/zh-Hans.json index 7f7a8727d..ac4d9acd5 100644 --- a/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/zh-Hans.json +++ b/aspnet-core/modules/text-templating/LINGYUN.Abp.TextTemplating.Domain.Shared/LINGYUN/Abp/TextTemplating/Localization/Resources/zh-Hans.json @@ -38,7 +38,7 @@ "TemplateContentUpdated": "模板内容已更新", "TemplateContentRestoredToDefault": "模板内容恢复为默认值.", "CustomizePerCulture": "根据文化定制", - "InlineContentDescription": "该模板使用内联本地化. 你可以使用L函数对文本进行本地化,例如 {{L \"Hello\"}}如果你仍想为区域性定义一个全新的模板,请使用\"根据文化定制\"按钮.
请检查
文本模板文档获取更多信息.", + "InlineContentDescription": "该模板使用内联本地化. 你可以使用 **L** 函数对文本进行本地化,例如 **{{L \"Hello\"}}**.如果你仍想为区域性定义一个全新的模板,请使用\"根据文化定制\"按钮. \n请检查 [文本模板文档](https://docs.abp.io/en/abp/latest/Text-Templating) 获取更多信息.", "RestoreTemplateToDefault": "还原到默认模板", "RestoreTemplateToDefaultMessage": "你确定吗? 此模板为内置模板, 此操作将还原模板为默认属性.", "TemplateUpdated": "模板属性已更新", diff --git a/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/Definitions/WebhookDefinitionAppService.cs b/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/Definitions/WebhookDefinitionAppService.cs index 33f1fc5be..a68410ed8 100644 --- a/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/Definitions/WebhookDefinitionAppService.cs +++ b/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/Definitions/WebhookDefinitionAppService.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Data; +using Volo.Abp.Domain.Entities; namespace LINGYUN.Abp.WebhooksManagement.Definitions; @@ -134,9 +135,18 @@ public class WebhookDefinitionAppService : WebhooksManagementAppServiceBase, IWe { record.IsEnabled = input.IsEnabled; record.ExtraProperties.Clear(); - foreach (var property in input.ExtraProperties) + if (!record.HasSameExtraProperties(input)) { - record.SetProperty(property.Key, property.Value); + var isStatic = record.GetProperty(nameof(WebhookDefinitionDto.IsStatic), true); + + record.ExtraProperties.Clear(); + + foreach (var property in input.ExtraProperties) + { + record.ExtraProperties.Add(property.Key, property.Value); + } + + record.SetProperty(nameof(WebhookDefinitionDto.IsStatic), isStatic); } if (!string.Equals(record.Description, input.Description, StringComparison.InvariantCultureIgnoreCase)) diff --git a/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/Definitions/WebhookGroupDefinitionAppService.cs b/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/Definitions/WebhookGroupDefinitionAppService.cs index 3eb1ba6c0..29b5abba6 100644 --- a/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/Definitions/WebhookGroupDefinitionAppService.cs +++ b/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/Definitions/WebhookGroupDefinitionAppService.cs @@ -100,10 +100,19 @@ public class WebhookGroupDefinitionAppService : WebhooksManagementAppServiceBase CheckIsStaticDefinitionRecord(definitionRecord); - definitionRecord.ExtraProperties.Clear(); - foreach (var property in input.ExtraProperties) + + if (!definitionRecord.HasSameExtraProperties(input)) { - definitionRecord.SetProperty(property.Key, property.Value); + var isStatic = definitionRecord.GetProperty(nameof(WebhookGroupDefinitionDto.IsStatic), true); + + definitionRecord.ExtraProperties.Clear(); + + foreach (var property in input.ExtraProperties) + { + definitionRecord.ExtraProperties.Add(property.Key, property.Value); + } + + definitionRecord.SetProperty(nameof(WebhookGroupDefinitionDto.IsStatic), isStatic); } if (!string.Equals(definitionRecord.DisplayName, input.DisplayName, StringComparison.InvariantCultureIgnoreCase)) From 85bc343dc1a801a4710a087bf1776dfe0753fbdc Mon Sep 17 00:00:00 2001 From: colin Date: Wed, 26 Aug 2026 15:00:21 +0800 Subject: [PATCH 09/10] feat: Optimize the definition management page --- .../tools/AIToolDefinitionModal.vue | 5 +- .../tools/AIToolDefinitionTable.vue | 1 + .../workspaces/WorkspaceDefinitionModal.vue | 4 +- .../workspaces/WorkspaceDefinitionTable.vue | 46 ++++++++++- .../workspaces/WorkspaceResetApiKeyModal.vue | 71 +++++++++++++++++ .../@abp/ai-management/src/types/tools.ts | 1 + .../ai-management/src/types/workspaces.ts | 1 + .../@abp/components/src/vditor/Viewer.vue | 5 +- .../features/FeatureDefinitionTable.vue | 13 +-- .../groups/FeatureGroupDefinitionTable.vue | 16 ++-- .../groups/PermissionGroupDefinitionTable.vue | 79 +++++++++---------- .../permissions/PermissionDefinitionModal.vue | 16 +++- .../permissions/PermissionDefinitionTable.vue | 63 +++++++++++++-- .../definitions/SettingDefinitionTable.vue | 49 ++++++------ .../definitions/TemplateContentModal.vue | 4 +- .../definitions/TemplateDefinitionModal.vue | 6 +- .../definitions/TemplateDefinitionTable.vue | 10 ++- .../components/properties/PropertyTable.vue | 2 +- 18 files changed, 293 insertions(+), 99 deletions(-) create mode 100644 apps/vben5/packages/@abp/ai-management/src/components/workspaces/WorkspaceResetApiKeyModal.vue diff --git a/apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionModal.vue b/apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionModal.vue index b4c91f861..0f78aab90 100644 --- a/apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionModal.vue +++ b/apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionModal.vue @@ -52,6 +52,7 @@ const defaultModel: AIToolDefinitionVto = { name: '', isEnabled: true, isGlobal: false, + isStatic: false, isSystem: false, provider: '', extraProperties: {}, @@ -80,7 +81,7 @@ const getAIToolOptions = computed>(() => { // 表单允许编辑 const getIsAllowUpdate = computed(() => { if (formModel.value.id) { - if (formModel.value.isSystem) { + if (formModel.value.isSystem || formModel.value.isStatic) { return false; } return isGranted(AIToolDefinitionPermissions.Update); @@ -140,6 +141,7 @@ async function onInit() { modalApi.setState({ loading: true, title: $t('AIManagement.Tools:New'), + showConfirmButton: true, }); await onInitProviderOptions(); const { id } = modalApi.getData(); @@ -154,6 +156,7 @@ async function onInit() { (p) => p.name === dto.provider, ); modalApi.setState({ + showConfirmButton: !dto.isSystem && !dto.isStatic, title: $t('AIManagement.Tools:Edit'), }); } finally { diff --git a/apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionTable.vue b/apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionTable.vue index 72ebd68af..88f9ab131 100644 --- a/apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionTable.vue +++ b/apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionTable.vue @@ -220,6 +220,7 @@ async function onDelete(row: AIToolDefinitionRecordDto) { - + diff --git a/apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionModal.vue b/apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionModal.vue index ce8793210..48075c404 100644 --- a/apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionModal.vue +++ b/apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionModal.vue @@ -16,6 +16,7 @@ import { useVbenModal } from '@vben/common-ui'; import { $t } from '@vben/locales'; import { + isNullOrWhiteSpace, listToTree, useLocalization, useLocalizationSerializer, @@ -94,9 +95,15 @@ const [Modal, modalApi] = useVbenModal({ }, onConfirm: async () => { await form.value?.validate(); + const input = toValue(formModel); const api = isEditModel.value - ? updateApi(formModel.value.name, toValue(formModel)) - : createApi(toValue(formModel)); + ? updateApi(formModel.value.name, input) + : createApi({ + ...input, + name: isNullOrWhiteSpace(input.parentName) + ? input.name + : `${input.parentName}.${input.name}`, + }); modalApi.setState({ submitting: true }); api .then((res) => { @@ -121,9 +128,11 @@ const [Modal, modalApi] = useVbenModal({ }); try { modalApi.setState({ loading: true }); - const { groupName, name } = modalApi.getData(); + const { groupName, name, parentName } = + modalApi.getData(); name && (await onGet(name)); await Promise.all([onInitGroups(groupName), onInitProviders()]); + formModel.value.parentName = parentName; } finally { modalApi.setState({ loading: false }); } @@ -251,6 +260,7 @@ function onPropDelete(prop: PropertyInfo) { > diff --git a/apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionTable.vue b/apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionTable.vue index 8b4316a37..ccaabcd88 100644 --- a/apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionTable.vue +++ b/apps/vben5/packages/@abp/permissions/src/components/definitions/permissions/PermissionDefinitionTable.vue @@ -1,10 +1,12 @@ @@ -287,7 +312,7 @@ onMounted(onGet); + + +