@@ -21,7 +21,7 @@ namespace VirtoCommerce.Platform.Data.Settings
21
21
{
22
22
/// <summary>
23
23
/// Provide next functionality to working with settings
24
- /// - Load setting metainformation from module manifest and database
24
+ /// - Load settings meta information from module manifest and database
25
25
/// - Deep load all settings for entity
26
26
/// - Mass update all entity settings
27
27
/// </summary>
@@ -32,7 +32,7 @@ public class SettingsManager : ISettingsManager
32
32
private readonly IDictionary < string , SettingDescriptor > _registeredSettingsByNameDict = new Dictionary < string , SettingDescriptor > ( StringComparer . OrdinalIgnoreCase ) . WithDefaultValue ( null ) ;
33
33
private readonly IDictionary < string , IEnumerable < SettingDescriptor > > _registeredTypeSettingsByNameDict = new Dictionary < string , IEnumerable < SettingDescriptor > > ( StringComparer . OrdinalIgnoreCase ) . WithDefaultValue ( null ) ;
34
34
private readonly IEventPublisher _eventPublisher ;
35
- private readonly IDictionary < string , ObjectSettingEntry > _fixedSettingsDict ;
35
+ private readonly Dictionary < string , ObjectSettingEntry > _fixedSettingsDict ;
36
36
37
37
public SettingsManager ( Func < IPlatformRepository > repositoryFactory ,
38
38
IPlatformMemoryCache memoryCache ,
@@ -51,10 +51,8 @@ public SettingsManager(Func<IPlatformRepository> repositoryFactory,
51
51
52
52
public void RegisterSettingsForType ( IEnumerable < SettingDescriptor > settings , string typeName )
53
53
{
54
- if ( settings == null )
55
- {
56
- throw new ArgumentNullException ( nameof ( settings ) ) ;
57
- }
54
+ ArgumentNullException . ThrowIfNull ( settings ) ;
55
+
58
56
var existTypeSettings = _registeredTypeSettingsByNameDict [ typeName ] ;
59
57
if ( existTypeSettings != null )
60
58
{
@@ -65,17 +63,15 @@ public void RegisterSettingsForType(IEnumerable<SettingDescriptor> settings, str
65
63
66
64
public IEnumerable < SettingDescriptor > GetSettingsForType ( string typeName )
67
65
{
68
- return _registeredTypeSettingsByNameDict [ typeName ] ?? Enumerable . Empty < SettingDescriptor > ( ) ;
66
+ return _registeredTypeSettingsByNameDict [ typeName ] ?? [ ] ;
69
67
}
70
68
71
69
public IEnumerable < SettingDescriptor > AllRegisteredSettings => _registeredSettingsByNameDict . Values ;
72
70
73
71
public void RegisterSettings ( IEnumerable < SettingDescriptor > settings , string moduleId = null )
74
72
{
75
- if ( settings == null )
76
- {
77
- throw new ArgumentNullException ( nameof ( settings ) ) ;
78
- }
73
+ ArgumentNullException . ThrowIfNull ( settings ) ;
74
+
79
75
foreach ( var setting in settings )
80
76
{
81
77
setting . ModuleId = moduleId ;
@@ -89,21 +85,18 @@ public void RegisterSettings(IEnumerable<SettingDescriptor> settings, string mod
89
85
90
86
public virtual async Task < ObjectSettingEntry > GetObjectSettingAsync ( string name , string objectType = null , string objectId = null )
91
87
{
92
- if ( name == null )
93
- {
94
- throw new ArgumentNullException ( nameof ( name ) ) ;
95
- }
96
- return ( await GetObjectSettingsAsync ( new [ ] { name } , objectType , objectId ) ) . FirstOrDefault ( ) ;
88
+ ArgumentException . ThrowIfNullOrWhiteSpace ( name ) ;
89
+
90
+ return ( await GetObjectSettingsAsync ( [ name ] , objectType , objectId ) ) . FirstOrDefault ( ) ;
97
91
}
98
92
99
93
public virtual async Task < IEnumerable < ObjectSettingEntry > > GetObjectSettingsAsync ( IEnumerable < string > names , string objectType = null , string objectId = null )
100
94
{
101
- if ( names == null )
102
- {
103
- throw new ArgumentNullException ( nameof ( names ) ) ;
104
- }
105
- var cacheKey = CacheKey . With ( GetType ( ) , "GetSettingByNamesAsync" , string . Join ( ";" , names ) , objectType , objectId ) ;
106
- var result = await _memoryCache . GetOrCreateExclusiveAsync ( cacheKey , async ( cacheEntry ) =>
95
+ ArgumentNullException . ThrowIfNull ( names ) ;
96
+
97
+ var settingNames = names as string [ ] ?? names . ToArray ( ) ;
98
+ var cacheKey = CacheKey . With ( GetType ( ) , "GetSettingByNamesAsync" , string . Join ( ";" , settingNames ) , objectType , objectId ) ;
99
+ var result = await _memoryCache . GetOrCreateExclusiveAsync ( cacheKey , async cacheEntry =>
107
100
{
108
101
var resultObjectSettings = new List < ObjectSettingEntry > ( ) ;
109
102
var dbStoredSettings = new List < SettingEntity > ( ) ;
@@ -113,87 +106,89 @@ public virtual async Task<IEnumerable<ObjectSettingEntry>> GetObjectSettingsAsyn
113
106
{
114
107
repository . DisableChangesTracking ( ) ;
115
108
//try to load setting from db
116
- dbStoredSettings . AddRange ( await repository . GetObjectSettingsByNamesAsync ( names . ToArray ( ) , objectType , objectId ) ) ;
109
+ dbStoredSettings . AddRange ( await repository . GetObjectSettingsByNamesAsync ( settingNames , objectType , objectId ) ) ;
117
110
}
118
111
119
- foreach ( var name in names )
112
+ foreach ( var name in settingNames )
120
113
{
121
- var objectSetting = _fixedSettingsDict . ContainsKey ( name ) ?
122
- GetFixedSetting ( name ) :
123
- GetRegularSetting ( name , dbStoredSettings , objectType , objectId ) ;
114
+ var objectSetting = _fixedSettingsDict . ContainsKey ( name )
115
+ ? GetFixedSetting ( name )
116
+ : GetRegularSetting ( name , dbStoredSettings , objectType , objectId ) ;
124
117
125
118
resultObjectSettings . Add ( objectSetting ) ;
126
119
127
120
//Add cache expiration token for setting
128
121
cacheEntry . AddExpirationToken ( SettingsCacheRegion . CreateChangeToken ( objectSetting ) ) ;
129
122
}
123
+
130
124
return resultObjectSettings ;
131
125
} ) ;
126
+
132
127
return result ;
133
128
}
134
129
135
130
public virtual async Task RemoveObjectSettingsAsync ( IEnumerable < ObjectSettingEntry > objectSettings )
136
131
{
137
- if ( objectSettings == null )
138
- {
139
- throw new ArgumentNullException ( nameof ( objectSettings ) ) ;
140
- }
132
+ ArgumentNullException . ThrowIfNull ( objectSettings ) ;
133
+
134
+ var settingEntries = objectSettings as ObjectSettingEntry [ ] ?? objectSettings . ToArray ( ) ;
141
135
using ( var repository = _repositoryFactory ( ) )
142
136
{
143
- foreach ( var objectSetting in objectSettings )
137
+ foreach ( var objectSetting in settingEntries )
144
138
{
145
- var dbSetting = repository . Settings . FirstOrDefault ( x => x . Name == objectSetting . Name && x . ObjectType == objectSetting . ObjectType && x . ObjectId == objectSetting . ObjectId ) ;
139
+ var dbSetting = repository . Settings . FirstOrDefault ( x =>
140
+ x . Name == objectSetting . Name && x . ObjectType == objectSetting . ObjectType &&
141
+ x . ObjectId == objectSetting . ObjectId ) ;
146
142
if ( dbSetting != null )
147
143
{
148
144
repository . Remove ( dbSetting ) ;
149
145
}
150
146
}
147
+
151
148
await repository . UnitOfWork . CommitAsync ( ) ;
152
- ClearCache ( objectSettings ) ;
153
149
}
150
+
151
+ ClearCache ( settingEntries ) ;
154
152
}
155
153
156
154
public virtual async Task SaveObjectSettingsAsync ( IEnumerable < ObjectSettingEntry > objectSettings )
157
155
{
158
- if ( objectSettings == null )
159
- {
160
- throw new ArgumentNullException ( nameof ( objectSettings ) ) ;
161
- }
156
+ ArgumentNullException . ThrowIfNull ( objectSettings ) ;
162
157
163
158
var changedEntries = new List < GenericChangedEntry < ObjectSettingEntry > > ( ) ;
164
159
160
+ // Ignore unregistered settings, fixed settings, and settings without values
161
+ var settings = objectSettings
162
+ . Where ( x => _registeredSettingsByNameDict . ContainsKey ( x . Name ) &&
163
+ ! _fixedSettingsDict . ContainsKey ( x . Name ) &&
164
+ x . ItHasValues )
165
+ . ToArray ( ) ;
166
+
165
167
using ( var repository = _repositoryFactory ( ) )
166
168
{
167
- var settingNames = objectSettings . Select ( x => x . Name ) . Distinct ( ) . ToArray ( ) ;
168
- var alreadyExistDbSettings = ( await repository . Settings
169
+ var settingNames = settings . Select ( x => x . Name ) . Distinct ( ) . ToArray ( ) ;
170
+
171
+ var alreadyExistDbSettings = await repository . Settings
169
172
. Include ( s => s . SettingValues )
170
173
. Where ( x => settingNames . Contains ( x . Name ) )
171
174
. AsSplitQuery ( )
172
- . ToListAsync ( ) ) ;
175
+ . ToListAsync ( ) ;
173
176
174
177
var validator = new ObjectSettingEntryValidator ( ) ;
175
- foreach ( var setting in objectSettings . Where ( x => x . ItHasValues ) )
176
- {
177
- if ( ! validator . Validate ( setting ) . IsValid )
178
- {
179
- throw new PlatformException ( $ "Setting with name { setting . Name } is invalid") ;
180
- }
181
-
182
- if ( _fixedSettingsDict . ContainsKey ( setting . Name ) )
183
- {
184
- throw new PlatformException ( $ "Setting with name { setting . Name } is read only") ;
185
- }
186
178
187
- // Skip when Setting is not registered
179
+ foreach ( var setting in settings )
180
+ {
188
181
var settingDescriptor = _registeredSettingsByNameDict [ setting . Name ] ;
189
- if ( settingDescriptor == null )
182
+
183
+ if ( ! ( await validator . ValidateAsync ( setting ) ) . IsValid )
190
184
{
191
- continue ;
185
+ throw new PlatformException ( $ "Setting with name { setting . Name } is invalid" ) ;
192
186
}
193
187
194
188
// We need to convert resulting DB entities to model. Use ValueObject.Equals to find already saved setting entity from passed setting
195
- var originalEntity = alreadyExistDbSettings . Where ( x => x . Name . EqualsInvariant ( setting . Name ) )
196
- . FirstOrDefault ( x => x . ToModel ( new ObjectSettingEntry ( settingDescriptor ) ) . Equals ( setting ) ) ;
189
+ var originalEntity = alreadyExistDbSettings . FirstOrDefault ( x =>
190
+ x . Name . EqualsIgnoreCase ( setting . Name ) &&
191
+ x . ToModel ( new ObjectSettingEntry ( settingDescriptor ) ) . Equals ( setting ) ) ;
197
192
198
193
var modifiedEntity = AbstractTypeFactory < SettingEntity > . TryCreateInstance ( ) . FromModel ( setting ) ;
199
194
@@ -216,7 +211,7 @@ public virtual async Task SaveObjectSettingsAsync(IEnumerable<ObjectSettingEntry
216
211
await repository . UnitOfWork . CommitAsync ( ) ;
217
212
}
218
213
219
- ClearCache ( objectSettings ) ;
214
+ ClearCache ( settings ) ;
220
215
221
216
await _eventPublisher . Publish ( new ObjectSettingChangedEvent ( changedEntries ) ) ;
222
217
}
@@ -245,7 +240,7 @@ protected virtual ObjectSettingEntry GetRegularSetting(string name, List<Setting
245
240
ObjectType = objectType ,
246
241
ObjectId = objectId
247
242
} ;
248
- var dbSetting = dbStoredSettings . FirstOrDefault ( x => x . Name . EqualsInvariant ( name ) ) ;
243
+ var dbSetting = dbStoredSettings . FirstOrDefault ( x => x . Name . EqualsIgnoreCase ( name ) ) ;
249
244
if ( dbSetting != null )
250
245
{
251
246
objectSetting = dbSetting . ToModel ( objectSetting ) ;
0 commit comments