Ejemplo n.º 1
0
        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");
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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");
        }
Ejemplo n.º 4
0
        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");
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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");
        }
Ejemplo n.º 7
0
        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");
        }
Ejemplo n.º 8
0
        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");
        }
Ejemplo n.º 9
0
        /// <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);
            }));
        }
Ejemplo n.º 10
0
        private ReleaseEvent CallUpdate(ReleaseEventForEditContract contract)
        {
            var result = queries.Update(contract, null);

            return(repository.Load(result.Id));
        }
Ejemplo n.º 11
0
        private async Task <ReleaseEvent> CallUpdate(ReleaseEventForEditContract contract)
        {
            var result = await queries.Update(contract, null);

            return(repository.Load(result.Id));
        }