diff --git a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs index 3d4d983f3b..162fa7cf51 100644 --- a/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs +++ b/modules/cms-kit/host/Volo.CmsKit.Host.Shared/FeatureConfigurer.cs @@ -1,10 +1,12 @@ -namespace Volo.CmsKit +using Volo.Abp.GlobalFeatures; + +namespace Volo.CmsKit { public static class FeatureConfigurer { public static void Configure() { - CmsKitFeatures.EnableAll(); + GlobalFeatureManager.Instance.Modules().CmsKit().EnableAll(); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs new file mode 100644 index 0000000000..4221b635c0 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeature.cs @@ -0,0 +1,36 @@ +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public class GlobalFeature + { + public GlobalFeatureManagerModuleConfigurator ModuleConfigurator { get; } + + public string Name { get; } + + public bool IsEnabled => ModuleConfigurator.ModulesConfigurator.FeatureManager.IsEnabled(Name); + + public GlobalFeature( + [NotNull] GlobalFeatureManagerModuleConfigurator moduleConfigurator, + [NotNull] string name) + { + ModuleConfigurator = Check.NotNull(moduleConfigurator, nameof(moduleConfigurator)); + Name = Check.NotNullOrWhiteSpace(name, nameof(name)); + } + + public virtual void Enable() + { + ModuleConfigurator.ModulesConfigurator.FeatureManager.Enable(Name); + } + + public virtual void Disable() + { + ModuleConfigurator.ModulesConfigurator.FeatureManager.Disable(Name); + } + + public virtual void SetEnabled(bool isEnabled) + { + ModuleConfigurator.ModulesConfigurator.FeatureManager.SetEnabled(Name, isEnabled); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs new file mode 100644 index 0000000000..bed947e4a8 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManager.cs @@ -0,0 +1,54 @@ +using System.Collections.Concurrent; +using System.Collections.Generic; +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public class GlobalFeatureManager //TODO: Move to the ABP Framework..? //rename? + { + public static GlobalFeatureManager Instance { get; protected set; } = new GlobalFeatureManager(); + + [NotNull] + public ConcurrentDictionary Configuration { get; } + + protected HashSet EnabledFeatures { get; } + + private GlobalFeatureManager() + { + EnabledFeatures = new HashSet(); + Configuration = new ConcurrentDictionary(); + } + + public virtual bool IsEnabled(string featureName) + { + return EnabledFeatures.Contains(featureName); + } + + public virtual void SetEnabled(string featureName, bool isEnabled) + { + if (isEnabled) + { + Enable(featureName); + } + else + { + Disable(featureName); + } + } + + public virtual void Enable(string featureName) + { + EnabledFeatures.AddIfNotContains(featureName); + } + + public virtual void Disable(string featureName) + { + EnabledFeatures.Remove(featureName); + } + + public virtual IEnumerable GetEnabledFeatures() + { + return EnabledFeatures; + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs new file mode 100644 index 0000000000..c3a1183866 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfigurator.cs @@ -0,0 +1,12 @@ +namespace Volo.Abp.GlobalFeatures +{ + public class GlobalFeatureManagerCmsKitConfigurator : GlobalFeatureManagerModuleConfigurator + { + public GlobalFeatureManagerCmsKitConfigurator(GlobalFeatureManagerModulesConfigurator modulesConfigurator) + : base(modulesConfigurator) + { + this.Reactions(); + this.Comments(); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfiguratorExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfiguratorExtensions.cs new file mode 100644 index 0000000000..4175271f0b --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerCmsKitConfiguratorExtensions.cs @@ -0,0 +1,52 @@ +using System; +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public static class GlobalFeatureManagerCmsKitConfiguratorExtensions + { + public static GlobalFeature Reactions( + [NotNull] this GlobalFeatureManagerCmsKitConfigurator cmsKitConfigurator) + { + Check.NotNull(cmsKitConfigurator, nameof(cmsKitConfigurator)); + + return cmsKitConfigurator + .Features + .GetOrAdd("Reactions", _ => new GlobalFeature(cmsKitConfigurator, "CmsKit:Reactions")) + as GlobalFeature; + } + + public static GlobalFeatureManagerCmsKitConfigurator Reactions( + [NotNull] this GlobalFeatureManagerCmsKitConfigurator cmsKitConfigurator, + [NotNull] Action configureAction) + { + Check.NotNull(cmsKitConfigurator, nameof(cmsKitConfigurator)); + + configureAction(cmsKitConfigurator.Reactions()); + + return cmsKitConfigurator; + } + + public static GlobalFeature Comments( + [NotNull] this GlobalFeatureManagerCmsKitConfigurator cmsKitConfigurator) + { + Check.NotNull(cmsKitConfigurator, nameof(cmsKitConfigurator)); + + return cmsKitConfigurator + .Features + .GetOrAdd("Comments", _ => new GlobalFeature(cmsKitConfigurator, "CmsKit:Comments")) + as GlobalFeature; + } + + public static GlobalFeatureManagerCmsKitConfigurator Comments( + [NotNull] this GlobalFeatureManagerCmsKitConfigurator cmsKitConfigurator, + [NotNull] Action configureAction) + { + Check.NotNull(cmsKitConfigurator, nameof(cmsKitConfigurator)); + + configureAction(cmsKitConfigurator.Comments()); + + return cmsKitConfigurator; + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerExtensions.cs new file mode 100644 index 0000000000..9f148fcef9 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerExtensions.cs @@ -0,0 +1,18 @@ +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public static class GlobalFeatureManagerExtensions + { + public static GlobalFeatureManagerModulesConfigurator Modules( + [NotNull] this GlobalFeatureManager featureManager) + { + Check.NotNull(featureManager, nameof(featureManager)); + + return featureManager + .Configuration + .GetOrAdd("_Modules", _ => new GlobalFeatureManagerModulesConfigurator(featureManager)) + as GlobalFeatureManagerModulesConfigurator; + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs new file mode 100644 index 0000000000..1c9ff9ae7c --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfigurator.cs @@ -0,0 +1,36 @@ +using System.Collections.Concurrent; +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public abstract class GlobalFeatureManagerModuleConfigurator + { + [NotNull] + public GlobalFeatureManagerModulesConfigurator ModulesConfigurator { get; } + + [NotNull] + public ConcurrentDictionary Features { get; } + + protected GlobalFeatureManagerModuleConfigurator(GlobalFeatureManagerModulesConfigurator modulesConfigurator) + { + ModulesConfigurator = Check.NotNull(modulesConfigurator, nameof(modulesConfigurator)); + Features = new ConcurrentDictionary(); + } + + public virtual void EnableAll() + { + foreach (var feature in Features.Values) + { + feature.Enable(); + } + } + + public virtual void DisableAll() + { + foreach (var feature in Features.Values) + { + feature.Disable(); + } + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs new file mode 100644 index 0000000000..9449ef702c --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModuleConfiguratorCmsKitExtensions.cs @@ -0,0 +1,30 @@ +using System; +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public static class GlobalFeatureManagerModuleConfiguratorCmsKitExtensions + { + public static GlobalFeatureManagerCmsKitConfigurator CmsKit( + [NotNull] this GlobalFeatureManagerModulesConfigurator modulesConfigurator) + { + Check.NotNull(modulesConfigurator, nameof(modulesConfigurator)); + + return modulesConfigurator + .Modules + .GetOrAdd("CmsKit", _ => new GlobalFeatureManagerCmsKitConfigurator(modulesConfigurator)) + as GlobalFeatureManagerCmsKitConfigurator; + } + + public static GlobalFeatureManagerModulesConfigurator CmsKit( + [NotNull] this GlobalFeatureManagerModulesConfigurator modulesConfigurator, + [NotNull] Action configureAction) + { + Check.NotNull(configureAction, nameof(configureAction)); + + configureAction(modulesConfigurator.CmsKit()); + + return modulesConfigurator; + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModulesConfigurator.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModulesConfigurator.cs new file mode 100644 index 0000000000..acaa13beab --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/Abp/GlobalFeatures/GlobalFeatureManagerModulesConfigurator.cs @@ -0,0 +1,19 @@ +using System.Collections.Concurrent; +using JetBrains.Annotations; + +namespace Volo.Abp.GlobalFeatures +{ + public class GlobalFeatureManagerModulesConfigurator //TODO: Change to GlobalFeatureManagerModuleDictionary and inherit from ConcurrentDictionary + { + public GlobalFeatureManager FeatureManager { get; } + + [NotNull] + public ConcurrentDictionary Modules { get; } + + public GlobalFeatureManagerModulesConfigurator([NotNull] GlobalFeatureManager featureManager) + { + FeatureManager = Check.NotNull(featureManager, nameof(featureManager)); + Modules = new ConcurrentDictionary(); + } + } +} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs index 925acdaf79..468222df8f 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitDomainSharedModule.cs @@ -1,4 +1,5 @@ -using Volo.Abp.Modularity; +using Volo.Abp.GlobalFeatures; +using Volo.Abp.Modularity; using Volo.Abp.Localization; using Volo.CmsKit.Localization; using Volo.Abp.Localization.ExceptionHandling; @@ -15,6 +16,20 @@ namespace Volo.CmsKit { public override void ConfigureServices(ServiceConfigurationContext context) { + GlobalFeatureManager.Instance.Modules().CmsKit().EnableAll(); + GlobalFeatureManager.Instance.Modules().CmsKit().DisableAll(); + GlobalFeatureManager.Instance.Modules().CmsKit().Reactions().Enable(); + GlobalFeatureManager.Instance.Modules().CmsKit(cmsKit => + { + cmsKit.Reactions().Disable(); + cmsKit.Reactions(reactions => + { + reactions.Enable(); + }); + }); + + GlobalFeatureManager.Instance.IsEnabled("asd"); + Configure(options => { options.FileSets.AddEmbedded(); diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitFeatures.cs deleted file mode 100644 index 6e9dff0011..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitFeatures.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System.Collections.Generic; - -namespace Volo.CmsKit -{ - public static class CmsKitFeatures - { - public const string NamePrefix = "CmsKit"; - - public static class Reactions - { - public const string Name = NamePrefix + ".Reactions"; - - public static bool IsEnabled - { - get => GlobalFeatures.IsEnabled(Name); - set => GlobalFeatures.SetEnabled(Name, value); - } - } - - public static class Comments - { - public const string Name = NamePrefix + ".Comments"; - - public static bool IsEnabled - { - get => GlobalFeatures.IsEnabled(Name); - set => GlobalFeatures.SetEnabled(Name, value); - } - } - - public static void EnableAll() - { - foreach (var featureName in GetAllNames()) - { - GlobalFeatures.Enable(featureName); - } - } - - public static void DisableAll() - { - foreach (var featureName in GetAllNames()) - { - GlobalFeatures.Disable(featureName); - } - } - - public static IEnumerable GetAllNames() - { - return new[] - { - Reactions.Name, - Comments.Name - }; - } - } -} diff --git a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures.cs b/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures.cs deleted file mode 100644 index 3c038431ca..0000000000 --- a/modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/GlobalFeatures.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Collections.Generic; -using System.Linq; - -namespace Volo.CmsKit -{ - internal static class GlobalFeatures //TODO: Move to the ABP Framework..? - { - private static readonly HashSet EnabledFeatures = new HashSet(); - - public static bool IsEnabled(string featureName) - { - return EnabledFeatures.Contains(featureName); - } - - public static void SetEnabled(string featureName, bool isEnabled) - { - if (isEnabled) - { - Enable(featureName); - } - else - { - Disable(featureName); - } - } - - public static void Enable(string featureName) - { - EnabledFeatures.AddIfNotContains(featureName); - } - - public static void Disable(string featureName) - { - EnabledFeatures.Remove(featureName); - } - - public static IEnumerable GetEnabledFeatures() - { - return EnabledFeatures; - } - } -} diff --git a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs index d778f43f57..d16d11c40a 100644 --- a/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs +++ b/modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitDbContextModelCreatingExtensions.cs @@ -2,6 +2,7 @@ using Microsoft.EntityFrameworkCore; using Volo.Abp; using Volo.Abp.EntityFrameworkCore.Modeling; +using Volo.Abp.GlobalFeatures; using Volo.CmsKit.Comments; using Volo.CmsKit.Reactions; using Volo.CmsKit.Users; @@ -32,7 +33,7 @@ namespace Volo.CmsKit.EntityFrameworkCore b.ConfigureAbpUser(); }); - if (CmsKitFeatures.Reactions.IsEnabled) + if (GlobalFeatureManager.Instance.Modules().CmsKit().Reactions().IsEnabled) { builder.Entity(b => { @@ -49,7 +50,7 @@ namespace Volo.CmsKit.EntityFrameworkCore }); } - if (CmsKitFeatures.Comments.IsEnabled) + if (GlobalFeatureManager.Instance.Modules().CmsKit().Comments().IsEnabled) { builder.Entity(b => { diff --git a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs index 7451c755a8..9ceaa348d0 100644 --- a/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs +++ b/modules/cms-kit/test/Volo.CmsKit.TestBase/CmsKitTestBaseModule.cs @@ -3,6 +3,7 @@ using Volo.Abp; using Volo.Abp.Authorization; using Volo.Abp.Autofac; using Volo.Abp.Data; +using Volo.Abp.GlobalFeatures; using Volo.Abp.Modularity; using Volo.Abp.Threading; @@ -18,7 +19,7 @@ namespace Volo.CmsKit { public override void ConfigureServices(ServiceConfigurationContext context) { - CmsKitFeatures.EnableAll(); + GlobalFeatureManager.Instance.Modules().CmsKit().EnableAll(); context.Services.AddAlwaysAllowAuthorization(); }