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 titres en utilisant une base de données. /// public class DbTitreRepository : ITitreRepository { private readonly ILogger logger; private readonly WebzineDbContext context; /// /// Initializes a new instance of the class. /// /// Le service de journalisation injecté pour suivre les opérations du repository. /// Le contexte de base de données injecté. public DbTitreRepository(ILogger logger, WebzineDbContext context) { this.logger = logger; this.context = context; this.logger.LogDebug(1, "NLog injecté dans DbTitreRepository"); } /// public void Add(Titre titre) { try { this.logger.LogInformation("Ajout d'un nouveau titre: {Libelle}", titre.Libelle); this.context.Titres.Add(titre); this.context.SaveChanges(); this.logger.LogDebug("Titre ajouté avec succès avec l'ID: {IdTitre}", titre.IdTitre); } catch (DbUpdateException ex) { this.logger.LogError(ex, "Erreur de base de données lors de l'ajout du titre: {Libelle}", titre.Libelle); throw; } catch (Exception ex) { this.logger.LogError(ex, "Erreur lors de l'ajout du titre: {Libelle}", titre.Libelle); throw; } } /// public int Count() { try { var count = this.context.Titres.Count(); this.logger.LogDebug("Nombre total de titres: {Count}", count); return count; } catch (Exception ex) { this.logger.LogError(ex, "Erreur lors du comptage des titres"); throw; } } /// public void Delete(Titre titre) { try { this.logger.LogInformation("Suppression du titre avec l'ID: {IdTitre}", titre.IdTitre); this.context.Titres.Remove(titre); this.context.SaveChanges(); this.logger.LogDebug("Titre supprimé avec succès: {IdTitre}", titre.IdTitre); } catch (DbUpdateException ex) { this.logger.LogError(ex, "Erreur de base de données lors de la suppression du titre ID: {IdTitre}", titre.IdTitre); throw; } catch (Exception ex) { this.logger.LogError(ex, "Erreur lors de la suppression du titre ID: {IdTitre}", titre.IdTitre); throw; } } /// public IEnumerable FindTitres(int offset, int limit) { try { this.logger.LogDebug("Recherche des titres avec offset: {Offset}, limit: {Limit}", offset, limit); var titres = this.context.Titres .OrderByDescending(t => t.DateCreation) .ThenBy(t => t.Libelle) .Include(t => t.Artiste) .Include(t => t.Styles) .Paginate(offset, limit) .AsNoTracking(); return titres; } catch (Exception ex) { this.logger.LogError(ex, "Erreur lors de la recherche des titres avec offset: {Offset}, limit: {Limit}", offset, limit); throw; } } /// public void IncrementNbLectures(Titre titre) { try { this.logger.LogInformation("Incrémentation du nombre de lectures pour le titre ID: {IdTitre}", titre.IdTitre); var existingTitre = this.context.Titres.Find(titre.IdTitre); if (existingTitre != null) { existingTitre.NbLectures++; this.context.SaveChanges(); this.logger.LogDebug("Nouveau nombre de lectures: {NbLectures}", existingTitre.NbLectures); } else { this.logger.LogWarning("Titre avec l'ID {IdTitre} non trouvé pour l'incrémentation des lectures", titre.IdTitre); } } catch (DbUpdateException ex) { this.logger.LogError(ex, "Erreur de base de données lors de l'incrémentation des lectures pour le titre ID: {IdTitre}", titre.IdTitre); throw; } catch (Exception ex) { this.logger.LogError(ex, "Erreur lors de l'incrémentation des lectures pour le titre ID: {IdTitre}", titre.IdTitre); throw; } } /// public void IncrementNbLikes(Titre titre) { try { this.logger.LogInformation("Incrémentation du nombre de likes pour le titre ID: {IdTitre}", titre.IdTitre); var existingTitre = this.context.Titres.Find(titre.IdTitre); if (existingTitre != null) { existingTitre.NbLikes++; this.context.SaveChanges(); this.logger.LogDebug("Nouveau nombre de likes: {NbLikes}", existingTitre.NbLikes); } else { this.logger.LogWarning("Titre avec l'ID {IdTitre} non trouvé pour l'incrémentation des likes", titre.IdTitre); } } catch (DbUpdateException ex) { this.logger.LogError(ex, "Erreur de base de données lors de l'incrémentation des likes pour le titre ID: {IdTitre}", titre.IdTitre); throw; } catch (Exception ex) { this.logger.LogError(ex, "Erreur lors de l'incrémentation des likes pour le titre ID: {IdTitre}", titre.IdTitre); throw; } } /// public void Update(Titre titre) { try { this.logger.LogInformation("Mise à jour du titre avec l'ID: {IdTitre}", titre.IdTitre); Titre existingTitre = this.Find(titre.IdTitre); if (existingTitre != null) { List