/// <summary>
        /// Creates a playlist
        /// </summary>
        /// <param name="playlistDTO">Playlist to create</param>
        public async Task <Playlist> Create(PlaylistDTO playlistDTO)
        {
            if (playlistDTO == null)
            {
                throw new ArgumentNullException("Null Playlist");
            }
            if (playlistDTO.Title.Length > 50)
            {
                throw new ArgumentOutOfRangeException("Playlist's title needs to be shorter than 50 characters.");
            }

            var existingPlaylist = await _context.Playlists.FirstOrDefaultAsync(x => x.Title == playlistDTO.Title);

            if (existingPlaylist != null)
            {
                throw new ArgumentException($"Playlist with title '{playlistDTO.Title}' already exists.");
            }

            Playlist playlistToAdd = playlistDTO.ToEntity();

            var playlist = await _context.Playlists.AddAsync(playlistToAdd);

            Log.Logger.Information($"Playlist with title '{playlist.Entity.Title}' has been created.");

            await _context.SaveChangesAsync();

            return(playlist.Entity);
        }
Exemple #2
0
        /// <summary>
        /// Ban user by ID
        /// </summary>
        /// <param name="id">User's ID</param>
        /// <returns>Returns true if banning was successful</returns>
        public async Task <bool> BanUserById(string id)
        {
            var userToBan = await _context.Users.FirstOrDefaultAsync(x => x.Id == id);

            if (userToBan == null)
            {
                return(false);
            }

            userToBan.LockoutEnabled = true;
            await _context.SaveChangesAsync();

            return(true);
        }
        public async Task DeleteThrowsWhenIdAlreadyDeleted()
        {
            var options = Utils.GetOptions(nameof(DeleteThrowsWhenIdAlreadyDeleted));

            var playlist = new PlaylistDTO
            {
                Title    = "In Utero",
                Duration = 1600,
                //PixabayImage = "https://en.wikipedia.org/wiki/In_Utero_(album)#/media/File:In_Utero_(Nirvana)_album_cover.jpg",
            };

            using (var arrangeContext = new PGDbContext(options))
            {
                var sut = new PlaylistService(arrangeContext);
                await sut.Create(playlist);

                await arrangeContext.SaveChangesAsync();
            }

            using (var assertContext = new PGDbContext(options))
            {
                var sut = new PlaylistService(assertContext);

                await sut.Delete(1);

                await Assert.ThrowsExceptionAsync <ArgumentException>(() => sut.Delete(1));
            }
        }
        public async Task DeleteCorrectly()
        {
            var options = Utils.GetOptions(nameof(DeleteCorrectly));

            var playlist = new PlaylistDTO
            {
                Title    = "In Utero",
                Duration = 1600,
                //PixabayImage = "https://en.wikipedia.org/wiki/In_Utero_(album)#/media/File:In_Utero_(Nirvana)_album_cover.jpg",
            };

            using (var arrangeContext = new PGDbContext(options))
            {
                var sut = new PlaylistService(arrangeContext);
                await sut.Create(playlist);

                await arrangeContext.SaveChangesAsync();
            }

            using (var assertContext = new PGDbContext(options))
            {
                var sut = new PlaylistService(assertContext);
                await sut.Delete(1);

                var playlists = await sut.GetAllPlaylists();

                int playlistsCount = playlists.Count();

                Assert.AreEqual(0, playlistsCount);
            }
        }
Exemple #5
0
        public async Task CreateCorrectly()
        {
            var options = Utils.GetOptions(nameof(CreateCorrectly));

            var playlist = new PlaylistDTO
            {
                Title    = "In Utero",
                Duration = 1600,
                //PixabayImage = "https://en.wikipedia.org/wiki/In_Utero_(album)#/media/File:In_Utero_(Nirvana)_album_cover.jpg",
            };

            using (var arrangeContext = new PGDbContext(options))
            {
                var sut = new PlaylistService(arrangeContext);
                await sut.Create(playlist);

                await arrangeContext.SaveChangesAsync();
            }

            using (var assertContext = new PGDbContext(options))
            {
                var result = await assertContext.Playlists.FirstOrDefaultAsync(x => x.Title == playlist.Title);

                Assert.AreEqual(playlist.Title, result.Title);
                Assert.AreEqual(playlist.Duration, result.Duration);
                //Assert.AreEqual(playlist.PixabayImage, result.Picture);
            }
        }
        public async Task GetAllPlaylistsByUserCorrectly()
        {
            var options = Utils.GetOptions(nameof(GetAllPlaylistsByUserCorrectly));

            var nirvanaPlaylist = new PlaylistDTO
            {
                Title    = "In Utero",
                Duration = 1600,
                //PixabayImage = "https://en.wikipedia.org/wiki/In_Utero_(album)#/media/File:In_Utero_(Nirvana)_album_cover.jpg",
                UserId = "153a257-526504u",
            };

            var acdcPlaylist = new PlaylistDTO
            {
                Title    = "Back in Black",
                Duration = 2531,
                //PixabayImage = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/ACDC_Back_in_Black.png/220px-ACDC_Back_in_Black.png",
                UserId = "153a257-526504u",
            };

            var scorpionsPLaylist = new PlaylistDTO
            {
                Title    = "Lovedrive",
                Duration = 2190,
                //PixabayImage = "https://en.wikipedia.org/wiki/Lovedrive#/media/File:Scorpions-album-lovedrive.jpg",
                UserId = "68910y78a-89as1568",
            };

            using (var arrangeContext = new PGDbContext(options))
            {
                var sut = new PlaylistService(arrangeContext);

                await sut.Create(nirvanaPlaylist);

                await sut.Create(acdcPlaylist);

                await sut.Create(scorpionsPLaylist);

                await arrangeContext.SaveChangesAsync();
            }

            using (var assertContext = new PGDbContext(options))
            {
                var sut = new PlaylistService(assertContext);

                var firstUserPalylists = await sut.GetPlaylistsByUser("153a257-526504u");

                int firstUserPalylistsCount = firstUserPalylists.Count();

                var secondUserPalylists = await sut.GetPlaylistsByUser("68910y78a-89as1568");

                int secondUserPalylistsCount = secondUserPalylists.Count();

                Assert.AreEqual(2, firstUserPalylistsCount);
                Assert.AreEqual(1, secondUserPalylistsCount);
            }
        }
        /// <summary>
        /// Creates a new Genre
        /// </summary>
        /// <param name="genreDTO">Genre to create</param>
        public async Task <GenreDTO> Create(GenreDTO genreDTO)
        {
            if (genreDTO == null)
            {
                throw new ArgumentNullException("Null Genre");
            }
            if (genreDTO.Name.Length > 50)
            {
                throw new ArgumentOutOfRangeException("Genre's Name needs to be shorter than 50 characters.");
            }

            var existingGenre = await _context.Genres.FirstOrDefaultAsync(x => x.Name == genreDTO.Name);

            if (existingGenre != null)
            {
                throw new ArgumentException($"Genre with name '{genreDTO.Name}' already exists.");
            }

            var genre = _context.Genres.Add(genreDTO.ToEntity());
            await _context.SaveChangesAsync();

            return(genre.Entity.ToDTO());
        }
Exemple #8
0
        /// <summary>
        /// Creates an Artist
        /// </summary>
        /// <param name="artistDTO">Artist to create</param>
        public async Task <ArtistDTO> Create(ArtistDTO artistDTO)
        {
            if (artistDTO == null)
            {
                throw new ArgumentNullException("Null Artist");
            }
            if (artistDTO.Name.Length > 100)
            {
                throw new ArgumentOutOfRangeException("Artist's Name needs to be shorter than 100 characters.");
            }

            var existedArtist = await _context.Artists.FirstOrDefaultAsync(x => x.Name == artistDTO.Name);

            if (existedArtist != null)
            {
                throw new ArgumentException($"Artist with name '{artistDTO.Name}' already exists.");
            }

            var artist = await _context.Artists.AddAsync(artistDTO.ToEntity());

            await _context.SaveChangesAsync();

            return(artist.Entity.ToDTO());
        }
        public async Task <SongDTO> Create(SongDTO songDTO)
        {
            if (songDTO == null)
            {
                throw new ArgumentNullException("Null Song");
            }
            if (songDTO.Title.Length > 50)
            {
                throw new ArgumentOutOfRangeException("Song's title needs to be shorter than 50 characters.");
            }

            var existingSong = await _context.Songs.FirstOrDefaultAsync(x => x.Title == songDTO.Title);

            if (existingSong != null)
            {
                throw new ArgumentException($"Song with title '{songDTO.Title}' already exists.");
            }

            var song = await _context.Songs.AddAsync(songDTO.ToEntity());

            await _context.SaveChangesAsync();

            return(song.Entity.ToDTO());
        }
Exemple #10
0
        public async Task GetPlaylistByIdCorrectly()
        {
            var options = Utils.GetOptions(nameof(GetPlaylistByIdCorrectly));

            var nirvanaPlaylist = new PlaylistDTO
            {
                Title    = "In Utero",
                Duration = 1600,
                //PixabayImage = "https://en.wikipedia.org/wiki/In_Utero_(album)#/media/File:In_Utero_(Nirvana)_album_cover.jpg",
            };

            var acdcPlaylist = new PlaylistDTO
            {
                Title    = "Back in Black",
                Duration = 2531,
                //PixabayImage = "https://upload.wikimedia.org/wikipedia/commons/thumb/9/92/ACDC_Back_in_Black.png/220px-ACDC_Back_in_Black.png",
            };

            using (var arrangeContext = new PGDbContext(options))
            {
                var sut = new PlaylistService(arrangeContext);

                await sut.Create(nirvanaPlaylist);

                await sut.Create(acdcPlaylist);

                await arrangeContext.SaveChangesAsync();
            }

            using (var assertContext = new PGDbContext(options))
            {
                var sut = new PlaylistService(assertContext);

                var userPalylists = await sut.GetPlaylistById(1);

                Assert.AreEqual(nirvanaPlaylist.Title, userPalylists.Title);
                Assert.AreEqual(nirvanaPlaylist.Duration, userPalylists.Duration);
                Assert.AreEqual(nirvanaPlaylist.PixabayImage, userPalylists.PixabayImage);
            }
        }
Exemple #11
0
        public async Task GeneratePlaylistCorrectly()
        {
            var options = Utils.GetOptions(nameof(GeneratePlaylistCorrectly));

            int    timeForTrip      = 7200;
            string playlistTitle    = "Sofia - Sandanski";
            int    metalPercentagee = 25;
            int    rockPercentagee  = 25;
            int    popPercentagee   = 50;
            bool   topTracks        = true;
            bool   sameArtist       = true;
            User   user             = new User();

            var arrangeContext = new PGDbContext(options);

            var deezerService = new DeezerAPIService(arrangeContext);

            await deezerService.ExtractSongsFromPlaylists("pop");

            await deezerService.ExtractSongsFromPlaylists("rock");

            await deezerService.ExtractSongsFromPlaylists("metal");

            var sut = new PlaylistService(arrangeContext);

            await sut.GeneratePlaylist(timeForTrip, playlistTitle, metalPercentagee, rockPercentagee, popPercentagee, topTracks, sameArtist, user);

            await arrangeContext.SaveChangesAsync();

            var actual = arrangeContext.Playlists.FirstOrDefault(x => x.Id == 1);

            Assert.AreEqual(1, actual.Id);
            Assert.AreEqual(playlistTitle, actual.Title);
            Assert.AreEqual(user.Id, actual.UserId);
            Assert.IsTrue(actual.Duration < timeForTrip + 300);
            Assert.IsTrue(actual.Duration > timeForTrip - 300);
            Assert.IsTrue(actual.PlaylistsGenres.Count() == 3);
            Assert.IsTrue(actual.PlaylistsSongs.Count() != 0);
        }
        /// <summary>
        /// Extract all songs with preview "link".mp3 from all playlists where their title contains "Rock".
        /// Creates new Creator/Artist accordingly to the song's specifications.
        /// </summary>
        public async Task ExtractSongsFromPlaylists(string genreString)
        {
            genreString = genreString.ToLower();
            var dbGenreName = await _context.Genres.FirstOrDefaultAsync(x => x.Name == genreString);

            if (!(dbGenreName == null))
            {
                return;
            }

            var client = new HttpClient();

            using (var response = await client.GetAsync($"https://api.deezer.com/search/playlist?q={genreString}"))
            {
                var responseAsString = await response.Content.ReadAsStringAsync();

                var result = JsonConvert.DeserializeObject <QueryPlaylistsAPI>(responseAsString);

                var expectedGenre = _context.Genres.FirstOrDefault(x => x.Name.ToLower().Equals(genreString));

                if (expectedGenre == null)
                {
                    await _context.Genres.AddAsync(new Genre()
                    {
                        Name = genreString
                    });

                    await _context.SaveChangesAsync();

                    expectedGenre = await _context.Genres.FirstOrDefaultAsync(a => a.Name.ToLower().Equals(genreString));
                }

                foreach (var playlist in result.Data)
                {
                    using (var response2 = await client.GetAsync(playlist.Tracklist))
                    {
                        var responseAsString2 = await response2.Content.ReadAsStringAsync();

                        var result2 = JsonConvert.DeserializeObject <PlaylistAPI>(responseAsString2);

                        foreach (var song in result2.Data)
                        {
                            if (song.Preview == null || song.Preview.Length < 5)
                            {
                                continue;
                            }

                            var expectedArtist = await _context.Artists.FirstOrDefaultAsync(x => x.Name == song.Artist.Name);

                            if (expectedArtist == null)
                            {
                                var addedArtist = await _context.Artists.AddAsync(new Artist()
                                {
                                    Name      = song.Artist.Name,
                                    Tracklist = song.Artist.Tracklist,
                                    Type      = song.Artist.Type
                                });

                                expectedArtist = addedArtist.Entity;

                                await _context.SaveChangesAsync();
                            }

                            var expectedAlbum = await _context.Albums.FirstOrDefaultAsync(x => x.Title == song.Album.Title);

                            if (expectedAlbum == null)
                            {
                                var addedAlbum = await _context.Albums.AddAsync(new Album()
                                {
                                    Title     = song.Album.Title,
                                    Tracklist = song.Album.Tracklist,
                                });

                                expectedAlbum = addedAlbum.Entity;

                                await _context.SaveChangesAsync();
                            }

                            var isSongNull = await _context.Songs.FirstOrDefaultAsync(x => x.Title == song.Title);

                            if (isSongNull == null)
                            {
                                var songToAdd = new Song()
                                {
                                    Title    = song.Title,
                                    DeezerID = song.Id,
                                    Duration = song.Duration,
                                    Rank     = song.Rank,
                                    Preview  = song.Preview,
                                    Link     = song.Link,
                                    GenreId  = expectedGenre.Id,
                                    ArtistId = expectedArtist.Id,
                                    AlbumId  = expectedAlbum.Id
                                };
                                await _context.Songs.AddAsync(songToAdd);

                                expectedAlbum.Songs.Add(songToAdd);
                            }
                        }

                        await _context.SaveChangesAsync();
                    }

                    System.Threading.Thread.Sleep(150);
                }
            }
        }