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; })); }
public void SerializeToXml_Unicode() { var album = new ArchivedAlbumContract { Description = "初音ミク" }; var res = SerializeToObjectAndBack(album); res.Description.Should().Be(album.Description, "string is intact"); }
public void SerializeToXml_Unicode() { var album = new ArchivedAlbumContract { Description = "初音ミク" }; var res = SerializeToObjectAndBack(album); Assert.AreEqual(album.Description, res.Description, "string is intact"); }
/// <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)); }
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"); }
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"); }
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"); }
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; })); }
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); })); }
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); })); }