namespace Webzine.Business; using Webzine.Business.Contracts; using Webzine.Business.Contracts.Dto; using Webzine.Entity; using Webzine.Repository.Contracts; /// /// Implémentation de . /// Orchestre plusieurs appels aux repositories pour produire les statistiques du tableau de bord. /// public class DashboardService : IDashboardService { private readonly IArtisteRepository artisteRepository; private readonly ITitreRepository titreRepository; private readonly IStyleRepository styleRepository; /// /// Initializes a new instance of the class. /// /// Repository des artistes. /// Repository des titres. /// Repository des styles. public DashboardService( IArtisteRepository artisteRepository, ITitreRepository titreRepository, IStyleRepository styleRepository) { this.artisteRepository = artisteRepository; this.titreRepository = titreRepository; this.styleRepository = styleRepository; } /// public DashboardDTO GetDashboardData() { IEnumerable titres = this.titreRepository.FindAll(); Artiste? artisteLePlusChronique = titres .GroupBy(t => t.Artiste) .OrderByDescending(g => g.Count()) .FirstOrDefault() ?.Key; Artiste? albumLePlusChronique = titres .GroupBy(t => (t.Artiste, t.Album)) .GroupBy(g => g.Key.Artiste) .OrderByDescending(g => g.Count()) .FirstOrDefault() ?.Key; Titre? musiqueLaPlusJouee = titres .OrderByDescending(t => t.NbLectures) .FirstOrDefault(); return new DashboardDTO { NombreArtistes = this.artisteRepository.Count(), ArtisteLePlusChronique = artisteLePlusChronique.Nom, AlbumLePlusChronique = albumLePlusChronique.Nom, NombreBiographies = this.artisteRepository.Count(a => !string.IsNullOrEmpty(a.Biographie)), IdMusiqueLaPlusJouee = musiqueLaPlusJouee.IdTitre, MusiqueLaPlusJouee = musiqueLaPlusJouee.Libelle, NombreTitres = this.titreRepository.Count(), NombreGenres = this.styleRepository.Count(), NombreLectures = titres.Sum(t => t.NbLectures), NombreLikes = titres.Sum(t => t.NbLikes), }; } }