public void AddPermission(PermissionRecord permission, string[] rolesToMap)
        {
            Guard.ArgumentNotNull(() => permission);
            Guard.ArgumentNotNull(() => rolesToMap);

            if (permission.SystemName.IsEmpty())
            {
                return;
            }

            var permissionRecord = _permissionRecords.FirstOrDefault(x => x.SystemName == permission.SystemName);

            if (permissionRecord == null)
            {
                _permissionRecords.Add(permission);

                _ctx.SaveChanges();
            }

            permissionRecord = _permissionRecords.FirstOrDefault(x => x.SystemName == permission.SystemName);

            foreach (var roleName in rolesToMap)
            {
                var role = _customerRoles.FirstOrDefault(x => x.SystemName == roleName);
                if (role != null && !role.PermissionRecords.Any(x => x.SystemName == permission.SystemName))
                {
                    role.PermissionRecords.Add(permissionRecord);
                }
            }

            _ctx.SaveChanges();
        }
Example #2
0
        public void Migrate(IEnumerable <SettingEntry> entries)
        {
            Guard.NotNull(entries, nameof(entries));

            if (!entries.Any())
            {
                return;
            }

            using (var scope = new DbContextScope(_ctx, autoDetectChanges: false))
            {
                var toDelete = new List <Setting>();
                var toAdd    = new List <Setting>();

                // First perform DELETE actions
                foreach (var entry in entries.Where(x => x.Value == null))
                {
                    bool isPattern = entry.KeyIsGroup;
                    if (!HasSettings(entry.Key, isPattern))
                    {
                        continue; // nothing to delete
                    }
                    var db = GetSettings(entry.Key, isPattern);
                    _settings.RemoveRange(db);
                }

                _ctx.SaveChanges();

                // Then perform ADD actions
                foreach (var entry in entries.Where(x => x.Value.HasValue()))
                {
                    var existing = toAdd.FirstOrDefault(x => x.Name.Equals(entry.Key, StringComparison.InvariantCultureIgnoreCase));
                    if (existing != null)
                    {
                        existing.Value = entry.Value;
                        continue;
                    }

                    if (HasSettings(entry.Key, false))
                    {
                        continue; // skip existing (we don't perform updates)
                    }
                    _settings.Add(new Setting
                    {
                        Name    = entry.Key,
                        Value   = entry.Value,
                        StoreId = 0
                    });
                }

                _ctx.SaveChanges();
            }
        }
        /// <summary>
        /// Imports all template xml files to MessageTemplate table
        /// </summary>
        /// <param name="virtualRootPath">The virtual root path of templates to import, e.g. "~/Plugins/MyPlugins/EmailTemplates". Default is "~/App_Data/EmailTemplates".</param>
        public void ImportAll(Language language, string virtualRootPath = null)
        {
            var table = _ctx.Set <MessageTemplate>();

            var sourceTemplates = LoadAll(language, virtualRootPath);
            var dbTemplatesMap  = table
                                  .ToList()
                                  .ToMultimap(x => x.Name, x => x, StringComparer.OrdinalIgnoreCase);

            foreach (var source in sourceTemplates)
            {
                if (dbTemplatesMap.ContainsKey(source.Name))
                {
                    foreach (var target in dbTemplatesMap[source.Name])
                    {
                        if (source.To.HasValue())
                        {
                            target.To = source.To;
                        }
                        if (source.ReplyTo.HasValue())
                        {
                            target.ReplyTo = source.ReplyTo;
                        }
                        if (source.Subject.HasValue())
                        {
                            target.Subject = source.Subject;
                        }
                        if (source.ModelTypes.HasValue())
                        {
                            target.ModelTypes = source.ModelTypes;
                        }
                        if (source.Body.HasValue())
                        {
                            target.Body = source.Body;
                        }
                    }
                }
                else
                {
                    var template = new MessageTemplate
                    {
                        Name           = source.Name,
                        To             = source.To,
                        ReplyTo        = source.ReplyTo,
                        Subject        = source.Subject,
                        ModelTypes     = source.ModelTypes,
                        Body           = source.Body,
                        IsActive       = true,
                        EmailAccountId = (_defaultEmailAccount?.Id).GetValueOrDefault(),
                    };

                    table.Add(template);
                }
            }

            _ctx.SaveChanges();
        }
Example #4
0
        /// <summary>
        /// Imports all template xml files to MessageTemplate table
        /// </summary>
        public void ImportAll(Language language)
        {
            var table = _ctx.Set <MessageTemplate>();

            var sourceTemplates = LoadAll(language);
            var dbTemplatesMap  = table
                                  .ToList()
                                  .ToDictionarySafe(x => x.Name, StringComparer.OrdinalIgnoreCase);

            foreach (var source in sourceTemplates)
            {
                if (dbTemplatesMap.TryGetValue(source.Name, out var target))
                {
                    if (source.To.HasValue())
                    {
                        target.To = source.To;
                    }
                    if (source.ReplyTo.HasValue())
                    {
                        target.ReplyTo = source.ReplyTo;
                    }
                    if (source.Subject.HasValue())
                    {
                        target.Subject = source.Subject;
                    }
                    if (source.ModelTypes.HasValue())
                    {
                        target.ModelTypes = source.ModelTypes;
                    }
                    if (source.Body.HasValue())
                    {
                        target.Body = source.Body;
                    }
                }
                else
                {
                    target = new MessageTemplate
                    {
                        Name           = source.Name,
                        To             = source.To,
                        ReplyTo        = source.ReplyTo,
                        Subject        = source.Subject,
                        ModelTypes     = source.ModelTypes,
                        Body           = source.Body,
                        IsActive       = true,
                        EmailAccountId = (_defaultEmailAccount?.Id).GetValueOrDefault(),
                    };

                    table.Add(target);
                }
            }

            _ctx.SaveChanges();
        }
Example #5
0
        public void AddPermission(PermissionRecord permission, string[] rolesToMap)
        {
            Guard.NotNull(permission, nameof(permission));
            Guard.NotNull(rolesToMap, nameof(rolesToMap));

            if (permission.SystemName.IsEmpty())
            {
                return;
            }

            var permissionRecord = _permissionRecords.FirstOrDefault(x => x.SystemName == permission.SystemName);

            if (permissionRecord == null)
            {
                _permissionRecords.Add(permission);
                _ctx.SaveChanges();
            }

            permissionRecord = _permissionRecords.FirstOrDefault(x => x.SystemName == permission.SystemName);

            foreach (var roleName in rolesToMap)
            {
                var role = _customerRoles.FirstOrDefault(x => x.SystemName == roleName);
                if (role != null)
                {
                    if (!_permissionRoleMappings.Any(x => x.PermissionRecord.SystemName == permission.SystemName && x.CustomerRole.SystemName == roleName))
                    {
                        _permissionRoleMappings.Add(new PermissionRoleMapping
                        {
                            Allow              = true,
                            CustomerRoleId     = role.Id,
                            PermissionRecordId = permissionRecord.Id
                        });
                    }
                }
            }

            _ctx.SaveChanges();
        }
Example #6
0
 public void Add(Country country)
 {
     using (var ctx = new SmartObjectContext())
     {
         country.Name               = "China";
         country.AllowsBilling      = true;
         country.AllowsShipping     = true;
         country.LimitedToStores    = false;
         country.NumericIsoCode     = 1;
         country.Published          = true;
         country.ThreeLetterIsoCode = "a";
         ctx.Countries.Add(country);
         var id = ctx.SaveChanges();
     }
 }
Example #7
0
        /// <summary>
        /// Persistance test helper
        /// </summary>
        /// <typeparam name="T">Entity type</typeparam>
        /// <param name="entity">Entity</param>
        /// <param name="disposeContext">A value indicating whether to dispose context</param>
        protected T SaveAndLoadEntity <T>(T entity, bool disposeContext = true) where T : BaseEntity
        {
            context.Set <T>().Add(entity);
            context.SaveChanges();

            object id = entity.Id;

            if (disposeContext)
            {
                context.Dispose();
                context = new SmartObjectContext(GetTestDbName());
            }

            var fromDb = context.Set <T>().Find(id);

            return(fromDb);
        }
Example #8
0
        private void ReRefMessageTemplateAttachments(
            SmartObjectContext ctx,
            Dictionary <int, MessageTemplate> messageTemplatesDict,
            Dictionary <int, Download> downloads)
        {
            bool hasChanges = false;

            foreach (var kvp in messageTemplatesDict)
            {
                var downloadId = kvp.Key;
                var mt         = kvp.Value;
                var idxProp    = Array.IndexOf(new int?[] { mt.Attachment1FileId, mt.Attachment2FileId, mt.Attachment3FileId }, downloadId) + 1;

                if (idxProp > 0)
                {
                    var d = downloads.Get(downloadId);
                    if (d?.MediaFileId != null)
                    {
                        // Change Download.Id ref to MediaFile.Id
                        if (idxProp == 1)
                        {
                            mt.Attachment1FileId = d.MediaFileId;
                        }
                        if (idxProp == 2)
                        {
                            mt.Attachment2FileId = d.MediaFileId;
                        }
                        if (idxProp == 3)
                        {
                            mt.Attachment3FileId = d.MediaFileId;
                        }

                        // We don't need Download entity anymore
                        ctx.Set <Download>().Remove(d);

                        hasChanges = true;
                    }
                }
            }

            if (hasChanges)
            {
                ctx.SaveChanges();
            }
        }
        public void AddActivityLogType(string systemKeyword, string enName, string deName)
        {
            Guard.NotEmpty(systemKeyword, nameof(systemKeyword));
            Guard.NotEmpty(enName, nameof(enName));
            Guard.NotEmpty(deName, nameof(deName));

            var record = _activityLogTypeRecords.FirstOrDefault(x => x.SystemKeyword == systemKeyword);

            if (record == null)
            {
                var language = GetDefaultAdminLanguage(_ctx.Set <Setting>(), _ctx.Set <Language>());

                _activityLogTypeRecords.Add(new ActivityLogType
                {
                    Enabled       = true,
                    SystemKeyword = systemKeyword,
                    Name          = (language.UniqueSeoCode.IsCaseInsensitiveEqual("de") ? deName : enName)
                });

                _ctx.SaveChanges();
            }
        }
        public void Migrate(IEnumerable <LocaleResourceEntry> entries, bool updateTouchedResources = false)
        {
            Guard.ArgumentNotNull(() => entries);

            if (!entries.Any() || !_languages.Any())
            {
                return;
            }

            using (var scope = new DbContextScope(_ctx, autoDetectChanges: false))
            {
                var langMap = _languages.ToDictionarySafe(x => x.UniqueSeoCode.EmptyNull().ToLower());

                var toDelete = new List <LocaleStringResource>();
                var toUpdate = new List <LocaleStringResource>();
                var toAdd    = new List <LocaleStringResource>();

                // remove all entries with invalid lang identifier
                var invalidEntries = entries.Where(x => x.Lang != null && !langMap.ContainsKey(x.Lang.ToLower()));
                if (invalidEntries.Any())
                {
                    entries = entries.Except(invalidEntries);
                }

                foreach (var lang in langMap)
                {
                    foreach (var entry in entries.Where(x => x.Lang == null || langMap[x.Lang.ToLower()].Id == lang.Value.Id))
                    {
                        bool isLocal;
                        var  db = GetResource(entry.Key, lang.Value.Id, toAdd, out isLocal);

                        if (db == null && entry.Value.HasValue() && !entry.UpdateOnly)
                        {
                            // ADD action
                            toAdd.Add(new LocaleStringResource {
                                LanguageId = lang.Value.Id, ResourceName = entry.Key, ResourceValue = entry.Value
                            });
                        }

                        if (db == null)
                        {
                            continue;
                        }

                        if (entry.Value == null)
                        {
                            // DELETE action
                            if (isLocal)
                            {
                                toAdd.Remove(db);
                            }
                            else
                            {
                                toDelete.Add(db);
                            }
                        }
                        else
                        {
                            if (isLocal)
                            {
                                db.ResourceValue = entry.Value;
                                continue;
                            }

                            // UPDATE action
                            if (updateTouchedResources || !db.IsTouched.GetValueOrDefault())
                            {
                                db.ResourceValue = entry.Value;
                                toUpdate.Add(db);
                                if (toDelete.Contains(db))
                                {
                                    toDelete.Remove(db);
                                }
                            }
                        }
                    }
                }

                // add new resources to context
                _resources.AddRange(toAdd);

                // remove deleted resources
                _resources.RemoveRange(toDelete);

                // update modified resources
                toUpdate.Each(x => _ctx.Entry(x).State = System.Data.Entity.EntityState.Modified);

                // save now
                int affectedRows = _ctx.SaveChanges();
            }
        }
Example #11
0
        /// <summary>
        /// Imports all news xml files to NewsItem table
        /// </summary>
        /// <param name="virtualRootPath">The virtual root path of blogs to import, e.g. "~/Plugins/MyPlugins/NewsItem". Default is "~/App_Data/Samples/news".</param>
        /// <returns>List of new imported news items</returns>
        public IList <NewsItem> ImportAll(Language language, string virtualRootPath = null)
        {
            var newsImported = new List <NewsItem>();
            var table        = _ctx.Set <NewsItem>();
            var sourceBlogs  = LoadAll(language);
            var dbNewsMap    = table.ToList().ToMultimap(x => x.Title, x => x, StringComparer.OrdinalIgnoreCase);

            foreach (var source in sourceBlogs)
            {
                if (dbNewsMap.ContainsKey(source.Title))
                {
                    foreach (var target in dbNewsMap[source.Title])
                    {
                        if (source.Title.HasValue())
                        {
                            target.Title = source.Title;
                        }
                        if (source.MetaTitle.HasValue())
                        {
                            target.MetaTitle = source.MetaTitle;
                        }
                        if (source.MetaDescription.HasValue())
                        {
                            target.MetaDescription = source.MetaDescription;
                        }
                        if (source.Short.HasValue())
                        {
                            target.Short = source.Short;
                        }
                        if (source.Full.HasValue())
                        {
                            target.Full = source.Full;
                        }
                        if (source.CreatedOnUtc != null)
                        {
                            target.CreatedOnUtc = source.CreatedOnUtc;
                        }
                        if (source.MediaFile != null)
                        {
                            target.MediaFile = source.MediaFile;
                        }
                        if (source.PreviewMediaFile != null)
                        {
                            target.PreviewMediaFile = source.PreviewMediaFile;
                        }
                        target.AllowComments = source.AllowComments;
                    }
                }
                else
                {
                    var news = new NewsItem
                    {
                        Title            = source.Title,
                        MetaTitle        = source.MetaTitle,
                        MetaDescription  = source.MetaDescription,
                        Short            = source.Short,
                        Full             = source.Full,
                        CreatedOnUtc     = source.CreatedOnUtc,
                        MediaFile        = source.MediaFile,
                        PreviewMediaFile = source.PreviewMediaFile,
                        AllowComments    = source.AllowComments,
                        Published        = true
                    };

                    newsImported.Add(news);
                    table.Add(news);
                }
            }

            _ctx.SaveChanges();
            return(newsImported);
        }
Example #12
0
        public void MigrateUploadedFiles(SmartObjectContext ctx)
        {
            var fileSet   = ctx.Set <MediaFile>();
            var folderSet = ctx.Set <MediaFolder>();

            using (var scope = new DbContextScope(ctx,
                                                  hooksEnabled: false,
                                                  autoCommit: false,
                                                  validateOnSave: false,
                                                  lazyLoading: false,
                                                  autoDetectChanges: false))
            {
                var albumId    = _albumRegistry.GetAlbumByName(SystemAlbumProvider.Files)?.Id;
                var rootFolder = _mediaFileSystem.GetFolder("Uploaded");
                if (!rootFolder.Exists)
                {
                    return;
                }

                ProcessFolder(rootFolder, albumId.Value);

                void ProcessFolder(IFolder folder, int mediaFolderId)
                {
                    var newFiles = new List <FilePair>();

                    foreach (var uploadedFile in _mediaFileSystem.ListFiles(folder.Path))
                    {
                        var file = new MediaFile
                        {
                            CreatedOnUtc = uploadedFile.LastUpdated,
                            UpdatedOnUtc = uploadedFile.LastUpdated,
                            Extension    = uploadedFile.Extension.TrimStart('.'),
                            Name         = uploadedFile.Name,
                            MimeType     = MimeTypes.MapNameToMimeType(uploadedFile.Name),
                            Size         = Convert.ToInt32(uploadedFile.Size),
                            FolderId     = mediaFolderId,
                            Version      = 2
                        };

                        ProcessMediaFile(file);

                        newFiles.Add(new FilePair {
                            MediaFile = file, UploadedFile = uploadedFile
                        });
                        fileSet.Add(file);
                    }

                    // Process/save files of current folder
                    try
                    {
                        // Save files to DB
                        int num = scope.Commit();

                        // Copy/Move files
                        foreach (var newFile in newFiles)
                        {
                            if (_isFsProvider)
                            {
                                var newPath = GetStoragePath(newFile.MediaFile);
                                if (!_mediaFileSystem.FileExists(newPath))
                                {
                                    // TODO: (mm) (mc) should we actually MOVE the file?
                                    _mediaFileSystem.CopyFile(newFile.UploadedFile.Path, newPath);
                                }
                            }
                            else
                            {
                                _mediaStorageProvider.Save(newFile.MediaFile, MediaStorageItem.FromFile(newFile.UploadedFile));
                            }
                        }

                        if (!_isFsProvider)
                        {
                            // MediaFile.MediaStorageId has been updated, we need to save again.
                            num = scope.Commit();
                        }
                    }
                    catch
                    {
                        throw;
                    }
                    finally
                    {
                        newFiles.Clear();

                        // Breathe
                        ctx.DetachEntities <MediaFile>(deep: true);
                    }

                    foreach (var uploadedFolder in _mediaFileSystem.ListFolders(folder.Path))
                    {
                        var mediaFolder = new MediaFolder
                        {
                            Name     = uploadedFolder.Name,
                            ParentId = mediaFolderId
                        };

                        // Add folder and save ASAP, we need the folder id
                        folderSet.Add(mediaFolder);
                        ctx.SaveChanges();

                        ProcessFolder(uploadedFolder, mediaFolder.Id);
                    }
                }
            }
        }
        public void Migrate(IEnumerable <LocaleResourceEntry> entries, bool updateTouchedResources = false)
        {
            Guard.NotNull(entries, nameof(entries));

            if (!entries.Any() || !_languages.Any())
            {
                return;
            }

            using (var scope = new DbContextScope(_ctx, autoDetectChanges: false, hooksEnabled: false))
            {
                var langMap = _languages.ToDictionarySafe(x => x.LanguageCulture.EmptyNull().ToLower());

                var toDelete = new List <LocaleStringResource>();
                var toUpdate = new List <LocaleStringResource>();
                var toAdd    = new List <LocaleStringResource>();

                bool IsEntryValid(LocaleResourceEntry entry, Language targetLang)
                {
                    if (entry.Lang == null)
                    {
                        return(true);
                    }

                    var sourceLangCode = entry.Lang.ToLower();

                    if (targetLang != null)
                    {
                        var culture = targetLang.LanguageCulture;
                        if (culture == sourceLangCode || culture.StartsWith(sourceLangCode + "-"))
                        {
                            return(true);
                        }
                    }
                    else
                    {
                        if (langMap.ContainsKey(sourceLangCode))
                        {
                            return(true);
                        }

                        if (langMap.Keys.Any(k => k.StartsWith(sourceLangCode + "-", StringComparison.OrdinalIgnoreCase)))
                        {
                            return(true);
                        }
                    }

                    return(false);
                }

                // Remove all entries with invalid lang identifier
                var invalidEntries = entries.Where(x => !IsEntryValid(x, null));
                if (invalidEntries.Any())
                {
                    entries = entries.Except(invalidEntries).ToArray();
                }

                foreach (var lang in langMap)
                {
                    var validEntries = entries.Where(x => IsEntryValid(x, lang.Value)).ToArray();
                    foreach (var entry in validEntries)
                    {
                        var db = GetResource(entry.Key, lang.Value.Id, toAdd, out bool isLocal);

                        if (db == null && entry.Value.HasValue() && !entry.UpdateOnly)
                        {
                            // ADD action
                            toAdd.Add(new LocaleStringResource {
                                LanguageId = lang.Value.Id, ResourceName = entry.Key, ResourceValue = entry.Value
                            });
                        }

                        if (db == null)
                        {
                            continue;
                        }

                        if (entry.Value == null)
                        {
                            // DELETE action
                            if (isLocal)
                            {
                                toAdd.Remove(db);
                            }
                            else
                            {
                                toDelete.Add(db);
                            }
                        }
                        else
                        {
                            if (isLocal)
                            {
                                db.ResourceValue = entry.Value;
                                continue;
                            }

                            // UPDATE action
                            if (updateTouchedResources || !db.IsTouched.GetValueOrDefault())
                            {
                                db.ResourceValue = entry.Value;
                                toUpdate.Add(db);
                                if (toDelete.Contains(db))
                                {
                                    toDelete.Remove(db);
                                }
                            }
                        }
                    }
                }

                // add new resources to context
                _resources.AddRange(toAdd);

                // remove deleted resources
                _resources.RemoveRange(toDelete);

                // save now
                int affectedRows = _ctx.SaveChanges();

                _ctx.DetachEntities <Language>();
                _ctx.DetachEntities <LocaleStringResource>();
            }
        }
Example #14
0
        public void Seed(SmartObjectContext context)
        {
            context.MigrateLocaleResources(MigrateLocaleResources);

            context.SaveChanges();
        }
Example #15
0
        /// <summary>
        /// Imports all blog xml files to BlogPost table
        /// </summary>
        /// <param name="virtualRootPath">The virtual root path of blogs to import, e.g. "~/Plugins/MyPlugins/BlogPost". Default is "~/App_Data/Samples/blog".</param>
        /// <returns>List of new imported blog posts</returns>
        public IList <BlogPost> ImportAll(Language language, string virtualRootPath = null)
        {
            var blogsImported = new List <BlogPost>();
            var table         = _ctx.Set <BlogPost>();
            var sourceBlogs   = LoadAll(language);
            var dbBlogMap     = table.ToList().ToMultimap(x => x.Title, x => x, StringComparer.OrdinalIgnoreCase);

            foreach (var source in sourceBlogs)
            {
                if (dbBlogMap.ContainsKey(source.Title))
                {
                    foreach (var target in dbBlogMap[source.Title])
                    {
                        if (source.Title.HasValue())
                        {
                            target.Title = source.Title;
                        }
                        if (source.MetaTitle.HasValue())
                        {
                            target.MetaTitle = source.MetaTitle;
                        }
                        if (source.MetaDescription.HasValue())
                        {
                            target.MetaDescription = source.MetaDescription;
                        }
                        if (source.Intro.HasValue())
                        {
                            target.Intro = source.Intro;
                        }
                        if (source.Body.HasValue())
                        {
                            target.Body = source.Body;
                        }
                        if (source.Tags.HasValue())
                        {
                            target.Tags = source.Tags;
                        }
                        if (source.CreatedOnUtc != null)
                        {
                            target.CreatedOnUtc = source.CreatedOnUtc;
                        }
                        if (source.MediaFile != null)
                        {
                            target.MediaFile = source.MediaFile;
                        }
                        if (source.PreviewMediaFile != null)
                        {
                            target.PreviewMediaFile = source.PreviewMediaFile;
                        }
                        if (source.SectionBg.HasValue())
                        {
                            target.SectionBg = source.SectionBg;
                        }
                        target.DisplayTagsInPreview = source.DisplayTagsInPreview;
                        target.PreviewDisplayType   = source.PreviewDisplayType;
                        target.AllowComments        = source.AllowComments;
                    }
                }
                else
                {
                    var blog = new BlogPost
                    {
                        Title                = source.Title,
                        MetaTitle            = source.MetaTitle,
                        MetaDescription      = source.MetaDescription,
                        Intro                = source.Intro,
                        Body                 = source.Body,
                        Tags                 = source.Tags,
                        DisplayTagsInPreview = source.DisplayTagsInPreview,
                        CreatedOnUtc         = source.CreatedOnUtc,
                        PreviewDisplayType   = source.PreviewDisplayType,
                        MediaFile            = source.MediaFile,
                        PreviewMediaFile     = source.PreviewMediaFile,
                        AllowComments        = source.AllowComments,
                        SectionBg            = source.SectionBg,
                        IsPublished          = true
                    };

                    blogsImported.Add(blog);
                    table.Add(blog);
                }
            }

            _ctx.SaveChanges();
            return(blogsImported);
        }