public void SetUp() { producer = CreateEntry.Producer(id: 1, name: "Tripshots"); vocalist = CreateEntry.Vocalist(id: 39, name: "Hatsune Miku"); vocalist2 = CreateEntry.Vocalist(id: 40, name: "Kagamine Rin"); song = CreateEntry.Song(id: 1, name: "Nebula"); song.LengthSeconds = 39; repository = new FakeSongRepository(song); Save(song.AddArtist(producer)); Save(song.AddArtist(vocalist)); Save(song.CreatePV(new PVContract { Id = 1, Service = PVService.Youtube, PVId = "hoLu7c2XZYU", Name = "Nebula", PVType = PVType.Original })); repository.SaveNames(song); user = CreateEntry.User(id: 1, name: "Miku"); user.GroupId = UserGroupId.Trusted; user2 = CreateEntry.User(id: 2, name: "Rin", email: "*****@*****.**"); user3 = CreateEntry.User(id: 3, name: "Luka", email: "*****@*****.**"); repository.Add(user, user2); repository.Add(producer, vocalist); tag = new Tag("vocarock"); repository.Add(tag, new Tag("vocaloud")); releaseEvent = repository.Save(new ReleaseEvent { Name = "Comiket 39" }); permissionContext = new FakePermissionContext(user); entryLinkFactory = new EntryAnchorFactory("http://test.vocadb.net"); newSongContract = new CreateSongContract { SongType = SongType.Original, Names = new[] { new LocalizedStringContract("Resistance", ContentLanguageSelection.English) }, Artists = new[] { new ArtistForSongContract { Artist = new ArtistContract(producer, ContentLanguagePreference.Default) }, new ArtistForSongContract { Artist = new ArtistContract(vocalist, ContentLanguagePreference.Default) }, }, PVUrl = "http://test.vocadb.net/" }; pvParser = new FakePVParser(); pvParser.ResultFunc = (url, getMeta) => VideoUrlParseResult.CreateOk(url, PVService.NicoNicoDouga, "sm393939", getMeta ? VideoTitleParseResult.CreateSuccess("Resistance", "Tripshots", "testimg.jpg", 39) : VideoTitleParseResult.Empty); mailer = new FakeUserMessageMailer(); queries = new SongQueries(repository, permissionContext, entryLinkFactory, pvParser, mailer, new FakeLanguageDetector(), new FakeUserIconFactory(), new EnumTranslations(), new InMemoryImagePersister(), new FakeObjectCache(), new Model.Utils.Config.VdbConfigManager()); }
public SongContract Create(CreateSongContract contract) { ParamIs.NotNull(() => contract); if (contract.Names == null || !contract.Names.Any()) { throw new ArgumentException("Song needs at least one name", "contract"); } VerifyManageDatabase(); return(repository.HandleTransaction(ctx => { var pvResult = ParsePV(ctx.OfType <PVForSong>(), contract.PVUrl); var reprintPvResult = ParsePV(ctx.OfType <PVForSong>(), contract.ReprintPVUrl); ctx.AuditLogger.SysLog(string.Format("creating a new song with name '{0}'", contract.Names.First().Value)); var song = new Song { SongType = contract.SongType, Status = contract.Draft ? EntryStatus.Draft : EntryStatus.Finished }; song.Names.Init(contract.Names, song); ctx.Save(song); foreach (var artistContract in contract.Artists) { var artist = ctx.OfType <Artist>().Load(artistContract.Id); if (!song.HasArtist(artist)) { ctx.OfType <ArtistForSong>().Save(song.AddArtist(artist)); } } if (pvResult != null) { ctx.OfType <PVForSong>().Save(song.CreatePV(new PVContract(pvResult, PVType.Original))); AddTagsFromPV(pvResult, song, ctx); } if (reprintPvResult != null) { ctx.OfType <PVForSong>().Save(song.CreatePV(new PVContract(reprintPvResult, PVType.Reprint))); } song.UpdateArtistString(); Archive(ctx, song, SongArchiveReason.Created); ctx.Update(song); ctx.AuditLogger.AuditLog(string.Format("created song {0} ({1})", entryLinkFactory.CreateEntryLink(song), song.SongType)); AddEntryEditedEntry(ctx.OfType <ActivityEntry>(), song, EntryEditEvent.Created); new FollowedArtistNotifier().SendNotifications(ctx.OfType <UserMessage>(), song, song.ArtistList, PermissionContext.LoggedUser, entryLinkFactory, mailer); return new SongContract(song, PermissionContext.LanguagePreference); })); }
public void SetUp() { producer = CreateEntry.Producer(id: 1, name: "Tripshots"); vocalist = CreateEntry.Vocalist(id: 39, name: "Hatsune Miku"); vocalist2 = CreateEntry.Vocalist(id: 40, name: "Kagamine Rin"); song = CreateEntry.Song(id: 1, name: "Nebula"); song.LengthSeconds = 39; repository = new FakeSongRepository(song); Save(song.AddArtist(producer)); Save(song.AddArtist(vocalist)); Save(song.CreatePV(new PVContract { Service = PVService.Youtube, PVId = "hoLu7c2XZYU", Name = "Nebula", PVType = PVType.Original })); foreach (var name in song.Names) { repository.Save(name); } user = CreateEntry.User(id: 1, name: "Miku"); user.GroupId = UserGroupId.Trusted; user2 = CreateEntry.User(id: 2, name: "Rin", email: "*****@*****.**"); repository.Add(user, user2); repository.Add(producer, vocalist); repository.Add(new Tag("vocarock"), new Tag("vocaloud")); permissionContext = new FakePermissionContext(user); var entryLinkFactory = new EntryAnchorFactory("http://test.vocadb.net"); newSongContract = new CreateSongContract { SongType = SongType.Original, Names = new[] { new LocalizedStringContract("Resistance", ContentLanguageSelection.English) }, Artists = new[] { new ArtistContract(producer, ContentLanguagePreference.Default), new ArtistContract(vocalist, ContentLanguagePreference.Default), }, PVUrl = "http://test.vocadb.net/" }; pvParser = new FakePVParser(); pvParser.ResultFunc = (url, getMeta) => VideoUrlParseResult.CreateOk(url, PVService.NicoNicoDouga, "sm393939", getMeta ? VideoTitleParseResult.CreateSuccess("Resistance", "Tripshots", "testimg.jpg", 39) : VideoTitleParseResult.Empty); mailer = new FakeUserMessageMailer(); queries = new SongQueries(repository, permissionContext, entryLinkFactory, pvParser, mailer, new FakeLanguageDetector()); }
public SongContract PostNewSong(CreateSongContract contract) { if (contract == null) { throw new HttpBadRequestException("Message was empty"); } try { return(queries.Create(contract)); } catch (VideoParseException x) { throw new HttpBadRequestException(x.Message); } catch (ArgumentException x) { throw new HttpBadRequestException(x.Message); } }
public async Task <ActionResult <SongContract> > PostNewSong(CreateSongContract contract) { if (contract == null) { return(BadRequest("Message was empty")); } try { return(await _queries.Create(contract)); } catch (VideoParseException x) { return(BadRequest(x.Message)); } catch (ArgumentException x) { return(BadRequest(x.Message)); } }
protected void DoCreateSong(object sender, EventArgs e) { string name = nameBox.Text; string nicoId = nicoIdBox.Text; int albumId = int.Parse(albumList.SelectedValue); int producerId = int.Parse(producerList.SelectedValue); int vocaloidId = int.Parse(vocaloidList.SelectedValue); if (name == string.Empty) { ErrorMsg = "Name cannot be empty"; } if (HasErrors) { DataBind(); return; } var song = new CreateSongContract { BasicData = new SongContract { Name = name, NicoId = nicoId }, AlbumId = albumId, ProducerId = producerId, PerformerId = vocaloidId }; try { CreatedSong = Services.Songs.CreateSong(song); DataBind(); } catch (ServiceException x) { ErrorMsg = x.Message; DataBind(); return; } }
public SongContract CreateSong(CreateSongContract contract) { return(HandleTransaction(session => { if (!string.IsNullOrEmpty(contract.BasicData.NicoId)) { var existing = session.Linq <Song>().FirstOrDefault(s => s.NicoId == contract.BasicData.NicoId); if (existing != null) { throw new ServiceException("Song with NicoId '" + contract.BasicData.NicoId + "' has already been added"); } } var song = new Song(new LocalizedString(contract.BasicData.Name), contract.BasicData.NicoId); if (contract.AlbumId != null) { song.AddAlbum(session.Load <Album>(contract.AlbumId.Value), 0); } if (contract.PerformerId != null) { song.AddArtist(session.Load <Artist>(contract.PerformerId.Value)); } if (contract.ProducerId != null) { song.AddArtist(session.Load <Artist>(contract.ProducerId.Value)); } song.UpdateArtistString(); session.Save(song); return new SongContract(song); })); }
public SongContract Create(CreateSongContract contract) { ParamIs.NotNull(() => contract); if (contract.Names == null || !contract.Names.Any()) { throw new ArgumentException("Song needs at least one name", nameof(contract)); } VerifyManageDatabase(); return(repository.HandleTransaction(ctx => { var pvResult = ParsePV(ctx.OfType <PVForSong>(), contract.PVUrl); var reprintPvResult = ParsePV(ctx.OfType <PVForSong>(), contract.ReprintPVUrl); ctx.AuditLogger.SysLog(string.Format("creating a new song with name '{0}'", contract.Names.First().Value)); var diff = new SongDiff { Names = true }; var song = new Song { SongType = contract.SongType }; if (contract.OriginalVersion != null && contract.OriginalVersion.Id != 0) { song.OriginalVersion = ctx.Load(contract.OriginalVersion.Id); diff.OriginalVersion = true; } song.Names.Init(contract.Names, song); ctx.Save(song); foreach (var artistContract in contract.Artists) { if (artistContract.Artist != null) { var artist = ctx.OfType <Artist>().Load(artistContract.Artist.Id); if (!song.HasArtist(artist)) { ctx.OfType <ArtistForSong>().Save(song.AddArtist(artist, artistContract.IsSupport, artistContract.Roles)); } } else { ctx.OfType <ArtistForSong>().Save(song.AddArtist(artistContract.Name, artistContract.IsSupport, artistContract.Roles)); } } diff.Artists = contract.Artists.Any(); var pvs = new List <PVContract>(); if (pvResult != null) { pvs.Add(new PVContract(pvResult, PVType.Original)); AddTagsFromPV(pvResult, song, ctx); } if (reprintPvResult != null) { pvs.Add(new PVContract(reprintPvResult, PVType.Reprint)); } var pvDiff = song.SyncPVs(pvs); ctx.OfType <PVForSong>().Sync(pvDiff); diff.PVs = pvs.Any(); if (contract.WebLinks != null) { var weblinksDiff = ctx.Sync(WebLink.Sync(song.WebLinks, contract.WebLinks, song)); diff.WebLinks = weblinksDiff.Changed; } if (contract.Lyrics != null && contract.Lyrics.Any()) { contract.Lyrics.ForEach(song.CreateLyrics); diff.Lyrics = true; } song.Status = (contract.Draft || !(new SongValidator().IsValid(song, config.SpecialTags.Instrumental))) ? EntryStatus.Draft : EntryStatus.Finished; song.UpdateArtistString(); var archived = Archive(ctx, song, diff, SongArchiveReason.Created, contract.UpdateNotes ?? string.Empty); ctx.Update(song); ctx.AuditLogger.AuditLog(string.Format("created song {0} ({1})", entryLinkFactory.CreateEntryLink(song), song.SongType)); AddEntryEditedEntry(ctx.OfType <ActivityEntry>(), song, EntryEditEvent.Created, archived); new FollowedArtistNotifier().SendNotifications(ctx.OfType <UserMessage>(), song, song.ArtistList, PermissionContext.LoggedUser, entryLinkFactory, mailer); return new SongContract(song, PermissionContext.LanguagePreference); })); }
public SongContract Create(CreateSongContract contract) { ParamIs.NotNull(() => contract); if (contract.Names == null || !contract.Names.Any()) { throw new ArgumentException("Song needs at least one name", nameof(contract)); } VerifyManageDatabase(); return(repository.HandleTransaction(ctx => { var pvResult = ParsePV(ctx.OfType <PVForSong>(), contract.PVUrl); var reprintPvResult = ParsePV(ctx.OfType <PVForSong>(), contract.ReprintPVUrl); ctx.AuditLogger.SysLog(string.Format("creating a new song with name '{0}'", contract.Names.First().Value)); var diff = new SongDiff(); diff.Names.Set(); var song = new Song { SongType = contract.SongType }; if (contract.OriginalVersion != null && contract.OriginalVersion.Id != 0) { song.OriginalVersion = ctx.Load(contract.OriginalVersion.Id); diff.OriginalVersion.Set(); } song.Names.Init(contract.Names, song); ctx.Save(song); foreach (var artistContract in contract.Artists) { if (artistContract.Artist != null) { var artist = ctx.OfType <Artist>().Load(artistContract.Artist.Id); if (!song.HasArtist(artist)) { ctx.OfType <ArtistForSong>().Save(song.AddArtist(artist, artistContract.IsSupport, artistContract.Roles)); } } else { ctx.OfType <ArtistForSong>().Save(song.AddArtist(artistContract.Name, artistContract.IsSupport, artistContract.Roles)); } } diff.Artists.Set(contract.Artists.Any()); var pvs = new List <PVContract>(); Tag[] addedTags = null; if (pvResult != null) { pvs.Add(new PVContract(pvResult, PVType.Original)); addedTags = AddTagsFromPV(pvResult, song, ctx); } if (reprintPvResult != null) { pvs.Add(new PVContract(reprintPvResult, PVType.Reprint)); } var pvDiff = song.SyncPVs(pvs); ctx.OfType <PVForSong>().Sync(pvDiff); diff.PVs.Set(pvs.Any()); if (contract.WebLinks != null) { var weblinksDiff = ctx.Sync(WebLink.Sync(song.WebLinks, contract.WebLinks, song)); diff.WebLinks.Set(weblinksDiff.Changed); } if (contract.Lyrics != null && contract.Lyrics.Any()) { contract.Lyrics.ForEach(song.CreateLyrics); diff.Lyrics.Set(); } song.Status = (contract.Draft || !(new SongValidator().IsValid(song, config.SpecialTags.Instrumental))) ? EntryStatus.Draft : EntryStatus.Finished; song.UpdateArtistString(); var archived = Archive(ctx, song, diff, SongArchiveReason.Created, contract.UpdateNotes ?? string.Empty); ctx.Update(song); var logStr = string.Format("created song {0} of type {1} ({2})", entryLinkFactory.CreateEntryLink(song), song.SongType, diff.ChangedFieldsString) + (!string.IsNullOrEmpty(contract.UpdateNotes) ? " " + HttpUtility.HtmlEncode(contract.UpdateNotes) : string.Empty) .Truncate(400); ctx.AuditLogger.AuditLog(logStr); AddEntryEditedEntry(ctx.OfType <ActivityEntry>(), song, EntryEditEvent.Created, archived); var user = PermissionContext.LoggedUser; // Send notifications. Avoid sending notification to the same users twice. var notifiedUsers = new FollowedArtistNotifier().SendNotifications(ctx, song, song.ArtistList, user, entryLinkFactory, mailer, enumTranslations); if (addedTags != null && addedTags.Length > 0) { new FollowedTagNotifier().SendNotifications(ctx, song, addedTags, notifiedUsers.Select(u => u.Id).Concat(new[] { user.Id }).ToArray(), entryLinkFactory, enumTranslations); } return new SongContract(song, PermissionContext.LanguagePreference); })); }