- Création de Local et DbCommentaireRepository.cs
 - Modif du CommentaireController
This commit is contained in:
b.nodon
2026-03-26 16:35:00 +01:00
parent 999d9893af
commit 9e45e0cd63
5 changed files with 371 additions and 26 deletions

View File

@@ -0,0 +1,136 @@
using Microsoft.EntityFrameworkCore;
using Webzine.EntitiesContext;
using Microsoft.Extensions.Logging;
using Webzine.Entity;
using Webzine.Repository.Contracts;
namespace Webzine.Repository;
/// <summary>
/// Classe qui implémente le repository pour les commentaires en utilisant une base de données.
/// </summary>
public class DbCommentaireRepository : ICommentaireRepository
{
private readonly ILogger<DbCommentaireRepository> logger;
private readonly WebzineDbContext context;
/// <summary>
/// Init de <see cref="DbCommentaireRepository"/> .
/// </summary>
/// <param name="logger">Le service de journalisation injecté pour suivre les opérations du repository.</param>
/// <param name="context">Le contexte de base de données injecté.</param>
public DbCommentaireRepository(ILogger<DbCommentaireRepository> logger, WebzineDbContext context)
{
this.logger = logger;
this.context = context;
this.logger.LogDebug(1, "NLog injecté dans DbCommentaireRepository");
}
/// <summary>
/// Ajoute un commentaire à la base de données.
/// </summary>
/// <param name="commentaire">L'objet commentaire à ajouter.</param>
public void Add(Commentaire commentaire)
{
this.logger.LogInformation($"Ajout nouveau commentaire depuis auteur: {commentaire.Auteur}");
this.context.Commentaires.Add(commentaire);
this.context.SaveChanges();
this.logger.LogDebug($"Commentaire ajouté avec l'id: {commentaire.IdCommentaire}");
}
/// <summary>
/// Remonte le nombre de commentaires.
/// </summary>
/// <returns>Le nombre total de commentaires présents dans la base de données.</returns>
public int Count()
{
var count = this.context.Commentaires.Count();
this.logger.LogDebug($"Compte total des commentaires: {count}");
return count;
}
/// <summary>
/// Supprime un commentaire de la base de données.
/// </summary>
/// <param name="commentaire">L'objet commentaire à supprimer.</param>
public void Delete(Commentaire commentaire)
{
this.logger.LogInformation($"suppression du commentaire avec l'id: {commentaire.IdCommentaire}");
this.context.Commentaires.Remove(commentaire);
this.context.SaveChanges();
this.logger.LogDebug($"Commentaire supprimé: {commentaire.IdCommentaire}");
}
/// <summary>
/// Trouve un commentaire dans la base de données en fonction de son identifiant.
/// </summary>
/// <param name="idCommentaire">L'identifiant du commentaire à trouver.</param>
/// <returns>Le commentaire correspondant à l'identifiant fourni, ou null si aucun n'est trouvé.</returns>
public Commentaire Find(int idCommentaire)
{
this.logger.LogDebug($"Commentaire cherché avec l'id: {idCommentaire}");
// On inclut le titre car il est souvent affiché avec le commentaire (ex: vue Delete)
var commentaire = this.context.Commentaires
.Include(c => c.Titre)
.FirstOrDefault(c => c.IdCommentaire == idCommentaire);
return commentaire;
}
/// <summary>
/// Trouve tous les commentaires dans la base de données, triés du plus récent au plus ancien.
/// </summary>
/// <returns>Une collection de tous les commentaires présents.</returns>
public IEnumerable<Commentaire> FindAll()
{
this.logger.LogDebug("Trouver tout les commentaires");
var commentaires = this.context.Commentaires
.Include(c => c.Titre)
.OrderByDescending(c => c.DateCreation)
.ToList();
this.logger.LogDebug($"Nombre de tout les commentaires trouvé: {commentaires.Count}");
return commentaires;
}
/// <summary>
/// Recherche les commentaires dans la base de données avec pagination.
/// </summary>
/// <param name="offset">L'offset à partir duquel commencer la recherche.</param>
/// <param name="limit">Le nombre maximum de commentaires à retourner.</param>
/// <returns>Une collection de commentaires paginée.</returns>
public IEnumerable<Commentaire> FindCommentaires(int offset, int limit)
{
this.logger.LogDebug($"Récherche des commentaires (décalage : {offset}, limite : {limit})");
var commentaires = this.context.Commentaires
.Include(c => c.Titre)
.OrderByDescending(c => c.DateCreation)
.Skip(offset)
.Take(limit)
.ToList();
this.logger.LogDebug($"{commentaires.Count} commentaires trouvés");
return commentaires;
}
/// <summary>
/// Trouve tous les commentaires associés à un titre spécifique.
/// </summary>
/// <param name="idTitre">L'identifiant du titre.</param>
/// <returns>Une collection de commentaires pour ce titre.</returns>
public IEnumerable<Commentaire> FindByIdTitre(int idTitre)
{
this.logger.LogInformation($"Recherche des commentaires pour l'ID de titre : {idTitre}");
var commentaires = this.context.Commentaires
.Where(c => c.Titre.IdTitre == idTitre)
.OrderByDescending(c => c.DateCreation)
.ToList();
this.logger.LogDebug($"{commentaires.Count} commentaires trouvés pour l'ID de titre : {idTitre}");
return commentaires;
}
}

View File

@@ -0,0 +1,198 @@
using Microsoft.Extensions.Logging;
using Webzine.Entity;
using Webzine.Repository.Contracts;
namespace Webzine.Repository;
/// <summary>
/// Classe qui implémente le repository pour les commentaires en utilisant une liste locale comme source de données.
/// </summary>
public class LocalCommentaireRepository : ICommentaireRepository
{
private readonly ILogger<LocalCommentaireRepository> logger;
private readonly List<Commentaire> commentaires;
/// <summary>
/// Initialise une nouvelle instance du <see cref="LocalCommentaireRepository"/> .
/// </summary>
/// <param name="logger">Le service de journalisation injecté pour suivre les opérations du repository.</param>
/// <param name="commentaires">La liste de commentaires à utiliser comme source de données pour le repository.</param>
public LocalCommentaireRepository(ILogger<LocalCommentaireRepository> logger, List<Commentaire> commentaires)
{
this.logger = logger;
this.commentaires = commentaires;
this.logger.LogDebug(1, "NLog injecté dans LocalCommentaireRepository");
}
/// <inheritdoc/>
public void Add(Commentaire commentaire)
{
try
{
this.logger.LogDebug("Ajout du commentaire rédigé par: {Auteur}", commentaire.Auteur);
// Simulation d'auto-incrémentation pour l'ID si nécessaire (selon votre logique)
if (commentaire.IdCommentaire == 0 && this.commentaires.Any())
{
commentaire.IdCommentaire = this.commentaires.Max(c => c.IdCommentaire) + 1;
}
else if (commentaire.IdCommentaire == 0)
{
commentaire.IdCommentaire = 1;
}
this.commentaires.Add(commentaire);
this.logger.LogDebug("Commentaire ajouté avec succès, ID: {IdCommentaire}", commentaire.IdCommentaire);
}
catch (Exception ex)
{
this.logger.LogError(ex, "Erreur lors de l'ajout du commentaire rédigé par: {Auteur}", commentaire.Auteur);
throw;
}
}
/// <inheritdoc/>
public int Count()
{
try
{
var count = this.commentaires.Count;
this.logger.LogDebug("Nombre total de commentaires: {Count}", count);
return count;
}
catch (Exception ex)
{
this.logger.LogError(ex, "Erreur lors du comptage des commentaires");
throw;
}
}
/// <inheritdoc/>
public void Delete(Commentaire commentaire)
{
try
{
this.logger.LogDebug("Suppression du commentaire ID: {IdCommentaire}", commentaire.IdCommentaire);
if (!this.commentaires.Contains(commentaire))
{
this.logger.LogWarning("Le commentaire avec l'identifiant {IdCommentaire} n'existe pas dans la liste.", commentaire.IdCommentaire);
}
this.commentaires.Remove(commentaire);
this.logger.LogDebug("Commentaire supprimé avec succès, ID: {IdCommentaire}", commentaire.IdCommentaire);
}
catch (Exception ex)
{
this.logger.LogError(ex, "Erreur lors de la suppression du commentaire ID: {IdCommentaire}", commentaire.IdCommentaire);
throw;
}
}
/// <inheritdoc/>
public Commentaire Find(int idCommentaire)
{
try
{
this.logger.LogDebug("Recherche du commentaire avec ID: {IdCommentaire}", idCommentaire);
// FirstOrDefault car le contrôleur s'attend potentiellement à un null si non trouvé
Commentaire commentaire = this.commentaires.FirstOrDefault(c => c.IdCommentaire == idCommentaire);
if (commentaire == null)
{
this.logger.LogWarning("Aucun commentaire trouvé avec l'ID: {IdCommentaire}", idCommentaire);
}
else
{
this.logger.LogDebug("Commentaire trouvé: ID {IdCommentaire} par {Auteur}", commentaire.IdCommentaire, commentaire.Auteur);
}
return commentaire;
}
catch (Exception ex)
{
this.logger.LogError(ex, "Erreur lors de la recherche du commentaire avec ID: {IdCommentaire}", idCommentaire);
throw;
}
}
/// <inheritdoc/>
public IEnumerable<Commentaire> FindAll()
{
try
{
this.logger.LogDebug("Récupération de tous les commentaires");
// on affiche les commentaires du plus récent au plus ancien et la je fais un commentaire super long pour que joséphine le voie et crois que ca va etre plus complexe que ce que c'est vraiment mais non en fait t'as eu peur hein :)
var result = this.commentaires.OrderByDescending(c => c.DateCreation).ToList();
this.logger.LogDebug("{Count} commentaires récupérés", result.Count);
return result;
}
catch (Exception ex)
{
this.logger.LogError(ex, "Erreur lors de la récupération de tous les commentaires");
throw;
}
}
/// <inheritdoc/>
public IEnumerable<Commentaire> FindCommentaires(int offset, int limit)
{
try
{
this.logger.LogDebug("Recherche des commentaires avec offset: {Offset}, limit: {Limit}", offset, limit);
if (offset < 0 || limit <= 0)
{
this.logger.LogWarning("FindCommentaires appelé avec offset {Offset} ou limit {Limit} invalide.", offset, limit);
return Enumerable.Empty<Commentaire>();
}
var result = this.commentaires
.OrderByDescending(c => c.DateCreation)
.Skip(offset)
.Take(limit)
.ToList();
this.logger.LogDebug("{Count} commentaires trouvés", result.Count);
return result;
}
catch (Exception ex)
{
this.logger.LogError(ex, "Erreur lors de la recherche des commentaires avec offset: {Offset}, limit: {Limit}", offset, limit);
throw;
}
}
/// <inheritdoc/>
public IEnumerable<Commentaire> FindByIdTitre(int idTitre)
{
try
{
this.logger.LogDebug("Recherche des commentaires pour le titre ID: {IdTitre}", idTitre);
IEnumerable<Commentaire> result = this.commentaires
.Where(c => c.Titre != null && c.Titre.IdTitre == idTitre)
.OrderByDescending(c => c.DateCreation)
.ToList();
if (!result.Any())
{
this.logger.LogInformation("Aucun commentaire trouvé pour le titre ID '{IdTitre}'.", idTitre);
}
else
{
this.logger.LogDebug("{Count} commentaires trouvés pour le titre ID '{IdTitre}'", result.Count(), idTitre);
}
return result;
}
catch (Exception ex)
{
this.logger.LogError(ex, "Erreur lors de la recherche des commentaires pour le titre ID: {IdTitre}", idTitre);
throw;
}
}
}

View File

@@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Mvc;
using Webzine.Entity;
using Webzine.Entity.Fixtures;
using Webzine.Repository.Contracts;
using Webzine.WebApplication.Areas.Administration.ViewModels.Commentaire;
namespace Webzine.WebApplication.Areas.Administration.Controllers
@@ -9,59 +9,48 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
public class CommentaireController : Controller
{
private readonly ILogger<CommentaireController> _logger;
private readonly List<Commentaire> _commentaires;
private readonly ICommentaireRepository _commentaireRepository;
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="CommentaireController"/>.
/// Initialise une nouvelle instance du <see cref="CommentaireController"/>.
/// Les données sont générées dynamiquement via <see cref="DataFactory"/>.
/// Utilise l'injection de dépendances pour récupérer le repository.
/// </summary>
/// <param name="logger">Service de journalisation injecté.</param>
public CommentaireController(ILogger<CommentaireController> logger)
/// <param name="commentaireRepository">Le repository des commentaires injecté.</param>
public CommentaireController(ILogger<CommentaireController> logger, ICommentaireRepository commentaireRepository)
{
this._logger = logger;
this._commentaireRepository = commentaireRepository;
this._logger.LogInformation("Initialisation du contrôleur CommentaireController.");
var factory = new DataFactory(); // TODO injecter le factory via DI pour éviter de le recréer à chaque fois
// faire une classe statique
var _artistes = factory.GenerateArtists(10);
var _styles = factory.GenerateStyles(10);
var _titres = factory.GenerateTitres(30, _artistes, _styles);
_commentaires = factory.GenerateCommentaires(50, _titres);
this._logger.LogInformation("Données fictives générées avec succès.");
}
/// <summary>
/// Affiche la liste des commentaires dans la vue Index.
/// </summary>
/// <returns>>La vue Index avec le ViewModel contenant la liste des commentaires.</returns>
/// <returns>La vue Index avec le ViewModel contenant la liste des commentaires.</returns>
public IActionResult Index()
{
// Création de données "bouchon" (mock) pour tester l'affichage
// Récupération des commentaires depuis le repository
var commentaires = this._commentaireRepository.FindAll().ToList();
// Initialisation du ViewModel
var viewModel = new CommentaireViewModel
{
Commentaires = _commentaires
Commentaires = commentaires
};
return View(viewModel);
}
/// <summary>
/// Affiche la vue de confirmation de suppression d'un commentaire, en récupérant les détails du commentaire à supprimer à partir de l'identifiant fourni.
/// Affiche la vue de confirmation de suppression d'un commentaire, en récupérant les détails à partir de l'identifiant fourni.
/// </summary>
/// <param name="id">L'identifiant du commentaire à supprimer.</param>
/// <returns>La vue de confirmation de suppression avec le ViewModel contenant les détails du commentaire à supprimer, ou une redirection vers l'index si le commentaire n'existe pas.</returns>
/// <returns>La vue de confirmation de suppression avec le ViewModel contenant les détails, ou une redirection vers l'index si introuvable.</returns>
public IActionResult Delete(int id)
{
var commentaire = _commentaires
.FirstOrDefault(c => c.IdCommentaire == id);
var commentaire = this._commentaireRepository.Find(id);
if (commentaire == null)
{
@@ -80,5 +69,27 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
return View(vm);
}
/// <summary>
/// Effectue la suppression réelle du commentaire (accessible via un simple lien sans HttpPost).
/// </summary>
/// <param name="id">L'identifiant du commentaire à supprimer.</param>
/// <returns>Redirection vers la vue Index après suppression.</returns>
public IActionResult DeleteConfirm(int id)
{
var commentaire = this._commentaireRepository.Find(id);
if (commentaire != null)
{
this._commentaireRepository.Delete(commentaire);
this._logger.LogInformation("Commentaire {Id} supprimé avec succès.", id);
}
else
{
this._logger.LogWarning("Échec de la suppression : Commentaire avec ID {Id} introuvable.", id);
}
return RedirectToAction("Index");
}
}
}

View File

@@ -31,7 +31,7 @@
[HttpGet("/artiste/{nom}")]
public IActionResult Index(string nom)
{
this.logger.LogInformation("Tentative d'accès à l'artiste avec le nom : {NomArtiste}", nom);
this._logger.LogInformation("Tentative d'accès à l'artiste avec le nom : {NomArtiste}", nom);
if (string.IsNullOrEmpty(nom))
{

View File

@@ -35,7 +35,7 @@ try
builder.Services.AddScoped<ITitreRepository, DbTitreRepository>();
builder.Services.AddScoped<IStyleRepository, DbStyleRepository>();
builder.Services.AddScoped<IArtisteRepository, DbArtisteRepository>();
//builder.Services.AddScoped<ICommentaireRepository, DbCommentaireRepository>();
builder.Services.AddScoped<ICommentaireRepository, DbCommentaireRepository>();
}
else
{