public async Task Update_ChangeName_CustomName() { var contract = new ReleaseEventForEditContract(existingEvent, ContentLanguagePreference.Default, permissionContext, null); contract.CustomName = true; contract.Names[0].Value = "M3 2013 Fall X2"; var result = await CallUpdate(contract); Assert.AreEqual("M3 2013 Fall X2", result.DefaultName, "Name was updated"); var archivedVersions = repository.List <ArchivedReleaseEventVersion>(); Assert.AreEqual(1, archivedVersions.Count, "Archived version was created"); Assert.AreEqual(ReleaseEventEditableFields.Names, archivedVersions[0].Diff.ChangedFields.Value, "Changed fields in diff"); }
public void Update_ChangeName_DuplicateForSameEvent() { var releaseEvent = repository.Save(CreateEntry.ReleaseEvent("Comiket 39")); var contract = new ReleaseEventForEditContract(releaseEvent, ContentLanguagePreference.Default, permissionContext, null) { Names = new[] { new LocalizedStringWithIdContract { Value = "Comiket 39" }, new LocalizedStringWithIdContract { Value = "Comiket 39" } } }; queries.Update(contract, null); }
public void Update_ChangeName_UseSeriesName() { var contract = new ReleaseEventForEditContract(existingEvent, ContentLanguagePreference.Default, permissionContext, null); contract.Names[0].Value = "New name"; contract.DefaultNameLanguage = ContentLanguageSelection.Romaji; var result = CallUpdate(contract); Assert.AreEqual("M3 2013 Spring", result.DefaultName, "Name was not updated"); Assert.AreEqual(ContentLanguageSelection.English, result.TranslatedName.DefaultLanguage, "Default language was not updated"); var archivedVersions = repository.List <ArchivedReleaseEventVersion>(); Assert.AreEqual(1, archivedVersions.Count, "Archived version was created"); Assert.AreEqual(ReleaseEventEditableFields.Nothing, archivedVersions[0].Diff.ChangedFields.Value, "Changed fields in diff"); }
public void Create_WithSeriesNoSuffix() { var contract = new ReleaseEventForEditContract { Description = string.Empty, Series = new ReleaseEventSeriesContract(series, ContentLanguagePreference.English), SeriesNumber = 2014, SeriesSuffix = string.Empty, }; var result = CallUpdate(contract); Assert.IsTrue(repository.Contains(result), "Event was saved to repository"); Assert.AreEqual("M3 2014", result.DefaultName, "Name"); Assert.AreEqual(2014, result.SeriesNumber, "SeriesNumber"); Assert.AreEqual(string.Empty, result.SeriesSuffix, "SeriesSuffix"); Assert.AreSame(series, result.Series, "Series"); }
public void Create_WithCustomArtists() { var artist = repository.Save(CreateEntry.Artist(ArtistType.Producer)); var contract = new ReleaseEventForEditContract { Description = string.Empty, SeriesSuffix = string.Empty, Artists = new [] { new ArtistForEventContract { Artist = new ArtistContract(artist, ContentLanguagePreference.Default) }, new ArtistForEventContract { Name = "Miku!" } } }; CallUpdate(contract); }
public void Update_ChangeSeriesSuffix() { var contract = new ReleaseEventForEditContract(existingEvent, ContentLanguagePreference.Default, permissionContext, null); contract.SeriesSuffix = "Fall"; var result = CallUpdate(contract); Assert.AreEqual(2013, contract.SeriesNumber, "SeriesNumber"); Assert.AreEqual("Fall", contract.SeriesSuffix, "SeriesSuffix"); Assert.AreEqual("M3 2013 Fall", result.DefaultName, "Name"); Assert.AreEqual("M3 2013 Fall", album.OriginalReleaseEvent?.DefaultName, "OriginalReleaseEventName for album"); var archivedVersions = repository.List <ArchivedReleaseEventVersion>(); Assert.AreEqual(1, archivedVersions.Count, "Archived version was created"); // Names are changed too when suffix changes Assert.AreEqual(ReleaseEventEditableFields.Names | ReleaseEventEditableFields.SeriesSuffix, archivedVersions[0].Diff.ChangedFields.Value, "Changed fields in diff"); }
public async Task Create_WithSeriesAndSuffix() { var contract = new ReleaseEventForEditContract { Description = string.Empty, Series = new ReleaseEventSeriesContract(series, ContentLanguagePreference.English), SeriesNumber = 2014, SeriesSuffix = "Spring", }; var result = await CallUpdate(contract); Assert.IsTrue(repository.Contains(result), "Event was saved to repository"); Assert.AreEqual("M3 2014 Spring", result.DefaultName, "Name"); Assert.AreEqual(1, result.Names.Names.Count, "Number of names"); Assert.AreEqual("M3 2014 Spring", result.Names.Names[0].Value, "First name"); Assert.AreEqual(2014, result.SeriesNumber, "SeriesNumber"); Assert.AreEqual("Spring", result.SeriesSuffix, "SeriesSuffix"); Assert.AreSame(series, result.Series, "Series"); }
public void Create_SeriesHasMultipleNames() { series.Names.Names = new[] { series.CreateName("Comiket", ContentLanguageSelection.English), series.CreateName("コミケ", ContentLanguageSelection.Japanese), series.CreateName("Comic Market", ContentLanguageSelection.Unspecified), }.ToList(); var contract = new ReleaseEventForEditContract { Description = string.Empty, Series = new ReleaseEventSeriesContract(series, ContentLanguagePreference.English), SeriesNumber = 39, SeriesSuffix = string.Empty, }; var result = CallUpdate(contract); Assert.AreEqual(3, result.Names.Names.Count, "Number of names"); Assert.IsTrue(result.Names.HasName("Comiket 39"), "Found English name"); Assert.IsTrue(result.Names.HasName("コミケ 39"), "Found Japanese name"); Assert.AreEqual("Comiket 39", result.TranslatedName.English, "English name"); Assert.AreEqual("コミケ 39", result.TranslatedName.Japanese, "Japanese name"); }
/// <summary> /// Updates or creates release event. /// /// Album release event names will be updated as well if the name changed. /// </summary> /// <param name="contract">Updated contract. Cannot be null.</param> /// <returns>Updated release event data. Cannot be null.</returns> /// <exception cref="DuplicateEventNameException">If the event name is already in use.</exception> public ReleaseEventContract Update(ReleaseEventForEditContract contract, EntryPictureFileContract pictureData) { ParamIs.NotNull(() => contract); PermissionContext.VerifyManageDatabase(); return(repository.HandleTransaction(session => { ReleaseEvent ev; if (contract.Id == 0) { var diff = new ReleaseEventDiff(); if (!contract.Series.IsNullOrDefault()) { var series = session.OfType <ReleaseEventSeries>().Load(contract.Series.Id); ev = new ReleaseEvent(contract.Description, contract.Date, series, contract.SeriesNumber, contract.SeriesSuffix, contract.DefaultNameLanguage, contract.CustomName); series.AllEvents.Add(ev); } else { ev = new ReleaseEvent(contract.Description, contract.Date, contract.DefaultNameLanguage); } ev.Category = contract.Category; ev.EndDate = contract.EndDate; ev.SongList = session.NullSafeLoad <SongList>(contract.SongList); ev.Status = contract.Status; ev.VenueName = contract.VenueName; if (contract.SongList != null) { diff.SongList.Set(); } if (!string.IsNullOrEmpty(contract.VenueName)) { diff.Venue.Set(); } var weblinksDiff = WebLink.Sync(ev.WebLinks, contract.WebLinks, ev); if (weblinksDiff.Changed) { diff.WebLinks.Set(); } var pvDiff = ev.PVs.Sync(contract.PVs, ev.CreatePV); session.OfType <PVForAlbum>().Sync(pvDiff); if (pvDiff.Changed) { diff.PVs.Set(); } var artistDiff = ev.SyncArtists(contract.Artists, artistId => session.Load <Artist>(artistId)); if (artistDiff.Changed) { diff.Artists.Set(); } session.Save(ev); var namesChanged = new UpdateEventNamesQuery().UpdateNames(session, ev, contract.Series, contract.CustomName, contract.SeriesNumber, contract.SeriesSuffix, contract.Names); if (namesChanged) { session.Update(ev); } if (pictureData != null) { diff.MainPicture.Set(); SaveImage(ev, pictureData); session.Update(ev); } var archived = Archive(session, ev, diff, EntryEditEvent.Created, string.Empty); AddEntryEditedEntry(session.OfType <ActivityEntry>(), archived); session.AuditLogger.AuditLog(string.Format("created {0}", entryLinkFactory.CreateEntryLink(ev))); new FollowedArtistNotifier().SendNotifications(session, ev, ev.Artists.Where(a => a?.Artist != null).Select(a => a.Artist), PermissionContext.LoggedUser, entryLinkFactory, mailer, enumTranslations); } else { ev = session.Load(contract.Id); permissionContext.VerifyEntryEdit(ev); var diff = new ReleaseEventDiff(DoSnapshot(ev, session)); if (ev.Category != contract.Category) { diff.Category.Set(); } if (!ev.Date.Equals(contract.Date) || !ev.EndDate.Equals(contract.EndDate)) { diff.Date.Set(); } if (ev.Description != contract.Description) { diff.Description.Set(); } var inheritedLanguage = ev.Series == null || contract.CustomName ? contract.DefaultNameLanguage : ev.Series.TranslatedName.DefaultLanguage; if (ev.TranslatedName.DefaultLanguage != inheritedLanguage) { diff.OriginalName.Set(); } var namesChanged = new UpdateEventNamesQuery().UpdateNames(session, ev, contract.Series, contract.CustomName, contract.SeriesNumber, contract.SeriesSuffix, contract.Names); if (namesChanged) { diff.Names.Set(); } if (!ev.Series.NullSafeIdEquals(contract.Series)) { diff.Series.Set(); } if (ev.SeriesNumber != contract.SeriesNumber) { diff.SeriesNumber.Set(); } if (ev.SeriesSuffix != contract.SeriesSuffix) { diff.SeriesSuffix.Set(); } if (!ev.SongList.NullSafeIdEquals(contract.SongList)) { diff.SongList.Set(); } if (ev.Status != contract.Status) { diff.Status.Set(); } if (!string.Equals(ev.VenueName, contract.VenueName)) { diff.Venue.Set(); } ev.SetSeries(session.NullSafeLoad <ReleaseEventSeries>(contract.Series)); ev.Category = contract.Category; ev.CustomName = contract.CustomName; ev.Date = contract.Date; ev.Description = contract.Description; ev.EndDate = contract.EndDate > contract.Date ? contract.EndDate : null; ev.SeriesNumber = contract.SeriesNumber; ev.SeriesSuffix = contract.SeriesSuffix; ev.SongList = session.NullSafeLoad <SongList>(contract.SongList); ev.Status = contract.Status; ev.TranslatedName.DefaultLanguage = inheritedLanguage; ev.VenueName = contract.VenueName; var weblinksDiff = WebLink.Sync(ev.WebLinks, contract.WebLinks, ev); if (weblinksDiff.Changed) { diff.WebLinks.Set(); session.OfType <ReleaseEventWebLink>().Sync(weblinksDiff); } var pvDiff = ev.PVs.Sync(contract.PVs, ev.CreatePV); session.OfType <PVForAlbum>().Sync(pvDiff); if (pvDiff.Changed) { diff.PVs.Set(); } var artistDiff = ev.SyncArtists(contract.Artists, artistId => session.Load <Artist>(artistId)); if (artistDiff.Changed) { diff.Artists.Set(); } if (pictureData != null) { diff.MainPicture.Set(); SaveImage(ev, pictureData); } session.Update(ev); var archived = Archive(session, ev, diff, EntryEditEvent.Updated, string.Empty); AddEntryEditedEntry(session.OfType <ActivityEntry>(), archived); var logStr = string.Format("updated properties for {0} ({1})", entryLinkFactory.CreateEntryLink(ev), diff.ChangedFieldsString); session.AuditLogger.AuditLog(logStr); var newSongCutoff = TimeSpan.FromHours(1); if (artistDiff.Added.Any() && ev.CreateDate >= DateTime.Now - newSongCutoff) { var addedArtists = artistDiff.Added.Where(a => a.Artist != null).Select(a => a.Artist).Distinct().ToArray(); if (addedArtists.Any()) { new FollowedArtistNotifier().SendNotifications(session, ev, addedArtists, PermissionContext.LoggedUser, entryLinkFactory, mailer, enumTranslations); } } } return new ReleaseEventContract(ev, LanguagePreference); })); }
private ReleaseEvent CallUpdate(ReleaseEventForEditContract contract) { var result = queries.Update(contract, null); return(repository.Load(result.Id)); }
private async Task <ReleaseEvent> CallUpdate(ReleaseEventForEditContract contract) { var result = await queries.Update(contract, null); return(repository.Load(result.Id)); }