pull/5259/head
maliming 5 years ago
parent 2180494827
commit 835e5466c0

@ -26,7 +26,6 @@ namespace Volo.Abp.Features
context.Services.Configure<AbpFeatureOptions>(options =>
{
options.ValueProviders.Add<DefaultValueFeatureValueProvider>();
options.ValueProviders.Add<HostFeatureValueProvider>();
options.ValueProviders.Add<EditionFeatureValueProvider>();
options.ValueProviders.Add<TenantFeatureValueProvider>();
});

@ -1,30 +0,0 @@
using System.Threading.Tasks;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Features
{
public class HostFeatureValueProvider : FeatureValueProvider
{
public const string ProviderName = "H";
public override string Name => ProviderName;
protected ICurrentTenant CurrentTenant { get; }
public HostFeatureValueProvider(IFeatureStore featureStore, ICurrentTenant currentTenant)
: base(featureStore)
{
CurrentTenant = currentTenant;
}
public override async Task<string> GetOrNullAsync(FeatureDefinition feature)
{
if (CurrentTenant.Id.HasValue || !feature.IsAvailableToHost)
{
return null;
}
return await FeatureStore.GetOrNullAsync(feature.Name, Name, null);
}
}
}

@ -28,7 +28,7 @@ namespace Volo.Abp.FeatureManagement
public virtual async Task<GetFeatureListResultDto> GetAsync([NotNull] string providerName, string providerKey)
{
await CheckProviderPolicy(providerName);
await CheckProviderPolicy(providerName, providerKey);
var result = new GetFeatureListResultDto
{
@ -46,7 +46,10 @@ namespace Volo.Abp.FeatureManagement
foreach (var featureDefinition in group.GetFeaturesWithChildren())
{
if (providerName == HostFeatureValueProvider.ProviderName && !featureDefinition.IsAvailableToHost)
if (providerName == TenantFeatureValueProvider.ProviderName &&
CurrentTenant.Id == null &&
providerKey == null &&
!featureDefinition.IsAvailableToHost)
{
continue;
}
@ -78,16 +81,10 @@ namespace Volo.Abp.FeatureManagement
public virtual async Task UpdateAsync([NotNull] string providerName, string providerKey, UpdateFeaturesDto input)
{
await CheckProviderPolicy(providerName);
await CheckProviderPolicy(providerName, providerKey);
foreach (var feature in input.Features)
{
var featureDefinition = FeatureDefinitionManager.GetOrNull(feature.Name);
if (featureDefinition == null || (providerName == HostFeatureValueProvider.ProviderName && !featureDefinition.IsAvailableToHost))
{
throw new UserFriendlyException(L["FeatureNotAvailable"]);
}
await FeatureManager.SetAsync(feature.Name, feature.Value, providerName, providerKey);
}
}
@ -105,12 +102,22 @@ namespace Volo.Abp.FeatureManagement
}
}
protected virtual async Task CheckProviderPolicy(string providerName)
protected virtual async Task CheckProviderPolicy(string providerName, string providerKey)
{
var policyName = Options.ProviderPolicies.GetOrDefault(providerName);
if (policyName.IsNullOrEmpty())
string policyName;
if (providerName == TenantFeatureValueProvider.ProviderName)
{
throw new AbpException($"No policy defined to get/set permissions for the provider '{policyName}'. Use {nameof(FeatureManagementOptions)} to map the policy.");
policyName = CurrentTenant.Id == null && providerKey == null ?
"FeatureManagement.ManageHostFeatures" :
"AbpTenantManagement.Tenants.ManageFeatures";
}
else
{
policyName = Options.ProviderPolicies.GetOrDefault(providerName);
if (policyName.IsNullOrEmpty())
{
throw new AbpException($"No policy defined to get/set permissions for the provider '{policyName}'. Use {nameof(FeatureManagementOptions)} to map the policy.");
}
}
await AuthorizationService.CheckAsync(policyName);

@ -3,7 +3,6 @@
"texts": {
"Features": "Features",
"NoFeatureFoundMessage": "There isn't any available feature.",
"FeatureNotAvailable": "Feature not available.",
"Permission:FeatureManagement": "Feature management",
"Permission:FeatureManagement.ManageHostFeatures": "Manage Host features"
}

@ -3,7 +3,6 @@
"texts": {
"Features": "Özellikler",
"NoFeatureFoundMessage": "Hiç özellik yok.",
"FeatureNotAvailable": "Özellik bulunamadı.",
"Permission:FeatureManagement": "Özellik yönetimi",
"Permission:FeatureManagement.ManageHostFeatures": "Host özelliklerini düzenle"
}

@ -3,7 +3,6 @@
"texts": {
"Features": "功能",
"NoFeatureFoundMessage": "没有可用的功能.",
"FeatureNotAvailable": "功能不可用.",
"Permission:FeatureManagement": "特性管理",
"Permission:FeatureManagement.ManageHostFeatures": "管理Host特性"
}

@ -3,7 +3,6 @@
"texts": {
"Features": "功能",
"NoFeatureFoundMessage": "沒有可用的功能.",
"FeatureNotAvailable": "功能不可用.",
"Permission:FeatureManagement": "功能管理",
"Permission:FeatureManagement.ManageHostFeatures": "管理Host功能"
}

@ -18,13 +18,10 @@ namespace Volo.Abp.FeatureManagement
Configure<FeatureManagementOptions>(options =>
{
options.Providers.Add<DefaultValueFeatureManagementProvider>();
options.Providers.Add<HostFeatureManagementProvider>();
options.ProviderPolicies[HostFeatureValueProvider.ProviderName] = "FeatureManagement.ManageHostFeatures";
options.Providers.Add<EditionFeatureManagementProvider>();
//TODO: Should be moved to the Tenant Management module
options.Providers.Add<TenantFeatureManagementProvider>();
options.ProviderPolicies[TenantFeatureValueProvider.ProviderName] = "AbpTenantManagement.Tenants.ManageFeatures";
});
Configure<AbpExceptionLocalizationOptions>(options =>

@ -1,59 +0,0 @@
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Features;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.FeatureManagement
{
public class HostFeatureManagementProvider : FeatureManagementProvider, ITransientDependency
{
public override string Name => HostFeatureValueProvider.ProviderName;
protected ICurrentTenant CurrentTenant { get; }
public HostFeatureManagementProvider(
IFeatureManagementStore store,
ICurrentTenant currentTenant)
: base(store)
{
CurrentTenant = currentTenant;
}
public override async Task<string> GetOrNullAsync(FeatureDefinition feature, string providerKey)
{
if (IsHostSide(feature))
{
return await Store.GetOrNullAsync(feature.Name, Name, NormalizeProviderKey(providerKey));
}
return null;
}
public override async Task SetAsync(FeatureDefinition feature, string value, string providerKey)
{
if (IsHostSide(feature))
{
await Store.SetAsync(feature.Name, value, Name, NormalizeProviderKey(providerKey));
}
}
public override async Task ClearAsync(FeatureDefinition feature, string providerKey)
{
if (IsHostSide(feature))
{
await Store.DeleteAsync(feature.Name, Name, NormalizeProviderKey(providerKey));
}
}
protected override string NormalizeProviderKey(string providerKey)
{
return null;
}
//TODO: Should throw an ex when there is not in the host side?
protected virtual bool IsHostSide(FeatureDefinition feature)
{
return feature.IsAvailableToHost && CurrentTenant.Id == null;
}
}
}

@ -132,7 +132,7 @@
_$wrapper.find('button[name=ManageHostFeatures]').click(function (e) {
e.preventDefault();
_featuresModal.open({
providerName: 'H'
providerName: 'T'
});
});
});

Loading…
Cancel
Save