Browse Source

Merge pull request #14514 from abpframework/feature-management-reset-14470

Feature management reset 14470
pull/14528/head
Enis Necipoglu 4 years ago
committed by GitHub
parent
commit
373365a75a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs
  2. 11
      modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs
  3. 1
      modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor
  4. 10
      modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor.cs
  5. 7
      modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/en.json
  6. 7
      modules/feature-management/src/Volo.Abp.FeatureManagement.Domain.Shared/Volo/Abp/FeatureManagement/Localization/Domain/tr.json
  7. 5
      modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureValueRepository.cs
  8. 9
      modules/feature-management/src/Volo.Abp.FeatureManagement.EntityFrameworkCore/Volo/Abp/FeatureManagement/EntityFrameworkCore/EfCoreFeatureValueRepository.cs
  9. 9
      modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/FeaturesClientProxy.Generated.cs
  10. 59
      modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/featureManagement-generate-proxy.json
  11. 5
      modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi/Volo/Abp/FeatureManagement/FeaturesController.cs
  12. 14
      modules/feature-management/src/Volo.Abp.FeatureManagement.MongoDB/Volo/Abp/FeatureManagement/MongoDB/MongoFeatureValueRepository.cs
  13. 6
      modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml
  14. 31
      modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js
  15. 8
      modules/feature-management/src/Volo.Abp.FeatureManagement.Web/wwwroot/client-proxies/featureManagement-proxy.js
  16. 11
      modules/feature-management/test/Volo.Abp.FeatureManagement.Application.Tests/Volo/Abp/FeatureManagement/FeatureAppService_Tests.cs
  17. 30
      modules/feature-management/test/Volo.Abp.FeatureManagement.TestBase/Volo/Abp/FeatureManagement/FeatureValueRepository_Tests.cs

2
modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/IFeatureAppService.cs

@ -9,4 +9,6 @@ public interface IFeatureAppService : IApplicationService
Task<GetFeatureListResultDto> GetAsync([NotNull] string providerName, string providerKey);
Task UpdateAsync([NotNull] string providerName, string providerKey, UpdateFeaturesDto input);
Task ResetToDefaultAsync([NotNull] string providerName, string providerKey);
}

11
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;
@ -15,15 +14,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<FeatureManagementOptions> options)
IOptions<FeatureManagementOptions> options,
IFeatureValueRepository featureValueRepository)
{
FeatureManager = featureManager;
FeatureDefinitionManager = featureDefinitionManager;
Options = options.Value;
FeatureValueRepository = featureValueRepository;
}
public virtual async Task<GetFeatureListResultDto> GetAsync([NotNull] string providerName, string providerKey)
@ -135,4 +137,9 @@ public class FeatureAppService : FeatureManagementAppServiceBase, IFeatureAppSer
await AuthorizationService.CheckAsync(policyName);
}
public virtual async Task ResetToDefaultAsync([NotNull] string providerName, string providerKey)
{
await FeatureValueRepository.DeleteAsync(providerName, providerKey);
}
}

1
modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor

@ -97,6 +97,7 @@
}
</ModalBody>
<ModalFooter>
<Button Color="Color.Primary" Clicked="@(async () => await ResetToDefaultAsync(ProviderName,ProviderKey))">@L["ResetToDefault"]</Button>
<Button Color="Color.Secondary" Clicked="CloseModal">@L["Cancel"]</Button>
<Button Color="Color.Primary" Clicked="SaveAsync">@L["Save"]</Button>
</ModalFooter>

10
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(".", "_");

7
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?"
}
}

7
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?"
}
}

5
modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/IFeatureValueRepository.cs

@ -24,4 +24,9 @@ public interface IFeatureValueRepository : IBasicRepository<FeatureValue, Guid>
string providerName,
string providerKey,
CancellationToken cancellationToken = default);
Task DeleteAsync(
string providerName,
string providerKey,
CancellationToken cancellationToken = default);
}

9
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,12 @@ public class EfCoreFeatureValueRepository : EfCoreRepository<IFeatureManagementD
s => s.ProviderName == providerName && s.ProviderKey == providerKey
).ToListAsync(GetCancellationToken(cancellationToken));
}
public async Task DeleteAsync(
string providerName,
string providerKey,
CancellationToken cancellationToken = default)
{
await DeleteAsync(s => s.ProviderName == providerName && s.ProviderKey == providerKey, cancellationToken: GetCancellationToken(cancellationToken));
}
}

9
modules/feature-management/src/Volo.Abp.FeatureManagement.HttpApi.Client/ClientProxies/FeaturesClientProxy.Generated.cs

@ -33,4 +33,13 @@ public partial class FeaturesClientProxy : ClientProxyBase<IFeatureAppService>,
{ typeof(UpdateFeaturesDto), input }
});
}
public virtual async Task ResetToDefaultAsync(string providerName, string providerKey)
{
await RequestAsync(nameof(ResetToDefaultAsync), new ClientProxyRequestTypeValue
{
{ typeof(string), providerName },
{ typeof(string), providerKey }
});
}
}

59
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,63 @@
},
"allowAnonymous": null,
"implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService"
},
"ResetToDefaultAsyncByProviderNameAndProviderKey": {
"uniqueName": "ResetToDefaultAsyncByProviderNameAndProviderKey",
"name": "ResetToDefaultAsync",
"httpMethod": null,
"url": "api/feature-management/features",
"supportedVersions": [],
"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"
},
"allowAnonymous": null,
"implementFrom": "Volo.Abp.FeatureManagement.IFeatureAppService"
}
}
}

5
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(string providerName, string providerKey)
{
return FeatureAppService.ResetToDefaultAsync(providerName, providerKey);
}
}

14
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,16 @@ public class MongoFeatureValueRepository :
.Where(s => s.ProviderName == providerName && s.ProviderKey == providerKey)
.ToListAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task DeleteAsync(
string providerName,
string providerKey,
CancellationToken cancellationToken = default)
{
var dbContext = await GetDbContextAsync();
await dbContext.FeatureValues
.DeleteManyAsync(x => x.ProviderName == providerName && x.ProviderKey == providerKey, GetCancellationToken(cancellationToken));
}
}

6
modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml

@ -119,7 +119,11 @@
</abp-tabs>
</abp-modal-body>
<abp-modal-footer buttons="@(AbpModalButtons.Cancel | AbpModalButtons.Save)"></abp-modal-footer>
<abp-modal-footer>
<abp-button button-type="Primary" id="ResetToDefaults"><i class="fa fa-refresh"></i> @L["ResetToDefault"]</abp-button>
<abp-button data-bs-dismiss="modal" button-type="Secondary">@L["Cancel"]</abp-button>
<abp-button button-type="Primary" type="submit"><i class="fa fa-check"></i> @L["Save"]</abp-button>
</abp-modal-footer>
}
else
{

31
modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js

@ -2,9 +2,26 @@ var abp = abp || {};
(function ($) {
abp.modals = abp.modals || {};
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(l('AreYouSureToResetToDefault'))
.then(function (confirmed) {
if (confirmed) {
let providerName = $('#ProviderName').val();
let prodiverKey = $('#ProviderKey').val();
volo.abp.featureManagement.features.resetToDefault(providerName, prodiverKey).then(function () {
abp.notify.success(l('ResetedToDefault'));
});
}
});
});
function checkParents($tab, $element, className) {
var parentName = $element
let parentName = $element
.closest(className)
.attr('data-parent-name');
@ -16,14 +33,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 +51,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 +59,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 +74,7 @@ var abp = abp || {};
$tab.find('.form-control')
.each(function () {
var $element = $(this);
let $element = $(this);
$element.change(function () {
checkParents($tab, $element, '.form-group')
});

8
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(providerName, providerKey, ajaxParams) {
return abp.ajax($.extend(true, {
url: abp.appPath + 'api/feature-management/features' + abp.utils.buildQueryString([{ name: 'providerName', value: providerName }, { name: 'providerKey', value: providerKey }]) + '',
type: 'POST',
dataType: null
}, ajaxParams));
};
})();
})();

11
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<IFeatureAppService>();
_featureValueRepository = GetRequiredService<IFeatureValueRepository>();
_testData = GetRequiredService<FeatureManagementTestData>();
}
@ -70,6 +68,15 @@ public class FeatureAppService_Tests : FeatureManagementApplicationTestBase
}
[Fact]
public async Task ResetToDefaultAsync()
{
Login(_testData.User1Id);
var exception = await Record.ExceptionAsync(async () =>
await _featureAppService.ResetToDefaultAsync("test", "test"));
Assert.Null(exception);
}
private void Login(Guid userId)
{
_currentUser.Id.Returns(userId);

30
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;
@ -72,4 +75,31 @@ public abstract class FeatureValueRepository_Tests<TStartupModule> : FeatureMana
fv.Value == "3"
);
}
[Fact]
public async Task DeleteAsync()
{
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<IUnitOfWorkManager>();
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();
}
}

Loading…
Cancel
Save