public void Archive(IRepositoryContext <Tag> ctx, Tag tag, TagDiff diff, EntryEditEvent reason) { var agentLoginData = ctx.CreateAgentLoginData(PermissionContext); var archived = tag.CreateArchivedVersion(diff, agentLoginData, reason); ctx.OfType <ArchivedTagVersion>().Save(archived); }
public void Archive(ISession session, Tag tag, TagDiff diff, EntryEditEvent reason) { var agentLoginData = SessionHelper.CreateAgentLoginData(session, PermissionContext); var archived = tag.CreateArchivedVersion(diff, agentLoginData, reason); session.Save(archived); }
public ArchivedTagVersion Archive(IDatabaseContext <Tag> ctx, Tag tag, TagDiff diff, EntryEditEvent reason, string notes = "") { var agentLoginData = ctx.CreateAgentLoginData(PermissionContext); var archived = ArchivedTagVersion.Create(tag, diff, agentLoginData, reason, notes); ctx.OfType <ArchivedTagVersion>().Save(archived); return(archived); }
public ArchivedTagContract(Tag tag, TagDiff diff) { ParamIs.NotNull(() => tag); CategoryName = tag.CategoryName; Description = diff.IncludeDescription ? tag.Description.Original : null; DescriptionEng = diff.IncludeDescription ? tag.Description.English : null; HideFromSuggestions = tag.HideFromSuggestions; Id = tag.Id; Names = diff.IncludeNames ? tag.Names.Names.Select(n => new LocalizedStringContract(n)).ToArray() : null; Parent = ObjectRefContract.Create(tag.Parent); RelatedTags = diff.IncludeRelatedTags ? tag.RelatedTags.Select(t => new ObjectRefContract(t.LinkedTag)).ToArray() : null; ThumbMime = tag.Thumb != null ? tag.Thumb.Mime : null; TranslatedName = new ArchivedTranslatedStringContract(tag.TranslatedName); WebLinks = diff.IncludeWebLinks ? tag.WebLinks.Links.Select(l => new ArchivedWebLinkContract(l)).ToArray() : null; }
public void UpdateTag(TagContract contract) { ParamIs.NotNull(() => contract); PermissionContext.VerifyPermission(PermissionToken.ManageDatabase); HandleTransaction(session => { var tag = session.Load <Tag>(contract.Name); var diff = new TagDiff(); var oldAliasedTo = tag.AliasedTo != null ? tag.AliasedTo.Name : string.Empty; var newAliasedTo = contract.AliasedTo ?? string.Empty; if (oldAliasedTo != newAliasedTo) { diff.AliasedTo = true; tag.AliasedTo = session.Query <Tag>().FirstOrDefault(t => t.AliasedTo == null && t.Name == newAliasedTo); } if (tag.CategoryName != contract.CategoryName) { diff.CategoryName = true; } if (tag.Description != contract.Description) { diff.Description = true; } tag.CategoryName = contract.CategoryName; tag.Description = contract.Description; var logStr = string.Format("updated properties for {0} ({1})", tag, diff.ChangedFieldsString); AuditLog(logStr, session); Archive(session, tag, diff, EntryEditEvent.Updated); session.Update(tag); }); }
private static void AddDiffs(TagDiffs diffs, FileErrors errors, string filePath) { TagLib.File file; try { file = TagLib.File.Create(filePath); } catch (TagLib.CorruptFileException ex) { errors.Add(new FileError { FilePath = filePath, Message = ex.Message }); return; } var current = new Dictionary<Tags, string>(); var expected = new Dictionary<Tags, string>(); var folderPath = System.IO.Path.GetDirectoryName(filePath); var parts = folderPath.Split('\\'); expected.Add(Tags.Album, parts[parts.Length - 1]); expected.Add(Tags.Performers, parts[parts.Length - 2]); expected.Add(Tags.AlbumArtists, parts[parts.Length - 2]); expected.Add(Tags.Genre, parts[parts.Length - 3]); expected.Add(Tags.Title, System.IO.Path.GetFileNameWithoutExtension(filePath)); current.Add(Tags.Album, file.Tag.Album); current.Add(Tags.Performers, String.Join(";", file.Tag.Performers)); current.Add(Tags.AlbumArtists, String.Join(";", file.Tag.AlbumArtists)); current.Add(Tags.Genre, String.Join(";", file.Tag.Genres)); current.Add(Tags.Title, file.Tag.Title); foreach (var tag in expected.Keys) { if (expected[tag] != current[tag]) { var diff = new TagDiff(); diff.Tag = tag; diff.FilePath = filePath; diff.OldValue = current[tag]; diff.NewValue = expected[tag]; diffs.Add(diff); } } }
public TagBaseContract Update(TagForEditContract contract, UploadedFileContract uploadedImage) { ParamIs.NotNull(() => contract); PermissionContext.VerifyPermission(PermissionToken.EditTags); return(repository.HandleTransaction(ctx => { var tag = LoadTagById(ctx, contract.Id); permissionContext.VerifyEntryEdit(tag); var diff = new TagDiff(); if (tag.CategoryName != contract.CategoryName) { diff.CategoryName.Set(); } diff.Description.Set(tag.Description.CopyFrom(contract.Description)); if (tag.HideFromSuggestions != contract.HideFromSuggestions) { diff.HideFromSuggestions.Set(); } if (tag.Targets != contract.Targets) { diff.Targets.Set(); } if (tag.TranslatedName.DefaultLanguage != contract.DefaultNameLanguage) { tag.TranslatedName.DefaultLanguage = contract.DefaultNameLanguage; diff.OriginalName.Set(); } var nameDiff = SyncNames(ctx.OfType <TagName>(), tag, contract.Names); if (nameDiff.Changed) { diff.Names.Set(); } if (!Tag.Equals(tag.Parent, contract.Parent)) { var newParent = GetRealTag(ctx, contract.Parent, tag); if (!Equals(newParent, tag.Parent)) { diff.Parent.Set(); tag.SetParent(newParent); } } var relatedTagsDiff = tag.SyncRelatedTags(contract.RelatedTags, tagId => ctx.Load(tagId)); ctx.Sync(relatedTagsDiff); diff.RelatedTags.Set(relatedTagsDiff.Changed); var webLinkDiff = tag.WebLinks.Sync(contract.WebLinks, tag); ctx.OfType <TagWebLink>().Sync(webLinkDiff); if (webLinkDiff.Changed) { diff.WebLinks.Set(); } if (tag.Status != contract.Status) { diff.Status.Set(); } tag.CategoryName = contract.CategoryName; tag.HideFromSuggestions = contract.HideFromSuggestions; tag.Status = contract.Status; tag.Targets = contract.Targets; if (uploadedImage != null) { diff.Picture.Set(); var thumb = new EntryThumb(tag, uploadedImage.Mime); tag.Thumb = thumb; var thumbGenerator = new ImageThumbGenerator(imagePersister); thumbGenerator.GenerateThumbsAndMoveImage(uploadedImage.Stream, thumb, Tag.ImageSizes, originalSize: Constants.RestrictedImageOriginalSize); } var logStr = string.Format("updated properties for tag {0} ({1})", entryLinkFactory.CreateEntryLink(tag), diff.ChangedFieldsString); ctx.AuditLogger.AuditLog(logStr); var archived = Archive(ctx, tag, diff, EntryEditEvent.Updated, contract.UpdateNotes); AddEntryEditedEntry(ctx.OfType <ActivityEntry>(), tag, EntryEditEvent.Updated, archived); ctx.Update(tag); return new TagBaseContract(tag, LanguagePreference); })); }
public void Merge(int sourceId, int targetId) { PermissionContext.VerifyPermission(PermissionToken.MergeEntries); if (sourceId == targetId) { throw new ArgumentException("Source and target songs can't be the same", nameof(targetId)); } repository.HandleTransaction(ctx => { var source = ctx.Load(sourceId); var target = ctx.Load(targetId); var diff = new TagDiff(false); diff.Names.Set(); ctx.AuditLogger.AuditLog(string.Format("Merging {0} to {1}", source, entryLinkFactory.CreateEntryLink(target))); // Other properties if (string.IsNullOrEmpty(target.CategoryName) && !string.IsNullOrEmpty(source.CategoryName)) { target.CategoryName = source.CategoryName; diff.CategoryName.Set(); } diff.Description.Set(target.Description.CopyIfEmpty(source.Description)); // Parent tag if (target.Parent == null && source.Parent != null && target.IsValidParent(source.Parent)) { target.SetParent(source.Parent); diff.Parent.Set(); } // Related tags foreach (var relatedTag in source.RelatedTags.Select(r => r.LinkedTag) .Where(r => !r.Equals(target) && !target.RelatedTags.Any(r2 => r.Equals(r2.LinkedTag)))) { var link = target.AddRelatedTag(relatedTag); ctx.Save(link); diff.RelatedTags.Set(); } // Weblinks foreach (var w in source.WebLinks.Links.Where(w => !target.WebLinks.HasLink(w.Url))) { var link = target.CreateWebLink(w.Description, w.Url, w.Category); ctx.Save(link); diff.WebLinks.Set(); } // Followed tags foreach (var user in source.TagsForUsers.Select(r => r.User).Where(u => !target.TagsForUsers.Any(r2 => r2.User.Equals(u)))) { var link = user.AddTag(target); ctx.Save(link); } // Tag mappings foreach (var mapping in source.Mappings.Select(r => r.SourceTag).Where(r => target.Mappings.All(r2 => r2.SourceTag != r))) { var link = target.CreateMapping(mapping); ctx.Save(link); } // Create merge record new CreateMergeEntryQuery().CreateMergeEntry <Tag, TagMergeRecord>(ctx, sourceId, target); var mergeEntry = new TagMergeRecord(source, target); ctx.Save(mergeEntry); MergeTagUsages(source, target); // Delete entry before copying names var names = source.Names.Names.Select(n => new LocalizedStringContract(n)).ToArray(); CreateTrashedEntry(ctx, source, "Merged to " + target); source.Delete(); DeleteActivityEntries(ctx, sourceId); DeleteReports(ctx, sourceId); ctx.Delete(source); ctx.Flush(); // Names foreach (var n in names) { var lang = target.Names.HasNameForLanguage(n.Language) ? ContentLanguageSelection.Unspecified : n.Language; var name = target.CreateName(n.Value, lang); ctx.Save(name); } Archive(ctx, target, diff, EntryEditEvent.Updated, string.Format("Merged from {0}", source)); ctx.Update(target); }); }
public void Update(TagContract contract, UploadedFileContract uploadedImage) { ParamIs.NotNull(() => contract); PermissionContext.VerifyPermission(PermissionToken.ManageDatabase); repository.HandleTransaction(ctx => { var tag = ctx.Load(contract.Name); permissionContext.VerifyEntryEdit(tag); var diff = new TagDiff(); var newAliasedTo = contract.AliasedTo ?? string.Empty; if (!Tag.Equals(tag.AliasedTo, contract.AliasedTo)) { diff.AliasedTo = true; tag.AliasedTo = GetRealTag(ctx, newAliasedTo, tag); } if (tag.CategoryName != contract.CategoryName) { diff.CategoryName = true; } if (tag.Description != contract.Description) { diff.Description = true; } if (!Tag.Equals(tag.Parent, contract.Parent)) { var newParent = GetRealTag(ctx, contract.Parent, tag); if (!Equals(newParent, tag.Parent)) { diff.Parent = true; tag.SetParent(newParent); } } if (tag.Status != contract.Status) { diff.Status = true; } tag.CategoryName = contract.CategoryName; tag.Description = contract.Description; tag.Status = contract.Status; if (uploadedImage != null) { diff.Picture = true; var thumb = new EntryThumb(tag, uploadedImage.Mime); tag.Thumb = thumb; var thumbGenerator = new ImageThumbGenerator(imagePersister); thumbGenerator.GenerateThumbsAndMoveImage(uploadedImage.Stream, thumb, ImageSizes.Original | ImageSizes.SmallThumb, originalSize: 500); } var logStr = string.Format("updated properties for tag {0} ({1})", entryLinkFactory.CreateEntryLink(tag), diff.ChangedFieldsString); ctx.AuditLogger.AuditLog(logStr); Archive(ctx, tag, diff, EntryEditEvent.Updated); ctx.Update(tag); }); }