Browse Source

Resolved #793: separate setting management from obtaining setting values.

pull/818/head
Halil ibrahim Kalkan 8 years ago
parent
commit
c8538ae63c
  1. 1
      framework/src/Volo.Abp.Ddd.Application/Volo.Abp.Ddd.Application.csproj
  2. 17
      framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs
  3. 1
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo.Abp.MultiTenancy.Abstractions.csproj
  4. 12
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/AbpMultiTenancyAbstractionsModule.cs
  5. 45
      framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantSettingValueProvider.cs
  6. 1
      framework/src/Volo.Abp.Settings/Volo.Abp.Settings.csproj
  7. 16
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/AbpSettingsModule.cs
  8. 14
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/DefaultValueSettingValueProvider.cs
  9. 12
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/GlobalSettingValueProvider.cs
  10. 15
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingStore.cs
  11. 8
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingValueProvider.cs
  12. 6
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingOptions.cs
  13. 7
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingProvider.cs
  14. 6
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingValueProvider.cs
  15. 25
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/TenantSettingValueProvider.cs
  16. 30
      framework/src/Volo.Abp.Settings/Volo/Abp/Settings/UserSettingValueProvider.cs
  17. 14
      framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/TestSettingValueProvider.cs
  18. 2
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManagementProvider.cs
  19. 1
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementOptions.cs
  20. 11
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/AbpSettingManagementDomainModule.cs
  21. 26
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/DefaultValueSettingManagementProvider.cs
  22. 20
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/DefaultValueSettingManagerExtensions.cs
  23. 21
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/GlobalSettingManagementProvider.cs
  24. 3
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/GlobalSettingManagerExtensions.cs
  25. 17
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManagementProvider.cs
  26. 17
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManagementStore.cs
  27. 3
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManager.cs
  28. 14
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManagementOptions.cs
  29. 37
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManagementProvider.cs
  30. 90
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManagementStore.cs
  31. 68
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs
  32. 31
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/TenantSettingManagementProvider.cs
  33. 4
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/TenantSettingManagerExtensions.cs
  34. 31
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/UserSettingManagementProvider.cs
  35. 3
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/UserSettingManagerExtensions.cs
  36. 12
      modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo/Abp/SettingManagement/SettingTestDataBuilder.cs
  37. 10
      modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_User_Tests.cs
  38. 8
      modules/users/src/Volo.Abp.Users.Abstractions/Volo/Abp/Users/AbpUsersAbstractionModule.cs
  39. 48
      modules/users/src/Volo.Abp.Users.Abstractions/Volo/Abp/Users/UserSettingValueProvider.cs

1
framework/src/Volo.Abp.Ddd.Application/Volo.Abp.Ddd.Application.csproj

@ -20,6 +20,7 @@
<ProjectReference Include="..\Volo.Abp.Http.Abstractions\Volo.Abp.Http.Abstractions.csproj" />
<ProjectReference Include="..\Volo.Abp.ObjectMapping\Volo.Abp.ObjectMapping.csproj" />
<ProjectReference Include="..\Volo.Abp.Security\Volo.Abp.Security.csproj" />
<ProjectReference Include="..\Volo.Abp.Settings\Volo.Abp.Settings.csproj" />
<ProjectReference Include="..\Volo.Abp.Validation\Volo.Abp.Validation.csproj" />
</ItemGroup>

17
framework/src/Volo.Abp.Ddd.Application/Volo/Abp/Application/AbpDddApplicationModule.cs

@ -1,5 +1,4 @@
using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Application.Services;
using Volo.Abp.Authorization;
using Volo.Abp.Domain;
@ -8,17 +7,21 @@ using Volo.Abp.Http.Modeling;
using Volo.Abp.Modularity;
using Volo.Abp.ObjectMapping;
using Volo.Abp.Security;
using Volo.Abp.Settings;
using Volo.Abp.Uow;
using Volo.Abp.Validation;
namespace Volo.Abp.Application
{
[DependsOn(typeof(AbpDddDomainModule))]
[DependsOn(typeof(AbpSecurityModule))]
[DependsOn(typeof(AbpObjectMappingModule))]
[DependsOn(typeof(AbpValidationModule))]
[DependsOn(typeof(AbpAuthorizationModule))]
[DependsOn(typeof(AbpHttpAbstractionsModule))]
[DependsOn(
typeof(AbpDddDomainModule),
typeof(AbpSecurityModule),
typeof(AbpObjectMappingModule),
typeof(AbpValidationModule),
typeof(AbpAuthorizationModule),
typeof(AbpHttpAbstractionsModule),
typeof(AbpSettingsModule)
)]
public class AbpDddApplicationModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)

1
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo.Abp.MultiTenancy.Abstractions.csproj

@ -17,7 +17,6 @@
<ProjectReference Include="..\Volo.Abp.Core\Volo.Abp.Core.csproj" />
<ProjectReference Include="..\Volo.Abp.Data\Volo.Abp.Data.csproj" />
<ProjectReference Include="..\Volo.Abp.Security\Volo.Abp.Security.csproj" />
<ProjectReference Include="..\Volo.Abp.Settings\Volo.Abp.Settings.csproj" />
</ItemGroup>
</Project>

12
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/AbpMultiTenancyAbstractionsModule.cs

@ -1,21 +1,13 @@
using Volo.Abp.Data;
using Volo.Abp.Modularity;
using Volo.Abp.Settings;
namespace Volo.Abp.MultiTenancy
{
[DependsOn(
typeof(AbpDataModule),
typeof(AbpSettingsModule)
typeof(AbpDataModule)
)]
public class AbpMultiTenancyAbstractionsModule : AbpModule //TODO: Rename to AbpMultiTenancyModule?
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<SettingOptions>(options =>
{
options.ValueProviders.Add<TenantSettingValueProvider>();
});
}
}
}

45
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/MultiTenancy/TenantSettingValueProvider.cs

@ -1,45 +0,0 @@
using System.Threading.Tasks;
using Volo.Abp.Settings;
namespace Volo.Abp.MultiTenancy
{
public class TenantSettingValueProvider : SettingValueProvider
{
public const string ProviderName = "Tenant";
public override string Name => ProviderName;
protected ICurrentTenant CurrentTenant { get; }
public TenantSettingValueProvider(ISettingStore settingStore, ICurrentTenant currentTenant)
: base(settingStore)
{
CurrentTenant = currentTenant;
}
public override async Task<string> GetOrNullAsync(SettingDefinition setting, string providerKey)
{
return await SettingStore.GetOrNullAsync(setting.Name, Name, NormalizeProviderKey(providerKey));
}
public override Task SetAsync(SettingDefinition setting, string value, string providerKey)
{
return SettingStore.SetAsync(setting.Name, value, Name, NormalizeProviderKey(providerKey));
}
public override Task ClearAsync(SettingDefinition setting, string providerKey)
{
return SettingStore.DeleteAsync(setting.Name, Name, NormalizeProviderKey(providerKey));
}
private string NormalizeProviderKey(string providerKey)
{
if (providerKey == null && CurrentTenant.Id.HasValue)
{
return CurrentTenant.Id.Value.ToString();
}
return providerKey;
}
}
}

1
framework/src/Volo.Abp.Settings/Volo.Abp.Settings.csproj

@ -15,6 +15,7 @@
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Localization.Abstractions\Volo.Abp.Localization.Abstractions.csproj" />
<ProjectReference Include="..\Volo.Abp.MultiTenancy.Abstractions\Volo.Abp.MultiTenancy.Abstractions.csproj" />
<ProjectReference Include="..\Volo.Abp.Security\Volo.Abp.Security.csproj" />
</ItemGroup>

16
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/AbpSettingsModule.cs

@ -1,15 +1,27 @@
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Security;
using Volo.Abp.Users;
namespace Volo.Abp.Settings
{
[DependsOn(
typeof(AbpLocalizationAbstractionsModule),
typeof(AbpSecurityModule)
typeof(AbpSecurityModule),
typeof(AbpMultiTenancyAbstractionsModule)
)]
public class AbpSettingsModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<SettingOptions>(options =>
{
options.ValueProviders.Add<DefaultValueSettingValueProvider>();
options.ValueProviders.Add<GlobalSettingValueProvider>();
options.ValueProviders.Add<TenantSettingValueProvider>();
options.ValueProviders.Add<UserSettingValueProvider>();
});
}
}
}

14
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/DefaultValueSettingValueProvider.cs

@ -14,21 +14,9 @@ namespace Volo.Abp.Settings
}
public override Task<string> GetOrNullAsync(SettingDefinition setting, string providerKey)
public override Task<string> GetOrNullAsync(SettingDefinition setting)
{
return Task.FromResult(setting.DefaultValue);
}
public override Task SetAsync(SettingDefinition setting, string value, string providerKey)
{
setting.DefaultValue = value;
return Task.CompletedTask;
}
public override Task ClearAsync(SettingDefinition setting, string providerKey)
{
setting.DefaultValue = null;
return Task.CompletedTask;
}
}
}

12
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/GlobalSettingValueProvider.cs

@ -13,19 +13,9 @@ namespace Volo.Abp.Settings
{
}
public override Task<string> GetOrNullAsync(SettingDefinition setting, string providerKey)
public override Task<string> GetOrNullAsync(SettingDefinition setting)
{
return SettingStore.GetOrNullAsync(setting.Name, Name, null);
}
public override Task SetAsync(SettingDefinition setting, string value, string providerKey)
{
return SettingStore.SetAsync(setting.Name, value, Name, null);
}
public override Task ClearAsync(SettingDefinition setting, string providerKey)
{
return SettingStore.DeleteAsync(setting.Name, Name, null);
}
}
}

15
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingStore.cs

@ -1,17 +1,14 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Threading.Tasks;
using JetBrains.Annotations;
namespace Volo.Abp.Settings
{
public interface ISettingStore
{
Task<string> GetOrNullAsync([NotNull] string name, [CanBeNull] string providerName, [CanBeNull] string providerKey);
Task SetAsync([NotNull] string name, [NotNull] string value, [CanBeNull] string providerName, [CanBeNull] string providerKey);
Task<List<SettingValue>> GetListAsync([CanBeNull] string providerName, [CanBeNull] string providerKey);
Task DeleteAsync([NotNull] string name, [CanBeNull]string providerName, [CanBeNull]string providerKey);
Task<string> GetOrNullAsync(
[NotNull] string name,
[CanBeNull] string providerName,
[CanBeNull] string providerKey
);
}
}

8
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingValueProvider.cs

@ -7,12 +7,6 @@ namespace Volo.Abp.Settings
{
string Name { get; }
//TODO: There is a bug here, because we are checking the same providerKey in all providers in a fallback system!
Task<string> GetOrNullAsync([NotNull] SettingDefinition setting, [CanBeNull] string providerKey);
Task SetAsync([NotNull] SettingDefinition setting, [NotNull] string value, [CanBeNull] string providerKey);
Task ClearAsync([NotNull] SettingDefinition setting, [CanBeNull] string providerKey);
Task<string> GetOrNullAsync([NotNull] SettingDefinition setting);
}
}

6
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingOptions.cs

@ -11,11 +11,7 @@ namespace Volo.Abp.Settings
public SettingOptions()
{
DefinitionProviders = new TypeList<ISettingDefinitionProvider>();
ValueProviders = new TypeList<ISettingValueProvider>
{
typeof(DefaultValueSettingValueProvider),
typeof(GlobalSettingValueProvider)
};
ValueProviders = new TypeList<ISettingValueProvider>();
}
}
}

7
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingProvider.cs

@ -48,7 +48,7 @@ namespace Volo.Abp.Settings
//TODO: How to implement setting.IsInherited?
var value = await GetOrNullValueFromProvidersAsync(null, providers, setting);
var value = await GetOrNullValueFromProvidersAsync(providers, setting);
if (setting.IsEncrypted)
{
value = SettingEncryptionService.Decrypt(setting, value);
@ -66,7 +66,7 @@ namespace Volo.Abp.Settings
{
foreach (var setting in settingDefinitions)
{
var value = await provider.GetOrNullAsync(setting, null);
var value = await provider.GetOrNullAsync(setting);
if (value != null)
{
if (setting.IsEncrypted)
@ -83,13 +83,12 @@ namespace Volo.Abp.Settings
}
protected virtual async Task<string> GetOrNullValueFromProvidersAsync(
string providerKey,
IEnumerable<ISettingValueProvider> providers,
SettingDefinition setting)
{
foreach (var provider in providers)
{
var value = await provider.GetOrNullAsync(setting, providerKey);
var value = await provider.GetOrNullAsync(setting);
if (value != null)
{
return value;

6
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingValueProvider.cs

@ -14,10 +14,6 @@ namespace Volo.Abp.Settings
SettingStore = settingStore;
}
public abstract Task<string> GetOrNullAsync(SettingDefinition setting, string providerKey);
public abstract Task SetAsync(SettingDefinition setting, string value, string providerKey);
public abstract Task ClearAsync(SettingDefinition setting, string providerKey);
public abstract Task<string> GetOrNullAsync(SettingDefinition setting);
}
}

25
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/TenantSettingValueProvider.cs

@ -0,0 +1,25 @@
using System.Threading.Tasks;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.Settings
{
public class TenantSettingValueProvider : SettingValueProvider
{
public const string ProviderName = "Tenant";
public override string Name => ProviderName;
protected ICurrentTenant CurrentTenant { get; }
public TenantSettingValueProvider(ISettingStore settingStore, ICurrentTenant currentTenant)
: base(settingStore)
{
CurrentTenant = currentTenant;
}
public override async Task<string> GetOrNullAsync(SettingDefinition setting)
{
return await SettingStore.GetOrNullAsync(setting.Name, Name, CurrentTenant.Id?.ToString());
}
}
}

30
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/UserSettingValueProvider.cs

@ -0,0 +1,30 @@
using System.Threading.Tasks;
using Volo.Abp.Users;
namespace Volo.Abp.Settings
{
public class UserSettingValueProvider : SettingValueProvider
{
public const string ProviderName = "User";
public override string Name => ProviderName;
protected ICurrentUser CurrentUser { get; }
public UserSettingValueProvider(ISettingStore settingStore, ICurrentUser currentUser)
: base(settingStore)
{
CurrentUser = currentUser;
}
public override async Task<string> GetOrNullAsync(SettingDefinition setting)
{
if (CurrentUser.Id == null)
{
return null;
}
return await SettingStore.GetOrNullAsync(setting.Name, Name, CurrentUser.Id.ToString());
}
}
}

14
framework/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/TestSettingValueProvider.cs

@ -17,21 +17,9 @@ namespace Volo.Abp.Settings
_values = new Dictionary<string, string>();
}
public Task<string> GetOrNullAsync(SettingDefinition setting, string providerKey)
public Task<string> GetOrNullAsync(SettingDefinition setting)
{
return Task.FromResult(_values.GetOrDefault(setting.Name));
}
public Task SetAsync(SettingDefinition setting, string value, string providerKey)
{
_values[setting.Name] = value;
return Task.CompletedTask;
}
public Task ClearAsync(SettingDefinition setting, string providerKey)
{
_values.Remove(setting.Name);
return Task.CompletedTask;
}
}
}

2
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/IPermissionManagementProvider.cs

@ -5,7 +5,7 @@ using Volo.Abp.DependencyInjection;
namespace Volo.Abp.PermissionManagement
{
public interface IPermissionManagementProvider : ISingletonDependency
public interface IPermissionManagementProvider : ISingletonDependency //TODO: Consider to remove this pre-assumption
{
string Name { get; }

1
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManagementOptions.cs

@ -5,6 +5,7 @@ namespace Volo.Abp.PermissionManagement
{
public class PermissionManagementOptions
{
//TODO: rename to Providers
public ITypeList<IPermissionManagementProvider> ManagementProviders { get; }
public Dictionary<string, string> ProviderPolicies { get; }

11
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/AbpSettingManagementDomainModule.cs

@ -13,6 +13,15 @@ namespace Volo.Abp.SettingManagement
)]
public class AbpSettingManagementDomainModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<SettingManagementOptions>(options =>
{
options.Providers.Add<DefaultValueSettingManagementProvider>();
options.Providers.Add<GlobalSettingManagementProvider>();
options.Providers.Add<TenantSettingManagementProvider>();
options.Providers.Add<UserSettingManagementProvider>();
});
}
}
}

26
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/DefaultValueSettingManagementProvider.cs

@ -0,0 +1,26 @@
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Settings;
namespace Volo.Abp.SettingManagement
{
public class DefaultValueSettingManagementProvider : ISettingManagementProvider, ISingletonDependency
{
public string Name => DefaultValueSettingValueProvider.ProviderName;
public Task<string> GetOrNullAsync(SettingDefinition setting, string providerKey)
{
return Task.FromResult(setting.DefaultValue);
}
public Task SetAsync(SettingDefinition setting, string value, string providerKey)
{
throw new AbpException($"Can not set default value of a setting. It is only possible while defining the setting in a {typeof(ISettingDefinitionProvider)} implementation.");
}
public Task ClearAsync(SettingDefinition setting, string providerKey)
{
throw new AbpException($"Can not clear default value of a setting. It is only possible while defining the setting in a {typeof(ISettingDefinitionProvider)} implementation.");
}
}
}

20
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/DefaultValueSettingManagerExtensions.cs

@ -0,0 +1,20 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Settings;
namespace Volo.Abp.SettingManagement
{
public static class DefaultValueSettingManagerExtensions
{
public static Task<string> GetOrNullDefaultAsync(this ISettingManager settingManager, [NotNull] string name, bool fallback = true)
{
return settingManager.GetOrNullAsync(name, DefaultValueSettingValueProvider.ProviderName, null, fallback);
}
public static Task<List<SettingValue>> GetAllDefaultAsync(this ISettingManager settingManager, bool fallback = true)
{
return settingManager.GetAllAsync(DefaultValueSettingValueProvider.ProviderName, null, fallback);
}
}
}

21
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/GlobalSettingManagementProvider.cs

@ -0,0 +1,21 @@
using Volo.Abp.DependencyInjection;
using Volo.Abp.Settings;
namespace Volo.Abp.SettingManagement
{
public class GlobalSettingManagementProvider : SettingManagementProvider, ITransientDependency
{
public override string Name => GlobalSettingValueProvider.ProviderName;
public GlobalSettingManagementProvider(ISettingManagementStore settingManagementStore)
: base(settingManagementStore)
{
}
protected override string NormalizeProviderKey(string providerKey)
{
return null;
}
}
}

3
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/GlobalSettingManagerExtensions.cs → modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/GlobalSettingManagerExtensions.cs

@ -1,8 +1,9 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Settings;
namespace Volo.Abp.Settings
namespace Volo.Abp.SettingManagement
{
public static class GlobalSettingManagerExtensions
{

17
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManagementProvider.cs

@ -0,0 +1,17 @@
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Settings;
namespace Volo.Abp.SettingManagement
{
public interface ISettingManagementProvider
{
string Name { get; }
Task<string> GetOrNullAsync([NotNull] SettingDefinition setting, [CanBeNull] string providerKey);
Task SetAsync([NotNull] SettingDefinition setting, [NotNull] string value, [CanBeNull] string providerKey);
Task ClearAsync([NotNull] SettingDefinition setting, [CanBeNull] string providerKey);
}
}

17
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManagementStore.cs

@ -0,0 +1,17 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Settings;
namespace Volo.Abp.SettingManagement
{
public interface ISettingManagementStore
{
Task<string> GetOrNullAsync(string name, string providerName, string providerKey);
Task<List<SettingValue>> GetListAsync(string providerName, string providerKey);
Task SetAsync(string name, string value, string providerName, string providerKey);
Task DeleteAsync(string name, string providerName, string providerKey);
}
}

3
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingManager.cs → modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/ISettingManager.cs

@ -1,8 +1,9 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Settings;
namespace Volo.Abp.Settings
namespace Volo.Abp.SettingManagement
{
public interface ISettingManager
{

14
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManagementOptions.cs

@ -0,0 +1,14 @@
using Volo.Abp.Collections;
namespace Volo.Abp.SettingManagement
{
public class SettingManagementOptions
{
public ITypeList<ISettingManagementProvider> Providers { get; }
public SettingManagementOptions()
{
Providers = new TypeList<ISettingManagementProvider>();
}
}
}

37
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManagementProvider.cs

@ -0,0 +1,37 @@
using System.Threading.Tasks;
using Volo.Abp.Settings;
namespace Volo.Abp.SettingManagement
{
public abstract class SettingManagementProvider : ISettingManagementProvider
{
public abstract string Name { get; }
protected ISettingManagementStore SettingManagementStore { get; }
protected SettingManagementProvider(ISettingManagementStore settingManagementStore)
{
SettingManagementStore = settingManagementStore;
}
public async Task<string> GetOrNullAsync(SettingDefinition setting, string providerKey)
{
return await SettingManagementStore.GetOrNullAsync(setting.Name, Name, NormalizeProviderKey(providerKey));
}
public virtual async Task SetAsync(SettingDefinition setting, string value, string providerKey)
{
await SettingManagementStore.SetAsync(setting.Name, value, Name, NormalizeProviderKey(providerKey));
}
public virtual async Task ClearAsync(SettingDefinition setting, string providerKey)
{
await SettingManagementStore.DeleteAsync(setting.Name, Name, NormalizeProviderKey(providerKey));
}
protected virtual string NormalizeProviderKey(string providerKey)
{
return providerKey;
}
}
}

90
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManagementStore.cs

@ -0,0 +1,90 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
using Volo.Abp.Settings;
namespace Volo.Abp.SettingManagement
{
public class SettingManagementStore : ISettingManagementStore, ITransientDependency
{
protected IDistributedCache<SettingCacheItem> Cache { get; }
protected ISettingRepository SettingRepository { get; }
protected IGuidGenerator GuidGenerator { get; }
public SettingManagementStore(
ISettingRepository settingRepository,
IGuidGenerator guidGenerator,
IDistributedCache<SettingCacheItem> cache)
{
SettingRepository = settingRepository;
GuidGenerator = guidGenerator;
Cache = cache;
}
public async Task<string> GetOrNullAsync(string name, string providerName, string providerKey)
{
var cacheItem = await GetCacheItemAsync(name, providerName, providerKey);
return cacheItem.Value;
}
public async Task SetAsync(string name, string value, string providerName, string providerKey)
{
var setting = await SettingRepository.FindAsync(name, providerName, providerKey);
if (setting == null)
{
setting = new Setting(GuidGenerator.Create(), name, value, providerName, providerKey);
await SettingRepository.InsertAsync(setting);
}
else
{
setting.Value = value;
await SettingRepository.UpdateAsync(setting);
}
}
public async Task<List<SettingValue>> GetListAsync(string providerName, string providerKey)
{
var settings = await SettingRepository.GetListAsync(providerName, providerKey);
return settings.Select(s => new SettingValue(s.Name, s.Value)).ToList();
}
public async Task DeleteAsync(string name, string providerName, string providerKey)
{
var setting = await SettingRepository.FindAsync(name, providerName, providerKey);
if (setting != null)
{
await SettingRepository.DeleteAsync(setting);
}
}
protected virtual async Task<SettingCacheItem> GetCacheItemAsync(string name, string providerName, string providerKey)
{
var cacheKey = CalculateCacheKey(name, providerName, providerKey);
var cacheItem = await Cache.GetAsync(cacheKey);
if (cacheItem != null)
{
return cacheItem;
}
var setting = await SettingRepository.FindAsync(name, providerName, providerKey);
cacheItem = new SettingCacheItem(setting?.Value);
await Cache.SetAsync(
cacheKey,
cacheItem
);
return cacheItem;
}
protected virtual string CalculateCacheKey(string name, string providerName, string providerKey)
{
return SettingCacheItem.CalculateCacheKey(name, providerName, providerKey);
}
}
}

68
framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingManager.cs → modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs

@ -5,18 +5,20 @@ using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Settings;
namespace Volo.Abp.Settings
namespace Volo.Abp.SettingManagement
{
public class SettingManager : ISettingManager, ISingletonDependency
{
protected ISettingDefinitionManager SettingDefinitionManager { get; }
protected ISettingEncryptionService SettingEncryptionService { get; }
protected Lazy<List<ISettingValueProvider>> Providers { get; }
protected SettingOptions Options { get; }
protected List<ISettingManagementProvider> Providers => _lazyProviders.Value;
protected SettingManagementOptions Options { get; }
private readonly Lazy<List<ISettingManagementProvider>> _lazyProviders;
public SettingManager(
IOptions<SettingOptions> options,
IOptions<SettingManagementOptions> options,
IServiceProvider serviceProvider,
ISettingDefinitionManager settingDefinitionManager,
ISettingEncryptionService settingEncryptionService)
@ -25,10 +27,12 @@ namespace Volo.Abp.Settings
SettingEncryptionService = settingEncryptionService;
Options = options.Value;
Providers = new Lazy<List<ISettingValueProvider>>(
//TODO: Instead, use IHybridServiceScopeFactory and create a scope..?
_lazyProviders = new Lazy<List<ISettingManagementProvider>>(
() => Options
.ValueProviders
.Select(c => serviceProvider.GetRequiredService(c) as ISettingValueProvider)
.Providers
.Select(c => serviceProvider.GetRequiredService(c) as ISettingManagementProvider)
.ToList(),
true
);
@ -47,7 +51,7 @@ namespace Volo.Abp.Settings
Check.NotNull(providerName, nameof(providerName));
var settingDefinitions = SettingDefinitionManager.GetAll();
var providers = Enumerable.Reverse(Providers.Value)
var providers = Enumerable.Reverse(Providers)
.SkipWhile(c => c.Name != providerName);
if (!fallback)
@ -72,7 +76,10 @@ namespace Volo.Abp.Settings
{
foreach (var provider in providerList)
{
var providerValue = await provider.GetOrNullAsync(setting, providerKey);
var providerValue = await provider.GetOrNullAsync(
setting,
provider.Name == providerName ? providerKey : null
);
if (providerValue != null)
{
value = providerValue;
@ -81,7 +88,10 @@ namespace Volo.Abp.Settings
}
else
{
value = await providerList[0].GetOrNullAsync(setting, providerKey);
value = await providerList[0].GetOrNullAsync(
setting,
providerKey
);
}
if (setting.IsEncrypted)
@ -106,7 +116,7 @@ namespace Volo.Abp.Settings
var setting = SettingDefinitionManager.Get(name);
var providers = Enumerable
.Reverse(Providers.Value)
.Reverse(Providers)
.SkipWhile(p => p.Name != providerName)
.ToList();
@ -122,10 +132,10 @@ namespace Volo.Abp.Settings
if (providers.Count > 1 && !forceToSet && setting.IsInherited && value != null)
{
//Clear the value if it's same as it's fallback value
var fallbackValue = await GetOrNullInternalAsync(name, providers[1].Name, providerKey);
var fallbackValue = await GetOrNullInternalAsync(name, providers[1].Name, null);
if (fallbackValue == value)
{
//Clear the value if it's same as it's fallback value
value = null;
}
}
@ -154,7 +164,7 @@ namespace Volo.Abp.Settings
{
var setting = SettingDefinitionManager.Get(name);
var providers = Enumerable
.Reverse(Providers.Value);
.Reverse(Providers);
if (providerName != null)
{
@ -166,30 +176,26 @@ namespace Volo.Abp.Settings
providers = providers.TakeWhile(c => c.Name == providerName);
}
var value = await GetOrNullValueFromProvidersAsync(providerKey, providers, setting);
if (setting.IsEncrypted)
{
value = SettingEncryptionService.Decrypt(setting, value);
}
return value;
}
protected virtual async Task<string> GetOrNullValueFromProvidersAsync(
string providerKey,
IEnumerable<ISettingValueProvider> providers,
SettingDefinition setting)
{
string value = null;
foreach (var provider in providers)
{
var value = await provider.GetOrNullAsync(setting, providerKey);
value = await provider.GetOrNullAsync(
setting,
provider.Name == providerName ? providerKey : null
);
if (value != null)
{
return value;
break;
}
}
return null;
if (setting.IsEncrypted)
{
value = SettingEncryptionService.Decrypt(setting, value);
}
return value;
}
}
}

31
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/TenantSettingManagementProvider.cs

@ -0,0 +1,31 @@
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Settings;
namespace Volo.Abp.SettingManagement
{
public class TenantSettingManagementProvider : SettingManagementProvider, ITransientDependency
{
public override string Name => TenantSettingValueProvider.ProviderName;
protected ICurrentTenant CurrentTenant { get; }
public TenantSettingManagementProvider(
ISettingManagementStore settingManagementStore,
ICurrentTenant currentTenant)
: base(settingManagementStore)
{
CurrentTenant = currentTenant;
}
protected override string NormalizeProviderKey(string providerKey)
{
if (providerKey != null)
{
return providerKey;
}
return CurrentTenant.Id?.ToString();
}
}
}

4
framework/src/Volo.Abp.MultiTenancy.Abstractions/Volo/Abp/Settings/TenantSettingManagerExtensions.cs → modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/TenantSettingManagerExtensions.cs

@ -2,9 +2,9 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Settings;
namespace Volo.Abp.Settings
namespace Volo.Abp.SettingManagement
{
public static class TenantSettingManagerExtensions
{

31
modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/UserSettingManagementProvider.cs

@ -0,0 +1,31 @@
using Volo.Abp.DependencyInjection;
using Volo.Abp.Settings;
using Volo.Abp.Users;
namespace Volo.Abp.SettingManagement
{
public class UserSettingManagementProvider : SettingManagementProvider, ITransientDependency
{
public override string Name => UserSettingValueProvider.ProviderName;
protected ICurrentUser CurrentUser { get; }
public UserSettingManagementProvider(
ISettingManagementStore settingManagementStore,
ICurrentUser currentUser)
: base(settingManagementStore)
{
CurrentUser = currentUser;
}
protected override string NormalizeProviderKey(string providerKey)
{
if (providerKey != null)
{
return providerKey;
}
return CurrentUser.Id?.ToString();
}
}
}

3
modules/users/src/Volo.Abp.Users.Abstractions/Volo/Abp/Settings/UserSettingManagerExtensions.cs → modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/UserSettingManagerExtensions.cs

@ -2,9 +2,10 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Settings;
using Volo.Abp.Users;
namespace Volo.Abp.Settings
namespace Volo.Abp.SettingManagement
{
//TODO: Consider to move to another package?

12
modules/setting-management/test/Volo.Abp.SettingManagement.TestBase/Volo/Abp/SettingManagement/SettingTestDataBuilder.cs

@ -22,7 +22,7 @@ namespace Volo.Abp.SettingManagement
public void Build()
{
_settingRepository.InsertAsync(
_settingRepository.Insert(
new Setting(
_guidGenerator.Create(),
"MySetting1",
@ -31,7 +31,7 @@ namespace Volo.Abp.SettingManagement
)
);
_settingRepository.InsertAsync(
_settingRepository.Insert(
new Setting(
_guidGenerator.Create(),
"MySetting2",
@ -40,7 +40,7 @@ namespace Volo.Abp.SettingManagement
)
);
_settingRepository.InsertAsync(
_settingRepository.Insert(
new Setting(
_guidGenerator.Create(),
"MySetting2",
@ -50,7 +50,7 @@ namespace Volo.Abp.SettingManagement
)
);
_settingRepository.InsertAsync(
_settingRepository.Insert(
new Setting(
_guidGenerator.Create(),
"MySetting2",
@ -60,7 +60,7 @@ namespace Volo.Abp.SettingManagement
)
);
_settingRepository.InsertAsync(
_settingRepository.Insert(
new Setting(
_guidGenerator.Create(),
"MySettingWithoutInherit",
@ -69,7 +69,7 @@ namespace Volo.Abp.SettingManagement
)
);
_settingRepository.InsertAsync(
_settingRepository.Insert(
new Setting(
_guidGenerator.Create(),
"MySettingWithoutInherit",

10
modules/setting-management/test/Volo.Abp.SettingManagement.Tests/Volo/Abp/SettingManagement/SettingManager_User_Tests.cs

@ -1,16 +1,16 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using NSubstitute;
using Shouldly;
using System;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.Settings;
using Volo.Abp.Users;
using Xunit;
namespace Volo.Abp.SettingManagement
{
public class SettingManager_User_Tests: SettingsTestBase
public class SettingManager_User_Tests : SettingsTestBase
{
private Guid? _currentUserId;

8
modules/users/src/Volo.Abp.Users.Abstractions/Volo/Abp/Users/AbpUsersAbstractionModule.cs

@ -14,12 +14,6 @@ namespace Volo.Abp.Users
)]
public class AbpUsersAbstractionModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<SettingOptions>(options =>
{
options.ValueProviders.Add<UserSettingValueProvider>();
});
}
}
}

48
modules/users/src/Volo.Abp.Users.Abstractions/Volo/Abp/Users/UserSettingValueProvider.cs

@ -1,48 +0,0 @@
using System.Threading.Tasks;
using Volo.Abp.Settings;
namespace Volo.Abp.Users
{
//TODO: Optimization: Get all settings and cache it!
//TODO: Think if it's true to have this provider in this project?
public class UserSettingValueProvider : SettingValueProvider
{
public const string ProviderName = "User";
public override string Name => ProviderName;
protected ICurrentUser CurrentUser { get; }
public UserSettingValueProvider(ISettingStore settingStore, ICurrentUser currentUser)
: base(settingStore)
{
CurrentUser = currentUser;
}
public override async Task<string> GetOrNullAsync(SettingDefinition setting, string providerKey)
{
return await SettingStore.GetOrNullAsync(setting.Name, Name, NormalizeProviderKey(providerKey));
}
public override Task SetAsync(SettingDefinition setting, string value, string providerKey)
{
return SettingStore.SetAsync(setting.Name, value, Name, NormalizeProviderKey(providerKey));
}
public override Task ClearAsync(SettingDefinition setting, string providerKey)
{
return SettingStore.DeleteAsync(setting.Name, Name, NormalizeProviderKey(providerKey));
}
private string NormalizeProviderKey(string providerKey)
{
if (providerKey == null && CurrentUser.Id.HasValue)
{
return CurrentUser.Id.Value.ToString();
}
return providerKey;
}
}
}
Loading…
Cancel
Save