예제 #1
0
        private static void TestAddSongRequest(IReadOnlyList <string> args)
        {
            var httpLink = ParseIntputLink(args);

            var settings = TestSettings.MockSettings(httpLink);

            using var scrapper = HttpWebScrapperFactory.Create(settings, Logger);

            scrapper.OpenUrl();

            var userData = UserData.Create("TestUserId", "TestUserName");
            var number   = SongRequestNumber.All;

            var request = SongRequestModel.CreateNew(userData, TestConfig.SongLink, number);

            request = request.AutoApprove(settings.AutoApproveReason);
            request = request.StartProcessing();
            var result = scrapper.Process(request);

            if (result.IsSuccess)
            {
                Logger.Info("Song request processed successfully!");
            }
            else
            {
                Logger.Error($"Failed to process song request: {result.Description}");
            }
        }
 public async Task <SongRequestCurrentlyPlayingModel> Play(SongRequestModel song)
 {
     try
     {
         if (await ChannelSession.Services.Spotify.PlaySong(song.URI))
         {
             return(new SongRequestCurrentlyPlayingModel()
             {
                 ID = song.ID,
                 URI = song.URI,
                 Name = song.Name,
                 AlbumImage = song.AlbumImage,
                 Length = song.Length,
                 Type = song.Type,
                 IsFromBackupPlaylist = song.IsFromBackupPlaylist,
                 User = song.User,
                 State = SongRequestStateEnum.Playing,
             });
         }
     }
     catch (Exception ex)
     {
         Logger.Log(ex);
     }
     return(null);
 }
        public IHttpActionResult ById(int id)
        {
            if (!this.ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var dbSong = this.data
                .Songs
                .All()
                .FirstOrDefault(s => s.Id == id);
            if (dbSong == null)
            {
                return BadRequest("Such song does not exist in database!");
            }

            var song = new SongRequestModel
            {
                Genre = (GenreTypeRequestModel)dbSong.Genre,
                Title = dbSong.Title,
                Year = dbSong.Year
            };

            return Ok(song);
        }
        /// <summary>
        /// Expect SongRequestModel with valid title, year (2 digits), Genre , ArtistId and AlbumId.
        /// </summary>
        /// <param name="model"></param>
        /// <returns>
        /// If the song is added returns IHttpActionResult with status code 200 OK
        /// If the input data in not in the valid format retunrs  IHttpActionResult with status code 400 Bad Request
        /// </returns>
        public IHttpActionResult Post(SongRequestModel model)
        {
            if (!this.ModelState.IsValid || model == null)
            {
                return(this.BadRequest(this.ModelState));
            }

            var albumExists = this.albums
                              .All()
                              .Any(a => a.Id == model.AlbumId);

            var artistExist = this.artists
                              .All()
                              .Any(a => a.Id == model.ArtistId);

            if (!(albumExists && artistExist))
            {
                return(this.BadRequest("Invalid albumID or artistID"));
            }

            this.songs.Add(new Song
            {
                Title       = model.Title,
                Genre       = model.Genre,
                PublishYear = model.PublishYear,
                ArtistId    = model.ArtistId,
                AlbumId     = model.AlbumId
            });

            this.songs.SaveChanges();
            return(this.Ok("The song was successfully added."));
        }
        public IHttpActionResult Post(SongRequestModel requestSong)
        {
            var song = Mapper.Map <Song>(requestSong);

            song = this.songs.Add(song);

            return(this.Created("/", Mapper.Map <SongResponseModel>(song)));
        }
        public IHttpActionResult Put(int id, SongRequestModel requestSong)
        {
            var song = Mapper.Map <Song>(requestSong);

            song = this.songs.Update(id, song);

            return(this.Ok(Mapper.Map <SongResponseModel>(song)));
        }
        public IHttpActionResult Post(SongRequestModel songToAdd)
        {
            var song = Mapper.Map<Song>(songToAdd);
            this.db.Songs.Add(song);
            this.db.SaveChanges();

            return this.Ok(string.Format("{0} was added to Songs", song.Title));
        }
        private SongRequestResult ProcessResult(SongRequestModel songRequest)
        {
            if (!_settings.ShouldParseResult)
            {
                _logger.Info("No need to parse result. Returning success.");
                return(SongRequestResult.Success(songRequest, _settings.DefaultSuccessMessage));
            }

            _logger.Info(
                $"Song request '{songRequest.RequestId.ToString()}' seems to be added, " +
                "processing result."
                );

            // Page can be loaded to quickly, need that notification will be enabled.
            var waiter = new WebDriverWait(_webDriver, TimeoutToWait);

            var notification = waiter.Until(
                driver => driver.FindElement(By.ClassName(_settings.ClassNameOfNotificationIcon))
                );

            _logger.Debug("Found notification icon.");

            var success = notification.FindElements(
                By.ClassName(_settings.ClassNameOfSuccessNotificationIcon)
                );

            _logger.Debug("Tried to find success notification icon.");

            var failure = notification.FindElements(
                By.ClassName(_settings.ClassNameOfErrorNotificationIcon)
                );

            _logger.Debug("Tried to find error notification icon.");

            var description = _webDriver.FindElement(
                By.ClassName(_settings.ClassNameOfNotificationDescription)
                );
            var descriptionText = description.Text;

            _logger.Debug($"Found notification description: [{descriptionText}].");

            // Success.
            if (success.Count > 0 && failure.Count == 0)
            {
                _logger.Info(
                    $"Song request '{songRequest.RequestId.ToString()}' processed successfully. " +
                    $"Result: {descriptionText}"
                    );
                return(SongRequestResult.Success(songRequest, descriptionText));
            }

            // Failure.
            _logger.Info(
                $"Song request {songRequest.RequestId.ToString()} processed with failure. " +
                $"Error: {descriptionText}"
                );
            return(SongRequestResult.Fail(songRequest, descriptionText));
        }
예제 #9
0
        private async Task AddSongRequest(UserViewModel user, SongRequestModel song)
        {
            song.User = user;

            if (bannedSongsCache[song.Type].Contains(song.ID))
            {
                await ChannelSession.Chat.Whisper(user.UserName, "This song is banned from being requested.");

                return;
            }

            bool isSongCurrentlyPlaying = false;
            await SongRequestService.songRequestLock.WaitAndRelease(() =>
            {
                isSongCurrentlyPlaying = (this.Status != null);

                if (ChannelSession.Settings.SongRequestSubPriority && user.IsMixerSubscriber)
                {
                    for (int i = 0; i < this.requestSongs.Count; i++)
                    {
                        if (!this.requestSongs[i].User.IsMixerSubscriber)
                        {
                            this.requestSongs.Insert(i, song);
                            return(Task.FromResult(0));
                        }
                    }
                }
                this.requestSongs.Add(song);

                if (ChannelSession.Settings.SongRequestsSaveRequestQueue)
                {
                    ChannelSession.Settings.SongRequestsSavedRequestQueue = this.requestSongs.ToList();
                }

                return(Task.FromResult(0));
            });

            if (!isSongCurrentlyPlaying)
            {
                await this.Skip();
            }
            else
            {
                if (ChannelSession.Settings.SongAddedCommand != null)
                {
                    Dictionary <string, string> specialIdentifiers = new Dictionary <string, string>()
                    {
                        { "songtitle", song.Name },
                        { "songalbumimage", song.AlbumImage }
                    };
                    await ChannelSession.Settings.SongAddedCommand.Perform(song.User, arguments : null, extraSpecialIdentifiers : specialIdentifiers);
                }
            }

            ChannelSession.Services.Telemetry.TrackSongRequest(song.Type);

            GlobalEvents.SongRequestsChangedOccurred();
        }
        public IHttpActionResult Post(SongRequestModel songToAdd)
        {
            var song = Mapper.Map <Song>(songToAdd);

            this.db.Songs.Add(song);
            this.db.SaveChanges();

            return(this.Ok(string.Format("{0} was added to Songs", song.Title)));
        }
예제 #11
0
        public async Task MoveDown(SongRequestModel song)
        {
            await SongRequestService.songRequestLock.WaitAndRelease(() =>
            {
                this.requestSongs.MoveDown(song);
                return(Task.FromResult(0));
            });

            GlobalEvents.SongRequestsChangedOccurred();
        }
예제 #12
0
 private async void BanQueueButton_Click(object sender, RoutedEventArgs e)
 {
     await this.Window.RunAsyncOperation(() =>
     {
         Button button = (Button)sender;
         SongRequestModel songRequest = (SongRequestModel)button.DataContext;
         this.viewModel.BanCommand.Execute(songRequest);
         return(Task.FromResult(0));
     });
 }
예제 #13
0
 public async Task Play(SongRequestModel song)
 {
     try
     {
         await ChannelSession.Services.Spotify.PlaySong(song.URI);
     }
     catch (Exception ex)
     {
         Logger.Log(ex);
     }
 }
예제 #14
0
        public async Task Ban(SongRequestModel song)
        {
            await SongRequestService.songRequestLock.WaitAndRelease(() =>
            {
                ChannelSession.Settings.SongRequestsBannedSongs.Add(song);
                bannedSongsCache[song.Type].Add(song.ID);
                return(Task.FromResult(0));
            });

            await this.Remove(song);
        }
예제 #15
0
        public override async Task <OverlayItemBase> GetProcessedItem(UserViewModel user, IEnumerable <string> arguments, Dictionary <string, string> extraSpecialIdentifiers)
        {
            if (ChannelSession.Services.SongRequestService != null && this.songRequestsUpdated)
            {
                this.songRequestsUpdated = false;

                List <SongRequestModel> songRequests = new List <SongRequestModel>();

                SongRequestModel currentlyPlaying = await ChannelSession.Services.SongRequestService.GetCurrent();

                if (currentlyPlaying != null)
                {
                    songRequests.Add(currentlyPlaying);
                }

                IEnumerable <SongRequestModel> allSongRequests = this.testSongRequestsList;
                if (this.testSongRequestsList.Count == 0)
                {
                    allSongRequests = ChannelSession.Services.SongRequestService.RequestSongs.ToList();
                }

                foreach (SongRequestModel songRequest in allSongRequests)
                {
                    if (!songRequests.Any(sr => sr.Equals(songRequest)))
                    {
                        songRequests.Add(songRequest);
                    }
                }

                this.SongRequestUpdates.Clear();
                this.currentSongRequests.Clear();

                OverlaySongRequests copy = this.Copy <OverlaySongRequests>();
                for (int i = 0; i < songRequests.Count() && i < this.TotalToShow; i++)
                {
                    this.currentSongRequests.Add(songRequests.ElementAt(i));
                }

                while (this.currentSongRequests.Count > 0)
                {
                    OverlayCustomHTMLItem overlayItem = (OverlayCustomHTMLItem)await base.GetProcessedItem(user, arguments, extraSpecialIdentifiers);

                    copy.SongRequestUpdates.Add(new OverlaySongRequestItem()
                    {
                        HTMLText = overlayItem.HTMLText
                    });
                    this.currentSongRequests.RemoveAt(0);
                }

                return(copy);
            }
            return(null);
        }
예제 #16
0
        public async Task Remove(SongRequestModel song)
        {
            await SongRequestService.songRequestLock.WaitAndRelease(() =>
            {
                this.RequestSongs.Remove(song);
                return(Task.FromResult(0));
            });

            await ChannelSession.Chat.SendMessage(string.Format("{0} removed from the queue.", song.Name));

            GlobalEvents.SongRequestsChangedOccurred();
        }
예제 #17
0
 private async void DeleteQueueButton_Click(object sender, RoutedEventArgs e)
 {
     await this.Window.RunAsyncOperation(() =>
     {
         Button button = (Button)sender;
         if (button != null && button.DataContext != null && button.DataContext is SongRequestModel)
         {
             SongRequestModel songRequest = (SongRequestModel)button.DataContext;
             this.viewModel.DeleteCommand.Execute(songRequest);
         }
         return(Task.FromResult(0));
     });
 }
        private async void GlobalEvents_OnSongRequestsChangedOccurred(object sender, System.EventArgs e)
        {
            List <SongRequestModel> songs = ChannelSession.Services.SongRequestService.RequestSongs.ToList();

            if (this.IncludeCurrentSong)
            {
                SongRequestModel current = await ChannelSession.Services.SongRequestService.GetCurrent();

                if (current != null)
                {
                    songs.Insert(0, current);
                }
            }
            await this.AddSongRequests(songs.Take(this.TotalToShow));
        }
        private void AddNewSong(SongRequestModel songRequest)
        {
            // Page can be loaded to quickly, need that UI will be available.
            var waiter = CreateWebDriverWaiterForButton();

            waiter.Until(_ => NewSongTextField.Enabled);
            NewSongTextField.Clear();
            NewSongTextField.SendKeys(songRequest.SongLink.Value);

            waiter.Until(_ =>
            {
                AddSongButton.Click();
                return(true);
            });
        }
예제 #20
0
        public async Task RemoveLastRequested()
        {
            SongRequestModel song = null;
            await SongRequestService.songRequestLock.WaitAndRelease(() =>
            {
                song = this.requestSongs.LastOrDefault();
                return(Task.FromResult(0));
            });

            if (song != null)
            {
                await this.Remove(song);
            }

            GlobalEvents.SongRequestsChangedOccurred();
        }
예제 #21
0
        private async void GlobalEvents_OnSongRequestsChangedOccurred(object sender, EventArgs e)
        {
            this.currentlyPlaying = await ChannelSession.Services.SongRequestService.GetCurrent();

            await DispatcherHelper.InvokeDispatcher(() =>
            {
                this.RequestSongs.Clear();
                foreach (SongRequestModel songRequest in ChannelSession.Services.SongRequestService.RequestSongs.ToList())
                {
                    this.RequestSongs.Add(songRequest);
                }
                return(Task.FromResult(0));
            });

            this.NotifyPropertyChanges();
        }
        public IHttpActionResult Get()
        {
            // TODO does not work properly with Mapper so I did it by hand but needs more work
            var artists = db.Artists
                          .AsQueryable()
                          .ToList();

            var artistModels = new List <ArtistRequestModel>();

            foreach (var artist in artists)
            {
                var albums = new List <AlbumRequestModel>();
                foreach (var album in artist.Albums)
                {
                    var albumModel = new AlbumRequestModel
                    {
                        Producer = album.Producer,
                        Title    = album.Title,
                        Year     = album.Year
                    };
                    albums.Add(albumModel);
                }

                var songs = new List <SongRequestModel>();
                foreach (var song in artist.Songs)
                {
                    var songToAdd = new SongRequestModel
                    {
                        Title     = song.Title,
                        GenreName = song.Genre.Name,
                        Year      = song.Year
                    };
                    songs.Add(songToAdd);
                }

                var artistToAdd = new ArtistRequestModel
                {
                    Name   = artist.Name,
                    Albums = albums,
                    Songs  = songs
                };

                artistModels.Add(artistToAdd);
            }

            return(this.Ok(artistModels));
        }
        public IHttpActionResult Get()
        {
            // TODO does not work properly with Mapper so I did it by hand but needs more work
            var artists = db.Artists
                .AsQueryable()
                .ToList();

            var artistModels = new List<ArtistRequestModel>();
            foreach (var artist in artists)
            {
                var albums = new List<AlbumRequestModel>();
                foreach (var album in artist.Albums)
                {
                    var albumModel = new AlbumRequestModel
                    {
                        Producer = album.Producer,
                        Title = album.Title,
                        Year = album.Year
                    };
                    albums.Add(albumModel);
                }

                var songs = new List<SongRequestModel>();
                foreach (var song in artist.Songs)
                {
                    var songToAdd = new SongRequestModel
                    {
                        Title = song.Title,
                        GenreName = song.Genre.Name,
                        Year = song.Year
                    };
                    songs.Add(songToAdd);
                }

                var artistToAdd = new ArtistRequestModel
                {
                    Name = artist.Name,
                    Albums = albums,
                    Songs = songs
                };

                artistModels.Add(artistToAdd);
            }

            return this.Ok(artistModels);
        }
        public IHttpActionResult Post(SongRequestModel model)
        {
            if (!this.ModelState.IsValid)
            {
                return(this.BadRequest(this.ModelState));
            }

            var song = new Song
            {
                Title = model.Title,
                Year  = model.Year
            };

            this.data.Songs.Add(song);
            this.data.Songs.SaveChanges();

            return(this.Ok(song));
        }
        public SongRequestResult Process(SongRequestModel songRequest)
        {
            _logger.Info($"Processing song request [{songRequest}].");

            if (!songRequest.IsApprovedAndProcessing)
            {
                string errorMessage = (
                    "Invalid song request to process. Expected " +
                    $"state {nameof(SongRequestState.ApprovedAndProcessing)}, " +
                    $"actual state {songRequest.State.ToString()}."
                    );
                throw new ArgumentException(errorMessage, nameof(songRequest));
            }

            AddNewSong(songRequest);

            return(ProcessResult(songRequest));
        }
        public IHttpActionResult Update(int id, SongRequestModel song)
        {
            if (!this.ModelState.IsValid)
            {
                return BadRequest(this.ModelState);
            }

            var songInDb = this.data.Songs
                .All()
                .FirstOrDefault(c => c.Id == id);

            songInDb.Title = song.Title;
            songInDb.Year = song.Year;
            songInDb.Genre = song.Genre;

            this.data.Songs.SaveChanges();

            return Ok(songInDb);
        }
        public IHttpActionResult Update(int id, SongRequestModel song)
        {
            if (!this.ModelState.IsValid)
            {
                return(BadRequest(this.ModelState));
            }

            var songInDb = this.data.Songs
                           .All()
                           .FirstOrDefault(c => c.Id == id);

            songInDb.Title = song.Title;
            songInDb.Year  = song.Year;
            songInDb.Genre = song.Genre;

            this.data.Songs.SaveChanges();

            return(Ok(songInDb));
        }
예제 #28
0
        public async Task <SongRequestCurrentlyPlayingModel> Play(SongRequestModel song)
        {
            await this.DispatchWrapper(() => this.browser.InvokeScript("play", new object[] { song.ID }));

            await this.SetVolume(this.lastVolume);

            return(new SongRequestCurrentlyPlayingModel()
            {
                ID = song.ID,
                URI = song.URI,
                Name = song.Name,
                AlbumImage = song.AlbumImage,
                Length = song.Length,
                Type = song.Type,
                IsFromBackupPlaylist = song.IsFromBackupPlaylist,
                User = song.User,
                State = SongRequestStateEnum.Playing,
            });
        }
예제 #29
0
        public IHttpActionResult Post([FromBody] SongRequestModel model)
        {
            if (!this.ModelState.IsValid)
            {
                return(this.BadRequest(this.ModelState));
            }

            var entity = new Song
            {
                Name    = model.Name,
                Year    = model.Year,
                GenreId = model.GenreId
            };

            this.context.AddEntity(entity);
            this.context.Save();

            return(this.Created(this.Url.ToString(), entity));
        }
        public IHttpActionResult Update(SongRequestModel songToUpdate)
        {
            var targetSong = this.db.Songs
                             .FirstOrDefault(s => s.Id == songToUpdate.Id);

            if (targetSong == null)
            {
                return(this.NotFound());
            }

            targetSong.Title       = songToUpdate.Title;
            targetSong.Year        = songToUpdate.Year;
            targetSong.Genre.Name  = songToUpdate.GenreName;
            targetSong.Album.Title = songToUpdate.AlbumTitle;
            targetSong.Artist.Name = songToUpdate.ArtistName;

            this.db.SaveChanges();

            return(this.Ok("Song has been updated successfully!"));
        }
예제 #31
0
        protected override Task <Dictionary <string, string> > GetReplacementSets(UserViewModel user, IEnumerable <string> arguments, Dictionary <string, string> extraSpecialIdentifiers)
        {
            SongRequestModel songRequest = this.currentSongRequests.ElementAt(0);

            Dictionary <string, string> replacementSets = new Dictionary <string, string>();

            replacementSets["BACKGROUND_COLOR"] = this.BackgroundColor;
            replacementSets["BORDER_COLOR"]     = this.BorderColor;
            replacementSets["TEXT_COLOR"]       = this.TextColor;
            replacementSets["TEXT_FONT"]        = this.TextFont;
            replacementSets["WIDTH"]            = this.Width.ToString();
            replacementSets["HEIGHT"]           = this.Height.ToString();
            replacementSets["TEXT_SIZE"]        = ((int)(0.2 * ((double)this.Height))).ToString();

            replacementSets["SONG_IMAGE"]      = songRequest.AlbumImage;
            replacementSets["SONG_IMAGE_SIZE"] = ((int)(0.8 * ((double)this.Height))).ToString();
            replacementSets["SONG_NAME"]       = songRequest.Name;

            return(Task.FromResult(replacementSets));
        }
예제 #32
0
        public async Task RemoveLastRequested(UserViewModel user)
        {
            SongRequestModel song = null;
            await SongRequestService.songRequestLock.WaitAndRelease(() =>
            {
                song = this.requestSongs.LastOrDefault(s => s.User.ID == user.ID);
                return(Task.FromResult(0));
            });

            if (song != null)
            {
                await this.Remove(song);
            }
            else
            {
                await ChannelSession.Chat.Whisper(user.UserName, string.Format("You have no songs in the queue.", song.Name));
            }

            GlobalEvents.SongRequestsChangedOccurred();
        }
        public IHttpActionResult Create(SongRequestModel song)
        {
            if (!this.ModelState.IsValid)
            {
                return(BadRequest(this.ModelState));
            }

            this.data
            .Songs
            .Add(new Song
            {
                Title = song.Title,
                Year  = song.Year,
                Genre = song.Genre
            });

            this.data.Songs.SaveChanges();

            return(Ok(song));
        }
        public IHttpActionResult Update(SongRequestModel songToUpdate)
        {
            var targetSong = this.db.Songs
                .FirstOrDefault(s => s.Id == songToUpdate.Id);

            if (targetSong == null)
            {
                return this.NotFound();
            }

            targetSong.Title = songToUpdate.Title;
            targetSong.Year = songToUpdate.Year;
            targetSong.Genre.Name = songToUpdate.GenreName;
            targetSong.Album.Title = songToUpdate.AlbumTitle;
            targetSong.Artist.Name = songToUpdate.ArtistName;

            this.db.SaveChanges();

            return this.Ok("Song has been updated successfully!");
        }
        public IHttpActionResult Post(SongRequestModel song)
        {
            if (!this.ModelState.IsValid)
            {
                return this.BadRequest(this.ModelState);
            }

            var songToPost = new Song()
            {
                Title = song.Title,
                Year = song.Year,
                Genre = song.Genre,
                ArtistId = song.ArtistId
            };

            this.db.Songs.Add(songToPost);
            this.db.SaveChanges();

            return this.Ok(song);
        }
예제 #36
0
        public async Task Remove(SongRequestModel song)
        {
            await SongRequestService.songRequestLock.WaitAndRelease(() =>
            {
                this.requestSongs.Remove(song);
                return(Task.FromResult(0));
            });

            if (ChannelSession.Settings.SongRemovedCommand != null)
            {
                Dictionary <string, string> specialIdentifiers = new Dictionary <string, string>()
                {
                    { "songtitle", song.Name },
                    { "songalbumimage", song.AlbumImage }
                };
                await ChannelSession.Settings.SongRemovedCommand.Perform(song.User, arguments : null, extraSpecialIdentifiers : specialIdentifiers);
            }

            GlobalEvents.SongRequestsChangedOccurred();
        }
        public IHttpActionResult Create(SongRequestModel song)
        {
            if (!this.ModelState.IsValid)
            {
                return BadRequest(this.ModelState);
            }

            this.data
                .Songs
                .Add(new Song
                {
                    Title = song.Title,
                    Year = song.Year,
                    Genre = song.Genre
                });

            this.data.Songs.SaveChanges();

            return Ok(song);
        }
예제 #38
0
        public IHttpActionResult Post(SongRequestModel request)
        {
            if (request == null)
            {
                return this.BadRequest(GlobalMessages.EntityMustNotBeNullMessage);
            }

            var song = new Song
            {
                Title = request.Title,
                Genre = request.Genre,
                Year = request.Year
            };

            Singer defaultSinger = this.data.SingersRepository.All().FirstOrDefault();
            song.Singer = defaultSinger;

            this.data.SongsRepository.Add(song);
            int result = this.data.SaveChanges();
            return this.Ok($"{GlobalMessages.EntitySuccessfullyAddedMessage} - {result}");
        }
        public IHttpActionResult Create(SongRequestModel song)
        {
            if (!this.ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var newSong= new Song
            {
                Genre = (GenreType)song.Genre,
                Title = song.Title,
                Year = song.Year
            };

            this.data.Songs.Add(newSong);
            this.data.SaveChanges();

            song.Id = newSong.Id;

            return Ok(song);
        }
예제 #40
0
        public IHttpActionResult Update(string id, SongRequestModel request)
        {
            if (id == null)
            {
                return this.BadRequest(GlobalMessages.IdMustNotBeNullMessage);
            }

            if (request == null)
            {
                return this.BadRequest(GlobalMessages.EntityMustNotBeNullMessage);
            }

            Song entity = this.data.SongsRepository.FindById(id);
            if (entity == null)
            {
                return this.BadRequest(GlobalMessages.EntityDoesNotExist);
            }

            // Map the request model to the db model
            if (request.Title != default(string))
            {
                entity.Title = request.Title;
            }

            if (request.Genre != default(string))
            {
                entity.Genre = request.Genre;
            }

            if (request.Year != default(short))
            {
                entity.Year = request.Year;
            }

            this.data.SongsRepository.Update(entity);
            int result = this.data.SaveChanges();
            return this.Ok($"{GlobalMessages.EntitySuccessfullyUpdatedMessage} - {result}");
        }
예제 #41
0
        // POST: api/Song
        public IHttpActionResult Post(SongRequestModel song)
        {
            var songToAdd = new Song
            {
                Title = song.Title,
                Year = song.Year
            };

            var genre = this.genreData.All()
                .FirstOrDefault(g => g.Name == song.Genre);
            if (genre == null)
            {
                return this.BadRequest("Invalid song genre!");
            }
            songToAdd.Genre = genre;

            var artist = this.artistData.All()
                .FirstOrDefault(a => a.Name == song.Artist);
            if (artist == null)
            {
                return this.BadRequest("Invalid song artist!");
            }
            songToAdd.Artist = artist;

            var album = this.albumData.All()
                .FirstOrDefault(a => a.Title == song.Album);
            if (album == null)
            {
                return this.BadRequest("Invalid album artist!");
            }
            songToAdd.Album = album;

            this.songData.Add(songToAdd);
            this.songData.SaveChanges();
            return this.Ok();
        }
        /// <summary>
        /// Expect SongRequestModel with valid title, year (2 digits), Genre , ArtistId and AlbumId.
        /// </summary>
        /// <param name="model"></param>
        /// <returns>
        /// If the song is added returns IHttpActionResult with status code 200 OK
        /// If the input data in not in the valid format retunrs  IHttpActionResult with status code 400 Bad Request
        /// </returns>
        public IHttpActionResult Post(SongRequestModel model)
        {
            if (!this.ModelState.IsValid || model == null)
            {
                return this.BadRequest(this.ModelState);
            }

            var albumExists = this.albums
                .All()
                .Any(a => a.Id == model.AlbumId);

            var artistExist = this.artists
                .All()
                .Any(a => a.Id == model.ArtistId);

            if (!(albumExists && artistExist))
            {
                return this.BadRequest("Invalid albumID or artistID");
            }

            this.songs.Add(new Song
            {
                Title = model.Title,
                Genre = model.Genre,
                PublishYear = model.PublishYear,
                ArtistId = model.ArtistId,
                AlbumId = model.AlbumId
            });

            this.songs.SaveChanges();
            return this.Ok("The song was successfully added.");
        }
        public IHttpActionResult Update(int id, SongRequestModel song)
        {
            if (!this.ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            var dbSong = this.data
                .Songs.All()
                .FirstOrDefault(s => s.Id == id);
            if (dbSong == null)
            {
                return BadRequest("Such song does not exist in database!");
            }

            dbSong.Genre = (GenreType)song.Genre;
            dbSong.Title = song.Title;
            dbSong.Year = song.Year;
            this.data.SaveChanges();

            song.Id = id;
            return Ok(song);
        }
        public IHttpActionResult Put(int id, SongRequestModel song)
        {
            if (!ModelState.IsValid)
            {
                return this.BadRequest(this.ModelState);
            }

            var songToUpdate =
                this.db
                .Songs
                .All()
                .FirstOrDefault(s => s.Id == id);

            songToUpdate.Title = song.Title;
            songToUpdate.Year = song.Year;
            songToUpdate.Genre = song.Genre;
            songToUpdate.ArtistId = song.ArtistId;

            this.db.SaveChanges();

            return this.Ok();
        }
예제 #45
0
        // PUT: api/Song/5
        public IHttpActionResult Put(int id, SongRequestModel songInfo)
        {
            if (songInfo == null)
            {
                return this.BadRequest("Invalid song info!");
            }

            var songToModify = this.songData.All()
                .FirstOrDefault(s => s.SongId == id);

            if (songToModify == null)
            {
                return this.BadRequest(string.Format("Song with id {0} not found!", id));
            }

            songToModify.Title = songInfo.Title;
            songToModify.Year = songInfo.Year;
            songToModify.Genre = this.genreData.All().FirstOrDefault(g => g.Name == songInfo.Genre);
            songToModify.Artist = this.artistData.All().FirstOrDefault(a => a.Name == songInfo.Artist);

            this.songData.SaveChanges();
            return this.Ok("Song modified!");
        }
        public IHttpActionResult Put(int id, SongRequestModel model)
        {
            var songToUpdate = this.songs
                .All()
                .FirstOrDefault(c => c.Id == id);

            if (songToUpdate == null)
            {
                return this.NotFound();
            }

            if (!this.ModelState.IsValid || model == null)
            {
                return this.BadRequest(this.ModelState);
            }

            var albumExists = this.albums
                .All()
                .Any(a => a.Id == model.AlbumId);

            var artistExist = this.artists
                .All()
                .Any(a => a.Id == model.ArtistId);

            if (!(albumExists && artistExist))
            {
                return this.BadRequest("Invalid albumID or artistID");
            }

            songToUpdate.Title = model.Title;
            songToUpdate.Genre = model.Genre;
            songToUpdate.PublishYear = model.PublishYear;
            songToUpdate.ArtistId = model.ArtistId;
            songToUpdate.AlbumId = model.AlbumId;

            this.songs.SaveChanges();
            return this.Ok("The song was updated successfully");
        }