Пример #1
0
        public async Task <ArtistContract> Create(CreateArtistContract contract)
        {
            ParamIs.NotNull(() => contract);

            if (contract.Names == null || !contract.Names.Any())
            {
                throw new ArgumentException("Artist needs at least one name", "contract");
            }

            VerifyManageDatabase();

            var diff = new ArtistDiff();

            diff.Names.Set();

            return(await repository.HandleTransactionAsync(async ctx => {
                ctx.AuditLogger.SysLog(string.Format("creating a new artist with name '{0}'", contract.Names.First().Value));

                var artist = new Artist {
                    ArtistType = contract.ArtistType,
                    Description = new EnglishTranslatedString(contract.Description.Trim())
                };

                artist.Names.Init(contract.Names, artist);

                if (contract.WebLink != null)
                {
                    artist.CreateWebLink(contract.WebLink.Description, contract.WebLink.Url, contract.WebLink.Category);
                    diff.WebLinks.Set();
                }

                artist.Status = (contract.Draft || !(new ArtistValidator().IsValid(artist))) ? EntryStatus.Draft : EntryStatus.Finished;

                await ctx.SaveAsync(artist);

                if (contract.PictureData != null)
                {
                    var pictureData = contract.PictureData;
                    var parsed = ImageHelper.GetOriginal(pictureData.UploadedFile, pictureData.ContentLength, pictureData.Mime);
                    artist.Picture = new PictureData(parsed);
                    artist.PictureMime = parsed.Mime;

                    pictureData.Id = artist.Id;
                    pictureData.EntryType = EntryType.Artist;
                    var thumbGenerator = new ImageThumbGenerator(imagePersister);
                    thumbGenerator.GenerateThumbsAndMoveImage(pictureData.UploadedFile, pictureData, ImageSizes.Thumb | ImageSizes.SmallThumb | ImageSizes.TinyThumb);

                    diff.Picture.Set();
                }

                var archived = await ArchiveAsync(ctx, artist, diff, ArtistArchiveReason.Created);
                await ctx.UpdateAsync(artist);

                await ctx.AuditLogger.AuditLogAsync(string.Format("created artist {0} ({1})", entryLinkFactory.CreateEntryLink(artist), artist.ArtistType));
                await AddEntryEditedEntryAsync(ctx.OfType <ActivityEntry>(), artist, EntryEditEvent.Created, archived);

                return new ArtistContract(artist, PermissionContext.LanguagePreference);
            }));
        }
Пример #2
0
 private void SetThumb(SongList list, UploadedFileContract uploadedFile)
 {
     if (uploadedFile != null)
     {
         var thumb = new EntryThumbMain(list, uploadedFile.Mime);
         list.Thumb = thumb;
         var thumbGenerator = new ImageThumbGenerator(imagePersister);
         thumbGenerator.GenerateThumbsAndMoveImage(uploadedFile.Stream, thumb, SongList.ImageSizes, originalSize: Constants.RestrictedImageOriginalSize);
     }
 }
Пример #3
0
 private void SetThumb(SongList list, UploadedFileContract uploadedFile)
 {
     if (uploadedFile != null)
     {
         var thumb = new EntryThumb(list, uploadedFile.Mime);
         list.Thumb = thumb;
         var thumbGenerator = new ImageThumbGenerator(imagePersister);
         thumbGenerator.GenerateThumbsAndMoveImage(uploadedFile.Stream, thumb, ImageSizes.Original | ImageSizes.SmallThumb, originalSize: 500);
     }
 }
Пример #4
0
        /// <summary>
        /// Generates thumbnails and writes the original file into external image files.
        /// </summary>
        /// <exception cref="InvalidPictureException">If the image could not be opened. Most likely the file is broken.</exception>
        public void GenerateThumbsAndMoveImage(ImageThumbGenerator thumbGenerator, IEnumerable <EntryPictureFile> pictureFiles, ImageSizes imageSizes)
        {
            foreach (var pictureFile in pictureFiles)
            {
                if (pictureFile.UploadedFile == null)
                {
                    continue;
                }

                thumbGenerator.GenerateThumbsAndMoveImage(pictureFile.UploadedFile, pictureFile, imageSizes);
            }
        }
Пример #5
0
        private void SaveImage(ReleaseEventSeries series, EntryPictureFileContract pictureData)
        {
            if (pictureData != null)
            {
                var parsed = ImageHelper.GetOriginal(pictureData.UploadedFile, pictureData.ContentLength, pictureData.Mime);
                series.PictureMime = parsed.Mime;

                pictureData.Id        = series.Id;
                pictureData.EntryType = EntryType.ReleaseEventSeries;
                var thumbGenerator = new ImageThumbGenerator(imagePersister);
                thumbGenerator.GenerateThumbsAndMoveImage(pictureData.UploadedFile, pictureData, ReleaseEventSeries.ImageSizes, originalSize: Constants.RestrictedImageOriginalSize);
            }
        }
Пример #6
0
        private PictureDataContract SaveImage(IEntryImageInformation entry, EntryPictureFileContract pictureData)
        {
            if (pictureData == null)
            {
                return(null);
            }

            var parsed = ImageHelper.GetOriginal(pictureData.UploadedFile, pictureData.ContentLength, pictureData.Mime);

            pictureData.Id        = entry.Id;
            pictureData.EntryType = entry.EntryType;
            var thumbGenerator = new ImageThumbGenerator(imagePersister);

            thumbGenerator.GenerateThumbsAndMoveImage(pictureData.UploadedFile, pictureData, ReleaseEventSeries.ImageSizes, originalSize: Constants.RestrictedImageOriginalSize);
            return(parsed);
        }
Пример #7
0
 public void SetUp()
 {
     persister = new InMemoryImagePersister();
     target    = new ImageThumbGenerator(persister);
 }
Пример #8
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);
            }));
        }
Пример #9
0
        public AlbumForEditContract UpdateBasicProperties(AlbumForEditContract properties, EntryPictureFileContract pictureData)
        {
            ParamIs.NotNull(() => properties);

            return(repository.HandleTransaction(session => {
                var album = session.Load(properties.Id);

                VerifyEntryEdit(album);

                var diff = new AlbumDiff(DoSnapshot(album.ArchivedVersionsManager.GetLatestVersion(), session.OfType <User>().GetLoggedUser(PermissionContext)));

                session.AuditLogger.SysLog(string.Format("updating properties for {0}", album));

                if (album.DiscType != properties.DiscType)
                {
                    album.DiscType = properties.DiscType;
                    album.UpdateArtistString();
                    diff.DiscType.Set();
                }

                diff.Description.Set(album.Description.CopyFrom(properties.Description));

                var parsedBarcodes = properties.Identifiers.Select(Album.ParseBarcode).ToArray();
                var barcodeDiff = album.SyncIdentifiers(parsedBarcodes);
                session.Sync(barcodeDiff);
                if (barcodeDiff.Changed)
                {
                    diff.Identifiers.Set();
                }

                if (album.TranslatedName.DefaultLanguage != properties.DefaultNameLanguage)
                {
                    album.TranslatedName.DefaultLanguage = properties.DefaultNameLanguage;
                    diff.OriginalName.Set();
                }

                var validNames = properties.Names;
                var nameDiff = album.Names.Sync(validNames, album);
                session.OfType <AlbumName>().Sync(nameDiff);

                album.Names.UpdateSortNames();

                if (nameDiff.Changed)
                {
                    diff.Names.Set();
                }

                var webLinkDiff = WebLink.Sync(album.WebLinks, properties.WebLinks, album);
                session.OfType <AlbumWebLink>().Sync(webLinkDiff);

                if (webLinkDiff.Changed)
                {
                    diff.WebLinks.Set();
                }

                var newEvent = new CreateEventQuery().FindOrCreate(session, PermissionContext, properties.OriginalRelease.ReleaseEvent, album);
                var newOriginalRelease = (properties.OriginalRelease != null ? new AlbumRelease(properties.OriginalRelease, newEvent) : new AlbumRelease());

                if (album.OriginalRelease == null)
                {
                    album.OriginalRelease = new AlbumRelease();
                }

                if (!album.OriginalRelease.Equals(newOriginalRelease))
                {
                    album.OriginalRelease = newOriginalRelease;
                    diff.OriginalRelease.Set();
                }

                // Required because of a bug in NHibernate
                NHibernateUtil.Initialize(album.CoverPictureData);

                if (pictureData != null)
                {
                    var parsed = ImageHelper.GetOriginal(pictureData.UploadedFile, pictureData.ContentLength, pictureData.Mime);
                    album.CoverPictureData = new PictureData(parsed);
                    album.CoverPictureMime = parsed.Mime;

                    pictureData.Id = album.Id;
                    pictureData.EntryType = EntryType.Album;
                    var thumbGenerator = new ImageThumbGenerator(imagePersister);
                    thumbGenerator.GenerateThumbsAndMoveImage(pictureData.UploadedFile, pictureData, ImageSizes.Thumb | ImageSizes.SmallThumb | ImageSizes.TinyThumb);

                    diff.Cover.Set();
                }

                if (album.Status != properties.Status)
                {
                    album.Status = properties.Status;
                    diff.Status.Set();
                }

                var artistGetter = new Func <ArtistContract, Artist>(artist =>
                                                                     session.OfType <Artist>().Load(artist.Id));

                var artistsDiff = album.SyncArtists(properties.ArtistLinks, artistGetter);
                session.OfType <ArtistForAlbum>().Sync(artistsDiff);

                if (artistsDiff.Changed)
                {
                    diff.Artists.Set();
                }

                var discsDiff = album.SyncDiscs(properties.Discs);
                session.OfType <AlbumDiscProperties>().Sync(discsDiff);

                if (discsDiff.Changed)
                {
                    diff.Discs.Set();
                }

                var songGetter = new Func <SongInAlbumEditContract, Song>(contract => {
                    if (contract.SongId != 0)
                    {
                        return session.Load <Album, Song>(contract.SongId);
                    }
                    else
                    {
                        var songName = StringHelper.TrimIfNotWhitespace(contract.SongName);

                        session.AuditLogger.SysLog(string.Format("creating a new song '{0}' to {1}", songName, album));

                        var song = new Song(new LocalizedString(songName, ContentLanguageSelection.Unspecified));
                        session.Save(song);

                        var songDiff = new SongDiff();
                        songDiff.Names.Set();
                        var songArtistDiff = song.SyncArtists(contract.Artists,
                                                              addedArtistContracts => GetArtists(session, addedArtistContracts));

                        if (songArtistDiff.Changed)
                        {
                            songDiff.Artists.Set();
                            session.Update(song);
                        }

                        session.Sync(songArtistDiff);

                        var archived = ArchiveSong(session.OfType <Song>(), song, songDiff, SongArchiveReason.Created,
                                                   string.Format("Created for album '{0}'", album.DefaultName.TruncateWithEllipsis(100)));

                        session.AuditLogger.AuditLog(string.Format("created {0} for {1}",
                                                                   entryLinkFactory.CreateEntryLink(song), entryLinkFactory.CreateEntryLink(album)));
                        AddEntryEditedEntry(session.OfType <ActivityEntry>(), song, EntryEditEvent.Created, archived);

                        return song;
                    }
                });

                var tracksDiff = album.SyncSongs(properties.Songs, songGetter,
                                                 (song, artistContracts) => UpdateSongArtists(session, song, artistContracts));

                session.OfType <SongInAlbum>().Sync(tracksDiff);

                if (tracksDiff.Changed)
                {
                    var add = string.Join(", ", tracksDiff.Added.Select(i => HttpUtility.HtmlEncode(i.SongToStringOrName)));
                    var rem = string.Join(", ", tracksDiff.Removed.Select(i => HttpUtility.HtmlEncode(i.SongToStringOrName)));
                    var edit = string.Join(", ", tracksDiff.Edited.Select(i => HttpUtility.HtmlEncode(i.SongToStringOrName)));

                    var str = string.Format("edited tracks (added: {0}, removed: {1}, reordered: {2})", add, rem, edit)
                              .Truncate(300);

                    session.AuditLogger.AuditLog(str);

                    diff.Tracks.Set();
                }

                var picsDiff = album.Pictures.SyncPictures(properties.Pictures, session.OfType <User>().GetLoggedUser(PermissionContext), album.CreatePicture);
                session.OfType <AlbumPictureFile>().Sync(picsDiff);
                var entryPictureFileThumbGenerator = new ImageThumbGenerator(pictureFilePersister);
                album.Pictures.GenerateThumbsAndMoveImage(entryPictureFileThumbGenerator, picsDiff.Added, ImageSizes.Original | ImageSizes.Thumb);

                if (picsDiff.Changed)
                {
                    diff.Pictures.Set();
                }

                var pvDiff = album.SyncPVs(properties.PVs);
                session.OfType <PVForAlbum>().Sync(pvDiff);

                if (pvDiff.Changed)
                {
                    diff.PVs.Set();
                }

                var logStr = string.Format("updated properties for album {0} ({1})",
                                           entryLinkFactory.CreateEntryLink(album), diff.ChangedFieldsString)
                             + (properties.UpdateNotes != string.Empty ? " " + properties.UpdateNotes : string.Empty)
                             .Truncate(400);

                session.AuditLogger.AuditLog(logStr);

                var archivedAlbum = Archive(session, album, diff, AlbumArchiveReason.PropertiesUpdated, properties.UpdateNotes);
                session.Update(album);

                AddEntryEditedEntry(session.OfType <ActivityEntry>(), album, EntryEditEvent.Updated, archivedAlbum);

                var newSongCutoff = TimeSpan.FromHours(1);
                if (artistsDiff.Added.Any() && album.CreateDate >= DateTime.Now - newSongCutoff)
                {
                    var addedArtists = artistsDiff.Added.Where(a => a.Artist != null).Select(a => a.Artist).Distinct().ToArray();

                    if (addedArtists.Any())
                    {
                        new FollowedArtistNotifier().SendNotifications(session, album, addedArtists, PermissionContext.LoggedUser, entryLinkFactory, mailer, enumTranslations);
                    }
                }

                return new AlbumForEditContract(album, PermissionContext.LanguagePreference, pictureFilePersister);
            }));
        }
Пример #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);
            }));
        }
Пример #11
0
        public async Task <int> Update(ArtistForEditContract properties, EntryPictureFileContract pictureData, IUserPermissionContext permissionContext)
        {
            ParamIs.NotNull(() => properties);
            ParamIs.NotNull(() => permissionContext);

            return(await repository.HandleTransactionAsync(async ctx => {
                var artist = await ctx.LoadAsync(properties.Id);

                VerifyEntryEdit(artist);

                var diff = new ArtistDiff(DoSnapshot(artist.GetLatestVersion(), await ctx.OfType <User>().GetLoggedUserAsync(permissionContext)));

                ctx.AuditLogger.SysLog(string.Format("updating properties for {0}", artist));

                if (artist.ArtistType != properties.ArtistType)
                {
                    artist.ArtistType = properties.ArtistType;
                    diff.ArtistType.Set();
                }

                diff.Description.Set(artist.Description.CopyFrom(properties.Description));

                if (artist.TranslatedName.DefaultLanguage != properties.DefaultNameLanguage)
                {
                    artist.TranslatedName.DefaultLanguage = properties.DefaultNameLanguage;
                    diff.OriginalName.Set();
                }

                // Required because of a bug in NHibernate
                NHibernateUtil.Initialize(artist.Picture);

                if (pictureData != null)
                {
                    var parsed = ImageHelper.GetOriginal(pictureData.UploadedFile, pictureData.ContentLength, pictureData.Mime);
                    artist.Picture = new PictureData(parsed);
                    artist.PictureMime = parsed.Mime;

                    pictureData.Id = artist.Id;
                    pictureData.EntryType = EntryType.Artist;
                    var thumbGenerator = new ImageThumbGenerator(imagePersister);
                    thumbGenerator.GenerateThumbsAndMoveImage(pictureData.UploadedFile, pictureData, ImageSizes.Thumb | ImageSizes.SmallThumb | ImageSizes.TinyThumb);

                    diff.Picture.Set();
                }

                if (artist.Status != properties.Status)
                {
                    artist.Status = properties.Status;
                    diff.Status.Set();
                }

                var nameDiff = artist.Names.Sync(properties.Names, artist);
                await ctx.OfType <ArtistName>().SyncAsync(nameDiff);

                if (nameDiff.Changed)
                {
                    diff.Names.Set();
                }

                if (!artist.BaseVoicebank.NullSafeIdEquals(properties.BaseVoicebank))
                {
                    var newBase = await ctx.NullSafeLoadAsync(properties.BaseVoicebank);

                    if (artist.IsValidBaseVoicebank(newBase))
                    {
                        diff.BaseVoicebank.Set();
                        artist.SetBaseVoicebank(await ctx.NullSafeLoadAsync(properties.BaseVoicebank));
                    }
                }

                if (!artist.ReleaseDate.Equals(properties.ReleaseDate))
                {
                    artist.ReleaseDate = properties.ReleaseDate;
                    diff.ReleaseDate.Set();
                }

                var webLinkDiff = WebLink.Sync(artist.WebLinks, properties.WebLinks, artist);
                await ctx.OfType <ArtistWebLink>().SyncAsync(webLinkDiff);

                if (webLinkDiff.Changed)
                {
                    diff.WebLinks.Set();
                }

                if (diff.ArtistType.IsChanged || diff.Names.IsChanged || diff.OriginalName.IsChanged)
                {
                    foreach (var song in artist.Songs)
                    {
                        song.Song.UpdateArtistString();
                        await ctx.UpdateAsync(song);
                    }
                }

                var newGroups = properties.Groups
                                .Select(g => new ArtistForArtistContract {
                    Parent = g.Parent, LinkType = ArtistLinkType.Group
                })
                                .Concat(new[] {
                    new ArtistForArtistContract {
                        Parent = properties.Illustrator, LinkType = ArtistLinkType.Illustrator
                    },
                    new ArtistForArtistContract {
                        Parent = properties.VoiceProvider, LinkType = ArtistLinkType.VoiceProvider
                    }
                })
                                .Concat(properties.AssociatedArtists)
                                .Where(a => a.Parent != null && ArtistHelper.CanHaveRelatedArtists(artist.ArtistType, a.LinkType, LinkDirection.ManyToOne))
                                .ToArray();

                var groupsDiff = CollectionHelper.Diff(artist.Groups, newGroups, (i, i2) => (i.Parent.Id == i2.Parent.Id && i.LinkType == i2.LinkType));

                foreach (var grp in groupsDiff.Removed)
                {
                    grp.Delete();
                    await ctx.DeleteAsync(grp);
                }

                foreach (var grp in groupsDiff.Added)
                {
                    var link = artist.AddGroup(ctx.Load(grp.Parent.Id), grp.LinkType);
                    await ctx.SaveAsync(link);
                }

                if (groupsDiff.Changed)
                {
                    diff.Groups.Set();
                }

                var picsDiff = artist.Pictures.SyncPictures(properties.Pictures, ctx.OfType <User>().GetLoggedUser(permissionContext), artist.CreatePicture);
                ctx.OfType <ArtistPictureFile>().Sync(picsDiff);
                var entryPictureFileThumbGenerator = new ImageThumbGenerator(pictureFilePersister);
                artist.Pictures.GenerateThumbsAndMoveImage(entryPictureFileThumbGenerator, picsDiff.Added, ImageSizes.Original | ImageSizes.Thumb);

                if (picsDiff.Changed)
                {
                    diff.Pictures.Set();
                }

                var logStr = string.Format("updated properties for artist {0} ({1})", entryLinkFactory.CreateEntryLink(artist), diff.ChangedFieldsString)
                             + (properties.UpdateNotes != string.Empty ? " " + properties.UpdateNotes : string.Empty)
                             .Truncate(400);

                var archived = await ArchiveAsync(ctx, artist, diff, ArtistArchiveReason.PropertiesUpdated, properties.UpdateNotes);
                await ctx.UpdateAsync(artist);

                await ctx.AuditLogger.AuditLogAsync(logStr);
                await AddEntryEditedEntryAsync(ctx.OfType <ActivityEntry>(), artist, EntryEditEvent.Updated, archived);

                return artist.Id;
            }));
        }
Пример #12
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 async Task <EntryRevertedContract> RevertToVersion(int archivedArtistVersionId)
        {
            PermissionContext.VerifyPermission(PermissionToken.RestoreRevisions);

            return(await HandleTransactionAsync(async session => {
                var archivedVersion = await session.LoadAsync <ArchivedArtistVersion>(archivedArtistVersionId);

                if (archivedVersion.Hidden)
                {
                    PermissionContext.VerifyPermission(PermissionToken.ViewHiddenRevisions);
                }

                var artist = archivedVersion.Artist;

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

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

                artist.ArtistType = fullProperties.ArtistType;
                artist.Description.Original = fullProperties.Description;
                artist.Description.English = fullProperties.DescriptionEng ?? string.Empty;
                artist.TranslatedName.DefaultLanguage = fullProperties.TranslatedName.DefaultLanguage;
                artist.BaseVoicebank = DatabaseContextHelper.RestoreWeakRootEntityRef(session, warnings, fullProperties.BaseVoicebank);

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

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

                    if (versionWithPic.Picture != null)
                    {
                        var thumbGenerator = new ImageThumbGenerator(imagePersister);
                        using (var stream = new MemoryStream(versionWithPic.Picture.Bytes)) {
                            var thumb = new EntryThumb(artist, versionWithPic.PictureMime, ImagePurpose.Main);
                            thumbGenerator.GenerateThumbsAndMoveImage(stream, thumb, ImageSizes.Thumb | ImageSizes.SmallThumb | ImageSizes.TinyThumb);
                        }
                    }
                }
                else
                {
                    artist.Picture = null;
                    artist.PictureMime = null;
                }

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

                // Groups
                DatabaseContextHelper.RestoreObjectRefs(
                    session, warnings, artist.AllGroups, fullProperties.Groups, (a1, a2) => (a1.Parent.Id == a2.Id),
                    (grp, grpRef) => (!artist.HasGroup(grp) ? artist.AddGroup(grp, grpRef.LinkType) : null),
                    groupForArtist => groupForArtist.Delete());

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

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

                await ArchiveAsync(session, artist, diff, ArtistArchiveReason.Reverted, string.Format("Reverted to version {0}", archivedVersion.Version));
                await AuditLogAsync(string.Format("reverted {0} to revision {1}", entryLinkFactory.CreateEntryLink(artist), archivedVersion.Version), session);

                return new EntryRevertedContract(artist, warnings);
            }));
        }
Пример #13
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);
            });
        }
Пример #14
0
        public int Update(ArtistForEditContract properties, EntryPictureFileContract pictureData, IUserPermissionContext permissionContext)
        {
            ParamIs.NotNull(() => properties);
            ParamIs.NotNull(() => permissionContext);

            return(repository.HandleTransaction(ctx => {
                var artist = ctx.Load(properties.Id);

                VerifyEntryEdit(artist);

                var diff = new ArtistDiff(DoSnapshot(artist.GetLatestVersion(), ctx.OfType <User>().GetLoggedUser(permissionContext)));

                ctx.AuditLogger.SysLog(string.Format("updating properties for {0}", artist));

                if (artist.ArtistType != properties.ArtistType)
                {
                    artist.ArtistType = properties.ArtistType;
                    diff.ArtistType = true;
                }

                if (artist.Description != properties.Description)
                {
                    artist.Description = properties.Description;
                    diff.Description = true;
                }

                if (artist.TranslatedName.DefaultLanguage != properties.DefaultNameLanguage)
                {
                    artist.TranslatedName.DefaultLanguage = properties.DefaultNameLanguage;
                    diff.OriginalName = true;
                }

                // Required because of a bug in NHibernate
                NHibernateUtil.Initialize(artist.Picture);

                if (pictureData != null)
                {
                    var parsed = ImageHelper.GetOriginal(pictureData.UploadedFile, pictureData.ContentLength, pictureData.Mime);
                    artist.Picture = new PictureData(parsed);
                    artist.PictureMime = parsed.Mime;

                    pictureData.Id = artist.Id;
                    pictureData.EntryType = EntryType.Artist;
                    var thumbGenerator = new ImageThumbGenerator(imagePersister);
                    thumbGenerator.GenerateThumbsAndMoveImage(pictureData.UploadedFile, pictureData, ImageSizes.Thumb | ImageSizes.SmallThumb | ImageSizes.TinyThumb);

                    diff.Picture = true;
                }

                if (artist.Status != properties.Status)
                {
                    artist.Status = properties.Status;
                    diff.Status = true;
                }

                var nameDiff = artist.Names.Sync(properties.Names, artist);
                ctx.OfType <ArtistName>().Sync(nameDiff);

                if (nameDiff.Changed)
                {
                    diff.Names = true;
                }

                if (!artist.BaseVoicebank.NullSafeIdEquals(properties.BaseVoicebank))
                {
                    var newBase = ctx.NullSafeLoad(properties.BaseVoicebank);

                    if (artist.IsValidBaseVoicebank(newBase))
                    {
                        diff.BaseVoicebank = true;
                        artist.SetBaseVoicebank(ctx.NullSafeLoad(properties.BaseVoicebank));
                    }
                }

                var validWebLinks = properties.WebLinks.Where(w => !string.IsNullOrEmpty(w.Url));
                var webLinkDiff = WebLink.Sync(artist.WebLinks, validWebLinks, artist);
                ctx.OfType <ArtistWebLink>().Sync(webLinkDiff);

                if (webLinkDiff.Changed)
                {
                    diff.WebLinks = true;
                }

                if (diff.ArtistType || diff.Names)
                {
                    foreach (var song in artist.Songs)
                    {
                        song.Song.UpdateArtistString();
                        ctx.Update(song);
                    }
                }

                var groupsDiff = CollectionHelper.Diff(artist.Groups, properties.Groups, (i, i2) => (i.Id == i2.Id));

                foreach (var grp in groupsDiff.Removed)
                {
                    grp.Delete();
                    ctx.Delete(grp);
                }

                foreach (var grp in groupsDiff.Added)
                {
                    var link = artist.AddGroup(ctx.Load(grp.Group.Id));
                    ctx.Save(link);
                }

                if (groupsDiff.Changed)
                {
                    diff.Groups = true;
                }

                var picsDiff = artist.Pictures.SyncPictures(properties.Pictures, ctx.OfType <User>().GetLoggedUser(permissionContext), artist.CreatePicture);
                ctx.OfType <ArtistPictureFile>().Sync(picsDiff);
                ImageHelper.GenerateThumbsAndMoveImages(picsDiff.Added);

                if (picsDiff.Changed)
                {
                    diff.Pictures = true;
                }

                var logStr = string.Format("updated properties for artist {0} ({1})", entryLinkFactory.CreateEntryLink(artist), diff.ChangedFieldsString)
                             + (properties.UpdateNotes != string.Empty ? " " + properties.UpdateNotes : string.Empty)
                             .Truncate(400);

                ctx.AuditLogger.AuditLog(logStr);
                AddEntryEditedEntry(ctx.OfType <ActivityEntry>(), artist, EntryEditEvent.Updated);

                Archive(ctx, artist, diff, ArtistArchiveReason.PropertiesUpdated, properties.UpdateNotes);
                ctx.Update(artist);

                return artist.Id;
            }));
        }
Пример #15
0
        public void CreateMissingThumbs()
        {
            VerifyAdmin();

            var imagePersister = new ServerEntryThumbPersister();
            var thumbGenerator = new ImageThumbGenerator(imagePersister);
            var artistIds      = new int[0];

            HandleQuery(session => {
                artistIds = session.Query <Artist>().Where(a => !a.Deleted && a.PictureMime != null && a.PictureMime != "").Select(a => a.Id).ToArray();
            });

            for (int i = 0; i < artistIds.Length; i += 100)
            {
                var ids = artistIds.Skip(i).Take(100).ToArray();

                HandleQuery(session => {
                    var artists = session.Query <Artist>().Where(a => ids.Contains(a.Id)).ToArray();

                    foreach (var artist in artists)
                    {
                        var data = new EntryThumb(artist, artist.PictureMime, ImagePurpose.Main);

                        if (artist.Picture.Bytes == null || imagePersister.HasImage(data, ImageSize.Thumb))
                        {
                            continue;
                        }

                        using (var stream = new MemoryStream(artist.Picture.Bytes)) {
                            thumbGenerator.GenerateThumbsAndMoveImage(stream, data, ImageSizes.Thumb | ImageSizes.SmallThumb | ImageSizes.TinyThumb);
                        }
                    }
                });
            }

            /*var albumIds = new int[0];
             *
             * HandleQuery(session => {
             *      albumIds = session.Query<Album>().Where(a => !a.Deleted && a.CoverPictureData.Mime != null && a.CoverPictureData.Mime != "").Select(a => a.Id).ToArray();
             * });
             *
             * for (int i = 0; i < albumIds.Length; i += 100) {
             *
             *      var ids = albumIds.Skip(i).Take(100).ToArray();
             *
             *      HandleQuery(session => {
             *
             *              var albums = session.Query<Album>().Where(a => ids.Contains(a.Id)).ToArray();
             *
             *              foreach (var album in albums) {
             *
             *                      var data = new EntryThumb(album, album.CoverPictureData.Mime);
             *
             *                      if (album.CoverPictureData.Bytes == null || imagePersister.HasImage(data, ImageSize.Thumb))
             *                              continue;
             *
             *                      using (var stream = new MemoryStream(album.CoverPictureData.Bytes)) {
             *                              thumbGenerator.GenerateThumbsAndMoveImage(stream, data, ImageSizes.Thumb | ImageSizes.SmallThumb | ImageSizes.TinyThumb);
             *                      }
             *
             *              }
             *
             *      });
             *
             * }*/

            HandleQuery(session => {
                /*var artistPic = session.Query<ArtistPictureFile>().ToArray();
                 *
                 * foreach (var pic in artistPic) {
                 *
                 *      var thumbFile = ImageHelper.GetImagePathSmallThumb(pic);
                 *      var origPath = ImageHelper.GetImagePath(pic);
                 *
                 *      if (File.Exists(origPath) && !File.Exists(thumbFile)) {
                 *
                 *              using (var original = Image.FromFile(ImageHelper.GetImagePath(pic))) {
                 *
                 *                      if (original.Width > ImageHelper.DefaultSmallThumbSize || original.Height > ImageHelper.DefaultSmallThumbSize) {
                 *                              using (var thumb = ImageHelper.ResizeToFixedSize(original, ImageHelper.DefaultSmallThumbSize, ImageHelper.DefaultSmallThumbSize)) {
                 *                                      thumb.Save(thumbFile);
                 *                              }
                 *                      } else {
                 *                              File.Copy(origPath, thumbFile);
                 *                      }
                 *
                 *              }
                 *
                 *      }
                 *
                 * }
                 *
                 * var albumPic = session.Query<AlbumPictureFile>().ToArray();
                 *
                 * foreach (var pic in albumPic) {
                 *
                 *      var thumbFile = ImageHelper.GetImagePathSmallThumb(pic);
                 *      var origPath = ImageHelper.GetImagePath(pic);
                 *
                 *      if (File.Exists(origPath) && !File.Exists(thumbFile)) {
                 *
                 *              using (var original = Image.FromFile(ImageHelper.GetImagePath(pic))) {
                 *
                 *                      if (original.Width > ImageHelper.DefaultSmallThumbSize || original.Height > ImageHelper.DefaultSmallThumbSize) {
                 *                              using (var thumb = ImageHelper.ResizeToFixedSize(original, ImageHelper.DefaultSmallThumbSize, ImageHelper.DefaultSmallThumbSize)) {
                 *                                      thumb.Save(thumbFile);
                 *                              }
                 *                      } else {
                 *                              File.Copy(origPath, thumbFile);
                 *                      }
                 *
                 *              }
                 *
                 *      }
                 *
                 * }*/
            });
        }