From a3f37a7d7391931f9791344ce5f1f77f75515f96 Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 1 Nov 2022 21:44:02 +0300 Subject: [PATCH 1/9] Added ResetToDefaultAsync action --- .../Volo/Abp/FeatureManagement/IFeatureAppService.cs | 2 ++ .../Volo/Abp/FeatureManagement/FeatureAppService.cs | 10 +++++++++- .../Abp/FeatureManagement/IFeatureValueRepository.cs | 3 +++ .../EfCoreFeatureValueRepository.cs | 8 ++++++++ .../Volo/Abp/FeatureManagement/FeaturesController.cs | 5 +++++ .../MongoDB/MongoFeatureValueRepository.cs | 9 +++++++++ 6 files changed, 36 insertions(+), 1 deletion(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs index 20583f7476..1b7f1fbd27 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs @@ -9,4 +9,6 @@ public interface IFeatureAppService : IApplicationService Task GetAsync([NotNull] string providerName, string providerKey); Task UpdateAsync([NotNull] string providerName, string providerKey, UpdateFeaturesDto input); + + Task ResetToDefaultAsync(); } 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 c21f40fb65..e126a09514 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 @@ -15,15 +15,18 @@ 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) + IOptions options, + IFeatureValueRepository featureValueRepository) { FeatureManager = featureManager; FeatureDefinitionManager = featureDefinitionManager; Options = options.Value; + FeatureValueRepository = featureValueRepository; } public virtual async Task GetAsync([NotNull] string providerName, string providerKey) @@ -135,4 +138,9 @@ public class FeatureAppService : FeatureManagementAppServiceBase, IFeatureAppSer await AuthorizationService.CheckAsync(policyName); } + + public virtual async Task ResetToDefaultAsync() + { + await FeatureValueRepository.DeleteAsync(); + } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureValueRepository.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureValueRepository.cs index 022d8a1394..91292ee273 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureValueRepository.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureValueRepository.cs @@ -24,4 +24,7 @@ public interface IFeatureValueRepository : IBasicRepository string providerName, string providerKey, CancellationToken cancellationToken = default); + + Task DeleteAsync( + CancellationToken cancellationToken = default); } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/EfCoreFeatureValueRepository.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/EfCoreFeatureValueRepository.cs index 3ef0cdde96..d55243e4e0 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/EfCoreFeatureValueRepository.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/EfCoreFeatureValueRepository.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; +using Polly; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; @@ -49,4 +50,11 @@ public class EfCoreFeatureValueRepository : EfCoreRepository s.ProviderName == providerName && s.ProviderKey == providerKey ).ToListAsync(GetCancellationToken(cancellationToken)); } + + public async Task DeleteAsync(CancellationToken cancellationToken = default) + { + var entities = await (await GetDbSetAsync()).ToListAsync(GetCancellationToken(cancellationToken)); + (await GetDbSetAsync()).RemoveRange(entities); + await (await GetDbContextAsync()).SaveChangesAsync(cancellationToken); + } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/FeaturesController.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/FeaturesController.cs index 0514579540..045516a6b8 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/FeaturesController.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/FeaturesController.cs @@ -27,4 +27,9 @@ public class FeaturesController : AbpControllerBase, IFeatureAppService { return FeatureAppService.UpdateAsync(providerName, providerKey, input); } + + public Task ResetToDefaultAsync() + { + return FeatureAppService.ResetToDefaultAsync(); + } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/MongoFeatureValueRepository.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/MongoFeatureValueRepository.cs index 9d9071ea1a..7a02c53c36 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/MongoFeatureValueRepository.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/MongoFeatureValueRepository.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; using System.Threading; using System.Threading.Tasks; using MongoDB.Driver; @@ -49,4 +51,11 @@ public class MongoFeatureValueRepository : .Where(s => s.ProviderName == providerName && s.ProviderKey == providerKey) .ToListAsync(GetCancellationToken(cancellationToken)); } + + public virtual async Task DeleteAsync(CancellationToken cancellationToken = default) + { + //TODO check it again + var entities = await AsyncExecuter.ToListAsync((await GetQueryableAsync()).Select(p => p.Id)); + await DeleteManyAsync(entities, true, GetCancellationToken(cancellationToken)); + } } From 9c73272489a753c66d9673ee2ed852bf137994cc Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 1 Nov 2022 21:44:34 +0300 Subject: [PATCH 2/9] updated the proxies --- .../FeaturesClientProxy.Generated.cs | 5 +++++ .../featureManagement-generate-proxy.json | 17 +++++++++++++++++ .../client-proxies/featureManagement-proxy.js | 8 ++++++++ 3 files changed, 30 insertions(+) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/FeaturesClientProxy.Generated.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/FeaturesClientProxy.Generated.cs index a315445d84..17e925add9 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/FeaturesClientProxy.Generated.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/FeaturesClientProxy.Generated.cs @@ -33,4 +33,9 @@ public partial class FeaturesClientProxy : ClientProxyBase, { typeof(UpdateFeaturesDto), input } }); } + + public virtual async Task ResetToDefaultAsync() + { + await RequestAsync(nameof(ResetToDefaultAsync)); + } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/featureManagement-generate-proxy.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/featureManagement-generate-proxy.json index 79a8b31a0c..e42f497760 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/featureManagement-generate-proxy.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/featureManagement-generate-proxy.json @@ -7,6 +7,8 @@ "Volo.Abp.FeatureManagement.FeaturesController": { "controllerName": "Features", "controllerGroupName": "Features", + "isRemoteService": true, + "apiVersion": null, "type": "Volo.Abp.FeatureManagement.FeaturesController", "interfaces": [ { @@ -147,6 +149,21 @@ }, "allowAnonymous": null, "implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService" + }, + "ResetToDefaultAsync": { + "uniqueName": "ResetToDefaultAsync", + "name": "ResetToDefaultAsync", + "httpMethod": null, + "url": "api/feature-management/features", + "supportedVersions": [], + "parametersOnMethod": [], + "parameters": [], + "returnValue": { + "type": "System.Void", + "typeSimple": "System.Void" + }, + "allowAnonymous": null, + "implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService" } } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/wwwroot/client-proxies/featureManagement-proxy.js b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/wwwroot/client-proxies/featureManagement-proxy.js index 3c149c0a7f..0dd0de7dc4 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/wwwroot/client-proxies/featureManagement-proxy.js +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/wwwroot/client-proxies/featureManagement-proxy.js @@ -27,6 +27,14 @@ }, ajaxParams)); }; + volo.abp.featureManagement.features.resetToDefault = function(ajaxParams) { + return abp.ajax($.extend(true, { + url: abp.appPath + 'api/feature-management/features', + type: 'POST', + dataType: null + }, ajaxParams)); + }; + })(); })(); From 3d1ede910ebeac422a92a5add8f7b04689185fc5 Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 1 Nov 2022 21:46:24 +0300 Subject: [PATCH 3/9] implemented razor UI --- .../FeatureManagementModal.cshtml | 6 +++- .../feature-management-modal.js | 29 ++++++++++++++----- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml index 4ed0012a89..314f69e71c 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml @@ -119,7 +119,11 @@ - + + @L["ResetToDefaults"] + @L["Cancel"] + @L["Save"] + } else { diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js index f4b052a755..83ed37d010 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js @@ -2,9 +2,24 @@ var abp = abp || {}; (function ($) { abp.modals = abp.modals || {}; + let l = abp.localization.getResource("FeatureManagement"); + + abp.modals.FeatureManagement = function () { + abp.ResourceLoader.loadScript('/client-proxies/featureManagement-proxy.js'); + $('#ResetToDefaults').click(function (e) { + abp.message.confirm('Are you sure to reset to defaults?') + .then(function (confirmed) { + if (confirmed) { + volo.abp.featureManagement.features.resetToDefault().then(function () { + abp.notify.success(l('Reseted')); + }); + } + }); + }); + function checkParents($tab, $element, className) { - var parentName = $element + let parentName = $element .closest(className) .attr('data-parent-name'); @@ -16,14 +31,14 @@ var abp = abp || {}; .filter('[data-feature-name="' + parentName + '"]') .find('input[type="checkbox"]') .each(function () { - var $parent = $(this); + let $parent = $(this); $parent.prop('checked', true); checkParents($tab, $parent, className); }); } function uncheckChildren($tab, $checkBox) { - var featureName = $checkBox + let featureName = $checkBox .closest('.custom-checkbox') .attr('data-feature-name'); if (!featureName) { @@ -34,7 +49,7 @@ var abp = abp || {}; .filter('[data-parent-name="' + featureName + '"]') .find('input[type="checkbox"]') .each(function () { - var $child = $(this); + let $child = $(this); $child.prop('checked', false); uncheckChildren($tab, $child); }); @@ -42,10 +57,10 @@ var abp = abp || {}; this.initDom = function ($el) { $el.find('.tab-pane').each(function () { - var $tab = $(this); + let $tab = $(this); $tab.find('input[type="checkbox"]') .each(function () { - var $checkBox = $(this); + let $checkBox = $(this); $checkBox.change(function () { if ($checkBox.is(':checked')) { checkParents($tab, $checkBox, '.custom-checkbox') @@ -57,7 +72,7 @@ var abp = abp || {}; $tab.find('.form-control') .each(function () { - var $element = $(this); + let $element = $(this); $element.change(function () { checkParents($tab, $element, '.form-group') }); From 9ec1f1d0d703aff7fef7bae6bb29dfa7161b9c58 Mon Sep 17 00:00:00 2001 From: malik masis Date: Tue, 1 Nov 2022 21:46:36 +0300 Subject: [PATCH 4/9] Added unit tests --- .../Abp/FeatureManagement/FeatureAppService_Tests.cs | 10 ++++++++-- .../FeatureManagement/FeatureValueRepository_Tests.cs | 8 ++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/FeatureAppService_Tests.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/FeatureAppService_Tests.cs index 66023a28f4..63a7736c3d 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/FeatureAppService_Tests.cs +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/FeatureAppService_Tests.cs @@ -14,7 +14,6 @@ namespace Volo.Abp.FeatureManagement; public class FeatureAppService_Tests : FeatureManagementApplicationTestBase { private readonly IFeatureAppService _featureAppService; - private readonly IFeatureValueRepository _featureValueRepository; private ICurrentUser _currentUser; private readonly FeatureManagementTestData _testData; @@ -22,7 +21,6 @@ public class FeatureAppService_Tests : FeatureManagementApplicationTestBase public FeatureAppService_Tests() { _featureAppService = GetRequiredService(); - _featureValueRepository = GetRequiredService(); _testData = GetRequiredService(); } @@ -70,6 +68,14 @@ public class FeatureAppService_Tests : FeatureManagementApplicationTestBase } + [Fact] + public async Task ResetToDefaultAsync() + { + Login(_testData.User1Id); + var exception = await Record.ExceptionAsync(async () => await _featureAppService.ResetToDefaultAsync()); + Assert.Null(exception); + } + private void Login(Guid userId) { _currentUser.Id.Returns(userId); 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 c2645dd65d..b30dc6a75e 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 @@ -72,4 +72,12 @@ public abstract class FeatureValueRepository_Tests : FeatureMana fv.Value == "3" ); } + + [Fact] + public async Task DeleteAsync() + { + var exception = await Record.ExceptionAsync(async() => await Repository.DeleteAsync()); + Assert.Null(exception); + + } } From 16503395ca8b733013cfd8f135dca016a24aa5c2 Mon Sep 17 00:00:00 2001 From: malik masis Date: Wed, 2 Nov 2022 10:10:20 +0300 Subject: [PATCH 5/9] Managed the language --- .../Volo/Abp/FeatureManagement/Localization/Domain/en.json | 7 +++++-- .../Volo/Abp/FeatureManagement/Localization/Domain/tr.json | 7 +++++-- .../Pages/FeatureManagement/FeatureManagementModal.cshtml | 2 +- .../Pages/FeatureManagement/feature-management-modal.js | 6 +++--- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en.json index 3615dd764d..54a19b0090 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en.json @@ -6,7 +6,10 @@ "ManageHostFeatures": "Manage Host features", "Permission:FeatureManagement": "Feature management", "Permission:FeatureManagement.ManageHostFeatures": "Manage Host features", - "Volo.Abp.FeatureManagement:InvalidFeatureValue" : "{0} feature value is not valid!", - "Menu:FeatureManagement": "Feature Management" + "Volo.Abp.FeatureManagement:InvalidFeatureValue": "{0} feature value is not valid!", + "Menu:FeatureManagement": "Feature Management", + "ResetToDefault": "Reset to default", + "ResetedToDefault": "Reseted to default", + "AreYouSureToResetToDefault": "Are you sure to reset to default?" } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/tr.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/tr.json index c21f59088b..523bb12d84 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/tr.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/tr.json @@ -6,7 +6,10 @@ "ManageHostFeatures": "Host özelliklerini yönetin", "Permission:FeatureManagement": "Özellik yönetimi", "Permission:FeatureManagement.ManageHostFeatures": "Host özelliklerini düzenle", - "Volo.Abp.FeatureManagement:InvalidFeatureValue" : "{0} özellik değeri geçerli değil!", - "Menu:FeatureManagement": "Özellik Yönetimi" + "Volo.Abp.FeatureManagement:InvalidFeatureValue": "{0} özellik değeri geçerli değil!", + "Menu:FeatureManagement": "Özellik Yönetimi", + "ResetToDefault": "Varsayılana sıfırla", + "ResetedToDefault": "Varsayılana sıfırlandı", + "AreYouSureToResetToDefault": "Varsayılana sıfırlamak istediğinizden emin misiniz?" } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml index 314f69e71c..4293620b72 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml @@ -120,7 +120,7 @@ - @L["ResetToDefaults"] + @L["ResetToDefault"] @L["Cancel"] @L["Save"] diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js index 83ed37d010..70d972909d 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js @@ -2,17 +2,17 @@ var abp = abp || {}; (function ($) { abp.modals = abp.modals || {}; - let l = abp.localization.getResource("FeatureManagement"); + let l = abp.localization.getResource("AbpFeatureManagement"); abp.modals.FeatureManagement = function () { abp.ResourceLoader.loadScript('/client-proxies/featureManagement-proxy.js'); $('#ResetToDefaults').click(function (e) { - abp.message.confirm('Are you sure to reset to defaults?') + abp.message.confirm(l('AreYouSureToResetToDefault')) .then(function (confirmed) { if (confirmed) { volo.abp.featureManagement.features.resetToDefault().then(function () { - abp.notify.success(l('Reseted')); + abp.notify.success(l('ResetedToDefault')); }); } }); From 276df8acdd7bce883790d25dfcb52048256a28d2 Mon Sep 17 00:00:00 2001 From: malik masis Date: Wed, 2 Nov 2022 11:40:44 +0300 Subject: [PATCH 6/9] Added provider name and key parameters --- .../FeatureManagement/IFeatureAppService.cs | 2 +- .../FeatureManagement/FeatureAppService.cs | 7 ++- .../IFeatureValueRepository.cs | 2 + .../EfCoreFeatureValueRepository.cs | 10 +++- .../FeaturesClientProxy.Generated.cs | 8 ++- .../featureManagement-generate-proxy.json | 50 +++++++++++++++++-- .../FeatureManagement/FeaturesController.cs | 4 +- .../MongoDB/MongoFeatureValueRepository.cs | 10 ++-- .../feature-management-modal.js | 6 ++- .../client-proxies/featureManagement-proxy.js | 4 +- .../FeatureAppService_Tests.cs | 3 +- .../FeatureValueRepository_Tests.cs | 5 +- 12 files changed, 87 insertions(+), 24 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs index 1b7f1fbd27..a2fa93cfd2 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs @@ -10,5 +10,5 @@ public interface IFeatureAppService : IApplicationService Task UpdateAsync([NotNull] string providerName, string providerKey, UpdateFeaturesDto input); - Task ResetToDefaultAsync(); + Task ResetToDefaultAsync([NotNull] string providerName, string providerKey); } 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 e126a09514..9d2c3b04a1 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 @@ -6,7 +6,6 @@ using JetBrains.Annotations; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Options; using Volo.Abp.Features; -using Volo.Abp.Localization; namespace Volo.Abp.FeatureManagement; @@ -138,9 +137,9 @@ public class FeatureAppService : FeatureManagementAppServiceBase, IFeatureAppSer await AuthorizationService.CheckAsync(policyName); } - - public virtual async Task ResetToDefaultAsync() + + public virtual async Task ResetToDefaultAsync([NotNull] string providerName, string providerKey) { - await FeatureValueRepository.DeleteAsync(); + await FeatureValueRepository.DeleteAsync(providerName, providerKey); } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureValueRepository.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureValueRepository.cs index 91292ee273..05a330a1b2 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureValueRepository.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureValueRepository.cs @@ -26,5 +26,7 @@ public interface IFeatureValueRepository : IBasicRepository CancellationToken cancellationToken = default); Task DeleteAsync( + string providerName, + string providerKey, CancellationToken cancellationToken = default); } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/EfCoreFeatureValueRepository.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/EfCoreFeatureValueRepository.cs index d55243e4e0..ef18b272b5 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/EfCoreFeatureValueRepository.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/EfCoreFeatureValueRepository.cs @@ -51,9 +51,15 @@ public class EfCoreFeatureValueRepository : EfCoreRepository s.ProviderName == providerName && s.ProviderKey == providerKey + ).ToListAsync(GetCancellationToken(cancellationToken)); (await GetDbSetAsync()).RemoveRange(entities); await (await GetDbContextAsync()).SaveChangesAsync(cancellationToken); } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/FeaturesClientProxy.Generated.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/FeaturesClientProxy.Generated.cs index 17e925add9..37d30b7c4d 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/FeaturesClientProxy.Generated.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/FeaturesClientProxy.Generated.cs @@ -34,8 +34,12 @@ public partial class FeaturesClientProxy : ClientProxyBase, }); } - public virtual async Task ResetToDefaultAsync() + public virtual async Task ResetToDefaultAsync(string providerName, string providerKey) { - await RequestAsync(nameof(ResetToDefaultAsync)); + await RequestAsync(nameof(ResetToDefaultAsync), new ClientProxyRequestTypeValue + { + { typeof(string), providerName }, + { typeof(string), providerKey } + }); } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/featureManagement-generate-proxy.json b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/featureManagement-generate-proxy.json index e42f497760..df5f6c0def 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/featureManagement-generate-proxy.json +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/featureManagement-generate-proxy.json @@ -150,14 +150,56 @@ "allowAnonymous": null, "implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService" }, - "ResetToDefaultAsync": { - "uniqueName": "ResetToDefaultAsync", + "ResetToDefaultAsyncByProviderNameAndProviderKey": { + "uniqueName": "ResetToDefaultAsyncByProviderNameAndProviderKey", "name": "ResetToDefaultAsync", "httpMethod": null, "url": "api/feature-management/features", "supportedVersions": [], - "parametersOnMethod": [], - "parameters": [], + "parametersOnMethod": [ + { + "name": "providerName", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + }, + { + "name": "providerKey", + "typeAsString": "System.String, System.Private.CoreLib", + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null + } + ], + "parameters": [ + { + "nameOnMethod": "providerName", + "name": "providerName", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + }, + { + "nameOnMethod": "providerKey", + "name": "providerKey", + "jsonName": null, + "type": "System.String", + "typeSimple": "string", + "isOptional": false, + "defaultValue": null, + "constraintTypes": null, + "bindingSourceId": "ModelBinding", + "descriptorName": "" + } + ], "returnValue": { "type": "System.Void", "typeSimple": "System.Void" diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/FeaturesController.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/FeaturesController.cs index 045516a6b8..a61fdd0508 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/FeaturesController.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/FeaturesController.cs @@ -28,8 +28,8 @@ public class FeaturesController : AbpControllerBase, IFeatureAppService return FeatureAppService.UpdateAsync(providerName, providerKey, input); } - public Task ResetToDefaultAsync() + public Task ResetToDefaultAsync(string providerName, string providerKey) { - return FeatureAppService.ResetToDefaultAsync(); + return FeatureAppService.ResetToDefaultAsync(providerName, providerKey); } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/MongoFeatureValueRepository.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/MongoFeatureValueRepository.cs index 7a02c53c36..235ef191ce 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/MongoFeatureValueRepository.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/MongoFeatureValueRepository.cs @@ -52,10 +52,14 @@ public class MongoFeatureValueRepository : .ToListAsync(GetCancellationToken(cancellationToken)); } - public virtual async Task DeleteAsync(CancellationToken cancellationToken = default) + public virtual async Task DeleteAsync( + string providerName, + string providerKey, + CancellationToken cancellationToken = default) { - //TODO check it again - var entities = await AsyncExecuter.ToListAsync((await GetQueryableAsync()).Select(p => p.Id)); + var entities = await (await GetMongoQueryableAsync(cancellationToken)) + .Where(s => s.ProviderName == providerName && s.ProviderKey == providerKey) + .ToListAsync(GetCancellationToken(cancellationToken)); await DeleteManyAsync(entities, true, GetCancellationToken(cancellationToken)); } } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js index 70d972909d..01ba7b9bdf 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js @@ -11,7 +11,11 @@ var abp = abp || {}; abp.message.confirm(l('AreYouSureToResetToDefault')) .then(function (confirmed) { if (confirmed) { - volo.abp.featureManagement.features.resetToDefault().then(function () { + debugger + + let providerName = $('#ProviderName').val(); + let prodiverKey = $('#ProviderKey').val(); + volo.abp.featureManagement.features.resetToDefault(providerName, prodiverKey).then(function () { abp.notify.success(l('ResetedToDefault')); }); } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/wwwroot/client-proxies/featureManagement-proxy.js b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/wwwroot/client-proxies/featureManagement-proxy.js index 0dd0de7dc4..78d1fe7917 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/wwwroot/client-proxies/featureManagement-proxy.js +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/wwwroot/client-proxies/featureManagement-proxy.js @@ -27,9 +27,9 @@ }, ajaxParams)); }; - volo.abp.featureManagement.features.resetToDefault = function(ajaxParams) { + volo.abp.featureManagement.features.resetToDefault = function(providerName, providerKey, ajaxParams) { return abp.ajax($.extend(true, { - url: abp.appPath + 'api/feature-management/features', + url: abp.appPath + 'api/feature-management/features' + abp.utils.buildQueryString([{ name: 'providerName', value: providerName }, { name: 'providerKey', value: providerKey }]) + '', type: 'POST', dataType: null }, ajaxParams)); diff --git a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/FeatureAppService_Tests.cs b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/FeatureAppService_Tests.cs index 63a7736c3d..7f11e297a3 100644 --- a/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/FeatureAppService_Tests.cs +++ b/modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/FeatureAppService_Tests.cs @@ -72,7 +72,8 @@ public class FeatureAppService_Tests : FeatureManagementApplicationTestBase public async Task ResetToDefaultAsync() { Login(_testData.User1Id); - var exception = await Record.ExceptionAsync(async () => await _featureAppService.ResetToDefaultAsync()); + var exception = await Record.ExceptionAsync(async () => + await _featureAppService.ResetToDefaultAsync("test", "test")); Assert.Null(exception); } 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 b30dc6a75e..003073991b 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 @@ -76,8 +76,9 @@ public abstract class FeatureValueRepository_Tests : FeatureMana [Fact] public async Task DeleteAsync() { - var exception = await Record.ExceptionAsync(async() => await Repository.DeleteAsync()); + var exception = await Record.ExceptionAsync(async () => + await Repository.DeleteAsync(TestFeatureDefinitionProvider.SocialLogins, "true")); Assert.Null(exception); - + } } From ea7e6ddf81b61f78aa752ad0c50972caab154946 Mon Sep 17 00:00:00 2001 From: malik masis Date: Wed, 2 Nov 2022 15:30:08 +0300 Subject: [PATCH 7/9] Implemented blazor UI --- .../Components/FeatureManagementModal.razor | 1 + .../Components/FeatureManagementModal.razor.cs | 10 ++++++++++ .../FeatureManagement/feature-management-modal.js | 2 -- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor index 8bc5e9dfe7..4d2c1eed74 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor @@ -97,6 +97,7 @@ } + diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor.cs index 095db9d12b..6dbdd282fe 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor.cs @@ -114,6 +114,16 @@ public partial class FeatureManagementModal } } + public virtual async Task ResetToDefaultAsync([NotNull] string providerName, string providerKey = null) + { + if (!await Message.Confirm(L["AreYouSureToResetToDefault"])) + { + return; + } + await FeatureAppService.ResetToDefaultAsync(ProviderName, ProviderKey); + await Message.Success(L["ResetedToDefault"]); + } + protected virtual string GetNormalizedGroupName(string name) { return "FeatureGroup_" + name.Replace(".", "_"); diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js index 01ba7b9bdf..25739b8a2d 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js @@ -11,8 +11,6 @@ var abp = abp || {}; abp.message.confirm(l('AreYouSureToResetToDefault')) .then(function (confirmed) { if (confirmed) { - debugger - let providerName = $('#ProviderName').val(); let prodiverKey = $('#ProviderKey').val(); volo.abp.featureManagement.features.resetToDefault(providerName, prodiverKey).then(function () { From 621cbd1d64c55b2e6fc3a8235cd2e9f624ed2e3c Mon Sep 17 00:00:00 2001 From: malik masis Date: Thu, 3 Nov 2022 09:26:30 +0300 Subject: [PATCH 8/9] Update modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/EfCoreFeatureValueRepository.cs made the simpler delete method Co-authored-by: Qingxiao Ren --- .../EntityFrameworkCore/EfCoreFeatureValueRepository.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/EfCoreFeatureValueRepository.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/EfCoreFeatureValueRepository.cs index ef18b272b5..233ce31edf 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/EfCoreFeatureValueRepository.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/EfCoreFeatureValueRepository.cs @@ -56,11 +56,6 @@ public class EfCoreFeatureValueRepository : EfCoreRepository s.ProviderName == providerName && s.ProviderKey == providerKey - ).ToListAsync(GetCancellationToken(cancellationToken)); - (await GetDbSetAsync()).RemoveRange(entities); - await (await GetDbContextAsync()).SaveChangesAsync(cancellationToken); + await DeleteAsync(s => s.ProviderName == providerName && s.ProviderKey == providerKey, cancellationToken: GetCancellationToken(cancellationToken)); } } From 5973d54e9b573e41391dfcd9b433b454dcba692f Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Thu, 3 Nov 2022 10:45:21 +0300 Subject: [PATCH 9/9] Optimize mongodb deletion for feature values --- .../MongoDB/MongoFeatureValueRepository.cs | 9 ++++---- .../FeatureValueRepository_Tests.cs | 23 ++++++++++++++++++- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/MongoFeatureValueRepository.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/MongoFeatureValueRepository.cs index 235ef191ce..4d4fbedcfd 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/MongoFeatureValueRepository.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/MongoFeatureValueRepository.cs @@ -57,9 +57,10 @@ public class MongoFeatureValueRepository : string providerKey, CancellationToken cancellationToken = default) { - var entities = await (await GetMongoQueryableAsync(cancellationToken)) - .Where(s => s.ProviderName == providerName && s.ProviderKey == providerKey) - .ToListAsync(GetCancellationToken(cancellationToken)); - await DeleteManyAsync(entities, true, GetCancellationToken(cancellationToken)); + var dbContext = await GetDbContextAsync(); + + await dbContext.FeatureValues + .DeleteManyAsync(x => x.ProviderName == providerName && x.ProviderKey == providerKey, GetCancellationToken(cancellationToken)); + } } 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 003073991b..b739cdf7e7 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 @@ -1,7 +1,10 @@ using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Shouldly; using Volo.Abp.Features; using Volo.Abp.Modularity; +using Volo.Abp.Uow; using Xunit; namespace Volo.Abp.FeatureManagement; @@ -79,6 +82,24 @@ public abstract class FeatureValueRepository_Tests : FeatureMana var exception = await Record.ExceptionAsync(async () => await Repository.DeleteAsync(TestFeatureDefinitionProvider.SocialLogins, "true")); Assert.Null(exception); - } + + [Fact] + public async Task DeleteForProviderNameAndKey() + { + using (var scope = ServiceProvider.CreateScope()) + { + var uowManager = scope.ServiceProvider.GetRequiredService(); + + using (var uow = uowManager.Begin(new AbpUnitOfWorkOptions())) + { + await Repository.DeleteAsync(TestFeatureDefinitionProvider.SocialLogins, "true"); + + await uow.CompleteAsync(); + } + } + + var features = await Repository.GetListAsync(TestFeatureDefinitionProvider.SocialLogins, "true"); + features.ShouldBeEmpty(); + } }