From 2e4ef14a77d7cb63444a13800732cce7ae6d568e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Thu, 8 Feb 2018 11:42:57 +0300 Subject: [PATCH] Improved setting system. --- .../Abp/Session/UserSettingValueProvider.cs | 13 ++- .../Volo/Abp/Settings/SettingStore.cs | 9 +++ .../DefaultStoreSettingValueProvider.cs | 10 +++ .../DefaultValueSettingValueProvider.cs | 12 +++ .../Volo/Abp/Settings/ISettingStore.cs | 2 + .../Abp/Settings/ISettingValueProvider.cs | 4 + .../Volo/Abp/Settings/NullSettingStore.cs | 29 +++++++ .../Volo/Abp/Settings/SettingManager.cs | 79 ++++++++++++++----- .../Volo/Abp/Settings/SettingValueProvider.cs | 4 + ...Tests.cs => SettingManager_Basic_Tests.cs} | 13 ++- ..._Tests.cs => SettingManager_User_Tests.cs} | 4 +- 11 files changed, 154 insertions(+), 25 deletions(-) create mode 100644 src/Volo.Abp.Settings/Volo/Abp/Settings/NullSettingStore.cs rename test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/{SettingManager_Tests.cs => SettingManager_Basic_Tests.cs} (79%) rename test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/{SettingManager_User_GetValue_Tests.cs => SettingManager_User_Tests.cs} (97%) diff --git a/src/Volo.Abp.Session/Volo/Abp/Session/UserSettingValueProvider.cs b/src/Volo.Abp.Session/Volo/Abp/Session/UserSettingValueProvider.cs index 39adb5cdd0..56e1992f73 100644 --- a/src/Volo.Abp.Session/Volo/Abp/Session/UserSettingValueProvider.cs +++ b/src/Volo.Abp.Session/Volo/Abp/Session/UserSettingValueProvider.cs @@ -1,5 +1,4 @@ -using System; -using System.Threading.Tasks; +using System.Threading.Tasks; using Volo.Abp.Settings; namespace Volo.Abp.Session @@ -34,5 +33,15 @@ namespace Volo.Abp.Session return await SettingStore.GetOrNullAsync(setting.Name, EntityType, entityId); } + + public override Task SetAsync(SettingDefinition setting, string value, string entityId) + { + return SettingStore.SetAsync(setting.Name, value, EntityType, entityId); + } + + public override Task ClearAsync(SettingDefinition setting, string entityId) + { + return SettingStore.DeleteAsync(setting.Name, EntityType, entityId); + } } } \ No newline at end of file diff --git a/src/Volo.Abp.Settings.Domain/Volo/Abp/Settings/SettingStore.cs b/src/Volo.Abp.Settings.Domain/Volo/Abp/Settings/SettingStore.cs index 5131a71116..231e097775 100644 --- a/src/Volo.Abp.Settings.Domain/Volo/Abp/Settings/SettingStore.cs +++ b/src/Volo.Abp.Settings.Domain/Volo/Abp/Settings/SettingStore.cs @@ -38,5 +38,14 @@ namespace Volo.Abp.Settings var setting = await _settingRepository.GetListAsync(entityType, entityId); return setting.Select(s => new SettingValue(s.Name, s.Value)).ToList(); } + + public async Task DeleteAsync(string name, string entityType, string entityId) + { + var setting = await _settingRepository.FindAsync(name, entityType, entityId); + if (setting != null) + { + await _settingRepository.DeleteAsync(setting); + } + } } } diff --git a/src/Volo.Abp.Settings/Volo/Abp/Settings/DefaultStoreSettingValueProvider.cs b/src/Volo.Abp.Settings/Volo/Abp/Settings/DefaultStoreSettingValueProvider.cs index 3369e987d2..86166f1eb7 100644 --- a/src/Volo.Abp.Settings/Volo/Abp/Settings/DefaultStoreSettingValueProvider.cs +++ b/src/Volo.Abp.Settings/Volo/Abp/Settings/DefaultStoreSettingValueProvider.cs @@ -15,5 +15,15 @@ namespace Volo.Abp.Settings { return SettingStore.GetOrNullAsync(setting.Name, null, null); } + + public override Task SetAsync(SettingDefinition setting, string value, string entityId) + { + return SettingStore.SetAsync(setting.Name, value, null, null); + } + + public override Task ClearAsync(SettingDefinition setting, string entityId) + { + return SettingStore.DeleteAsync(setting.Name, null, null); + } } } \ No newline at end of file diff --git a/src/Volo.Abp.Settings/Volo/Abp/Settings/DefaultValueSettingValueProvider.cs b/src/Volo.Abp.Settings/Volo/Abp/Settings/DefaultValueSettingValueProvider.cs index 09a81028bf..f6d6df3b91 100644 --- a/src/Volo.Abp.Settings/Volo/Abp/Settings/DefaultValueSettingValueProvider.cs +++ b/src/Volo.Abp.Settings/Volo/Abp/Settings/DefaultValueSettingValueProvider.cs @@ -16,5 +16,17 @@ namespace Volo.Abp.Settings { return Task.FromResult(setting.DefaultValue); } + + public override Task SetAsync(SettingDefinition setting, string value, string entityId) + { + setting.DefaultValue = value; + return Task.CompletedTask; + } + + public override Task ClearAsync(SettingDefinition setting, string entityId) + { + setting.DefaultValue = null; + return Task.CompletedTask; + } } } \ No newline at end of file diff --git a/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingStore.cs b/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingStore.cs index 1c4924b1e3..523da0c38c 100644 --- a/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingStore.cs +++ b/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingStore.cs @@ -11,5 +11,7 @@ namespace Volo.Abp.Settings Task SetAsync([NotNull] string name, [NotNull] string value, [CanBeNull] string entityType, [CanBeNull] string entityId); Task> GetListAsync([CanBeNull] string entityType, [CanBeNull] string entityId); + + Task DeleteAsync([NotNull] string name, [CanBeNull]string entityType, [CanBeNull]string entityId); } } diff --git a/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingValueProvider.cs b/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingValueProvider.cs index 05eda04da3..9065b4bba7 100644 --- a/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingValueProvider.cs +++ b/src/Volo.Abp.Settings/Volo/Abp/Settings/ISettingValueProvider.cs @@ -8,5 +8,9 @@ namespace Volo.Abp.Settings string EntityType { get; } Task GetOrNullAsync([NotNull] SettingDefinition setting, [CanBeNull] string entityId); + + Task SetAsync([NotNull] SettingDefinition setting, [NotNull] string value, [CanBeNull] string entityId); + + Task ClearAsync([NotNull] SettingDefinition setting, [CanBeNull] string entityId); } } \ No newline at end of file diff --git a/src/Volo.Abp.Settings/Volo/Abp/Settings/NullSettingStore.cs b/src/Volo.Abp.Settings/Volo/Abp/Settings/NullSettingStore.cs new file mode 100644 index 0000000000..898e2d9f51 --- /dev/null +++ b/src/Volo.Abp.Settings/Volo/Abp/Settings/NullSettingStore.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Settings +{ + public class NullSettingStore : ISettingStore, ISingletonDependency + { + public Task GetOrNullAsync(string name, string entityType, string entityId) + { + return Task.FromResult((string) null); + } + + public Task SetAsync(string name, string value, string entityType, string entityId) + { + return Task.CompletedTask; + } + + public Task> GetListAsync(string entityType, string entityId) + { + return Task.FromResult(new List()); + } + + public Task DeleteAsync(string name, string entityType, string entityId) + { + return Task.CompletedTask; + } + } +} \ No newline at end of file diff --git a/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingManager.cs b/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingManager.cs index dd315e48f9..4795c086cb 100644 --- a/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingManager.cs +++ b/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingManager.cs @@ -38,34 +38,31 @@ namespace Volo.Abp.Settings ); } - public virtual async Task GetOrNullAsync(string name) + public virtual Task GetOrNullAsync(string name) { Check.NotNull(name, nameof(name)); - var setting = SettingDefinitionManager.Get(name); - var contributors = Enumerable.Reverse(Providers.Value); - - foreach (var contributor in contributors) - { - var value = await contributor.GetOrNullAsync(setting, null); - if (value != null) - { - return value; - } - } - - return null; + return GetOrNullInternalAsync(name, null, null); } - public virtual async Task GetOrNullAsync(string name, string entityType, string entityId, bool fallback = true) + public virtual Task GetOrNullAsync(string name, string entityType, string entityId, bool fallback = true) { Check.NotNull(name, nameof(name)); Check.NotNull(entityType, nameof(entityType)); + + return GetOrNullInternalAsync(name, entityType, entityId, fallback); + } + public virtual async Task GetOrNullInternalAsync(string name, string entityType, string entityId, bool fallback = true) + { var setting = SettingDefinitionManager.Get(name); var providers = Enumerable - .Reverse(Providers.Value) - .SkipWhile(c => c.EntityType != entityType); + .Reverse(Providers.Value); + + if (entityType != null) + { + providers = providers.SkipWhile(c => c.EntityType != entityType); + } if (!fallback) { @@ -137,12 +134,56 @@ namespace Volo.Abp.Settings public virtual Task SetAsync(string name, string value, bool forceToSet = false) { - throw new System.NotImplementedException(); + Check.NotNull(name, nameof(name)); + + return SetInternalAsync(name, value, null, null, forceToSet); } public virtual Task SetAsync(string name, string value, string entityType, string entityId, bool forceToSet = false) { - throw new System.NotImplementedException(); + Check.NotNull(name, nameof(name)); + Check.NotNull(entityType, nameof(entityType)); + + return SetInternalAsync(name, value, entityType, entityId, forceToSet); + } + + protected virtual async Task SetInternalAsync(string name, string value, string entityType, string entityId, bool forceToSet = false) + { + var setting = SettingDefinitionManager.Get(name); + + if (!forceToSet) + { + var currentValue = await GetOrNullInternalAsync(name, entityType, entityId); + if (currentValue == value) + { + return; + } + } + + var providers = Enumerable + .Reverse(Providers.Value) + .SkipWhile(p => p.EntityType != entityType) + .ToList(); + + if (!providers.Any()) + { + return; + } + + if (value == null) + { + foreach (var provider in providers) + { + await provider.ClearAsync(setting, entityId); + } + } + else + { + foreach (var provider in providers) + { + await provider.SetAsync(setting, value, entityId); + } + } } } } \ No newline at end of file diff --git a/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingValueProvider.cs b/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingValueProvider.cs index c4ab0bba2b..5af5b45471 100644 --- a/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingValueProvider.cs +++ b/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingValueProvider.cs @@ -15,5 +15,9 @@ namespace Volo.Abp.Settings } public abstract Task GetOrNullAsync(SettingDefinition setting, string entityId); + + public abstract Task SetAsync(SettingDefinition setting, string value, string entityId); + + public abstract Task ClearAsync(SettingDefinition setting, string entityId); } } \ No newline at end of file diff --git a/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_Tests.cs b/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_Basic_Tests.cs similarity index 79% rename from test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_Tests.cs rename to test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_Basic_Tests.cs index b690fe3895..184fd3bb80 100644 --- a/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_Tests.cs +++ b/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_Basic_Tests.cs @@ -4,11 +4,11 @@ using Xunit; namespace Volo.Abp.Settings { - public class SettingManager_Tests : AbpSettingsTestBase + public class SettingManager_Basic_Tests : AbpSettingsTestBase { private readonly ISettingManager _settingManager; - public SettingManager_Tests() + public SettingManager_Basic_Tests() { _settingManager = GetRequiredService(); } @@ -42,5 +42,14 @@ namespace Volo.Abp.Settings settingValues.ShouldContain(sv => sv.Name == "MySetting2" && sv.Value == "default-store-value"); settingValues.ShouldContain(sv => sv.Name == "SettingNotSetInStore" && sv.Value == "default-value"); } + + [Fact] + public async Task Should_Set_Value() + { + await _settingManager.SetAsync("MySetting1", "43"); + + (await _settingManager.GetOrNullAsync("MySetting1")).ShouldBe("43"); + //TODO: Also check database! + } } } diff --git a/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_User_GetValue_Tests.cs b/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_User_Tests.cs similarity index 97% rename from test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_User_GetValue_Tests.cs rename to test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_User_Tests.cs index 650e242d9f..af6e7e195d 100644 --- a/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_User_GetValue_Tests.cs +++ b/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_User_Tests.cs @@ -8,13 +8,13 @@ using Xunit; namespace Volo.Abp.Settings { - public class SettingManager_User_GetValue_Tests: AbpSettingsTestBase + public class SettingManager_User_Tests: AbpSettingsTestBase { private Guid _currentUserId; private readonly ISettingManager _settingManager; - public SettingManager_User_GetValue_Tests() + public SettingManager_User_Tests() { _settingManager = GetRequiredService(); }