public bool AddToCrate(int id)
        {
            var user   = ctx.Users.FirstOrDefault(u => u.Id == _userId.ToString());
            var artist = ctx.Artists.Find(id);
            //add if for duplicates
            UserArtist userArtist = new UserArtist {
                Artist = artist
            };

            user.UserArtists.Add(userArtist);

            ctx.SaveChanges();

            user.UserAlbums.AddRange(artist.Albums.Select(a => new UserAlbum {
                AlbumID = a.AlbumID, UserArtistID = userArtist.UserArtistID
            }));

            ctx.SaveChanges();

            int songCount = 0;

            foreach (var album in artist.Albums)
            {
                var userAlbum = ctx.UserAlbums.FirstOrDefault(j => j.AlbumID == album.AlbumID && j.UserID == user.Id);
                user.UserSongs.AddRange(album.Songs.Select(a => new UserSong {
                    SongID = a.SongID, UserAlbumID = userAlbum.UserAlbumID
                }));
                songCount += album.Songs.Count();
            }

            return(ctx.SaveChanges() == songCount);
        }
        public void DeleteUserArtist(UserArtist userArtist)
        {
            var toRemove = _context.UserArtist
                           .Where(x => x.ArtistID == userArtist.ArtistID &&
                                  x.UserUID == userArtist.UserUID)
                           .FirstOrDefault();

            _context.UserArtist.Remove(toRemove);
            _context.SaveChanges();
        }
 public void Insert(UserArtist userArtist)
 {
     DbOperations.ExecuteCommand(_context.connectionString, "dbo.UsersArtists_Insert", userArtist.GenerateSqlParametersFromModel().ToArray());
 }
        // POST: Users/Create
        // To protect from overposting attacks, enable the specific properties you want to bind to, for
        // more details, see http://go.microsoft.com/fwlink/?LinkId=317598.


        public async Task <IActionResult> Build()
        {
            var spotify = await _spotifyClientBuilder.CreateClient();

            if (spotify == null)
            {
                return(RedirectToAction("Index", "Home"));
            }

            PrivateUser me = await spotify.UserProfile.Current();

            _user.UserId   = me.Id;
            _user.UserName = me.DisplayName;
            if (me.Images.Any())
            {
                _user.UserProfilePicture = me.Images[0].Url;
            }
            else
            {
                _user.UserProfilePicture = "";
            }



            var user = await _context.Users
                       .FirstOrDefaultAsync(m => m.UserId == me.Id);

            var userNum = _context.Users.Count() + 1;

            _user.UserCode = GenerateUserCode(me.Id) + userNum.ToString();

            if (user == null)
            {
                PersonalizationTopRequest request = new PersonalizationTopRequest();
                request.Limit = 50;

                var tracks = await spotify.Personalization.GetTopTracks(request);

                List <FullTrack> .Enumerator tracksEnumerator = tracks.Items.GetEnumerator();



                var trackNumbers = tracks.Items.Count;
                for (int i = 0; i < trackNumbers; i++)
                {
                    tracksEnumerator.MoveNext();

                    if (tracksEnumerator.Current != null)
                    {
                        //creating a new track and userTracks to map tracks and users
                        Track     newTrack   = new Track();
                        UserTrack userTracks = new UserTrack();

                        //initializing tracks one bu one
                        newTrack.TrackId   = tracksEnumerator.Current.Id;
                        newTrack.TrackName = tracksEnumerator.Current.Name;
                        if (tracksEnumerator.Current.Album.Images.Any())
                        {
                            newTrack.TrackAlbumPicture = tracksEnumerator.Current.Album.Images[0].Url;
                        }
                        else
                        {
                            newTrack.TrackAlbumPicture = "";
                        }
                        newTrack.TrackAlbumPicture = tracksEnumerator.Current.Album.Images[0].Url;

                        //adding track and user to UserTracks model initializing userTracks
                        userTracks.Track = newTrack;
                        userTracks.User  = _user;

                        //adding userTracks to User model
                        _user.UsersTracks.Add(userTracks);

                        //adding userTracks to Track model
                        newTrack.UsersTracks.Add(userTracks);
                        //check if artist exists in db
                        var trackExists = _context.Tracks.Count(a => a.TrackId == newTrack.TrackId);
                        if (trackExists == 0)
                        {
                            await _context.Tracks.AddAsync(newTrack);
                        }
                        else
                        {
                            _context.Tracks.Update(newTrack);
                        }
                    }
                }

                //now put top artist to database

                var artists = await spotify.Personalization.GetTopArtists(request);

                List <FullArtist> .Enumerator artistsEnumerator = artists.Items.GetEnumerator();

                var artistCount = artists.Items.Count;
                for (int i = 0; i < artistCount; i++)
                {
                    artistsEnumerator.MoveNext();

                    if (artistsEnumerator.Current != null)
                    {
                        //creating a new track and userTracks to map tracks and users
                        Artist     newArtist  = new Artist();
                        UserArtist userArtist = new UserArtist();

                        //initializing tracks one bu one
                        newArtist.ArtistId   = artistsEnumerator.Current.Id;
                        newArtist.ArtistName = artistsEnumerator.Current.Name;

                        if (artistsEnumerator.Current.Images.Any())
                        {
                            newArtist.ArtistPicture = artistsEnumerator.Current.Images[0].Url;
                        }
                        else
                        {
                            newArtist.ArtistPicture = "";
                        }
                        //adding track and user to UserTracks model initializing userTracks
                        userArtist.Artist = newArtist;
                        userArtist.User   = _user;

                        //adding userTracks to User model
                        _user.UsersArtists.Add(userArtist);

                        //adding userTracks to Track model
                        newArtist.UsersArtists.Add(userArtist);

                        //check if artist exists in db
                        var artistExists = _context.Artists.Count(a => a.ArtistId == newArtist.ArtistId);
                        if (artistExists == 0)
                        {
                            await _context.Artists.AddAsync(newArtist);
                        }
                        else
                        {
                            _context.Artists.Update(newArtist);
                        }
                    }
                }

                await _context.Users.AddAsync(_user);

                await _context.SaveChangesAsync();

                return(RedirectToAction(actionName: "Home", "Users", new { id = _user.UserId }));
            }



            return(RedirectToAction(actionName: "Home", "Users", new { id = _user.UserId }));
        }
 public ActionResult DislikeArtist(UserArtist artist)
 {
     _userRepository.DeleteUserArtist(artist);
     return(Ok());
 }
 public ActionResult LikeArtist(UserArtist userArtist)
 {
     _userRepository.AddUserArtist(userArtist);
     return(Ok());
 }
 public void AddUserArtist(UserArtist userArtist)
 {
     _context.UserArtist.Add(userArtist);
     _context.SaveChanges();
 }