From 9e45e0cd63d202b45f8b77f8e35ab24e601df23f Mon Sep 17 00:00:00 2001 From: "b.nodon" Date: Thu, 26 Mar 2026 16:35:00 +0100 Subject: [PATCH 1/6] =?UTF-8?q?#110=20:=20=20-=20Cr=C3=A9ation=20de=20Loca?= =?UTF-8?q?l=20et=20DbCommentaireRepository.cs=20=20-=20Modif=20du=20Comme?= =?UTF-8?q?ntaireController?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Webzine.Repository/DbCommentaireRepository.cs | 136 ++++++++++++ .../LocalCommentaireRepository.cs | 198 ++++++++++++++++++ .../Controllers/CommentaireController.cs | 59 +++--- .../Controllers/ArtisteController.cs | 2 +- Webzine.WebApplication/Program.cs | 2 +- 5 files changed, 371 insertions(+), 26 deletions(-) create mode 100644 Webzine.Repository/DbCommentaireRepository.cs create mode 100644 Webzine.Repository/LocalCommentaireRepository.cs diff --git a/Webzine.Repository/DbCommentaireRepository.cs b/Webzine.Repository/DbCommentaireRepository.cs new file mode 100644 index 0000000..e61b7be --- /dev/null +++ b/Webzine.Repository/DbCommentaireRepository.cs @@ -0,0 +1,136 @@ +using Microsoft.EntityFrameworkCore; +using Webzine.EntitiesContext; +using Microsoft.Extensions.Logging; +using Webzine.Entity; +using Webzine.Repository.Contracts; + +namespace Webzine.Repository; + +/// +/// 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; + + /// + /// Init 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(1, "NLog injecté dans DbCommentaireRepository"); + } + + /// + /// Ajoute un commentaire à la base de données. + /// + /// L'objet commentaire à ajouter. + public void Add(Commentaire commentaire) + { + this.logger.LogInformation($"Ajout nouveau commentaire depuis auteur: {commentaire.Auteur}"); + this.context.Commentaires.Add(commentaire); + this.context.SaveChanges(); + this.logger.LogDebug($"Commentaire ajouté avec l'id: {commentaire.IdCommentaire}"); + } + + /// + /// Remonte le nombre de commentaires. + /// + /// Le nombre total de commentaires présents dans la base de données. + public int Count() + { + var count = this.context.Commentaires.Count(); + this.logger.LogDebug($"Compte total des commentaires: {count}"); + return count; + } + + /// + /// Supprime un commentaire de la base de données. + /// + /// L'objet commentaire à supprimer. + public void Delete(Commentaire commentaire) + { + this.logger.LogInformation($"suppression du commentaire avec l'id: {commentaire.IdCommentaire}"); + this.context.Commentaires.Remove(commentaire); + this.context.SaveChanges(); + this.logger.LogDebug($"Commentaire supprimé: {commentaire.IdCommentaire}"); + } + + /// + /// Trouve un commentaire dans la base de données en fonction de son identifiant. + /// + /// L'identifiant du commentaire à trouver. + /// Le commentaire correspondant à l'identifiant fourni, ou null si aucun n'est trouvé. + public Commentaire Find(int idCommentaire) + { + this.logger.LogDebug($"Commentaire cherché avec l'id: {idCommentaire}"); + + // On inclut le titre car il est souvent affiché avec le commentaire (ex: vue Delete) + var commentaire = this.context.Commentaires + .Include(c => c.Titre) + .FirstOrDefault(c => c.IdCommentaire == idCommentaire); + + return commentaire; + } + + /// + /// Trouve tous les commentaires dans la base de données, triés du plus récent au plus ancien. + /// + /// Une collection de tous les commentaires présents. + public IEnumerable FindAll() + { + this.logger.LogDebug("Trouver tout les commentaires"); + + var commentaires = this.context.Commentaires + .Include(c => c.Titre) + .OrderByDescending(c => c.DateCreation) + .ToList(); + + this.logger.LogDebug($"Nombre de tout les commentaires trouvé: {commentaires.Count}"); + return commentaires; + } + + /// + /// Recherche les commentaires dans la base de données avec pagination. + /// + /// L'offset à partir duquel commencer la recherche. + /// Le nombre maximum de commentaires à retourner. + /// Une collection de commentaires paginée. + public IEnumerable FindCommentaires(int offset, int limit) + { + this.logger.LogDebug($"Récherche des commentaires (décalage : {offset}, limite : {limit})"); + + var commentaires = this.context.Commentaires + .Include(c => c.Titre) + .OrderByDescending(c => c.DateCreation) + .Skip(offset) + .Take(limit) + .ToList(); + + this.logger.LogDebug($"{commentaires.Count} commentaires trouvés"); + return commentaires; + } + + /// + /// Trouve tous les commentaires associés à un titre spécifique. + /// + /// L'identifiant du titre. + /// Une collection de commentaires pour ce titre. + public IEnumerable FindByIdTitre(int idTitre) + { + this.logger.LogInformation($"Recherche des commentaires pour l'ID de titre : {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/LocalCommentaireRepository.cs b/Webzine.Repository/LocalCommentaireRepository.cs new file mode 100644 index 0000000..0e48761 --- /dev/null +++ b/Webzine.Repository/LocalCommentaireRepository.cs @@ -0,0 +1,198 @@ +using Microsoft.Extensions.Logging; +using Webzine.Entity; +using Webzine.Repository.Contracts; + +namespace Webzine.Repository; + +/// +/// Classe qui implémente le repository pour les commentaires en utilisant une liste locale comme source de données. +/// +public class LocalCommentaireRepository : ICommentaireRepository +{ + private readonly ILogger logger; + private readonly List commentaires; + + /// + /// Initialise une nouvelle instance du . + /// + /// Le service de journalisation injecté pour suivre les opérations du repository. + /// La liste de commentaires à utiliser comme source de données pour le repository. + public LocalCommentaireRepository(ILogger logger, List commentaires) + { + this.logger = logger; + this.commentaires = commentaires; + this.logger.LogDebug(1, "NLog injecté dans LocalCommentaireRepository"); + } + + /// + public void Add(Commentaire commentaire) + { + try + { + this.logger.LogDebug("Ajout du commentaire rédigé par: {Auteur}", commentaire.Auteur); + + // Simulation d'auto-incrémentation pour l'ID si nécessaire (selon votre logique) + if (commentaire.IdCommentaire == 0 && this.commentaires.Any()) + { + commentaire.IdCommentaire = this.commentaires.Max(c => c.IdCommentaire) + 1; + } + else if (commentaire.IdCommentaire == 0) + { + commentaire.IdCommentaire = 1; + } + + this.commentaires.Add(commentaire); + this.logger.LogDebug("Commentaire ajouté avec succès, ID: {IdCommentaire}", commentaire.IdCommentaire); + } + catch (Exception ex) + { + this.logger.LogError(ex, "Erreur lors de l'ajout du commentaire rédigé par: {Auteur}", commentaire.Auteur); + throw; + } + } + + /// + public int Count() + { + try + { + var count = this.commentaires.Count; + this.logger.LogDebug("Nombre total de commentaires: {Count}", count); + return count; + } + catch (Exception ex) + { + this.logger.LogError(ex, "Erreur lors du comptage des commentaires"); + throw; + } + } + + /// + public void Delete(Commentaire commentaire) + { + try + { + this.logger.LogDebug("Suppression du commentaire ID: {IdCommentaire}", commentaire.IdCommentaire); + + if (!this.commentaires.Contains(commentaire)) + { + this.logger.LogWarning("Le commentaire avec l'identifiant {IdCommentaire} n'existe pas dans la liste.", commentaire.IdCommentaire); + } + + this.commentaires.Remove(commentaire); + this.logger.LogDebug("Commentaire supprimé avec succès, ID: {IdCommentaire}", commentaire.IdCommentaire); + } + catch (Exception ex) + { + this.logger.LogError(ex, "Erreur lors de la suppression du commentaire ID: {IdCommentaire}", commentaire.IdCommentaire); + throw; + } + } + + /// + public Commentaire Find(int idCommentaire) + { + try + { + this.logger.LogDebug("Recherche du commentaire avec ID: {IdCommentaire}", idCommentaire); + + // FirstOrDefault car le contrôleur s'attend potentiellement à un null si non trouvé + Commentaire commentaire = this.commentaires.FirstOrDefault(c => c.IdCommentaire == idCommentaire); + + if (commentaire == null) + { + this.logger.LogWarning("Aucun commentaire trouvé avec l'ID: {IdCommentaire}", idCommentaire); + } + else + { + this.logger.LogDebug("Commentaire trouvé: ID {IdCommentaire} par {Auteur}", commentaire.IdCommentaire, commentaire.Auteur); + } + + return commentaire; + } + catch (Exception ex) + { + this.logger.LogError(ex, "Erreur lors de la recherche du commentaire avec ID: {IdCommentaire}", idCommentaire); + throw; + } + } + + /// + public IEnumerable FindAll() + { + try + { + this.logger.LogDebug("Récupération de tous les commentaires"); + + // on affiche les commentaires du plus récent au plus ancien et la je fais un commentaire super long pour que joséphine le voie et crois que ca va etre plus complexe que ce que c'est vraiment mais non en fait t'as eu peur hein :) + var result = this.commentaires.OrderByDescending(c => c.DateCreation).ToList(); + + this.logger.LogDebug("{Count} commentaires récupérés", result.Count); + return result; + } + catch (Exception ex) + { + this.logger.LogError(ex, "Erreur lors de la récupération de tous les commentaires"); + throw; + } + } + + /// + public IEnumerable FindCommentaires(int offset, int limit) + { + try + { + this.logger.LogDebug("Recherche des commentaires avec offset: {Offset}, limit: {Limit}", offset, limit); + + if (offset < 0 || limit <= 0) + { + this.logger.LogWarning("FindCommentaires appelé avec offset {Offset} ou limit {Limit} invalide.", offset, limit); + return Enumerable.Empty(); + } + + var result = this.commentaires + .OrderByDescending(c => c.DateCreation) + .Skip(offset) + .Take(limit) + .ToList(); + + this.logger.LogDebug("{Count} commentaires trouvés", result.Count); + return result; + } + catch (Exception ex) + { + this.logger.LogError(ex, "Erreur lors de la recherche des commentaires avec offset: {Offset}, limit: {Limit}", offset, limit); + throw; + } + } + + /// + public IEnumerable FindByIdTitre(int idTitre) + { + try + { + this.logger.LogDebug("Recherche des commentaires pour le titre ID: {IdTitre}", idTitre); + + IEnumerable result = this.commentaires + .Where(c => c.Titre != null && c.Titre.IdTitre == idTitre) + .OrderByDescending(c => c.DateCreation) + .ToList(); + + if (!result.Any()) + { + this.logger.LogInformation("Aucun commentaire trouvé pour le titre ID '{IdTitre}'.", idTitre); + } + else + { + this.logger.LogDebug("{Count} commentaires trouvés pour le titre ID '{IdTitre}'", result.Count(), idTitre); + } + + return result; + } + catch (Exception ex) + { + this.logger.LogError(ex, "Erreur lors de la recherche des commentaires pour le titre ID: {IdTitre}", idTitre); + throw; + } + } +} \ No newline at end of file diff --git a/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs b/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs index 236bfb7..dcb8857 100644 --- a/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs +++ b/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Mvc; using Webzine.Entity; -using Webzine.Entity.Fixtures; +using Webzine.Repository.Contracts; using Webzine.WebApplication.Areas.Administration.ViewModels.Commentaire; namespace Webzine.WebApplication.Areas.Administration.Controllers @@ -9,59 +9,48 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers public class CommentaireController : Controller { private readonly ILogger _logger; - private readonly List _commentaires; + private readonly ICommentaireRepository _commentaireRepository; /// /// Initialise une nouvelle instance de la classe . - /// Initialise une nouvelle instance du . - /// Les données sont générées dynamiquement via . + /// Utilise l'injection de dépendances pour récupérer le repository. /// /// Service de journalisation injecté. - public CommentaireController(ILogger logger) + /// Le repository des commentaires injecté. + public CommentaireController(ILogger logger, ICommentaireRepository commentaireRepository) { this._logger = logger; + this._commentaireRepository = commentaireRepository; this._logger.LogInformation("Initialisation du contrôleur CommentaireController."); - - var factory = new DataFactory(); // TODO injecter le factory via DI pour éviter de le recréer à chaque fois - // faire une classe statique - - var _artistes = factory.GenerateArtists(10); - var _styles = factory.GenerateStyles(10); - var _titres = factory.GenerateTitres(30, _artistes, _styles); - - _commentaires = factory.GenerateCommentaires(50, _titres); - - this._logger.LogInformation("Données fictives générées avec succès."); } /// /// Affiche la liste des commentaires dans la vue Index. /// - /// >La vue Index avec le ViewModel contenant la liste des commentaires. + /// La vue Index avec le ViewModel contenant la liste des commentaires. public IActionResult Index() { - // Création de données "bouchon" (mock) pour tester l'affichage + // Récupération des commentaires depuis le repository + var commentaires = this._commentaireRepository.FindAll().ToList(); // Initialisation du ViewModel var viewModel = new CommentaireViewModel { - Commentaires = _commentaires + Commentaires = commentaires }; return View(viewModel); } - /// - /// Affiche la vue de confirmation de suppression d'un commentaire, en récupérant les détails du commentaire à supprimer à partir de l'identifiant fourni. + /// Affiche la vue de confirmation de suppression d'un commentaire, en récupérant les détails à partir de l'identifiant fourni. /// /// L'identifiant du commentaire à supprimer. - /// La vue de confirmation de suppression avec le ViewModel contenant les détails du commentaire à supprimer, ou une redirection vers l'index si le commentaire n'existe pas. + /// La vue de confirmation de suppression avec le ViewModel contenant les détails, ou une redirection vers l'index si introuvable. public IActionResult Delete(int id) { - var commentaire = _commentaires - .FirstOrDefault(c => c.IdCommentaire == id); + var commentaire = this._commentaireRepository.Find(id); if (commentaire == null) { @@ -80,5 +69,27 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers return View(vm); } + + /// + /// Effectue la suppression réelle du commentaire (accessible via un simple lien sans HttpPost). + /// + /// L'identifiant du commentaire à supprimer. + /// Redirection vers la vue Index après suppression. + public IActionResult DeleteConfirm(int id) + { + var commentaire = this._commentaireRepository.Find(id); + + if (commentaire != null) + { + this._commentaireRepository.Delete(commentaire); + this._logger.LogInformation("Commentaire {Id} supprimé avec succès.", id); + } + else + { + this._logger.LogWarning("Échec de la suppression : Commentaire avec ID {Id} introuvable.", id); + } + + return RedirectToAction("Index"); + } } } \ No newline at end of file diff --git a/Webzine.WebApplication/Controllers/ArtisteController.cs b/Webzine.WebApplication/Controllers/ArtisteController.cs index 68b2443..b63f140 100644 --- a/Webzine.WebApplication/Controllers/ArtisteController.cs +++ b/Webzine.WebApplication/Controllers/ArtisteController.cs @@ -31,7 +31,7 @@ [HttpGet("/artiste/{nom}")] public IActionResult Index(string nom) { - this.logger.LogInformation("Tentative d'accès à l'artiste avec le nom : {NomArtiste}", nom); + this._logger.LogInformation("Tentative d'accès à l'artiste avec le nom : {NomArtiste}", nom); if (string.IsNullOrEmpty(nom)) { diff --git a/Webzine.WebApplication/Program.cs b/Webzine.WebApplication/Program.cs index 1cd46cf..3e224ca 100644 --- a/Webzine.WebApplication/Program.cs +++ b/Webzine.WebApplication/Program.cs @@ -35,7 +35,7 @@ try builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); - //builder.Services.AddScoped(); + builder.Services.AddScoped(); } else { From b7f06c8e8b7cc72ea833b94abbdb2869b2ce3acb Mon Sep 17 00:00:00 2001 From: "b.nodon" Date: Fri, 27 Mar 2026 09:11:03 +0100 Subject: [PATCH 2/6] fix --- .../Areas/Administration/Controllers/CommentaireController.cs | 2 +- Webzine.WebApplication/Controllers/ArtisteController.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs b/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs index 9b7708c..dcb8857 100644 --- a/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs +++ b/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs @@ -54,7 +54,7 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers if (commentaire == null) { - this.logger.LogWarning("Commentaire avec ID {Id} introuvable pour suppression.", id); + this._logger.LogWarning("Commentaire avec ID {Id} introuvable pour suppression.", id); return RedirectToAction("Index"); } diff --git a/Webzine.WebApplication/Controllers/ArtisteController.cs b/Webzine.WebApplication/Controllers/ArtisteController.cs index 7563346..6f395d2 100644 --- a/Webzine.WebApplication/Controllers/ArtisteController.cs +++ b/Webzine.WebApplication/Controllers/ArtisteController.cs @@ -31,7 +31,7 @@ [HttpGet("/artiste/{nom}")] public IActionResult Index(string nom) { - this._logger.LogInformation("Tentative d'accès à l'artiste avec le nom : {NomArtiste}", nom); + this.logger.LogInformation("Tentative d'accès à l'artiste avec le nom : {NomArtiste}", nom); if (string.IsNullOrEmpty(nom)) { From a3db0059ab0255f58c61bd183ff90994d0f8ad38 Mon Sep 17 00:00:00 2001 From: "b.nodon" Date: Fri, 27 Mar 2026 10:21:20 +0100 Subject: [PATCH 3/6] =?UTF-8?q?#123=20refactor:=20refonte=20de=20DbComment?= =?UTF-8?q?aireRepository=20et=20LocalCommentaireRepository=20en=20prenant?= =?UTF-8?q?=20comme=20model=20Jos=C3=A9phine:=20=20-=20Nettoyage=20du=20co?= =?UTF-8?q?de=20=20-=20ajout=20des=20=20=20-=20InMemoryDataSt?= =?UTF-8?q?ore=20pour=20le=20mode=20local?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Webzine.Repository/DbCommentaireRepository.cs | 122 ++++++----- .../LocalCommentaireRepository.cs | 204 +++++------------- 2 files changed, 117 insertions(+), 209 deletions(-) diff --git a/Webzine.Repository/DbCommentaireRepository.cs b/Webzine.Repository/DbCommentaireRepository.cs index e61b7be..00f6967 100644 --- a/Webzine.Repository/DbCommentaireRepository.cs +++ b/Webzine.Repository/DbCommentaireRepository.cs @@ -15,7 +15,7 @@ public class DbCommentaireRepository : ICommentaireRepository private readonly WebzineDbContext context; /// - /// Init de . + /// Initialisation de . /// /// Le service de journalisation injecté pour suivre les opérations du repository. /// Le contexte de base de données injecté. @@ -23,87 +23,99 @@ public class DbCommentaireRepository : ICommentaireRepository { this.logger = logger; this.context = context; - this.logger.LogDebug(1, "NLog injecté dans DbCommentaireRepository"); + this.logger.LogDebug("NLog injecté dans DbCommentaireRepository"); } - /// - /// Ajoute un commentaire à la base de données. - /// - /// L'objet commentaire à ajouter. + /// public void Add(Commentaire commentaire) { - this.logger.LogInformation($"Ajout nouveau commentaire depuis auteur: {commentaire.Auteur}"); - this.context.Commentaires.Add(commentaire); - this.context.SaveChanges(); - this.logger.LogDebug($"Commentaire ajouté avec l'id: {commentaire.IdCommentaire}"); + try + { + if (commentaire == null) + { + throw new ArgumentNullException(nameof(commentaire), "Le commentaire à ajouter ne peut pas être null."); + } + + this.logger.LogInformation("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); + } } - /// - /// Remonte le nombre de commentaires. - /// - /// Le nombre total de commentaires présents dans la base de données. + /// + 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.LogInformation("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}"); + this.logger.LogDebug("Compte total des commentaires : {Count}", count); return count; } - /// - /// Supprime un commentaire de la base de données. - /// - /// L'objet commentaire à supprimer. - public void Delete(Commentaire commentaire) - { - this.logger.LogInformation($"suppression du commentaire avec l'id: {commentaire.IdCommentaire}"); - this.context.Commentaires.Remove(commentaire); - this.context.SaveChanges(); - this.logger.LogDebug($"Commentaire supprimé: {commentaire.IdCommentaire}"); - } - - /// - /// Trouve un commentaire dans la base de données en fonction de son identifiant. - /// - /// L'identifiant du commentaire à trouver. - /// Le commentaire correspondant à l'identifiant fourni, ou null si aucun n'est trouvé. + /// public Commentaire Find(int idCommentaire) { - this.logger.LogDebug($"Commentaire cherché avec l'id: {idCommentaire}"); + this.logger.LogDebug("Recherche du commentaire avec l'id : {Id}", idCommentaire); - // On inclut le titre car il est souvent affiché avec le commentaire (ex: vue Delete) - var commentaire = this.context.Commentaires + // 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); - - return commentaire; } - /// - /// Trouve tous les commentaires dans la base de données, triés du plus récent au plus ancien. - /// - /// Une collection de tous les commentaires présents. + /// public IEnumerable FindAll() { - this.logger.LogDebug("Trouver tout les commentaires"); + 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 tout les commentaires trouvé: {commentaires.Count}"); + this.logger.LogDebug("Nombre de commentaires trouvés : {Count}", commentaires.Count); return commentaires; } - /// - /// Recherche les commentaires dans la base de données avec pagination. - /// - /// L'offset à partir duquel commencer la recherche. - /// Le nombre maximum de commentaires à retourner. - /// Une collection de commentaires paginée. + /// public IEnumerable FindCommentaires(int offset, int limit) { - this.logger.LogDebug($"Récherche des commentaires (décalage : {offset}, limite : {limit})"); + this.logger.LogDebug("Recherche paginée des commentaires (offset : {Offset}, limit : {Limit})", offset, limit); var commentaires = this.context.Commentaires .Include(c => c.Titre) @@ -112,18 +124,14 @@ public class DbCommentaireRepository : ICommentaireRepository .Take(limit) .ToList(); - this.logger.LogDebug($"{commentaires.Count} commentaires trouvés"); + this.logger.LogDebug("{Count} commentaires trouvés pour cette page", commentaires.Count); return commentaires; } - /// - /// Trouve tous les commentaires associés à un titre spécifique. - /// - /// L'identifiant du titre. - /// Une collection de commentaires pour ce titre. + /// public IEnumerable FindByIdTitre(int idTitre) { - this.logger.LogInformation($"Recherche des commentaires pour l'ID de titre : {idTitre}"); + this.logger.LogInformation("Recherche des commentaires pour le titre ID : {IdTitre}", idTitre); var commentaires = this.context.Commentaires .Where(c => c.Titre.IdTitre == idTitre) diff --git a/Webzine.Repository/LocalCommentaireRepository.cs b/Webzine.Repository/LocalCommentaireRepository.cs index 0e48761..be4f3e2 100644 --- a/Webzine.Repository/LocalCommentaireRepository.cs +++ b/Webzine.Repository/LocalCommentaireRepository.cs @@ -1,198 +1,98 @@ -using Microsoft.Extensions.Logging; -using Webzine.Entity; -using Webzine.Repository.Contracts; +// +// Copyright (c) PlaceholderCompany. All rights reserved. +// -namespace Webzine.Repository; - -/// -/// Classe qui implémente le repository pour les commentaires en utilisant une liste locale comme source de données. -/// -public class LocalCommentaireRepository : ICommentaireRepository +namespace Webzine.Repository { - private readonly ILogger logger; - private readonly List commentaires; + using System; + using System.Collections.Generic; + using System.Linq; + using Microsoft.Extensions.Logging; + using Webzine.Entity; + using Webzine.Repository.Contracts; /// - /// Initialise une nouvelle instance du . + /// Initialise une classe qui implémente l'interface pour gérer les opérations liées aux commentaires. + /// Utilise en injection de dépendances. /// - /// Le service de journalisation injecté pour suivre les opérations du repository. - /// La liste de commentaires à utiliser comme source de données pour le repository. - public LocalCommentaireRepository(ILogger logger, List commentaires) + public class LocalCommentaireRepository : ICommentaireRepository { - this.logger = logger; - this.commentaires = commentaires; - this.logger.LogDebug(1, "NLog injecté dans LocalCommentaireRepository"); - } + private readonly ILogger logger; + private readonly InMemoryDataStore dataStore; - /// - public void Add(Commentaire commentaire) - { - try + /// + /// 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. + /// + /// 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. + public LocalCommentaireRepository(InMemoryDataStore dataStore, ILogger logger) { - this.logger.LogDebug("Ajout du commentaire rédigé par: {Auteur}", commentaire.Auteur); - - // Simulation d'auto-incrémentation pour l'ID si nécessaire (selon votre logique) - if (commentaire.IdCommentaire == 0 && this.commentaires.Any()) - { - commentaire.IdCommentaire = this.commentaires.Max(c => c.IdCommentaire) + 1; - } - else if (commentaire.IdCommentaire == 0) - { - commentaire.IdCommentaire = 1; - } - - this.commentaires.Add(commentaire); - this.logger.LogDebug("Commentaire ajouté avec succès, ID: {IdCommentaire}", commentaire.IdCommentaire); + this.logger = logger; + this.dataStore = dataStore; } - catch (Exception ex) + + /// + public void Add(Commentaire commentaire) { - this.logger.LogError(ex, "Erreur lors de l'ajout du commentaire rédigé par: {Auteur}", commentaire.Auteur); - throw; + throw new NotSupportedException("Mode Local"); } - } - /// - public int Count() - { - try + /// + public void Delete(Commentaire commentaire) { - var count = this.commentaires.Count; - this.logger.LogDebug("Nombre total de commentaires: {Count}", count); - return count; + throw new NotSupportedException("Mode Local"); } - catch (Exception ex) + + /// + public int Count() { - this.logger.LogError(ex, "Erreur lors du comptage des commentaires"); - throw; + return this.dataStore.Commentaires.Count; } - } - /// - public void Delete(Commentaire commentaire) - { - try + /// + public Commentaire Find(int idCommentaire) { - this.logger.LogDebug("Suppression du commentaire ID: {IdCommentaire}", commentaire.IdCommentaire); - - if (!this.commentaires.Contains(commentaire)) - { - this.logger.LogWarning("Le commentaire avec l'identifiant {IdCommentaire} n'existe pas dans la liste.", commentaire.IdCommentaire); - } - - this.commentaires.Remove(commentaire); - this.logger.LogDebug("Commentaire supprimé avec succès, ID: {IdCommentaire}", commentaire.IdCommentaire); - } - catch (Exception ex) - { - this.logger.LogError(ex, "Erreur lors de la suppression du commentaire ID: {IdCommentaire}", commentaire.IdCommentaire); - throw; - } - } - - /// - public Commentaire Find(int idCommentaire) - { - try - { - this.logger.LogDebug("Recherche du commentaire avec ID: {IdCommentaire}", idCommentaire); - - // FirstOrDefault car le contrôleur s'attend potentiellement à un null si non trouvé - Commentaire commentaire = this.commentaires.FirstOrDefault(c => c.IdCommentaire == idCommentaire); - + + var commentaire = this.dataStore.Commentaires.FirstOrDefault(c => c.IdCommentaire == idCommentaire); if (commentaire == null) { - this.logger.LogWarning("Aucun commentaire trouvé avec l'ID: {IdCommentaire}", idCommentaire); - } - else - { - this.logger.LogDebug("Commentaire trouvé: ID {IdCommentaire} par {Auteur}", commentaire.IdCommentaire, commentaire.Auteur); + return new Commentaire(); } return commentaire; } - catch (Exception ex) + + /// + public IEnumerable FindAll() { - this.logger.LogError(ex, "Erreur lors de la recherche du commentaire avec ID: {IdCommentaire}", idCommentaire); - throw; + return this.dataStore.Commentaires + .OrderByDescending(c => c.DateCreation) + .ToList(); } - } - /// - public IEnumerable FindAll() - { - try + /// + public IEnumerable FindCommentaires(int offset, int limit) { - this.logger.LogDebug("Récupération de tous les commentaires"); - - // on affiche les commentaires du plus récent au plus ancien et la je fais un commentaire super long pour que joséphine le voie et crois que ca va etre plus complexe que ce que c'est vraiment mais non en fait t'as eu peur hein :) - var result = this.commentaires.OrderByDescending(c => c.DateCreation).ToList(); - - this.logger.LogDebug("{Count} commentaires récupérés", result.Count); - return result; - } - catch (Exception ex) - { - this.logger.LogError(ex, "Erreur lors de la récupération de tous les commentaires"); - throw; - } - } - - /// - public IEnumerable FindCommentaires(int offset, int limit) - { - try - { - this.logger.LogDebug("Recherche des commentaires avec offset: {Offset}, limit: {Limit}", offset, limit); - if (offset < 0 || limit <= 0) { - this.logger.LogWarning("FindCommentaires appelé avec offset {Offset} ou limit {Limit} invalide.", offset, limit); return Enumerable.Empty(); } - var result = this.commentaires + return this.dataStore.Commentaires .OrderByDescending(c => c.DateCreation) .Skip(offset) .Take(limit) .ToList(); - - this.logger.LogDebug("{Count} commentaires trouvés", result.Count); - return result; } - catch (Exception ex) - { - this.logger.LogError(ex, "Erreur lors de la recherche des commentaires avec offset: {Offset}, limit: {Limit}", offset, limit); - throw; - } - } - /// - public IEnumerable FindByIdTitre(int idTitre) - { - try + /// + public IEnumerable FindByIdTitre(int idTitre) { - this.logger.LogDebug("Recherche des commentaires pour le titre ID: {IdTitre}", idTitre); - - IEnumerable result = this.commentaires + return this.dataStore.Commentaires .Where(c => c.Titre != null && c.Titre.IdTitre == idTitre) .OrderByDescending(c => c.DateCreation) .ToList(); - - if (!result.Any()) - { - this.logger.LogInformation("Aucun commentaire trouvé pour le titre ID '{IdTitre}'.", idTitre); - } - else - { - this.logger.LogDebug("{Count} commentaires trouvés pour le titre ID '{IdTitre}'", result.Count(), idTitre); - } - - return result; - } - catch (Exception ex) - { - this.logger.LogError(ex, "Erreur lors de la recherche des commentaires pour le titre ID: {IdTitre}", idTitre); - throw; } } } \ No newline at end of file From b53fa189a595e3cf9ac1b4f4e41ac7eff5de932e Mon Sep 17 00:00:00 2001 From: "b.nodon" Date: Fri, 27 Mar 2026 11:22:52 +0100 Subject: [PATCH 4/6] # 123 fix 1 --- Webzine.Repository/DbCommentaireRepository.cs | 11 +++------ .../LocalCommentaireRepository.cs | 1 - .../Controllers/CommentaireController.cs | 24 +++++++++---------- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/Webzine.Repository/DbCommentaireRepository.cs b/Webzine.Repository/DbCommentaireRepository.cs index 00f6967..d87696b 100644 --- a/Webzine.Repository/DbCommentaireRepository.cs +++ b/Webzine.Repository/DbCommentaireRepository.cs @@ -31,12 +31,7 @@ public class DbCommentaireRepository : ICommentaireRepository { try { - if (commentaire == null) - { - throw new ArgumentNullException(nameof(commentaire), "Le commentaire à ajouter ne peut pas être null."); - } - - this.logger.LogInformation("Ajout d'un nouveau commentaire de l'auteur : {Auteur}", commentaire.Auteur); + 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); @@ -65,7 +60,7 @@ public class DbCommentaireRepository : ICommentaireRepository this.context.Commentaires.Remove(commentaire); this.context.SaveChanges(); - this.logger.LogInformation("Le commentaire {IdCommentaire} a bien été supprimé", commentaire.IdCommentaire); + this.logger.LogDebug("Le commentaire {IdCommentaire} a bien été supprimé", commentaire.IdCommentaire); } catch (DbUpdateException dbex) { @@ -131,7 +126,7 @@ public class DbCommentaireRepository : ICommentaireRepository /// public IEnumerable FindByIdTitre(int idTitre) { - this.logger.LogInformation("Recherche des commentaires pour le titre ID : {IdTitre}", idTitre); + this.logger.LogDebug("Recherche des commentaires pour le titre ID : {IdTitre}", idTitre); var commentaires = this.context.Commentaires .Where(c => c.Titre.IdTitre == idTitre) diff --git a/Webzine.Repository/LocalCommentaireRepository.cs b/Webzine.Repository/LocalCommentaireRepository.cs index be4f3e2..a556346 100644 --- a/Webzine.Repository/LocalCommentaireRepository.cs +++ b/Webzine.Repository/LocalCommentaireRepository.cs @@ -53,7 +53,6 @@ namespace Webzine.Repository /// public Commentaire Find(int idCommentaire) { - var commentaire = this.dataStore.Commentaires.FirstOrDefault(c => c.IdCommentaire == idCommentaire); if (commentaire == null) { diff --git a/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs b/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs index dcb8857..72bb706 100644 --- a/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs +++ b/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs @@ -8,8 +8,8 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers [Area("Administration")] public class CommentaireController : Controller { - private readonly ILogger _logger; - private readonly ICommentaireRepository _commentaireRepository; + private readonly ILogger logger; + private readonly ICommentaireRepository commentaireRepository; /// /// Initialise une nouvelle instance de la classe . @@ -19,10 +19,10 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers /// Le repository des commentaires injecté. public CommentaireController(ILogger logger, ICommentaireRepository commentaireRepository) { - this._logger = logger; - this._commentaireRepository = commentaireRepository; + this.logger = logger; + this.commentaireRepository = commentaireRepository; - this._logger.LogInformation("Initialisation du contrôleur CommentaireController."); + this.logger.LogInformation("Initialisation du contrôleur CommentaireController."); } /// @@ -32,7 +32,7 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers public IActionResult Index() { // Récupération des commentaires depuis le repository - var commentaires = this._commentaireRepository.FindAll().ToList(); + var commentaires = this.commentaireRepository.FindAll().ToList(); // Initialisation du ViewModel var viewModel = new CommentaireViewModel @@ -50,11 +50,11 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers /// La vue de confirmation de suppression avec le ViewModel contenant les détails, ou une redirection vers l'index si introuvable. public IActionResult Delete(int id) { - var commentaire = this._commentaireRepository.Find(id); + var commentaire = this.commentaireRepository.Find(id); if (commentaire == null) { - this._logger.LogWarning("Commentaire avec ID {Id} introuvable pour suppression.", id); + this.logger.LogWarning("Commentaire avec ID {Id} introuvable pour suppression.", id); return RedirectToAction("Index"); } @@ -77,16 +77,16 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers /// Redirection vers la vue Index après suppression. public IActionResult DeleteConfirm(int id) { - var commentaire = this._commentaireRepository.Find(id); + var commentaire = this.commentaireRepository.Find(id); if (commentaire != null) { - this._commentaireRepository.Delete(commentaire); - this._logger.LogInformation("Commentaire {Id} supprimé avec succès.", id); + this.commentaireRepository.Delete(commentaire); + this.logger.LogInformation("Commentaire {Id} supprimé avec succès.", id); } else { - this._logger.LogWarning("Échec de la suppression : Commentaire avec ID {Id} introuvable.", id); + this.logger.LogWarning("Échec de la suppression : Commentaire avec ID {Id} introuvable.", id); } return RedirectToAction("Index"); From ce7acdba9ba5ed95a2b08392d7667f4c67568b56 Mon Sep 17 00:00:00 2001 From: "b.nodon" Date: Fri, 27 Mar 2026 11:27:56 +0100 Subject: [PATCH 5/6] =?UTF-8?q?#123=20fix:=20.Tolist()=20enlev=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Areas/Administration/Controllers/CommentaireController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs b/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs index 72bb706..a1734bd 100644 --- a/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs +++ b/Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs @@ -32,7 +32,7 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers public IActionResult Index() { // Récupération des commentaires depuis le repository - var commentaires = this.commentaireRepository.FindAll().ToList(); + var commentaires = this.commentaireRepository.FindAll(); // Initialisation du ViewModel var viewModel = new CommentaireViewModel From db822e3ac57680c300cb501e44ac18fb262dd630 Mon Sep 17 00:00:00 2001 From: Loic Masi Date: Fri, 27 Mar 2026 11:28:10 +0100 Subject: [PATCH 6/6] =?UTF-8?q?#106=20Mis=20en=20place=20du=20n=C3=A9cessa?= =?UTF-8?q?ire=20pour=20Postgresql=20et=20configuration=20"UseDatabase"=20?= =?UTF-8?q?et=20"IsSQLite"=20op=C3=A9rationnel.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Webzine.EntitiesContext.csproj | 1 + Webzine.EntitiesContext/WebzineDbContext.cs | 8 ++++ Webzine.Entity/Fixtures/SeedDataLocal.cs | 6 +-- Webzine.WebApplication/Program.cs | 43 ++++++++++++++----- Webzine.WebApplication/appsettings.json | 7 +-- 5 files changed, 49 insertions(+), 16 deletions(-) diff --git a/Webzine.EntitiesContext/Webzine.EntitiesContext.csproj b/Webzine.EntitiesContext/Webzine.EntitiesContext.csproj index b5c89ad..d7e7ae6 100644 --- a/Webzine.EntitiesContext/Webzine.EntitiesContext.csproj +++ b/Webzine.EntitiesContext/Webzine.EntitiesContext.csproj @@ -11,6 +11,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Webzine.EntitiesContext/WebzineDbContext.cs b/Webzine.EntitiesContext/WebzineDbContext.cs index 2ec5aa1..0bd2b51 100644 --- a/Webzine.EntitiesContext/WebzineDbContext.cs +++ b/Webzine.EntitiesContext/WebzineDbContext.cs @@ -43,6 +43,8 @@ namespace Webzine.EntitiesContext modelBuilder.Entity(entity => { + entity.ToTable("Artistes"); + entity.HasKey(a => a.IdArtiste) .HasName("PK_Artiste"); @@ -54,12 +56,16 @@ namespace Webzine.EntitiesContext modelBuilder.Entity