From 1ab5f27d82ee5e048f27b9a9c3c06b2a095e6d8f Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Fri, 27 Jan 2023 12:35:34 +0300 Subject: [PATCH 1/5] Use providers instead of direct repository access for resetting features --- .../FeatureManagement/FeatureAppService.cs | 7 ++--- .../Abp/FeatureManagement/FeatureManager.cs | 31 +++++++++++++++++++ .../Abp/FeatureManagement/IFeatureManager.cs | 1 + 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs index bce61c679b..4b879a6436 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs @@ -14,18 +14,15 @@ public class FeatureAppService : FeatureManagementAppServiceBase, IFeatureAppSer { protected FeatureManagementOptions Options { get; } protected IFeatureManager FeatureManager { get; } - protected IFeatureValueRepository FeatureValueRepository { get; } protected IFeatureDefinitionManager FeatureDefinitionManager { get; } public FeatureAppService(IFeatureManager featureManager, IFeatureDefinitionManager featureDefinitionManager, - IOptions options, - IFeatureValueRepository featureValueRepository) + IOptions options) { FeatureManager = featureManager; FeatureDefinitionManager = featureDefinitionManager; Options = options.Value; - FeatureValueRepository = featureValueRepository; } public virtual async Task GetAsync([NotNull] string providerName, string providerKey) @@ -140,6 +137,6 @@ public class FeatureAppService : FeatureManagementAppServiceBase, IFeatureAppSer public virtual async Task DeleteAsync([NotNull] string providerName, string providerKey) { - await FeatureValueRepository.DeleteAsync(providerName, providerKey); + await FeatureManager.DeleteAsync(providerName, providerKey); } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs index 2c255071f7..90b8cb25fd 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using System.Xml.Linq; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; using Microsoft.Extensions.Options; @@ -215,4 +216,34 @@ public class FeatureManager : IFeatureManager, ISingletonDependency return featureNameValueWithGrantedProvider; } + + public async Task DeleteAsync(string providerName, string providerKey) + { + var featureNameValues = await GetAllAsync(providerName, providerKey); + + var providers = Enumerable + .Reverse(Providers) + .SkipWhile(p => p.Name != providerName) + .ToList(); + + if (!providers.Any()) + { + return; + } + + providers = providers + .TakeWhile(p => p.Name == providerName) + .ToList(); //Getting list for case of there are more than one provider with same providerName + + + foreach (var featureNameValue in featureNameValues) + { + var feature = await FeatureDefinitionManager.GetAsync(featureNameValue.Name); + + foreach (var provider in providers) + { + await provider.ClearAsync(feature, providerKey); + } + } + } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureManager.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureManager.cs index 577e9efa7e..4d911bfac4 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureManager.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureManager.cs @@ -15,4 +15,5 @@ public interface IFeatureManager Task> GetAllWithProviderAsync([NotNull] string providerName, [CanBeNull] string providerKey, bool fallback = true); Task SetAsync([NotNull] string name, [CanBeNull] string value, [NotNull] string providerName, [CanBeNull] string providerKey, bool forceToSet = false); + Task DeleteAsync(string providerName, string providerKey); } From d38da29bdd06c084cdd7c3636b7e0e150c4d7da9 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Fri, 27 Jan 2023 12:38:58 +0300 Subject: [PATCH 2/5] Formatting on FeatureManager --- .../Volo/Abp/FeatureManagement/FeatureManager.cs | 1 - .../Volo/Abp/FeatureManagement/IFeatureManager.cs | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs index 90b8cb25fd..b3c079dd3b 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs @@ -235,7 +235,6 @@ public class FeatureManager : IFeatureManager, ISingletonDependency .TakeWhile(p => p.Name == providerName) .ToList(); //Getting list for case of there are more than one provider with same providerName - foreach (var featureNameValue in featureNameValues) { var feature = await FeatureDefinitionManager.GetAsync(featureNameValue.Name); diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureManager.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureManager.cs index 4d911bfac4..7d9063bb92 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureManager.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureManager.cs @@ -15,5 +15,6 @@ public interface IFeatureManager Task> GetAllWithProviderAsync([NotNull] string providerName, [CanBeNull] string providerKey, bool fallback = true); Task SetAsync([NotNull] string name, [CanBeNull] string value, [NotNull] string providerName, [CanBeNull] string providerKey, bool forceToSet = false); + Task DeleteAsync(string providerName, string providerKey); } From 073fb539025111017e6f1834ae83e2ec6514bb5e Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Fri, 27 Jan 2023 12:44:23 +0300 Subject: [PATCH 3/5] Update FeatureManager.cs --- .../Volo/Abp/FeatureManagement/FeatureManager.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs index b3c079dd3b..0ef30605f8 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using System.Xml.Linq; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; using Microsoft.Extensions.Options; From f409b0a863d5f201aeed532962b9543cfaedec29 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Fri, 27 Jan 2023 15:58:45 +0300 Subject: [PATCH 4/5] Update modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs --- .../Volo/Abp/FeatureManagement/FeatureManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs index 0ef30605f8..1a5356a1be 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs @@ -216,7 +216,7 @@ public class FeatureManager : IFeatureManager, ISingletonDependency return featureNameValueWithGrantedProvider; } - public async Task DeleteAsync(string providerName, string providerKey) + public virtual async Task DeleteAsync(string providerName, string providerKey) { var featureNameValues = await GetAllAsync(providerName, providerKey); From 68b8e3bebc0585e478ea8b44390a5f1f1f03a5eb Mon Sep 17 00:00:00 2001 From: maliming Date: Sun, 29 Jan 2023 20:56:28 +0800 Subject: [PATCH 5/5] Add a unit test. --- .../Abp/FeatureManagement/FeatureManager_Tests.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 index 0344a67440..831d021e38 100644 --- 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 @@ -195,4 +195,18 @@ public class FeatureManager_Tests : FeatureManagementDomainTestBase featureValue.ShouldNotBeNull(); featureValue.Value.ShouldBe(true.ToString().ToLower()); } + + [Fact] + public async Task DeleteAsync() + { + //Default + (await _featureManager.GetOrNullAsync(TestFeatureDefinitionProvider.BackupCount, TenantFeatureValueProvider.ProviderName, TestEditionIds.TenantId.ToString())).ShouldBe("0"); + + await _featureManager.SetAsync(TestFeatureDefinitionProvider.BackupCount, "2", TenantFeatureValueProvider.ProviderName, TestEditionIds.TenantId.ToString()); + (await _featureManager.GetOrNullAsync(TestFeatureDefinitionProvider.BackupCount, TenantFeatureValueProvider.ProviderName, TestEditionIds.TenantId.ToString())).ShouldBe("2"); + + await _featureManager.DeleteAsync(TenantFeatureValueProvider.ProviderName, TestEditionIds.TenantId.ToString()); + + (await _featureManager.GetOrNullAsync(TestFeatureDefinitionProvider.BackupCount, TenantFeatureValueProvider.ProviderName, TestEditionIds.TenantId.ToString())).ShouldBe("0"); + } }