namespace Webzine.Repository; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Webzine.EntitiesContext; using Webzine.Entity; using Webzine.Repository.Contracts; /// /// 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; /// /// Initializes a new instance of the class. /// Initialisation 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("NLog injecté dans DbCommentaireRepository"); } /// public void Add(Commentaire commentaire) { try { this.logger.LogDebug("Ajout d'un nouveau commentaire de l'auteur : {Auteur}", commentaire.Auteur); this.context.Commentaires.Add(commentaire); this.context.SaveChanges(); this.logger.LogDebug("Commentaire ajouté avec l'id : {Id}", commentaire.IdCommentaire); } catch (DbUpdateException dbex) { this.logger.LogError(dbex, "Erreur de base de données lors de l'ajout du commentaire de l'auteur : {Auteur}", commentaire?.Auteur); throw; } catch (Exception ex) { this.logger.LogError(ex, "Une erreur est survenue lors de l'ajout d'un commentaire."); throw new Exception("Une erreur est survenue lors de l'ajout du commentaire.", ex); } } /// public void Delete(Commentaire commentaire) { try { if (commentaire == null) { throw new ArgumentNullException(nameof(commentaire), "Le commentaire à supprimer ne peut pas être null."); } this.context.Commentaires.Remove(commentaire); this.context.SaveChanges(); this.logger.LogDebug("Le commentaire {IdCommentaire} a bien été supprimé", commentaire.IdCommentaire); } catch (DbUpdateException dbex) { this.logger.LogError(dbex, "Erreur de base de données lors de la suppression du commentaire : {Id}", commentaire.IdCommentaire); throw; } catch (Exception ex) { this.logger.LogError(ex, "Une erreur est survenue lors de la suppression du commentaire {Id}.", commentaire?.IdCommentaire); throw new Exception("Une erreur est survenue lors de la suppression du commentaire.", ex); } } /// public int Count() { var count = this.context.Commentaires.Count(); this.logger.LogDebug("Compte total des commentaires : {Count}", count); return count; } /// public Commentaire Find(int idCommentaire) { this.logger.LogDebug("Recherche du commentaire avec l'id : {Id}", idCommentaire); // On inclut le titre car il est souvent affiché avec le commentaire return this.context.Commentaires .Include(c => c.Titre) .FirstOrDefault(c => c.IdCommentaire == idCommentaire); } /// public IEnumerable FindAll() { this.logger.LogDebug("Récupération de tous les commentaires"); var commentaires = this.context.Commentaires .Include(c => c.Titre) .OrderByDescending(c => c.DateCreation) .ToList(); this.logger.LogDebug("Nombre de commentaires trouvés : {Count}", commentaires.Count); return commentaires; } /// public IEnumerable FindCommentaires(int offset, int limit) { this.logger.LogDebug("Recherche paginée des commentaires (offset : {Offset}, limit : {Limit})", offset, limit); var commentaires = this.context.Commentaires .Include(c => c.Titre) .OrderByDescending(c => c.DateCreation) .Skip(offset) .Take(limit) .ToList(); this.logger.LogDebug("{Count} commentaires trouvés pour cette page", commentaires.Count); return commentaires; } /// public IEnumerable FindByIdTitre(int idTitre) { this.logger.LogDebug("Recherche des commentaires pour le titre ID : {IdTitre}", 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; } }