#124 Pagination faite pour la page d'accueil, ordonnée par date de création puis du libelle. Début de pagination pour les artistes.

This commit is contained in:
josephine.vetu
2026-04-02 16:24:17 +02:00
parent ae80c3e14e
commit 06cdb351ec
8 changed files with 67 additions and 17 deletions

View File

@@ -39,6 +39,14 @@ namespace Webzine.Repository.Contracts
/// <returns>Retourne une collection d'artistes.</returns> /// <returns>Retourne une collection d'artistes.</returns>
IEnumerable<Artiste> FindAll(); IEnumerable<Artiste> FindAll();
/// <summary>
/// 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.
/// </summary>
/// <param name="pageNumber">Le numéro de la page à récupérer.</param>
/// <param name="pageSize">La taille de chaque page.</param>
/// <returns>Une liste d'artistes pour la page demandée.</returns>
IEnumerable<Artiste> FindArtistes(int pageNumber, int pageSize);
/// <summary> /// <summary>
/// Met à jour les informations d'un artiste existant dans la collection. /// Met à jour les informations d'un artiste existant dans la collection.
/// </summary> /// </summary>

View File

@@ -200,5 +200,31 @@ namespace Webzine.Repository
throw; throw;
} }
} }
/// <summary>
/// Permet de paginer les artistes en fonction du numéro de page et de la taille de page spécifiés.
/// </summary>
/// <param name="pageNumber">Le numéro de la page à récupérer.</param>
/// <param name="pageSize">La taille de chaque page.</param>
/// <returns>Une liste d'artistes pour la page demandée.</returns>
public IEnumerable<Artiste> 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;
}
}
} }
} }

View File

@@ -99,15 +99,14 @@ public class DbTitreRepository : ITitreRepository
this.logger.LogDebug("Recherche des titres avec offset: {Offset}, limit: {Limit}", offset, limit); this.logger.LogDebug("Recherche des titres avec offset: {Offset}, limit: {Limit}", offset, limit);
var titres = this.context.Titres var titres = this.context.Titres
.OrderByDescending(t => t.DateCreation)
.ThenBy(t => t.Libelle)
.Include(t => t.Artiste) .Include(t => t.Artiste)
.Include(t => t.Styles) .Include(t => t.Styles)
.OrderBy(t => t.Libelle)
.Skip(offset) .Skip(offset)
.Take(limit) .Take(limit)
.AsNoTracking() .AsNoTracking();
.ToList();
this.logger.LogDebug("{Count} titres trouvés", titres.Count);
return titres; return titres;
} }
catch (Exception ex) catch (Exception ex)

View File

@@ -106,5 +106,17 @@ namespace Webzine.Repository
{ {
return this.dataStore.Artistes.Count(predicate); return this.dataStore.Artistes.Count(predicate);
} }
/// <inheritdoc/>
/// <param name="pageNumber">Le numéro de la page à récupérer.</param>
/// <param name="pageSize">La taille de chaque page.</param>
/// <returns>Une liste d'artistes pour la page demandée.</returns>
public IEnumerable<Artiste> FindArtistes(int pageNumber, int pageSize)
{
return this.dataStore.Artistes
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.ToList();
}
} }
} }

View File

@@ -49,6 +49,7 @@ public class LocalTitreRepository : ITitreRepository
{ {
return this.dataStore.Titres return this.dataStore.Titres
.OrderByDescending(t => t.DateCreation) .OrderByDescending(t => t.DateCreation)
.ThenBy(t => t.Libelle)
.Skip(offset) .Skip(offset)
.Take(limit); .Take(limit);
} }

View File

@@ -21,6 +21,7 @@
/// </summary> /// </summary>
/// <param name="logger">Service de journalisation injecté pour enregistrer les événements et les erreurs.</param> /// <param name="logger">Service de journalisation injecté pour enregistrer les événements et les erreurs.</param>
/// <param name="configuration">Service d'injection de configuration pour accéder aux paramètres de l'application.</param> /// <param name="configuration">Service d'injection de configuration pour accéder aux paramètres de l'application.</param>
/// <param name="titreRepository">Service d'injection du dépôt de titres pour accéder aux données des titres.</param>
public AccueilController( public AccueilController(
ILogger<AccueilController> logger, ILogger<AccueilController> logger,
IConfiguration configuration, IConfiguration configuration,
@@ -36,24 +37,25 @@
/// <summary> /// <summary>
/// Affiche la page d'accueil du webzine, présentant les derniers titres et les titres les plus populaires. /// Affiche la page d'accueil du webzine, présentant les derniers titres et les titres les plus populaires.
/// </summary> /// </summary>
/// <param name="page">Le numéro de page pour la pagination des titres (par défaut à 0).</param>
/// <returns>La vue Index avec le ViewModel contenant les listes de titres à afficher.</returns> /// <returns>La vue Index avec le ViewModel contenant les listes de titres à afficher.</returns>
public IActionResult Index() public IActionResult Index(int page = 0)
{ {
this.logger.LogInformation("Arrivée sur la page d'accueil"); this.logger.LogInformation("Arrivée sur la page d'accueil");
var derniereChronique = this.configuration.GetValue<int>("Webzine:NombreDerniereChronique"); var derniereChronique = this.configuration.GetValue<int>("Webzine:NombreDerniereChronique");
var nbTopTitres = this.configuration.GetValue<int>("Webzine:NombreDeTopTitres"); var nbTopTitres = this.configuration.GetValue<int>("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 var vm = new AccueilIndexViewModel
{ {
DerniersTitres = titres.Take(derniereChronique).ToList(), DerniersTitres = titres_paginé.ToList(),
TopTitres = top_titres.ToList(),
TopTitres = titres Page = page,
.OrderByDescending(t => t.NbLikes)
.Take(nbTopTitres)
.ToList(),
}; };
return this.View(vm); return this.View(vm);

View File

@@ -23,8 +23,8 @@
// public int NombreDeTitre { get; set; } = 0; // public int NombreDeTitre { get; set; } = 0;
/// <summary> /// <summary>
/// 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.
/// </summary> /// </summary>
// public int Pagination { get; set; } = 0; public int Page { get; set; } = 0;
} }
} }

View File

@@ -74,9 +74,11 @@
} }
<!-- Bouton --> <!-- Bouton -->
<div class="row justify-content-end"> <div class="row justify-content-end">
<button class="btn btn-secondary col-auto mt-3"> <a asp-action="Index" asp-route-page="@(Model.Page + 1)"
class="btn btn-secondary col-auto mt-3">
Titres plus anciens >> Titres plus anciens >>
</button> </button>
</a>
</div> </div>
</div> </div>