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(); }
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(); }
/// <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(); }
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(); }
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(); } }
/// <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); }
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(); } }
/// <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); }
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>(); } }
public void Seed(SmartObjectContext context) { context.MigrateLocaleResources(MigrateLocaleResources); context.SaveChanges(); }
/// <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); }