From 03cc02b6f263a819285da73c6ae3800eb99d661e Mon Sep 17 00:00:00 2001 From: "josephine.vetu" Date: Wed, 1 Apr 2026 11:43:01 +0200 Subject: [PATCH] =?UTF-8?q?#175=20Correction=20des=20repository=20:=20=20F?= =?UTF-8?q?irst=20remplac=C3=A9=20par=20FirstOrDefault.=20Ajout=20de=20la?= =?UTF-8?q?=20documentation=20manquante.=20Les=20return=20Model()=20vides?= =?UTF-8?q?=20sont=20supprim=C3=A9s.=20La=20gestion=20d'erreurs=20est=20op?= =?UTF-8?q?timis=C3=A9e.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IArtisteRepository.cs | 2 +- .../ICommentaireRepository.cs | 29 +++++++++++++++ Webzine.Repository/DbArtisteRepository.cs | 17 ++------- Webzine.Repository/DbCommentaireRepository.cs | 35 ++----------------- Webzine.Repository/DbEntityRepository.cs | 7 ++++ Webzine.Repository/DbStyleRepository.cs | 17 ++------- Webzine.Repository/DbTitreRepository.cs | 6 ---- Webzine.Repository/LocalArtisteRepository.cs | 13 +++---- .../LocalCommentaireRepository.cs | 33 ++--------------- Webzine.Repository/LocalStyleRepository.cs | 3 +- Webzine.Repository/LocalTitreRepository.cs | 2 +- 11 files changed, 54 insertions(+), 110 deletions(-) diff --git a/Webzine.Repository.Contracts/IArtisteRepository.cs b/Webzine.Repository.Contracts/IArtisteRepository.cs index 3c873c9..4eef62b 100644 --- a/Webzine.Repository.Contracts/IArtisteRepository.cs +++ b/Webzine.Repository.Contracts/IArtisteRepository.cs @@ -23,7 +23,7 @@ namespace Webzine.Repository.Contracts /// Récupère un artiste par son identifiant unique. Si aucun artiste n'est trouvé, retourne null. /// /// L'identifiant de l'artiste. - /// + /// L'artiste trouvé ou null. Artiste Find(int id); /// diff --git a/Webzine.Repository.Contracts/ICommentaireRepository.cs b/Webzine.Repository.Contracts/ICommentaireRepository.cs index 3529d83..bcd07d2 100644 --- a/Webzine.Repository.Contracts/ICommentaireRepository.cs +++ b/Webzine.Repository.Contracts/ICommentaireRepository.cs @@ -2,14 +2,43 @@ namespace Webzine.Repository.Contracts { using Webzine.Entity; + /// + /// Interface de repository pour les commentaires. + /// public interface ICommentaireRepository { + /// + /// Ajoute un commentaire à la source de données. + /// + /// Commentaire à ajouter. void Add(Commentaire commentaire); + /// + /// Supprime un commentaire de la source de données. + /// + /// Commentaire à supprimer. void Delete(Commentaire commentaire); + /// + /// Trouve un commentaire par son ID. + /// + /// ID du commentaire à trouver. + /// Le commentaire trouvé, ou null si non trouvé. Commentaire Find(int id); + /// + /// Retourne tous les commentaires de la source de données. + /// + /// Une collection de commentaires. IEnumerable FindAll(); + + /// + /// Retourne une collection de commentaires paginée à partir de la source de données. + /// + /// Le nombre de commentaires à ignorer avant de commencer à + /// récupérer les commentaires. + /// Le nombre maximum de commentaires à récupérer. + /// Une collection de commentaires paginée. + IEnumerable Paginate(int offset, int limit); } } \ No newline at end of file diff --git a/Webzine.Repository/DbArtisteRepository.cs b/Webzine.Repository/DbArtisteRepository.cs index d34628e..f1d5856 100644 --- a/Webzine.Repository/DbArtisteRepository.cs +++ b/Webzine.Repository/DbArtisteRepository.cs @@ -13,7 +13,6 @@ namespace Webzine.Repository /// /// Initialise une classe qui implémente l'interface pour gérer les opérations de base de données liées aux artistes. - /// Utilise en injection de dépendances. // TODO commentaire faux. /// public class DbArtisteRepository : IArtisteRepository { @@ -23,8 +22,8 @@ namespace Webzine.Repository /// /// Initializes a new instance of the class. /// - /// Le contexte de base de données à utiliser pour accéder aux entités et effectuer des opérations de - /// persistance. Ne peut pas être null. + /// Le contexte de base de données à utiliser pour accéder aux entités et effectuer des opérations de persistance. + /// Le service de journalisation. public DbArtisteRepository(WebzineDbContext context, ILogger logger) { this.logger = logger; @@ -56,11 +55,6 @@ namespace Webzine.Repository { try { - if (artiste == null) - { - throw new ArgumentNullException(nameof(artiste), "L'artiste à supprimer ne peut pas être null."); - } - this.context.Artistes.Remove(artiste); this.context.SaveChanges(); this.logger.LogDebug("L'artiste {IdArtiste} a bien été supprimé", artiste.IdArtiste); @@ -125,18 +119,13 @@ namespace Webzine.Repository catch (Exception ex) { this.logger.LogError(ex, "Erreur lors de la récupération de tous les artistes."); - return Enumerable.Empty(); // Retourne une liste vide au lieu de faire crash l'UI + throw; } } /// public void Update(Artiste artiste) { - if (artiste == null) - { - throw new ArgumentNullException(nameof(artiste)); - } - try { this.context.Artistes.Update(artiste); diff --git a/Webzine.Repository/DbCommentaireRepository.cs b/Webzine.Repository/DbCommentaireRepository.cs index bfc5727..0c41ffd 100644 --- a/Webzine.Repository/DbCommentaireRepository.cs +++ b/Webzine.Repository/DbCommentaireRepository.cs @@ -16,10 +16,9 @@ public class DbCommentaireRepository : ICommentaireRepository 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 service de journalisation. /// Le contexte de base de données injecté. public DbCommentaireRepository(ILogger logger, WebzineDbContext context) { @@ -33,7 +32,6 @@ public class DbCommentaireRepository : ICommentaireRepository { 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); @@ -55,11 +53,6 @@ public class DbCommentaireRepository : ICommentaireRepository { 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); @@ -76,14 +69,6 @@ public class DbCommentaireRepository : ICommentaireRepository } } - /// - 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) { @@ -98,8 +83,6 @@ public class DbCommentaireRepository : ICommentaireRepository /// 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) @@ -110,7 +93,7 @@ public class DbCommentaireRepository : ICommentaireRepository } /// - public IEnumerable FindCommentaires(int offset, int limit) + public IEnumerable Paginate(int offset, int limit) { this.logger.LogDebug("Recherche paginée des commentaires (offset : {Offset}, limit : {Limit})", offset, limit); @@ -124,18 +107,4 @@ public class DbCommentaireRepository : ICommentaireRepository 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; - } } \ No newline at end of file diff --git a/Webzine.Repository/DbEntityRepository.cs b/Webzine.Repository/DbEntityRepository.cs index 1558cc6..9368fb6 100644 --- a/Webzine.Repository/DbEntityRepository.cs +++ b/Webzine.Repository/DbEntityRepository.cs @@ -8,10 +8,17 @@ namespace Webzine.Repository using Webzine.Entity; using Webzine.Entity.Fixtures; + /// + /// Classe de repository pour les entités de la base de données. + /// public class DbEntityRepository { private readonly WebzineDbContext context; + /// + /// Constructeur de DbEntityRepository. + /// + /// DB context. public DbEntityRepository(WebzineDbContext context) { this.context = context; diff --git a/Webzine.Repository/DbStyleRepository.cs b/Webzine.Repository/DbStyleRepository.cs index 4f5c20c..452b312 100644 --- a/Webzine.Repository/DbStyleRepository.cs +++ b/Webzine.Repository/DbStyleRepository.cs @@ -93,13 +93,6 @@ public class DbStyleRepository : IStyleRepository { this.logger.LogDebug("Recherche du style avec l'ID: {Id}", id); - if (id <= 0) // TODO à supprimer, c'est au controller de vérifier la validité de l'id - { - this.logger.LogWarning("Tentative de recherche d'un style avec un Id invalide: {Id}", id); - return new Style(); // TODO pas de retour d'objet vide - } - - this.logger.LogDebug("Préparation de la requête avec inclusion des titres"); var style = this.context.Styles .Include(s => s.Titres) .FirstOrDefault(s => s.IdStyle == id); @@ -107,13 +100,10 @@ public class DbStyleRepository : IStyleRepository if (style == null) { this.logger.LogWarning("Style avec l'ID {Id} non trouvé", id); - style = new Style(); - } - else - { - this.logger.LogDebug("Style trouvé: {Libelle}", style.Libelle); + return null; } + this.logger.LogDebug("Style trouvé: {Libelle}", style.Libelle); return style; } catch (Exception ex) @@ -151,7 +141,6 @@ public class DbStyleRepository : IStyleRepository try { this.logger.LogInformation("Mise à jour du style avec l'ID: {IdStyle}", style.IdStyle); - this.logger.LogDebug("Recherche du style en base de données"); var existingStyle = this.context.Styles.Find(style.IdStyle); if (existingStyle == null) @@ -160,8 +149,6 @@ public class DbStyleRepository : IStyleRepository throw new InvalidOperationException($"Style avec l'ID {style.IdStyle} non trouvé."); } - // Update properties - this.logger.LogDebug("Style trouvé, mise à jour des propriétés"); existingStyle.Libelle = style.Libelle; this.context.SaveChanges(); diff --git a/Webzine.Repository/DbTitreRepository.cs b/Webzine.Repository/DbTitreRepository.cs index 9390c15..0675c33 100644 --- a/Webzine.Repository/DbTitreRepository.cs +++ b/Webzine.Repository/DbTitreRepository.cs @@ -159,20 +159,14 @@ public class DbTitreRepository : ITitreRepository 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) { diff --git a/Webzine.Repository/LocalArtisteRepository.cs b/Webzine.Repository/LocalArtisteRepository.cs index a65fe44..8a4f51c 100644 --- a/Webzine.Repository/LocalArtisteRepository.cs +++ b/Webzine.Repository/LocalArtisteRepository.cs @@ -10,22 +10,21 @@ namespace Webzine.Repository using Webzine.Repository.Contracts; /// - /// Initialise une classe qui implémente l'interface pour gérer les opérations de base de données liées aux artistes. - /// Utilise en injection de dépendances. // TODO faux. + /// Initialise une classe qui implémente l'interface . + /// Gère les opérations liées aux artistes en utilisant une source de données locale (en mémoire). /// public class LocalArtisteRepository : IArtisteRepository { private readonly ILogger logger; - // private readonly List artistes; // TODO code mort private readonly InMemoryDataStore dataStore; /// /// Initializes a new instance of the class. /// Est liéee à une liste d'artistes en local et utilise un logger pour enregistrer les opérations effectuées sur les artistes. /// - /// La liste des artistes à initialiser. Ne peut pas être null. // TODO pas le bon paramètre /// Le logger à utiliser pour enregistrer les messages de journalisation. Ne peut pas être null. + /// Le magasin de données en mémoire. public LocalArtisteRepository(InMemoryDataStore dataStore, ILogger logger) { this.logger = logger; @@ -49,11 +48,7 @@ namespace Webzine.Repository /// public Artiste Find(int id) { - var artiste = this.dataStore.Artistes.First(a => a.IdArtiste == id); - if (artiste == null) - { - return new Artiste(); // TODO ne pas retourner un objet vide, FirstOrDefault et gérer le null dans le controller - } + var artiste = this.dataStore.Artistes.SingleOrDefault(a => a.IdArtiste == id); return artiste; } diff --git a/Webzine.Repository/LocalCommentaireRepository.cs b/Webzine.Repository/LocalCommentaireRepository.cs index a0b1da3..8f71958 100644 --- a/Webzine.Repository/LocalCommentaireRepository.cs +++ b/Webzine.Repository/LocalCommentaireRepository.cs @@ -15,7 +15,6 @@ namespace Webzine.Repository /// /// Initialise une classe qui implémente l'interface pour gérer les opérations liées aux commentaires. - /// Utilise en injection de dépendances. /// public class LocalCommentaireRepository : ICommentaireRepository { @@ -25,7 +24,7 @@ namespace Webzine.Repository /// /// Initializes a new instance of the class. /// Initialise une nouvelle instance du . - /// Est liée à un magasin de données en mémoire et utilise un logger pour enregistrer les opérations. + /// Gère les opérations liées aux commentaires en utilisant une source de données locale (en mémoire). /// /// Le magasin de données en mémoire. Ne peut pas être null. /// Le logger à utiliser pour enregistrer les messages de journalisation. Ne peut pas être null. @@ -47,22 +46,10 @@ namespace Webzine.Repository throw new NotSupportedException("Mode Local"); } - /// - public int Count() - { - return this.dataStore.Commentaires.Count; - } - /// public Commentaire Find(int idCommentaire) { - var commentaire = this.dataStore.Commentaires.FirstOrDefault(c => c.IdCommentaire == idCommentaire); - if (commentaire == null) - { - return new Commentaire(); - } - - return commentaire; + return this.dataStore.Commentaires.FirstOrDefault(c => c.IdCommentaire == idCommentaire); } /// @@ -74,27 +61,13 @@ namespace Webzine.Repository } /// - public IEnumerable FindCommentaires(int offset, int limit) + public IEnumerable Paginate(int offset, int limit) { - if (offset < 0 || limit <= 0) - { - return Enumerable.Empty(); - } - return this.dataStore.Commentaires .OrderByDescending(c => c.DateCreation) .Skip(offset) .Take(limit) .ToList(); } - - /// - public IEnumerable FindByIdTitre(int idTitre) - { - return this.dataStore.Commentaires - .Where(c => c.Titre != null && c.Titre.IdTitre == idTitre) - .OrderByDescending(c => c.DateCreation) - .ToList(); - } } } \ No newline at end of file diff --git a/Webzine.Repository/LocalStyleRepository.cs b/Webzine.Repository/LocalStyleRepository.cs index 0b4d16c..76d37dc 100644 --- a/Webzine.Repository/LocalStyleRepository.cs +++ b/Webzine.Repository/LocalStyleRepository.cs @@ -17,9 +17,10 @@ public class LocalStyleRepository : IStyleRepository /// /// Initializes a new instance of the class. + /// Gère les opérations liées aux styles en utilisant une source de données locale (en mémoire). /// /// Le service de journalisation injecté pour suivre les opérations du repository. - /// La liste de styles à utiliser comme source de données pour le repository. + /// Les données en mémoire. public LocalStyleRepository(ILogger logger, InMemoryDataStore dataStore) { this.logger = logger; diff --git a/Webzine.Repository/LocalTitreRepository.cs b/Webzine.Repository/LocalTitreRepository.cs index bc1e488..a970bf9 100644 --- a/Webzine.Repository/LocalTitreRepository.cs +++ b/Webzine.Repository/LocalTitreRepository.cs @@ -78,7 +78,7 @@ public class LocalTitreRepository : ITitreRepository public Titre Find(int idTitre) { return this.dataStore.Titres - .First(t => t.IdTitre == idTitre); + .FirstOrDefault(t => t.IdTitre == idTitre); } ///