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); }