public ActionResult Edit(int pId, string inputTitle, int inputMetal, int inputRock, int inputPop, int inputJazz)
        {
            //genrePercentage e Dictionary => ako го сменим с List<string>, трябва да edit-нем EditPlaylist() в PlaylistService
            var genres = new Dictionary <string, int>();

            genres.Add("metal", inputMetal);
            genres.Add("rock", inputRock);
            genres.Add("pop", inputPop);
            genres.Add("jazz", inputJazz);

            var editedPlaylist = new EditPlaylistDTO()
            {
                Id              = pId,
                Title           = inputTitle,
                GenrePercentage = genres
            };

            var result = this.service.EditPlaylistAsync(editedPlaylist).Result;

            if (result == false)
            {
                return(RedirectToAction("Details", new { id = pId, err = TempData["Error"] = "Playlist not edited" }));
            }
            return(RedirectToAction("Details", new { id = pId, msg = TempData["Msg"] = "Playlist edited" }));
        }
Example #2
0
        public async Task <PlaylistDTO> EditPlaylist(EditPlaylistDTO editPlaylistDTO)
        {
            if (editPlaylistDTO.Id == null)
            {
                throw new ArgumentNullException();
            }

            var playlist = await _appDbContext.Playlists
                           .Include(t => t.TrackPlaylists)
                           .ThenInclude(t => t.Track)
                           .Where(p => p.IsDeleted == false || editPlaylistDTO.Revive == true)
                           .FirstOrDefaultAsync(p => p.Id == editPlaylistDTO.Id);

            if (playlist == null)
            {
                throw new ArgumentNullException();
            }
            if (editPlaylistDTO.Revive == true)
            {
                playlist.IsDeleted = false;
            }
            playlist.Title = editPlaylistDTO.Title;
            _appDbContext.Update(playlist);
            await _appDbContext.SaveChangesAsync();

            return(_mapper.Map <PlaylistDTO>(playlist));
        }
        public IActionResult UpdatePlaylist(int id, [FromBody] EditPlaylistDTO model)
        {
            if (id < 1 || model == null)
            {
                return(BadRequest());
            }

            var userId = int.Parse(userManager.GetUserId(HttpContext.User));

            var playlist = new EditPlaylistDTO
            {
                Id              = id,
                Title           = model.Title,
                GenrePercentage = model.GenrePercentage,
                UserId          = userId
            };

            var result = this.playlistService.EditPlaylistAsync(playlist).Result;

            if (result == false)
            {
                return(BadRequest());
            }

            return(Ok());
        }
Example #4
0
        public async Task Throw_If_NoPlaylistsExist()
        {
            //Arrange
            var options = Utils.GetOptions(nameof(Throw_If_NoPlaylistsExist));

            var editPlaylistDTO = new EditPlaylistDTO
            {
                Id              = 7,
                Title           = "Home and back",
                GenrePercentage = new Dictionary <string, int>()
                {
                    {
                        "rock", 0
                    },
                    {
                        "metal", 0
                    },
                    {
                        "pop", 100
                    },
                    {
                        "jazz", 0
                    }
                },
                UserId = 2
            };

            var dateTimeProviderMock = new Mock <IDateTimeProvider>();
            var mockImageService     = new Mock <IPixaBayImageService>();

            //Act & Assert
            using (var assertContext = new RidePalDbContext(options))
            {
                var sut = new PlaylistService(assertContext, dateTimeProviderMock.Object, mockImageService.Object);

                await Assert.ThrowsExceptionAsync <ArgumentNullException>(() => sut.EditPlaylistAsync(editPlaylistDTO));
            }
        }
Example #5
0
        /// <summary>
        /// Edits a playlist's title and/or genres by provided user's input
        /// </summary>
        /// <param name="editPlaylistDTO">DTO of the playlist with the new data</param>
        /// <returns>DTO of the edited playlist</returns>
        public async Task <bool> EditPlaylistAsync(EditPlaylistDTO editPlaylistDTO)
        {
            if (editPlaylistDTO == null)
            {
                throw new ArgumentNullException("No playlist data provided.");
            }

            var playlist = await this.context.Playlists
                           .FirstOrDefaultAsync(playlist => playlist.Id == editPlaylistDTO.Id)
                           ?? throw new ArgumentNullException("Playlist not found.");

            var genresToAdd = editPlaylistDTO.GenrePercentage.Where(g => g.Value > 0).Select(g => g.Key).ToList();

            var allGenres = await this.context.Genres.ToListAsync();

            var playlistGenreEntries = await this.context.PlaylistGenres
                                       .Include(plg => plg.Genre)
                                       .Where(plg => plg.PlaylistId == editPlaylistDTO.Id)
                                       .ToListAsync();


            foreach (var genre in playlistGenreEntries)
            {
                if (genresToAdd.FirstOrDefault(g => g == genre.Genre.Name) != null)
                {
                    if (genre.IsDeleted == true)
                    {
                        genre.IsDeleted = false;
                    }
                }
                else
                {
                    genre.IsDeleted = true;
                }
            }

            List <PlaylistGenre> newEntries = new List <PlaylistGenre>();

            foreach (var item in genresToAdd)
            {
                if (!playlistGenreEntries.Select(pge => pge.Genre.Name).Contains(item))
                {
                    var genreId = allGenres.FirstOrDefault(g => g.Name == item).Id;
                    newEntries.Add(new PlaylistGenre(genreId, editPlaylistDTO.Id));
                }
            }

            if (editPlaylistDTO.Title != null)
            {
                playlist.Title = editPlaylistDTO.Title;
            }
            if (genresToAdd != null)
            {
                playlist.GenresCount = genresToAdd.Count();
            }
            playlist.ModifiedOn = this.dateTimeProvider.GetDateTime();
            await this.context.AddRangeAsync(newEntries);

            await this.context.SaveChangesAsync();

            var playlistFromDB = this.context.Playlists
                                 .Include(p => p.Genres)
                                 .FirstOrDefaultAsync(playlist => playlist.Id == editPlaylistDTO.Id).Result
                                 ?? throw new ArgumentNullException("Playlist from database not found.");

            if (editPlaylistDTO.Title != null && playlistFromDB.Title != editPlaylistDTO.Title)
            {
                return(false);
            }
            var playlistFromDbGenreNames = await GetPlaylistGenresAsStringAsync(playlist.Id);

            foreach (var gen in genresToAdd)
            {
                if (!playlistFromDbGenreNames.Contains(gen))
                {
                    return(false);
                }
            }

            return(true);
        }
Example #6
0
        public async Task ReturnTrue_WhenParamsAreValid()
        {
            // Arrange
            var options = Utils.GetOptions(nameof(ReturnTrue_WhenParamsAreValid));

            Playlist firstPlaylist = new Playlist
            {
                Id               = 5,
                Title            = "Home",
                PlaylistPlaytime = 5524,
                UserId           = 2,
                Rank             = 552348,
                IsDeleted        = false,
            };

            Playlist secondPlaylist = new Playlist
            {
                Id               = 6,
                Title            = "Metal",
                PlaylistPlaytime = 5024,
                UserId           = 2,
                Rank             = 490258,
                IsDeleted        = false
            };

            var editPlaylistDTO = new EditPlaylistDTO
            {
                Id              = 5,
                Title           = "Home and back",
                GenrePercentage = new Dictionary <string, int>()
                {
                    {
                        "rock", 0
                    },
                    {
                        "metal", 0
                    },
                    {
                        "pop", 100
                    },
                    {
                        "jazz", 0
                    }
                },
                UserId = 2
            };

            Genre rock = new Genre
            {
                Id   = 1,
                Name = "rock"
            };

            Genre metal = new Genre
            {
                Id   = 2,
                Name = "metal"
            };

            Genre pop = new Genre
            {
                Id   = 3,
                Name = "pop"
            };

            Genre jazz = new Genre
            {
                Id   = 4,
                Name = "jazz"
            };

            var firstPlaylistGenre  = new PlaylistGenre(1, 5);
            var secondPlaylistGenre = new PlaylistGenre(2, 5);

            var updatedPlaylistDTO = new PlaylistDTO
            {
                Id               = 5,
                Title            = "Home and back",
                PlaylistPlaytime = 5524,
                UserId           = 2,
                Rank             = 552348,
                GenresCount      = 1
            };

            var dateTimeProviderMock = new Mock <IDateTimeProvider>();
            var mockImageService     = new Mock <IPixaBayImageService>();

            using (var arrangeContext = new RidePalDbContext(options))
            {
                arrangeContext.Genres.Add(metal);
                arrangeContext.Genres.Add(rock);
                arrangeContext.Genres.Add(pop);
                arrangeContext.Genres.Add(jazz);
                arrangeContext.Playlists.Add(firstPlaylist);
                arrangeContext.Playlists.Add(secondPlaylist);
                arrangeContext.PlaylistGenres.Add(firstPlaylistGenre);
                arrangeContext.PlaylistGenres.Add(secondPlaylistGenre);
                arrangeContext.SaveChanges();
            }

            using (var assertContext = new RidePalDbContext(options))
            {
                var sut = new PlaylistService(assertContext, dateTimeProviderMock.Object, mockImageService.Object);

                // Act
                var result = await sut.EditPlaylistAsync(editPlaylistDTO);

                var updatedPlaylistFromDb = await sut.GetPlaylistByIdAsync(5);

                //Assert
                Assert.IsTrue(result);
                Assert.AreEqual(updatedPlaylistDTO.Id, updatedPlaylistFromDb.Id);
                Assert.AreEqual(updatedPlaylistDTO.Title, updatedPlaylistFromDb.Title);
                Assert.AreEqual(updatedPlaylistDTO.GenresCount, updatedPlaylistFromDb.GenresCount);
            }
        }