diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs index db6dabf9c6..515db2b03f 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/AbpFeatureManagementDomainModule.cs @@ -20,6 +20,7 @@ namespace Volo.Abp.FeatureManagement Configure(options => { options.Providers.Add(); + options.Providers.Add(); options.Providers.Add(); }); diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/EditionFeatureManagementProvider.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/EditionFeatureManagementProvider.cs new file mode 100644 index 0000000000..d904ef124a --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/EditionFeatureManagementProvider.cs @@ -0,0 +1,32 @@ +using System.Security.Principal; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; +using Volo.Abp.Security.Claims; + +namespace Volo.Abp.FeatureManagement +{ + public class EditionFeatureManagementProvider : FeatureManagementProvider, ITransientDependency + { + public override string Name => EditionFeatureValueProvider.ProviderName; + + protected ICurrentPrincipalAccessor PrincipalAccessor { get; } + + public EditionFeatureManagementProvider( + IFeatureManagementStore store, + ICurrentPrincipalAccessor principalAccessor) + : base(store) + { + PrincipalAccessor = principalAccessor; + } + + protected override string NormalizeProviderKey(string providerKey) + { + if (providerKey != null) + { + return providerKey; + } + + return PrincipalAccessor.Principal?.FindEditionId()?.ToString("N"); + } + } +} \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/EditionFeatureManagerExtensions.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/EditionFeatureManagerExtensions.cs new file mode 100644 index 0000000000..9cad051d5f --- /dev/null +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/EditionFeatureManagerExtensions.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Volo.Abp.Features; + +namespace Volo.Abp.FeatureManagement +{ + public static class EditionFeatureManagerExtensions + { + public static Task GetOrNullForEditionAsync(this IFeatureManager featureManager, [NotNull] string name, Guid editionId, bool fallback = true) + { + return featureManager.GetOrNullAsync(name, EditionFeatureValueProvider.ProviderName, editionId.ToString("N"), fallback); + } + + public static Task> GetAllForEditionAsync(this IFeatureManager featureManager, Guid editionId, bool fallback = true) + { + return featureManager.GetAllAsync(EditionFeatureValueProvider.ProviderName, editionId.ToString("N"), fallback); + } + + public static Task SetForEditionAsync(this IFeatureManager featureManager, Guid editionId, [NotNull] string name, [CanBeNull] string value, bool forceToSet = false) + { + return featureManager.SetAsync(name, value, EditionFeatureValueProvider.ProviderName, editionId.ToString("N"), forceToSet); + } + } +} \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/TenantFeatureManagementProvider.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/TenantFeatureManagementProvider.cs index 928d794671..b03fc43d8a 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/TenantFeatureManagementProvider.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/TenantFeatureManagementProvider.cs @@ -1,14 +1,31 @@ -using Volo.Abp.Features; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.FeatureManagement { - public class TenantFeatureManagementProvider : FeatureManagementProvider + public class TenantFeatureManagementProvider : FeatureManagementProvider, ITransientDependency { public override string Name => TenantFeatureValueProvider.ProviderName; - public TenantFeatureManagementProvider(IFeatureManagementStore store) + protected ICurrentTenant CurrentTenant { get; } + + public TenantFeatureManagementProvider( + IFeatureManagementStore store, + ICurrentTenant currentTenant) : base(store) { + CurrentTenant = currentTenant; + } + + protected override string NormalizeProviderKey(string providerKey) + { + if (providerKey != null) + { + return providerKey; + } + + return CurrentTenant.Id?.ToString("N"); } } } \ No newline at end of file diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/TenantFeatureManagerExtensions.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/TenantFeatureManagerExtensions.cs index 6a26def9a6..972c8f7d53 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/TenantFeatureManagerExtensions.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/TenantFeatureManagerExtensions.cs @@ -13,29 +13,14 @@ namespace Volo.Abp.FeatureManagement return featureManager.GetOrNullAsync(name, TenantFeatureValueProvider.ProviderName, tenantId.ToString(), fallback); } - public static Task GetOrNullForCurrentTenantAsync(this IFeatureManager featureManager, [NotNull] string name, bool fallback = true) - { - return featureManager.GetOrNullAsync(name, TenantFeatureValueProvider.ProviderName, null, fallback); - } - public static Task> GetAllForTenantAsync(this IFeatureManager featureManager, Guid tenantId, bool fallback = true) { return featureManager.GetAllAsync(TenantFeatureValueProvider.ProviderName, tenantId.ToString(), fallback); } - public static Task> GetAllForCurrentTenantAsync(this IFeatureManager featureManager, bool fallback = true) - { - return featureManager.GetAllAsync(TenantFeatureValueProvider.ProviderName, null, fallback); - } - public static Task SetForTenantAsync(this IFeatureManager featureManager, Guid tenantId, [NotNull] string name, [CanBeNull] string value, bool forceToSet = false) { return featureManager.SetAsync(name, value, TenantFeatureValueProvider.ProviderName, tenantId.ToString(), forceToSet); } - - public static Task SetForCurrentTenantAsync(this IFeatureManager featureManager, [NotNull] string name, [CanBeNull] string value, bool forceToSet = false) - { - return featureManager.SetAsync(name, value, TenantFeatureValueProvider.ProviderName, null, forceToSet); - } } } diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Domain.Tests/Volo/Abp/FeatureManagement/FeatureManager_Tests.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.Domain.Tests/Volo/Abp/FeatureManagement/FeatureManager_Tests.cs new file mode 100644 index 0000000000..83f9fc8220 --- /dev/null +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.Domain.Tests/Volo/Abp/FeatureManagement/FeatureManager_Tests.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Features; +using Xunit; + +namespace Volo.Abp.FeatureManagement +{ + public class FeatureManager_Tests : FeatureManagementDomainTestBase + { + private readonly IFeatureManager _featureManager; + + public FeatureManager_Tests() + { + _featureManager = GetRequiredService(); + } + + [Fact] + public async Task Should_Get_A_FeatureValue_For_A_Provider() + { + (await _featureManager.GetOrNullForEditionAsync( + TestFeatureDefinitionProvider.BackupCount, + TestEditionIds.Enterprise + )).ShouldBe("5"); + } + } +} diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/AbpFeatureManagementTestBaseModule.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/AbpFeatureManagementTestBaseModule.cs index 0519d65855..bf6169b488 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/AbpFeatureManagementTestBaseModule.cs +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/AbpFeatureManagementTestBaseModule.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Authorization; using Volo.Abp.Autofac; using Volo.Abp.Modularity; @@ -17,14 +16,6 @@ namespace Volo.Abp.FeatureManagement public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddAlwaysAllowAuthorization(); - - Configure(options => - { - options.Providers.InsertBefore( - typeof(TenantFeatureManagementProvider), - typeof(EditionFeatureManagementProvider) - ); - }); } public override void OnApplicationInitialization(ApplicationInitializationContext context) diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/EditionFeatureManagementProvider.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/EditionFeatureManagementProvider.cs deleted file mode 100644 index 94500b35d9..0000000000 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/EditionFeatureManagementProvider.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Volo.Abp.Features; - -namespace Volo.Abp.FeatureManagement -{ - public class EditionFeatureManagementProvider : FeatureManagementProvider - { - public override string Name => EditionFeatureValueProvider.ProviderName; - - public EditionFeatureManagementProvider(IFeatureManagementStore store) - : base(store) - { - } - } -} \ No newline at end of file diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/FeatureManagementTestDataBuilder.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/FeatureManagementTestDataBuilder.cs index 4cfc3ff667..f402288fa3 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/FeatureManagementTestDataBuilder.cs +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/FeatureManagementTestDataBuilder.cs @@ -31,7 +31,7 @@ namespace Volo.Abp.FeatureManagement TestFeatureDefinitionProvider.SocialLogins, true.ToString().ToLowerInvariant(), EditionFeatureValueProvider.ProviderName, - TestEditionNames.Regular + TestEditionIds.Regular.ToString("N") ) ); @@ -42,7 +42,7 @@ namespace Volo.Abp.FeatureManagement TestFeatureDefinitionProvider.UserCount, "10", EditionFeatureValueProvider.ProviderName, - TestEditionNames.Regular + TestEditionIds.Regular.ToString("N") ) ); @@ -53,7 +53,7 @@ namespace Volo.Abp.FeatureManagement TestFeatureDefinitionProvider.ProjectCount, "1", EditionFeatureValueProvider.ProviderName, - TestEditionNames.Regular + TestEditionIds.Regular.ToString("N") ) ); @@ -68,7 +68,7 @@ namespace Volo.Abp.FeatureManagement TestFeatureDefinitionProvider.SocialLogins, true.ToString().ToLowerInvariant(), EditionFeatureValueProvider.ProviderName, - TestEditionNames.Enterprise + TestEditionIds.Enterprise.ToString("N") ) ); @@ -79,7 +79,7 @@ namespace Volo.Abp.FeatureManagement TestFeatureDefinitionProvider.EmailSupport, true.ToString().ToLowerInvariant(), EditionFeatureValueProvider.ProviderName, - TestEditionNames.Enterprise + TestEditionIds.Enterprise.ToString("N") ) ); @@ -90,7 +90,7 @@ namespace Volo.Abp.FeatureManagement TestFeatureDefinitionProvider.UserCount, "20", EditionFeatureValueProvider.ProviderName, - TestEditionNames.Enterprise + TestEditionIds.Enterprise.ToString("N") ) ); @@ -101,7 +101,7 @@ namespace Volo.Abp.FeatureManagement TestFeatureDefinitionProvider.ProjectCount, "3", EditionFeatureValueProvider.ProviderName, - TestEditionNames.Enterprise + TestEditionIds.Enterprise.ToString("N") ) ); @@ -112,7 +112,7 @@ namespace Volo.Abp.FeatureManagement TestFeatureDefinitionProvider.BackupCount, "5", EditionFeatureValueProvider.ProviderName, - TestEditionNames.Enterprise + TestEditionIds.Enterprise.ToString("N") ) ); @@ -127,7 +127,7 @@ namespace Volo.Abp.FeatureManagement TestFeatureDefinitionProvider.SocialLogins, true.ToString().ToLowerInvariant(), EditionFeatureValueProvider.ProviderName, - TestEditionNames.Enterprise + TestEditionIds.Ultimate.ToString("N") ) ); @@ -138,7 +138,7 @@ namespace Volo.Abp.FeatureManagement TestFeatureDefinitionProvider.EmailSupport, true.ToString().ToLowerInvariant(), EditionFeatureValueProvider.ProviderName, - TestEditionNames.Enterprise + TestEditionIds.Ultimate.ToString("N") ) ); @@ -149,7 +149,7 @@ namespace Volo.Abp.FeatureManagement TestFeatureDefinitionProvider.DailyAnalysis, true.ToString().ToLowerInvariant(), EditionFeatureValueProvider.ProviderName, - TestEditionNames.Enterprise + TestEditionIds.Ultimate.ToString("N") ) ); @@ -160,7 +160,7 @@ namespace Volo.Abp.FeatureManagement TestFeatureDefinitionProvider.UserCount, "100", EditionFeatureValueProvider.ProviderName, - TestEditionNames.Enterprise + TestEditionIds.Ultimate.ToString("N") ) ); @@ -171,7 +171,7 @@ namespace Volo.Abp.FeatureManagement TestFeatureDefinitionProvider.ProjectCount, "10", EditionFeatureValueProvider.ProviderName, - TestEditionNames.Enterprise + TestEditionIds.Ultimate.ToString("N") ) ); @@ -182,7 +182,7 @@ namespace Volo.Abp.FeatureManagement TestFeatureDefinitionProvider.BackupCount, "10", EditionFeatureValueProvider.ProviderName, - TestEditionNames.Enterprise + TestEditionIds.Ultimate.ToString("N") ) ); diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/FeatureValueRepository_Tests.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/FeatureValueRepository_Tests.cs index e25b09ebcc..4ec3d2f437 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/FeatureValueRepository_Tests.cs +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/FeatureValueRepository_Tests.cs @@ -24,7 +24,7 @@ namespace Volo.Abp.FeatureManagement var featureValue = await Repository.FindAsync( TestFeatureDefinitionProvider.ProjectCount, EditionFeatureValueProvider.ProviderName, - TestEditionNames.Enterprise + TestEditionIds.Enterprise.ToString("N") ); featureValue.ShouldNotBeNull(); @@ -34,7 +34,7 @@ namespace Volo.Abp.FeatureManagement featureValue = await Repository.FindAsync( TestFeatureDefinitionProvider.ProjectCount, EditionFeatureValueProvider.ProviderName, - "undefined-edition-name" + "undefined-edition-id" ); featureValue.ShouldBeNull(); @@ -45,7 +45,7 @@ namespace Volo.Abp.FeatureManagement { var featureValues = await Repository.GetListAsync( EditionFeatureValueProvider.ProviderName, - TestEditionNames.Enterprise + TestEditionIds.Enterprise.ToString("N") ); featureValues.Count.ShouldBeGreaterThan(0); diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/TestEditionIds.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/TestEditionIds.cs new file mode 100644 index 0000000000..540631cd45 --- /dev/null +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/TestEditionIds.cs @@ -0,0 +1,18 @@ +using System; + +namespace Volo.Abp.FeatureManagement +{ + public static class TestEditionIds + { + public static Guid Regular { get; } + public static Guid Enterprise { get; } + public static Guid Ultimate { get; } + + static TestEditionIds() + { + Regular = Guid.Parse("532599ab-c0c0-4345-a04a-e322867b6e15"); + Enterprise = Guid.Parse("27e50758-1feb-436a-be4f-cae8519e0cb2"); + Ultimate = Guid.Parse("6ea78c22-be32-497e-aaba-a2332c564c5e"); + } + } +} \ No newline at end of file diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/TestEditionNames.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/TestEditionNames.cs deleted file mode 100644 index d398ead4bb..0000000000 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/TestEditionNames.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Volo.Abp.FeatureManagement -{ - public static class TestEditionNames - { - public const string Regular = "Regular"; - public const string Enterprise = "Enterprise"; - public const string Ultimate = "Ultimate"; - } -} \ No newline at end of file