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); })); }
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); } }
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); } }
/// <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); } }
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); } }
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); }
public void SetUp() { persister = new InMemoryImagePersister(); target = new ImageThumbGenerator(persister); }
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); })); }
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); })); }
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); })); }
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; })); }
/// <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); })); }
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); }); }
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; })); }
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); * } * * } * * } * * }*/ }); }