Ejemplo n.º 1
0
        public void Merge(int sourceId, int targetId)
        {
            PermissionContext.VerifyPermission(PermissionToken.MergeEntries);

            if (sourceId == targetId)
            {
                throw new ArgumentException("Source and target artists can't be the same", "targetId");
            }

            HandleTransaction(session => {
                var source = session.Load <Artist>(sourceId);
                var target = session.Load <Artist>(targetId);

                AuditLog(string.Format("Merging {0} to {1}",
                                       EntryLinkFactory.CreateEntryLink(source), EntryLinkFactory.CreateEntryLink(target)), session);

                foreach (var n in source.Names.Names.Where(n => !target.HasName(n)))
                {
                    var name = target.CreateName(n.Value, n.Language);
                    session.Save(name);
                }

                foreach (var w in source.WebLinks.Where(w => !target.HasWebLink(w.Url)))
                {
                    var link = target.CreateWebLink(w.Description, w.Url, w.Category);
                    session.Save(link);
                }

                var groups = source.Groups.Where(g => !target.HasGroup(g.Group)).ToArray();
                foreach (var g in groups)
                {
                    g.MoveToMember(target);
                    session.Update(g);
                }

                var members = source.Members.Where(m => !m.Member.HasGroup(target)).ToArray();
                foreach (var m in members)
                {
                    m.MoveToGroup(target);
                    session.Update(m);
                }

                var albums = source.Albums.Where(a => !target.HasAlbum(a.Album)).ToArray();
                foreach (var a in albums)
                {
                    a.Move(target);
                    session.Update(a);
                }

                var songs = source.Songs.Where(s => !target.HasSong(s.Song)).ToArray();
                foreach (var s in songs)
                {
                    s.Move(target);
                    session.Update(s);
                }

                var ownerUsers = source.OwnerUsers.Where(s => !target.HasOwnerUser(s.User)).ToArray();
                foreach (var u in ownerUsers)
                {
                    u.Move(target);
                    session.Update(u);
                }

                var pictures = source.Pictures.ToArray();
                foreach (var p in pictures)
                {
                    p.Move(target);
                    session.Update(p);
                }

                var users = source.Users.ToArray();
                foreach (var u in users)
                {
                    u.Move(target);
                    session.Update(u);
                }

                if (target.Description == string.Empty)
                {
                    target.Description = source.Description;
                }

                source.Deleted = true;

                Archive(session, target, ArtistArchiveReason.Merged, string.Format("Merged from '{0}'", source.DefaultName));

                session.Update(source);
                session.Update(target);
            });
        }
Ejemplo n.º 2
0
        public EntryRevertedContract RevertToVersion(int archivedSongVersionId)
        {
            PermissionContext.VerifyPermission(PermissionToken.RestoreRevisions);

            return(HandleTransaction(session => {
                var archivedVersion = session.Load <ArchivedSongVersion>(archivedSongVersionId);
                var song = archivedVersion.Song;

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

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

                song.LengthSeconds = fullProperties.LengthSeconds;
                song.NicoId = fullProperties.NicoId;
                song.Notes = fullProperties.Notes;
                song.SongType = fullProperties.SongType;
                song.TranslatedName.DefaultLanguage = fullProperties.TranslatedName.DefaultLanguage;

                // Artists
                SessionHelper.RestoreObjectRefs <ArtistForSong, Artist, ArchivedArtistForSongContract>(
                    session, warnings, song.AllArtists, fullProperties.Artists,
                    (a1, a2) => (a1.Artist != null && a1.Artist.Id == a2.Id) || (a1.Artist == null && a2.Id == 0 && a1.Name == a2.NameHint),
                    (artist, artistRef) => RestoreArtistRef(song, artist, artistRef),
                    artistForSong => artistForSong.Delete());

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

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

                // Lyrics
                if (fullProperties.Lyrics != null)
                {
                    var lyricsDiff = CollectionHelper.Diff(song.Lyrics, fullProperties.Lyrics, (p1, p2) => (p1.Id == p2.Id));

                    foreach (var lyrics in lyricsDiff.Added)
                    {
                        session.Save(song.CreateLyrics(lyrics.Language, lyrics.Value, lyrics.Source));
                    }

                    foreach (var lyrics in lyricsDiff.Removed)
                    {
                        song.Lyrics.Remove(lyrics);
                        session.Delete(lyrics);
                    }

                    foreach (var lyrics in lyricsDiff.Unchanged)
                    {
                        var newLyrics = fullProperties.Lyrics.First(l => l.Id == lyrics.Id);

                        lyrics.Language = newLyrics.Language;
                        lyrics.Source = newLyrics.Source;
                        lyrics.Value = newLyrics.Value;
                        session.Update(lyrics);
                    }
                }

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

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

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

                song.UpdateFavoritedTimes();

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

                return new EntryRevertedContract(song, warnings);
            }));
        }
Ejemplo n.º 3
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.Original = fullProperties.Description;
                album.Description.English = fullProperties.DescriptionEng;
                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 != 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);
                    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, 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);
            }));
        }
Ejemplo n.º 4
0
 protected string CreateEntryLink(IEntryBase entry)
 {
     return(EntryLinkFactory.CreateEntryLink(entry));
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Reverts an album to an earlier archived version.
        /// </summary>
        /// <param name="archivedArtistVersionId">Id of the archived version to be restored.</param>
        /// <returns>Result of the revert operation, with possible warnings if any. Cannot be null.</returns>
        /// <remarks>Requires the RestoreRevisions permission.</remarks>
        public EntryRevertedContract RevertToVersion(int archivedArtistVersionId)
        {
            PermissionContext.VerifyPermission(PermissionToken.RestoreRevisions);

            return(HandleTransaction(session => {
                var archivedVersion = session.Load <ArchivedArtistVersion>(archivedArtistVersionId);
                var artist = archivedVersion.Artist;

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

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

                artist.ArtistType = fullProperties.ArtistType;
                artist.Description.Original = fullProperties.Description;
                artist.Description.English = fullProperties.DescriptionEng;
                artist.TranslatedName.DefaultLanguage = fullProperties.TranslatedName.DefaultLanguage;
                artist.BaseVoicebank = SessionHelper.RestoreWeakRootEntityRef <Artist>(session, warnings, fullProperties.BaseVoicebank);

                // Picture
                var versionWithPic = archivedVersion.GetLatestVersionWithField(ArtistEditableFields.Picture);

                if (versionWithPic != null)
                {
                    artist.Picture = versionWithPic.Picture;
                }

                /*
                 * // Albums
                 * SessionHelper.RestoreObjectRefs<ArtistForAlbum, Album>(
                 *      session, warnings, artist.AllAlbums, fullProperties.Albums, (a1, a2) => (a1.Album.Id == a2.Id),
                 *      album => (!artist.HasAlbum(album) ? artist.AddAlbum(album) : null),
                 *      albumForArtist => albumForArtist.Delete());
                 */

                // Groups
                SessionHelper.RestoreObjectRefs <GroupForArtist, Artist>(
                    session, warnings, artist.AllGroups, fullProperties.Groups, (a1, a2) => (a1.Group.Id == a2.Id),
                    grp => (!artist.HasGroup(grp) ? artist.AddGroup(grp) : null),
                    groupForArtist => groupForArtist.Delete());

                /*
                 * // Members
                 * SessionHelper.RestoreObjectRefs<GroupForArtist, Artist>(
                 *      session, warnings, artist.AllMembers, fullProperties.Members, (a1, a2) => (a1.Member.Id == a2.Id),
                 *      member => (!artist.HasMember(member) ? artist.AddMember(member) : null),
                 *      groupForArtist => groupForArtist.Delete());
                 */

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

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

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

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