示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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;
        }
示例#5
0
        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);
            });
        }
示例#6
0
 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);
         }
     }
 }
示例#7
0
        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);
            }));
        }
示例#8
0
        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);
            });
        }
示例#9
0
        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);
            });
        }