From 06cdb351ecd62b48bc2b4fe3fafe3092e47ae70d Mon Sep 17 00:00:00 2001 From: "josephine.vetu" Date: Thu, 2 Apr 2026 16:24:17 +0200 Subject: [PATCH] =?UTF-8?q?#124=20Pagination=20faite=20pour=20la=20page=20?= =?UTF-8?q?d'accueil,=20ordonn=C3=A9e=20par=20date=20de=20cr=C3=A9ation=20?= =?UTF-8?q?puis=20du=20libelle.=20D=C3=A9but=20de=20pagination=20pour=20le?= =?UTF-8?q?s=20artistes.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IArtisteRepository.cs | 8 ++++++ Webzine.Repository/DbArtisteRepository.cs | 26 +++++++++++++++++++ Webzine.Repository/DbTitreRepository.cs | 7 +++-- Webzine.Repository/LocalArtisteRepository.cs | 12 +++++++++ Webzine.Repository/LocalTitreRepository.cs | 1 + .../Controllers/AccueilController.cs | 18 +++++++------ .../Accueil/AccueilIndexViewModel.cs | 4 +-- .../Views/Accueil/Index.cshtml | 8 +++--- 8 files changed, 67 insertions(+), 17 deletions(-) diff --git a/Webzine.Repository.Contracts/IArtisteRepository.cs b/Webzine.Repository.Contracts/IArtisteRepository.cs index 1985ddc..b480816 100644 --- a/Webzine.Repository.Contracts/IArtisteRepository.cs +++ b/Webzine.Repository.Contracts/IArtisteRepository.cs @@ -39,6 +39,14 @@ namespace Webzine.Repository.Contracts /// Retourne une collection d'artistes. IEnumerable FindAll(); + /// + /// Récupère une liste d'artistes pour une page spécifique, en fonction du numéro de page et de la taille de la page. + /// + /// Le numéro de la page à récupérer. + /// La taille de chaque page. + /// Une liste d'artistes pour la page demandée. + IEnumerable FindArtistes(int pageNumber, int pageSize); + /// /// Met à jour les informations d'un artiste existant dans la collection. /// diff --git a/Webzine.Repository/DbArtisteRepository.cs b/Webzine.Repository/DbArtisteRepository.cs index 2c50cdc..18068bc 100644 --- a/Webzine.Repository/DbArtisteRepository.cs +++ b/Webzine.Repository/DbArtisteRepository.cs @@ -200,5 +200,31 @@ namespace Webzine.Repository throw; } } + + /// + /// Permet de paginer les artistes en fonction du numéro de page et de la taille de page spécifiés. + /// + /// Le numéro de la page à récupérer. + /// La taille de chaque page. + /// Une liste d'artistes pour la page demandée. + public IEnumerable FindArtistes(int pageNumber, int pageSize) + { + try + { + var artistes = this.context.Artistes + .AsNoTracking() + .Include(t => t.Titres) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToList(); + this.logger.LogDebug("Page {PageNumber} d'artistes récupérée avec {PageSize} artistes par page.", pageNumber, pageSize); + return artistes; + } + catch (Exception ex) + { + this.logger.LogError(ex, "Erreur lors de la pagination des artistes. Page: {PageNumber}, Taille: {PageSize}", pageNumber, pageSize); + throw; + } + } } } \ No newline at end of file diff --git a/Webzine.Repository/DbTitreRepository.cs b/Webzine.Repository/DbTitreRepository.cs index 5ae3c9a..d75cb16 100644 --- a/Webzine.Repository/DbTitreRepository.cs +++ b/Webzine.Repository/DbTitreRepository.cs @@ -99,15 +99,14 @@ public class DbTitreRepository : ITitreRepository this.logger.LogDebug("Recherche des titres avec offset: {Offset}, limit: {Limit}", offset, limit); var titres = this.context.Titres + .OrderByDescending(t => t.DateCreation) + .ThenBy(t => t.Libelle) .Include(t => t.Artiste) .Include(t => t.Styles) - .OrderBy(t => t.Libelle) .Skip(offset) .Take(limit) - .AsNoTracking() - .ToList(); + .AsNoTracking(); - this.logger.LogDebug("{Count} titres trouvés", titres.Count); return titres; } catch (Exception ex) diff --git a/Webzine.Repository/LocalArtisteRepository.cs b/Webzine.Repository/LocalArtisteRepository.cs index 1aa7137..cc6f25d 100644 --- a/Webzine.Repository/LocalArtisteRepository.cs +++ b/Webzine.Repository/LocalArtisteRepository.cs @@ -106,5 +106,17 @@ namespace Webzine.Repository { return this.dataStore.Artistes.Count(predicate); } + + /// + /// Le numéro de la page à récupérer. + /// La taille de chaque page. + /// Une liste d'artistes pour la page demandée. + public IEnumerable FindArtistes(int pageNumber, int pageSize) + { + return this.dataStore.Artistes + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToList(); + } } } \ No newline at end of file diff --git a/Webzine.Repository/LocalTitreRepository.cs b/Webzine.Repository/LocalTitreRepository.cs index b414a62..291e196 100644 --- a/Webzine.Repository/LocalTitreRepository.cs +++ b/Webzine.Repository/LocalTitreRepository.cs @@ -49,6 +49,7 @@ public class LocalTitreRepository : ITitreRepository { return this.dataStore.Titres .OrderByDescending(t => t.DateCreation) + .ThenBy(t => t.Libelle) .Skip(offset) .Take(limit); } diff --git a/Webzine.WebApplication/Controllers/AccueilController.cs b/Webzine.WebApplication/Controllers/AccueilController.cs index 4d15d99..86ee384 100644 --- a/Webzine.WebApplication/Controllers/AccueilController.cs +++ b/Webzine.WebApplication/Controllers/AccueilController.cs @@ -21,6 +21,7 @@ /// /// Service de journalisation injecté pour enregistrer les événements et les erreurs. /// Service d'injection de configuration pour accéder aux paramètres de l'application. + /// Service d'injection du dépôt de titres pour accéder aux données des titres. public AccueilController( ILogger logger, IConfiguration configuration, @@ -36,24 +37,25 @@ /// /// Affiche la page d'accueil du webzine, présentant les derniers titres et les titres les plus populaires. /// + /// Le numéro de page pour la pagination des titres (par défaut à 0). /// La vue Index avec le ViewModel contenant les listes de titres à afficher. - public IActionResult Index() + public IActionResult Index(int page = 0) { this.logger.LogInformation("Arrivée sur la page d'accueil"); var derniereChronique = this.configuration.GetValue("Webzine:NombreDerniereChronique"); var nbTopTitres = this.configuration.GetValue("Webzine:NombreDeTopTitres"); - var titres = this.titreRepository.FindAll(); + var titres_paginé = this.titreRepository.FindTitres(page * derniereChronique, derniereChronique); + var top_titres = this.titreRepository.FindAll() + .OrderByDescending(t => t.NbLikes) + .Take(nbTopTitres); var vm = new AccueilIndexViewModel { - DerniersTitres = titres.Take(derniereChronique).ToList(), - - TopTitres = titres - .OrderByDescending(t => t.NbLikes) - .Take(nbTopTitres) - .ToList(), + DerniersTitres = titres_paginé.ToList(), + TopTitres = top_titres.ToList(), + Page = page, }; return this.View(vm); diff --git a/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs b/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs index 3803f4a..dbf66ff 100644 --- a/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs +++ b/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs @@ -23,8 +23,8 @@ // public int NombreDeTitre { get; set; } = 0; /// - /// Obtient ou définit le nombre de titre paginé. + /// Obtient ou définit le numéro de page pour la pagination des titres affichés sur la page d'accueil. /// - // public int Pagination { get; set; } = 0; + public int Page { get; set; } = 0; } } \ No newline at end of file diff --git a/Webzine.WebApplication/Views/Accueil/Index.cshtml b/Webzine.WebApplication/Views/Accueil/Index.cshtml index defe1e8..7160add 100644 --- a/Webzine.WebApplication/Views/Accueil/Index.cshtml +++ b/Webzine.WebApplication/Views/Accueil/Index.cshtml @@ -74,9 +74,11 @@ }
- + + Titres plus anciens >> + +