Пример #1
0
        private async void btnGenerateReport_Click(object sender, EventArgs e)
        {
            var idObj = cmbArtists.SelectedValue;

            if (int.TryParse(idObj.ToString(), out int id))
            {
                if (id == 0)
                {
                    MessageBox.Show("You must select an artist!");
                    return;
                }
                ArtistReportingModel artistReportingModel = await Helper.GenerateReport(id);

                reportBindingSource.DataSource = artistReportingModel;
                reportViewer.RefreshReport();
            }
        }
        public static async Task <ArtistReportingModel> GenerateReport(int artistId)
        {
            ArtistReportingModel thisReportingModel = new ArtistReportingModel();
            var thisArtist = await _artistService.GetById <Artist>(artistId);

            thisReportingModel.ArtistName = thisArtist.ArtistName;
            var allGenres = await _genreService.Get <List <Genre> >(null);

            var allArtistGenres = await _artistGenreService.Get <List <ArtistGenre> >(
                new ArtistGenreSearchRequest()
            {
                ArtistId = artistId
            });

            string genresStr = "";

            foreach (var x in allArtistGenres)
            {
                genresStr += allGenres.Where(a => a.GenreId == x.GenreId).Select(a => a.GenreName).FirstOrDefault();
                if (x != allArtistGenres.ElementAt(allArtistGenres.Count - 1))
                {
                    genresStr += ", ";
                }
            }
            thisReportingModel.ArtistGenresInString = genresStr;
            var albumsByArtist = await _albumService.Get <List <Album> >(new AlbumSearchRequest()
            {
                ArtistId = artistId
            });

            int albumSumLikes       = 0;
            int albumNumberFeatured = 0;
            int albumListedNumbers  = 0;
            int reviewsNumber       = 0;
            //album related queries
            List <Track> allTracksFromArtist = new List <Track>();
            List <Tuple <string, int> > AlbumNamePlusViews = new List <Tuple <string, int> >();

            foreach (var item in albumsByArtist)
            {
                var albumLikes = await _userAlbumVoteService.Get <List <UserAlbumVote> >(new UserAlbumVoteSearchRequest()
                {
                    AlbumId = item.AlbumId, Liked = true
                });

                albumSumLikes += albumLikes.Count;
                var tracksFromAlbum = await _trackService.Get <List <Track> >(new TrackSearchRequest()
                {
                    AlbumId = item.AlbumId
                });

                albumNumberFeatured += await NumberOfRecommendedAlbumTimes(item.AlbumId);

                AlbumNamePlusViews.Add(new Tuple <string, int>(item.AlbumName, (int)tracksFromAlbum.Sum(a => a.TrackViews)));
                allTracksFromArtist.AddRange(tracksFromAlbum);
                var inAlbumLists = await _albumListAlbum.Get <List <AlbumListAlbum> >(new AlbumListAlbumSearchRequest()
                {
                    AlbumId = item.AlbumId
                });

                albumListedNumbers += inAlbumLists.Count;
                var reviews = await _reviewService.Get <List <Review> >(new ReviewSearchRequest()
                {
                    AlbumId = item.AlbumId
                });

                reviewsNumber += reviews.Count;
            }
            AlbumNamePlusViews.Sort((x, y) => y.Item2.CompareTo(x.Item2));
            if (AlbumNamePlusViews.Count != 0)
            {
                thisReportingModel.MostPopularAlbumByViews = AlbumNamePlusViews.First().Item1;
            }
            thisReportingModel.AlbumListedNumber            = albumListedNumbers.ToString();
            thisReportingModel.ArtistAlbumsCombinedLikes    = albumSumLikes.ToString();
            thisReportingModel.AlbumsTimesFeaturedOnProfile = albumNumberFeatured.ToString();
            thisReportingModel.ReviewNumberCombined         = reviewsNumber.ToString();
            if (albumsByArtist.Count != 0)
            {
                thisReportingModel.BestRatedAlbum = albumsByArtist.OrderByDescending(a => a.AlbumGeneratedRating).First().AlbumName;
            }
            //track related queries
            int tracksLikes       = 0;
            int tracklistedNumber = 0;
            List <Tuple <string, int> > TrackNamePlusLikes = new List <Tuple <string, int> >();

            foreach (var item in allTracksFromArtist)
            {
                var likesForTrack = await _userTrackVote.Get <List <UserTrackVote> >(new UserTrackVoteSearchRequest()
                {
                    TrackId = item.TrackId, Liked = true
                });

                tracksLikes += likesForTrack.Count;
                TrackNamePlusLikes.Add(new Tuple <string, int>(item.TrackName, likesForTrack.Count));
                var tracklistedNumberTrack = await _tracklistTrack.Get <List <TracklistTrack> >(new TracklistTrackSearchRequest()
                {
                    TrackId = item.TrackId
                });

                tracklistedNumber += tracklistedNumberTrack.Count;
            }
            TrackNamePlusLikes.Sort((x, y) => y.Item2.CompareTo(x.Item2));
            if (TrackNamePlusLikes.Count != 0)
            {
                thisReportingModel.MostLikedTrack = TrackNamePlusLikes.First().Item1;
            }
            thisReportingModel.TracksCombinedLikes = tracksLikes.ToString();
            thisReportingModel.TracklistedNumber   = tracklistedNumber.ToString();
            if (allTracksFromArtist.Count != 0)
            {
                thisReportingModel.MostViewedTrack = allTracksFromArtist.OrderByDescending(a => a.TrackViews).First().TrackName;
            }
            thisReportingModel.CombinedViews = ((int)allTracksFromArtist.Sum(a => a.TrackViews)).ToString();
            thisReportingModel.ArtistTimesFeaturedOnProfile = (await NumberOfRecommendedArtistTimes(artistId)).ToString();
            var followers = await _userFollowsArtist.Get <List <UserFollowsArtist> >(new UserFollowsArtistSearchRequest()
            {
                ArtistId = artistId
            });

            thisReportingModel.ArtistFollowersNumber = followers.Count.ToString();
            double rating = (double)albumsByArtist.Sum(a => a.AlbumGeneratedRating);

            rating /= albumsByArtist.Count;
            rating *= 20;
            string ratingStr = rating.ToString("0.0");

            thisReportingModel.ArtistCombinedRatingPercent = ratingStr;
            return(thisReportingModel);
        }