namespace Webzine.Repository; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Npgsql; 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; /// /// Initialisation de . /// /// Le service de journalisation. /// 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.context.Commentaires.Add(commentaire); this.context.SaveChanges(); this.logger.LogDebug("Commentaire ajouté avec l'id : {Id}", commentaire.IdCommentaire); } catch (DbUpdateException dbex) { PostgresException? postgresException = dbex.InnerException as PostgresException; this.logger.LogError( dbex, "Erreur de base de données lors de l'ajout du commentaire. Auteur: {Auteur} | IdTitre: {IdTitre} | DateCreation: {DateCreation:o} | PostgresCode: {PostgresCode} | Detail: {Detail} | Constraint: {Constraint} | Column: {Column} | Table: {Table}", commentaire?.Auteur, commentaire?.IdTitre, commentaire?.DateCreation, postgresException?.SqlState, postgresException?.Detail, postgresException?.ConstraintName, postgresException?.ColumnName, postgresException?.TableName); 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 { 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 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) .SingleOrDefault(c => c.IdCommentaire == idCommentaire); } /// public IEnumerable FindAll() { var commentaires = this.context.Commentaires .AsNoTracking() .Include(c => c.Titre) .OrderByDescending(c => c.DateCreation); this.logger.LogDebug("La liste de commentaires a été récupérée."); return commentaires; } /// public IEnumerable FindCommentaires(int offset, int limit) { try { this.logger.LogDebug("Recherche paginée des commentaires (offset : {Offset}, limit : {Limit})", offset, limit); var commentaires = this.context.Commentaires .AsNoTracking() .Include(c => c.Titre) .OrderByDescending(c => c.DateCreation) .Paginate(offset, limit); return commentaires; } catch (Exception ex) { this.logger.LogError(ex, "Erreur lors de la pagination des commentaires (offset : {Offset}, limit : {Limit})", offset, limit); throw new Exception("Une erreur est survenue lors de la pagination des commentaires.", ex); } } /// public int Count() { try { this.logger.LogDebug("Comptage du nombre total de commentaires"); return Enumerable.Count(this.context.Commentaires); } catch (Exception ex) { this.logger.LogError(ex, "Erreur lors du comptage des commentaires"); throw new Exception("Une erreur est survenue lors du comptage des commentaires.", ex); } } }