private async Task <SaveThemeVariablesResult> SaveThemeVariablesInternal(ThemeManifest manifest, int storeId, IDictionary <string, object> variables) { var result = new SaveThemeVariablesResult(); var infos = manifest.Variables; var unsavedVars = new List <string>(); var savedThemeVars = await _db.ThemeVariables .Where(v => v.StoreId == storeId && v.Theme == manifest.ThemeName) .ToDictionaryAsync(x => x.Name); bool touched = false; foreach (var v in variables) { if (!infos.TryGetValue(v.Key, out var info)) { // var not specified in metadata so don't save // TODO: (MC) delete from db also if it exists continue; } var value = v.Value == null ? string.Empty : v.Value.ToString(); var savedThemeVar = savedThemeVars.Get(v.Key); if (savedThemeVar != null) { if (value.IsEmpty() || String.Equals(info.DefaultValue, value, StringComparison.CurrentCultureIgnoreCase)) { // it's either null or the default value, so delete _db.ThemeVariables.Remove(savedThemeVar); result.Deleted.Add(savedThemeVar); touched = true; } else { // update entity if (!savedThemeVar.Value.Equals(value, StringComparison.OrdinalIgnoreCase)) { savedThemeVar.Value = value; result.Updated.Add(savedThemeVar); touched = true; } } } else { if (value.HasValue() && !string.Equals(info.DefaultValue, value, StringComparison.CurrentCultureIgnoreCase)) { // Insert entity (only when not default value) unsavedVars.Add(v.Key); savedThemeVar = new ThemeVariable { Theme = manifest.ThemeName, Name = v.Key, Value = value, StoreId = storeId }; _db.ThemeVariables.Add(savedThemeVar); result.Inserted.Add(savedThemeVar); touched = true; } } } if (touched) { await _db.SaveChangesAsync(); } return(result); }
public virtual int SaveThemeVariables(string themeName, int storeId, IDictionary <string, object> variables) { Guard.ArgumentNotEmpty(themeName, "themeName"); Guard.Against <ArgumentException>(!_themeRegistry.ThemeManifestExists(themeName), "The theme '{0}' does not exist in the registry.".FormatInvariant(themeName)); Guard.ArgumentNotNull(variables, "variables"); if (!variables.Any()) { return(0); } var count = 0; var infos = _themeRegistry.GetThemeManifest(themeName).Variables; using (var scope = new DbContextScope(ctx: _rsVariables.Context, autoCommit: false)) { var unsavedVars = new List <string>(); var savedThemeVars = _rsVariables.Table.Where(v => v.StoreId == storeId && v.Theme.Equals(themeName, StringComparison.OrdinalIgnoreCase)).ToList(); bool touched = false; foreach (var v in variables) { ThemeVariableInfo info; if (!infos.TryGetValue(v.Key, out info)) { // var not specified in metadata so don't save // TODO: (MC) delete from db also if it exists continue; } var value = v.Value == null ? string.Empty : v.Value.ToString(); var savedThemeVar = savedThemeVars.FirstOrDefault(x => x.Name == v.Key); if (savedThemeVar != null) { if (value.IsEmpty() || String.Equals(info.DefaultValue, value, StringComparison.CurrentCultureIgnoreCase)) { // it's either null or the default value, so delete _rsVariables.Delete(savedThemeVar); _eventPublisher.EntityDeleted(savedThemeVar); touched = true; count++; } else { // update entity if (!savedThemeVar.Value.Equals(value, StringComparison.OrdinalIgnoreCase)) { savedThemeVar.Value = value; _eventPublisher.EntityUpdated(savedThemeVar); touched = true; count++; } } } else { if (value.HasValue() && !String.Equals(info.DefaultValue, value, StringComparison.CurrentCultureIgnoreCase)) { // insert entity (only when not default value) unsavedVars.Add(v.Key); savedThemeVar = new ThemeVariable { Theme = themeName, Name = v.Key, Value = value, StoreId = storeId }; _rsVariables.Insert(savedThemeVar); _eventPublisher.EntityInserted(savedThemeVar); touched = true; count++; } } } if (touched) { _rsVariables.Context.SaveChanges(); } } return(count); }
private static string BuildThemeVarsCacheKey(ThemeVariable entity) { return(BuildThemeVarsCacheKey(entity.Theme, entity.StoreId)); }