Exemple #1
0
        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);
        }
Exemple #2
0
        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));
 }