using Microsoft.EntityFrameworkCore; using Webzine.EntitiesContext; using Microsoft.Extensions.Logging; using Webzine.Entity; using Webzine.Repository.Contracts; namespace Webzine.Repository; /// /// Classe qui implémente le repository pour les commentaires en utilisant une base de données. /// public class DbCommentaireRepository : ICommentaireRepository { private readonly ILogger logger; private readonly WebzineDbContext context; /// /// Init de . /// /// Le service de journalisation injecté pour suivre les opérations du repository. /// Le contexte de base de données injecté. public DbCommentaireRepository(ILogger logger, WebzineDbContext context) { this.logger = logger; this.context = context; this.logger.LogDebug(1, "NLog injecté dans DbCommentaireRepository"); } /// /// Ajoute un commentaire à la base de données. /// /// L'objet commentaire à ajouter. 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}"); } /// /// Remonte le nombre de commentaires. /// /// Le nombre total de commentaires présents dans la base de données. public int Count() { var count = this.context.Commentaires.Count(); this.logger.LogDebug($"Compte total des commentaires: {count}"); return count; } /// /// Supprime un commentaire de la base de données. /// /// L'objet commentaire à supprimer. 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}"); } /// /// Trouve un commentaire dans la base de données en fonction de son identifiant. /// /// L'identifiant du commentaire à trouver. /// Le commentaire correspondant à l'identifiant fourni, ou null si aucun n'est trouvé. 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; } /// /// Trouve tous les commentaires dans la base de données, triés du plus récent au plus ancien. /// /// Une collection de tous les commentaires présents. public IEnumerable 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; } /// /// Recherche les commentaires dans la base de données avec pagination. /// /// L'offset à partir duquel commencer la recherche. /// Le nombre maximum de commentaires à retourner. /// Une collection de commentaires paginée. public IEnumerable 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; } /// /// Trouve tous les commentaires associés à un titre spécifique. /// /// L'identifiant du titre. /// Une collection de commentaires pour ce titre. public IEnumerable 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; } }