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.logger.LogDebug("Début de l'ajout du titre en base de données"); 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 { this.logger.LogDebug("Comptage des titres en base de données"); 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.logger.LogDebug("Début de la suppression du titre en base de données"); 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); this.logger.LogDebug("Préparation de la requête avec les inclusions Artiste et Styles"); var titres = this.context.Titres .Include(t => t.Artiste) .Include(t => t.Styles) .OrderBy(t => t.Libelle) .Skip(offset) .Take(limit) .ToList(); this.logger.LogDebug("{Count} titres trouvés", titres.Count); 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); this.logger.LogDebug("Recherche du titre en base de données"); var existingTitre = this.context.Titres.Find(titre.IdTitre); if (existingTitre != null) { this.logger.LogDebug("Titre trouvé, incrémentation du compteur de lectures"); 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); this.logger.LogDebug("Recherche du titre en base de données"); var existingTitre = this.context.Titres.Find(titre.IdTitre); if (existingTitre != null) { this.logger.LogDebug("Titre trouvé, incrémentation du compteur de likes"); 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); var existingTitre = this.context.Titres.Find(titre.IdTitre); if (existingTitre != null) { this.logger.LogWarning("Aucun titre trouvé avec l'ID: {IdTitre}", titre.IdTitre); } this.context.SaveChanges(); this.logger.LogDebug("Titre mis à jour avec succès: {IdTitre}", titre.IdTitre); } catch (DbUpdateException ex) { this.logger.LogError(ex, "Erreur de base de données lors de la mise à jour du titre ID: {IdTitre}", titre.IdTitre); throw; } catch (Exception ex) { this.logger.LogError(ex, "Erreur lors de la mise à jour du titre ID: {IdTitre}", titre.IdTitre); throw; } } /// public IEnumerable Search(string mot) { try { this.logger.LogInformation("Recherche des titres avec le mot-clé: {Mot}", mot); this.logger.LogDebug("Préparation de la requête de recherche avec les inclusions"); var titres = this.context.Titres .Include(t => t.Artiste) .Include(t => t.Styles) .Where(t => t.Libelle.ToLower().Contains(mot.ToLower())) .OrderBy(t => t.Libelle) .AsNoTracking() .ToList(); this.logger.LogDebug("{Count} titres trouvés correspondant à '{Mot}'", titres.Count, mot); return titres; } catch (Exception ex) { this.logger.LogError(ex, "Erreur lors de la recherche des titres avec le mot-clé: {Mot}", mot); throw; } } /// public Titre Find(int idTitre) { try { this.logger.LogDebug("Recherche du titre avec l'ID: {IdTitre}", idTitre); var titre = this.context.Titres .Include(t => t.Artiste) .Include(t => t.Styles) .Include(t => t.Commentaires) .FirstOrDefault(t => t.IdTitre == idTitre); return titre; } catch (InvalidOperationException ex) { this.logger.LogWarning(ex, "Aucun titre trouvé avec l'ID: {IdTitre}", idTitre); throw; } catch (Exception ex) { this.logger.LogError(ex, "Erreur lors de la recherche du titre avec l'ID: {IdTitre}", idTitre); throw; } } /// public IEnumerable FindAll() { try { this.logger.LogDebug("Récupération de tous les titres"); this.logger.LogDebug("Préparation de la requête avec les inclusions Artiste et Styles"); var titres = this.context.Titres .Include(t => t.Artiste) .Include(t => t.Styles) .Include(t => t.Commentaires) .OrderBy(t => t.Libelle) .ToList(); this.logger.LogDebug("{Count} titres récupérés", titres.Count); return titres; } catch (Exception ex) { this.logger.LogError(ex, "Erreur lors de la récupération de tous les titres"); throw; } } /// public IEnumerable SearchByStyle(string libelle) { try { this.logger.LogInformation("Recherche des titres par style: {Libelle}", libelle); this.logger.LogDebug("Préparation de la requête de recherche par style"); var titres = this.context.Titres .Include(t => t.Artiste) .Include(t => t.Styles) .Where(t => t.Styles.Any(s => s.Libelle.ToLower() == libelle.ToLower())) .OrderBy(t => t.Libelle) .ToList(); this.logger.LogDebug("{Count} titres trouvés pour le style '{Libelle}'", titres.Count, libelle); return titres; } catch (Exception ex) { this.logger.LogError(ex, "Erreur lors de la recherche des titres par style: {Libelle}", libelle); throw; } } }