Esempio n. 1
0
        public int MoveToTrash(int albumId)
        {
            PermissionContext.VerifyPermission(PermissionToken.MoveToTrash);

            return(HandleTransaction(ctx => {
                var album = ctx.Load <Album>(albumId);

                AuditLog(string.Format("moving {0} to trash", album), ctx);

                NHibernateUtil.Initialize(album.CoverPictureData);

                var archived = new ArchivedAlbumContract(album, new AlbumDiff(true));
                var data = XmlHelper.SerializeToXml(archived);
                var trashed = new TrashedEntry(album, data, GetLoggedUser(ctx));

                ctx.Save(trashed);

                album.DeleteLinks();

                var ctxActivity = ctx.OfType <AlbumActivityEntry>();
                var activityEntries = ctxActivity.Query().Where(t => t.Entry.Id == albumId).ToArray();

                foreach (var activityEntry in activityEntries)
                {
                    ctxActivity.Delete(activityEntry);
                }

                ctx.Delete(album);

                return trashed.Id;
            }));
        }
Esempio n. 2
0
        public void SerializeToXml_Unicode()
        {
            var album = new ArchivedAlbumContract {
                Description = "初音ミク"
            };

            var res = SerializeToObjectAndBack(album);

            res.Description.Should().Be(album.Description, "string is intact");
        }
Esempio n. 3
0
        public void SerializeToXml_Unicode()
        {
            var album = new ArchivedAlbumContract {
                Description = "初音ミク"
            };

            var res = SerializeToObjectAndBack(album);

            Assert.AreEqual(album.Description, res.Description, "string is intact");
        }
Esempio n. 4
0
        /// <summary>
        /// Creates an archived version of an album.
        /// </summary>
        /// <param name="album">Album to be archived. Cannot be null.</param>
        /// <param name="diff">Album diff. Cannot be null.</param>
        /// <param name="author">User creating the archived version. Cannot be null.</param>
        /// <param name="reason">Reason for archiving.</param>
        /// <param name="notes">Free-form edit notes. Cannot be null.</param>
        /// <returns>Archived album version. Cannot be null.</returns>
        /// <exception cref="XmlException">If the entry could not be serialized. This could happen if the object contains illegal characters.</exception>
        public static ArchivedAlbumVersion Create(Album album, AlbumDiff diff, AgentLoginData author, AlbumArchiveReason reason, string notes)
        {
            ParamIs.NotNull(() => album);
            ParamIs.NotNull(() => diff);
            ParamIs.NotNull(() => author);
            ParamIs.NotNull(() => notes);

            var contract = new ArchivedAlbumContract(album, diff);
            var data     = XmlHelper.SerializeToXml(contract);

            return(album.CreateArchivedVersion(data, diff, author, reason, notes));
        }
Esempio n. 5
0
        public void SerializeToXml_MultipleForbiddenChars()
        {
            var name  = "Miku Miku!";
            var album = new ArchivedAlbumContract {
                Description = $"\x01{name}\x02"
            };

            album.Description.IsNormalized().Should().BeTrue();

            var res = SerializeToObjectAndBack(album);

            res.Description.Should().Be(name, "string is intact");
        }
Esempio n. 6
0
        public void SerializeToXml_MultipleForbiddenChars()
        {
            var name  = "Miku Miku!";
            var album = new ArchivedAlbumContract {
                Description = string.Format("\x01{0}\x02", name)
            };

            Assert.IsTrue(album.Description.IsNormalized());

            var res = SerializeToObjectAndBack(album);

            Assert.AreEqual(name, res.Description, "string is intact");
        }
Esempio n. 7
0
        public void SerializeToUTF8XmlString_ValidObject()
        {
            var album = new ArchivedAlbumContract {
                Description = "Miku Miku!"
            };
            var doc         = XmlHelper.SerializeToXml(album);
            var declaration = new XDeclaration("1.0", "utf-8", "yes");
            var reference   = declaration + Environment.NewLine + doc;

            var res = XmlHelper.SerializeToUTF8XmlString(album);

            res.StartsWith("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>").Should().BeTrue("Header is correct");
            res.Should().Be(reference, "Result as expected");
        }
Esempio n. 8
0
        public int MoveToTrash(int albumId)
        {
            PermissionContext.VerifyPermission(PermissionToken.MoveToTrash);

            return(HandleTransaction(session => {
                var album = session.Load <Album>(albumId);

                AuditLog(string.Format("moving {0} to trash", album), session);

                var archived = new ArchivedAlbumContract(album, new AlbumDiff(true));
                var data = XmlHelper.SerializeToXml(archived);
                var trashed = new TrashedEntry(album, data, GetLoggedUser(session));

                session.Save(trashed);

                album.DeleteLinks();
                session.Delete(album);

                return trashed.Id;
            }));
        }
Esempio n. 9
0
        public EntryRevertedContract RevertToVersion(int archivedAlbumVersionId)
        {
            PermissionContext.VerifyPermission(PermissionToken.RestoreRevisions);

            return(HandleTransaction(session => {
                var archivedVersion = session.Load <ArchivedAlbumVersion>(archivedAlbumVersionId);
                var album = archivedVersion.Album;

                SysLog("reverting " + album + " to version " + archivedVersion.Version);

                var fullProperties = ArchivedAlbumContract.GetAllProperties(archivedVersion);
                var warnings = new List <string>();

                album.Description = fullProperties.Description;
                album.DiscType = fullProperties.DiscType;
                album.TranslatedName.DefaultLanguage = fullProperties.TranslatedName.DefaultLanguage;

                // Picture
                var versionWithPic = archivedVersion.GetLatestVersionWithField(AlbumEditableFields.Cover);

                if (versionWithPic != null)
                {
                    album.CoverPictureData = versionWithPic.CoverPicture;
                }

                // Original release
                album.OriginalRelease = (fullProperties.OriginalRelease != null ? new AlbumRelease(fullProperties.OriginalRelease) : null);

                // Artists
                SessionHelper.RestoreObjectRefs <ArtistForAlbum, Artist, ArchivedArtistForAlbumContract>(
                    session, warnings, album.AllArtists, fullProperties.Artists,
                    (a1, a2) => (a1.Artist != null && a1.Artist.Id == a2.Id) || (a1.Artist == null && a2.Id == 0 && a1.Name == a2.NameHint),
                    (artist, albumRef) => RestoreArtistRef(album, artist, albumRef),
                    albumForArtist => albumForArtist.Delete());

                // Songs
                SessionHelper.RestoreObjectRefs <SongInAlbum, Song, SongInAlbumRefContract>(
                    session, warnings, album.AllSongs, fullProperties.Songs, (a1, a2) => (a1.Song.Id == a2.Id),
                    (song, songRef) => (!album.HasSong(song) ? album.AddSong(song, songRef.TrackNumber, Math.Min(songRef.DiscNumber, 1)) : null),
                    songInAlbum => songInAlbum.Delete());

                // Names
                if (fullProperties.Names != null)
                {
                    var nameDiff = album.Names.SyncByContent(fullProperties.Names, album);
                    SessionHelper.Sync(session, nameDiff);
                }

                // Weblinks
                if (fullProperties.WebLinks != null)
                {
                    var webLinkDiff = WebLink.SyncByValue(album.WebLinks, fullProperties.WebLinks, album);
                    SessionHelper.Sync(session, webLinkDiff);
                }

                // PVs
                if (fullProperties.PVs != null)
                {
                    var pvDiff = CollectionHelper.Diff(album.PVs, fullProperties.PVs, (p1, p2) => (p1.PVId == p2.PVId && p1.Service == p2.Service));

                    foreach (var pv in pvDiff.Added)
                    {
                        session.Save(album.CreatePV(new PVContract(pv)));
                    }

                    foreach (var pv in pvDiff.Removed)
                    {
                        pv.OnDelete();
                        session.Delete(pv);
                    }
                }

                album.UpdateArtistString();
                album.UpdateRatingTotals();

                Archive(session, album, AlbumArchiveReason.Reverted);
                AuditLog("reverted " + EntryLinkFactory.CreateEntryLink(album) + " to revision " + archivedVersion.Version, session);

                return new EntryRevertedContract(album, warnings);
            }));
        }
Esempio n. 10
0
        public EntryRevertedContract RevertToVersion(int archivedAlbumVersionId)
        {
            PermissionContext.VerifyPermission(PermissionToken.RestoreRevisions);

            return(HandleTransaction(session => {
                var archivedVersion = session.Load <ArchivedAlbumVersion>(archivedAlbumVersionId);
                var album = archivedVersion.Album;

                session.AuditLogger.SysLog("reverting " + album + " to version " + archivedVersion.Version);

                var fullProperties = ArchivedAlbumContract.GetAllProperties(archivedVersion);
                var warnings = new List <string>();
                var diff = new AlbumDiff();

                album.Description.Original = fullProperties.Description;
                album.Description.English = fullProperties.DescriptionEng ?? string.Empty;
                album.DiscType = fullProperties.DiscType;
                album.TranslatedName.DefaultLanguage = fullProperties.TranslatedName.DefaultLanguage;

                // Picture
                var versionWithPic = archivedVersion.GetLatestVersionWithField(AlbumEditableFields.Cover);

                if (versionWithPic != null)
                {
                    album.CoverPictureData = versionWithPic.CoverPicture;
                    album.CoverPictureMime = versionWithPic.CoverPictureMime;

                    if (versionWithPic.CoverPicture != null)
                    {
                        var thumbGenerator = new ImageThumbGenerator(imagePersister);
                        using (var stream = new MemoryStream(versionWithPic.CoverPicture.Bytes)) {
                            var thumb = new EntryThumb(album, versionWithPic.CoverPictureMime);
                            thumbGenerator.GenerateThumbsAndMoveImage(stream, thumb, ImageSizes.Thumb | ImageSizes.SmallThumb | ImageSizes.TinyThumb);
                        }
                    }
                }
                else
                {
                    album.CoverPictureData = null;
                    album.CoverPictureMime = null;
                }

                // Assume picture was changed if there's a version between the current version and the restored version where the picture was changed.
                diff.Cover.Set(!Equals(album.ArchivedVersionsManager.GetLatestVersionWithField(AlbumEditableFields.Cover, album.Version), versionWithPic));

                // Original release
                album.OriginalRelease = (fullProperties.OriginalRelease != null ? new AlbumRelease(fullProperties.OriginalRelease, session.NullSafeLoad <ReleaseEvent>(fullProperties.OriginalRelease.ReleaseEvent)) : null);

                // Artists
                DatabaseContextHelper.RestoreObjectRefs <ArtistForAlbum, Artist, ArchivedArtistForAlbumContract>(
                    session.OfType <Artist>(), warnings, album.AllArtists, fullProperties.Artists,
                    (a1, a2) => (a1.Artist != null && a1.Artist.Id == a2.Id) || (a1.Artist == null && a2.Id == 0 && a1.Name == a2.NameHint),
                    (artist, albumRef) => RestoreArtistRef(album, artist, albumRef),
                    albumForArtist => albumForArtist.Delete());

                // Songs
                DatabaseContextHelper.RestoreObjectRefs <SongInAlbum, Song, SongInAlbumRefContract>(
                    session.OfType <Song>(), warnings, album.AllSongs, fullProperties.Songs,
                    (a1, a2) => ((a1.Song != null && a1.Song.Id == a2.Id) || a1.Song == null && a2.Id == 0 && a1.Name == a2.NameHint),
                    (song, songRef) => RestoreTrackRef(album, song, songRef),
                    songInAlbum => songInAlbum.Delete());

                // Names
                if (fullProperties.Names != null)
                {
                    var nameDiff = album.Names.SyncByContent(fullProperties.Names, album);
                    session.Sync(nameDiff);
                }

                // Weblinks
                if (fullProperties.WebLinks != null)
                {
                    var webLinkDiff = WebLink.SyncByValue(album.WebLinks, fullProperties.WebLinks, album);
                    session.Sync(webLinkDiff);
                }

                // PVs
                if (fullProperties.PVs != null)
                {
                    var pvDiff = CollectionHelper.Diff(album.PVs, fullProperties.PVs, (p1, p2) => (p1.PVId == p2.PVId && p1.Service == p2.Service));

                    foreach (var pv in pvDiff.Added)
                    {
                        session.Save(album.CreatePV(new PVContract(pv)));
                    }

                    foreach (var pv in pvDiff.Removed)
                    {
                        pv.OnDelete();
                        session.Delete(pv);
                    }
                }

                album.UpdateArtistString();
                album.UpdateRatingTotals();

                Archive(session, album, diff, AlbumArchiveReason.Reverted, string.Format("Reverted to version {0}", archivedVersion.Version));
                AuditLog(string.Format("reverted {0} to revision {1}", EntryLinkFactory.CreateEntryLink(album), archivedVersion.Version), session);

                return new EntryRevertedContract(album, warnings);
            }));
        }