From ec07fa692152e48692e3b7c0a489c74499b8a193 Mon Sep 17 00:00:00 2001 From: "josephine.vetu" Date: Wed, 25 Mar 2026 16:57:19 +0100 Subject: [PATCH 1/3] =?UTF-8?q?D=C3=A9placement=20du=20linq=20pour=20group?= =?UTF-8?q?er=20les=20albums=20par=20titre=20de=20la=20vue=20=C3=A0=20un?= =?UTF-8?q?=20ViewModel.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Artiste/ArtisteDetailsViewModel.cs | 15 ++++++++++++ .../Views/Artiste/Index.cshtml | 23 +++++++++---------- 2 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 Webzine.WebApplication/ViewModels/Artiste/ArtisteDetailsViewModel.cs diff --git a/Webzine.WebApplication/ViewModels/Artiste/ArtisteDetailsViewModel.cs b/Webzine.WebApplication/ViewModels/Artiste/ArtisteDetailsViewModel.cs new file mode 100644 index 0000000..2a53603 --- /dev/null +++ b/Webzine.WebApplication/ViewModels/Artiste/ArtisteDetailsViewModel.cs @@ -0,0 +1,15 @@ +namespace Webzine.WebApplication.ViewModels.Artiste +{ + using Webzine.Entity; + public class ArtisteDetailsViewModel + { + public int IdArtiste { get; set; } + public string Nom { get; set; } = string.Empty; + public string Biographie { get; set; } = string.Empty; + + // On stocke les titres déjà groupés et triés + // La clé est le nom de l'album, la valeur est la liste des titres + public IEnumerable> AlbumsGroupes { get; set; } + = Enumerable.Empty>(); + } +} diff --git a/Webzine.WebApplication/Views/Artiste/Index.cshtml b/Webzine.WebApplication/Views/Artiste/Index.cshtml index f719270..3b4cdf9 100644 --- a/Webzine.WebApplication/Views/Artiste/Index.cshtml +++ b/Webzine.WebApplication/Views/Artiste/Index.cshtml @@ -1,4 +1,4 @@ -@model Webzine.Entity.Artiste +@model Webzine.WebApplication.ViewModels.Artiste.ArtisteDetailsViewModel; @{ ViewData["Title"] = "Artiste"; @@ -8,22 +8,20 @@

@Model.Nom

-
+

@Model.Biographie

Albums

-
+
- @* On groupe les titres par nom d'album *@ - @{ - var albumsGroupes = Model.Titres - .OrderBy(t => t.Libelle) // Trie les titres par ordre alphabétique au sein de chaque groupe futur - .GroupBy(t => t.Album) // Groupe par nom d'album - .OrderBy(g => g.Key); // Trie les albums par ordre alphabétique (la clé du groupe) - } - - @foreach (var groupe in albumsGroupes) + @if (!Model.AlbumsGroupes.Any()) +{ +

Cet artiste n'a pas encore de titres répertoriés.

+} +else +{ + @foreach (var groupe in Model.AlbumsGroupes) { // On récupère le premier titre du groupe pour afficher l'image de l'album var premierTitre = groupe.First(); @@ -70,4 +68,5 @@
} +} \ No newline at end of file From b334b1f63d797ec26cb1211ed0133abd4f3ef1cb Mon Sep 17 00:00:00 2001 From: "josephine.vetu" Date: Thu, 26 Mar 2026 11:08:26 +0100 Subject: [PATCH 2/3] =?UTF-8?q?#84=20Impl=C3=A9mentation=20du=20repository?= =?UTF-8?q?=20Artiste.=20Le=20controler=20Artiste=20pour=20la=20partie=20u?= =?UTF-8?q?tilisateur=20et=20la=20partie=20admin.=20Ajout=20de=20commentai?= =?UTF-8?q?res=20sur=20toutes=20les=20m=C3=A9thodes.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IArtisteRepository.cs | 45 +++++++-- Webzine.Repository/LocalArtisteRepository.cs | 92 +++++++++++++++++++ Webzine.Repository/Webzine.Repository.csproj | 1 + .../Controllers/ArtisteController.cs | 20 ++-- .../Controllers/ArtisteController.cs | 36 ++++++-- Webzine.WebApplication/Program.cs | 1 + .../Webzine.WebApplication.csproj | 1 - 7 files changed, 169 insertions(+), 27 deletions(-) create mode 100644 Webzine.Repository/LocalArtisteRepository.cs diff --git a/Webzine.Repository.Contracts/IArtisteRepository.cs b/Webzine.Repository.Contracts/IArtisteRepository.cs index 1e4a369..ea99b20 100644 --- a/Webzine.Repository.Contracts/IArtisteRepository.cs +++ b/Webzine.Repository.Contracts/IArtisteRepository.cs @@ -1,17 +1,46 @@ -// using Webzine.Entity; - -namespace Webzine.Repository.Contracts +namespace Webzine.Repository.Contracts { + using Webzine.Entity; + /// + /// Défini une interface pour gérer les opérations de base de données liées aux artistes. + /// public interface IArtisteRepository { - // void Add(Artiste artiste); + /// + /// Ajoute un nouvel artiste. + /// + /// L'artiste à ajouter à la collection. Ne peut pas être null. + void Add(Artiste artiste); - // void Delete(Artiste artiste); + /// + /// Supprime un artiste. + /// + /// L'artiste à supprimer. + void Delete(Artiste artiste); - // Artiste Find(int id); + /// + /// Récupère un artiste par son identifiant unique. Si aucun artiste n'est trouvé, retourne null. + /// + /// L'identifiant de l'artiste. + /// + Artiste Find(int id); + /// + /// Récupère un artiste par son nom. Si aucun artiste n'est trouvé, retourne null. + /// + /// Le nom de l'artiste. + /// L'artiste recherché ou null. + Artiste FindByName(string name); - // IEnumerable FindAll(); + /// + /// Récupère tous les artistes disponibles dans la collection. Si aucun artiste n'est trouvé, retourne une collection vide. + /// + /// Retourne une collection d'artistes. + IEnumerable FindAll(); - // void Update(Artiste artiste); + /// + /// Met à jour les informations d'un artiste existant dans la collection. + /// + /// L'artiste à mettre à jour. + void Update(Artiste artiste); } } \ No newline at end of file diff --git a/Webzine.Repository/LocalArtisteRepository.cs b/Webzine.Repository/LocalArtisteRepository.cs new file mode 100644 index 0000000..036e183 --- /dev/null +++ b/Webzine.Repository/LocalArtisteRepository.cs @@ -0,0 +1,92 @@ +namespace Webzine.Repository +{ + using Microsoft.EntityFrameworkCore; + using Webzine.EntitiesContext; + using Webzine.Entity; + 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. + /// + public class LocalArtisteRepository : IArtisteRepository + { + /// + /// Contexte de la base de données utilisé pour accéder aux entités et effectuer des opérations de persistance. Injecté via le constructeur. + /// + private WebzineDbContext _context; + + /// + /// 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. + public LocalArtisteRepository(WebzineDbContext context) + { + this._context = context; + } + + /// + /// Méthode pour ajouter un nouvel artiste à la base de données. + /// + /// L'artiste à ajouter. Ne peut pas être null. + public void Add(Artiste artiste) + { + this._context.Artistes.Add(artiste); + this._context.SaveChanges(); + } + + /// + /// Méthode pour supprimer un artiste de la base de données. + /// + /// L'artiste à supprimer. + public void Delete(Artiste artiste) + { + this._context.Artistes.Remove(artiste); + this._context.SaveChanges(); + } + + /// + /// Récupère un artiste avec son id. + /// + /// L'id de l'artiste. + /// L'artiste correspondant à l'identifiant fourni, ou null si aucun artiste trouvé. + public Artiste Find(int id) + { + return this._context.Artistes + .Include(a => a.Titres) + .FirstOrDefault(a => a.IdArtiste == id); + } + + /// + /// Récupère un artiste avec son nom. + /// + /// Nom de l'artiste. + /// L'artiste correspondant à l'identifiant fourni, ou null si aucun artiste trouvé. + public Artiste FindByName(string nom) + { + return this._context.Artistes + .Include(a => a.Titres) + .FirstOrDefault(a => a.Nom == nom); + } + + /// + /// Retourne tous les artistes présents dans la base de données. + /// + /// La liste des artistes. + public IEnumerable FindAll() + { + return this._context.Artistes.ToList(); + } + + /// + /// Mets à jour un artiste existant dans la base de données avec les nouvelles informations fournies dans l'objet artiste. + /// + /// L'artiste à mettre à jour. + public void Update(Artiste artiste) + { + this._context.Artistes.Update(artiste); + this._context.SaveChanges(); + } + } +} \ No newline at end of file diff --git a/Webzine.Repository/Webzine.Repository.csproj b/Webzine.Repository/Webzine.Repository.csproj index 364f60a..afa21ab 100644 --- a/Webzine.Repository/Webzine.Repository.csproj +++ b/Webzine.Repository/Webzine.Repository.csproj @@ -24,6 +24,7 @@ + diff --git a/Webzine.WebApplication/Areas/Administration/Controllers/ArtisteController.cs b/Webzine.WebApplication/Areas/Administration/Controllers/ArtisteController.cs index d059092..bca6cfd 100644 --- a/Webzine.WebApplication/Areas/Administration/Controllers/ArtisteController.cs +++ b/Webzine.WebApplication/Areas/Administration/Controllers/ArtisteController.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Mvc; using Webzine.Entity; using Webzine.Entity.Fixtures; +using Webzine.Repository.Contracts; using Webzine.WebApplication.Areas.Administration.ViewModels.Artiste; namespace Webzine.WebApplication.Areas.Administration.Controllers; @@ -10,16 +11,17 @@ public class ArtisteController : Controller { // Injection du logger via le constructeur private readonly ILogger _logger; - private readonly List _artistes; + private readonly IArtisteRepository _artisteRepository; + private readonly List _artistes = new List(); - public ArtisteController(ILogger logger) + public ArtisteController(ILogger logger, + IArtisteRepository artisteRepository) { this._logger = logger; this._logger.LogDebug(1, "initialisation du ArtisteController d'administration"); - var factory = new DataFactory(); - - _artistes = factory.GenerateArtists(10); + this._artisteRepository = artisteRepository; + this._artistes.AddRange(this._artisteRepository.FindAll()); } /// @@ -30,7 +32,9 @@ public class ArtisteController : Controller public IActionResult Index() { - var _artistes_ordre = _artistes.OrderBy(t => t.Nom).ToList(); + this._logger.LogInformation("ID 1", this._artisteRepository.Find(1)); + var _artistes_ordre = this._artistes.OrderBy(t => t.Nom).ToList(); + this._logger.LogInformation("LISTE ARTISTES ORDRE", _artistes_ordre); this._logger.LogInformation("Initialisation du contrôleur TitreController pour l'Administration."); @@ -60,7 +64,7 @@ public class ArtisteController : Controller /// Redirection. public IActionResult Edit(int id) { - var artiste = _artistes.First(t => t.IdArtiste == id); + var artiste = this._artistes.First(t => t.IdArtiste == id); var model = new AdminArtisteForm { @@ -79,7 +83,7 @@ public class ArtisteController : Controller /// Redirection.> public IActionResult Delete(int id) { - var artiste = _artistes.First(t => t.IdArtiste == id); + var artiste = this._artistes.First(t => t.IdArtiste == id); var model = new AdminArtisteForm { Id = id, diff --git a/Webzine.WebApplication/Controllers/ArtisteController.cs b/Webzine.WebApplication/Controllers/ArtisteController.cs index 35a2cbc..b63f140 100644 --- a/Webzine.WebApplication/Controllers/ArtisteController.cs +++ b/Webzine.WebApplication/Controllers/ArtisteController.cs @@ -1,21 +1,26 @@ -using Microsoft.AspNetCore.Mvc; -using Webzine.Entity.Fixtures; - -namespace Webzine.WebApplication.Controllers +namespace Webzine.WebApplication.Controllers { + using Microsoft.AspNetCore.Mvc; + using Webzine.Entity.Fixtures; + using Webzine.Repository.Contracts; + using Webzine.WebApplication.ViewModels.Artiste; + public class ArtisteController : Controller { // Injection du logger via le constructeur private readonly ILogger _logger; + private readonly IArtisteRepository _artisteRepository; /// - /// Initialise une nouvelle instance du avec un service de journalisation injecté. + /// Initialise une nouvelle instance du . avec un service de journalisation injecté. /// /// Service de journalisation injecté pour enregistrer les événements et les erreurs. - public ArtisteController(ILogger logger) + public ArtisteController(ILogger logger, + IArtisteRepository artisteRepository) { this._logger = logger; - this._logger.LogDebug(1, "initialisation du ArtisteController"); + this._logger.LogDebug("Initialisation du ArtisteController"); + this._artisteRepository = artisteRepository; } /// @@ -31,7 +36,7 @@ namespace Webzine.WebApplication.Controllers if (string.IsNullOrEmpty(nom)) { this._logger.LogWarning("Nom de l'artiste manquant dans la requête."); - return RedirectToAction("Index", "Accueil"); + return RedirectToAction("Index"); } // On transforme "fatal-bazooka" en "Fatal Bazooka" pour la factory @@ -39,17 +44,28 @@ namespace Webzine.WebApplication.Controllers .ToTitleCase(nom.Replace("-", " ")); // On appelle la factory pour obtenir l'artiste unique - var artiste = ArtisteFactory.SeedArtisteByName(nomPropre); + var artiste = this._artisteRepository.FindByName(nomPropre); if (artiste == null) { this._logger.LogWarning("Artiste non trouvé pour le nom : {NomArtiste}", nomPropre); return RedirectToAction("Index"); } + var viewModel = new ArtisteDetailsViewModel + { + IdArtiste = artiste.IdArtiste, + Nom = artiste.Nom, + Biographie = artiste.Biographie, + // On effectue le groupement ici une bonne fois pour toutes + AlbumsGroupes = artiste.Titres + .OrderBy(t => t.Libelle) + .GroupBy(t => t.Album) + .OrderBy(g => g.Key), + }; this._logger.LogInformation("Artiste trouvé : {NomArtiste}", nom); - return View(artiste); + return View(viewModel); } } } diff --git a/Webzine.WebApplication/Program.cs b/Webzine.WebApplication/Program.cs index ae6bb7a..35ddffd 100644 --- a/Webzine.WebApplication/Program.cs +++ b/Webzine.WebApplication/Program.cs @@ -22,6 +22,7 @@ try .AddRazorRuntimeCompilation(); builder.Services.AddSingleton(); + builder.Services.AddScoped(); builder.Services.AddDbContext(options => options.UseSqlite(builder.Configuration.GetConnectionString("DefaultConnection"))); diff --git a/Webzine.WebApplication/Webzine.WebApplication.csproj b/Webzine.WebApplication/Webzine.WebApplication.csproj index 9aad56b..93e8483 100644 --- a/Webzine.WebApplication/Webzine.WebApplication.csproj +++ b/Webzine.WebApplication/Webzine.WebApplication.csproj @@ -17,7 +17,6 @@ - From 6c21ef2a26361b7efef2fbe669d71df374519f32 Mon Sep 17 00:00:00 2001 From: "josephine.vetu" Date: Thu, 26 Mar 2026 11:56:26 +0100 Subject: [PATCH 3/3] =?UTF-8?q?#84=20Fix=20de=20du=20LocalRepository:=20do?= =?UTF-8?q?it=20prendre=20seulement=20une=20liste=20d'artiste=20(donn?= =?UTF-8?q?=C3=A9=20par=20la=20factory).=20Cr=C3=A9ation=20du=20DbReposito?= =?UTF-8?q?ry=20qui=20prendra=20lui=20la=20dbContext.=20Ajout=20de=20logs?= =?UTF-8?q?=20et=20meilleure=20gestion=20des=20erreurs.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Webzine.Repository/DbArtisteRepository.cs | 142 +++++++++++++++++++ Webzine.Repository/LocalArtisteRepository.cs | 139 +++++++++++------- 2 files changed, 232 insertions(+), 49 deletions(-) create mode 100644 Webzine.Repository/DbArtisteRepository.cs diff --git a/Webzine.Repository/DbArtisteRepository.cs b/Webzine.Repository/DbArtisteRepository.cs new file mode 100644 index 0000000..5aa9bb7 --- /dev/null +++ b/Webzine.Repository/DbArtisteRepository.cs @@ -0,0 +1,142 @@ +namespace Webzine.Repository +{ + using Microsoft.EntityFrameworkCore; + using Microsoft.Extensions.Logging; + using Webzine.EntitiesContext; + using Webzine.Entity; + 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. + /// + public class DbArtisteRepository : IArtisteRepository + { + private WebzineDbContext _context; + private readonly ILogger _logger; + + + /// + /// 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. + public DbArtisteRepository(WebzineDbContext context, ILogger logger) + { + this._logger = logger; + this._context = context; + } + + /// + public void Add(Artiste artiste) + { + try + { + if (artiste == null) + { + throw new ArgumentNullException(nameof(artiste), "L'artiste à ajouter ne peut pas être null."); + } + + this._context.Artistes.Add(artiste); + this._context.SaveChanges(); + } + catch (Exception ex) + { + this._logger.LogError(ex, "Une erreur est survenue lors de l'ajout de l'artiste {Nom}.", artiste?.Nom); + throw new Exception("Une erreur est survenue lors de l'ajout de l'artiste.", ex); + } + } + + /// + public void Delete(Artiste artiste) + { + 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(); + } + catch (Exception ex) + { + this._logger.LogError(ex, "Une erreur est survenue lors de la suppression de l'artiste {Nom}.", artiste?.Nom); + throw new Exception("Une erreur est survenue lors de la suppression de l'artiste.", ex); + } + } + + /// + public Artiste Find(int id) + { + Artiste artiste = this._context.Artistes + .Include(a => a.Titres) + .FirstOrDefault(a => a.IdArtiste == id); + if (artiste == null) + { + this._logger.LogWarning("Aucun artiste trouvé avec l'identifiant {Id}", id); + } + return artiste; + } + + /// + public Artiste FindByName(string nom) + { + if (string.IsNullOrWhiteSpace(nom)) + { + this._logger.LogWarning("Tentative de recherche avec un nom vide ou null."); + return null; + } + + var artiste = this._context.Artistes + .Include(a => a.Titres) + .FirstOrDefault(a => a.Nom == nom); + + if (artiste == null) + { + this._logger.LogWarning("Recherche Nom : Aucun artiste trouvé pour '{Nom}'.", nom); + } + + return artiste; + } + + /// + public IEnumerable FindAll() + { + try + { + // .AsNoTracking() rend la requête beaucoup plus rapide pour de la lecture + var artistes = this._context.Artistes.AsNoTracking().ToList(); + this._logger.LogInformation("{Count} artistes récupérés de la base.", artistes.Count); + return artistes; + } + 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 + } + } + + /// + public void Update(Artiste artiste) + { + if (artiste == null) + { + throw new ArgumentNullException(nameof(artiste)); + } + + try + { + this._context.Artistes.Update(artiste); + this._context.SaveChanges(); + this._logger.LogInformation("Artiste {Id} ({Nom}) mis à jour avec succès.", artiste.IdArtiste, artiste.Nom); + } + catch (Exception ex) + { + this._logger.LogError(ex, "Erreur lors de la mise à jour de l'artiste {Id}.", artiste.IdArtiste); + throw; + } + } + } +} \ No newline at end of file diff --git a/Webzine.Repository/LocalArtisteRepository.cs b/Webzine.Repository/LocalArtisteRepository.cs index 036e183..0841d3c 100644 --- a/Webzine.Repository/LocalArtisteRepository.cs +++ b/Webzine.Repository/LocalArtisteRepository.cs @@ -1,7 +1,6 @@ namespace Webzine.Repository { - using Microsoft.EntityFrameworkCore; - using Webzine.EntitiesContext; + using Microsoft.Extensions.Logging; using Webzine.Entity; using Webzine.Repository.Contracts; @@ -11,82 +10,124 @@ /// public class LocalArtisteRepository : IArtisteRepository { - /// - /// Contexte de la base de données utilisé pour accéder aux entités et effectuer des opérations de persistance. Injecté via le constructeur. - /// - private WebzineDbContext _context; + private readonly ILogger _logger; + private readonly List _artistes; /// /// 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. /// - /// 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. - public LocalArtisteRepository(WebzineDbContext context) + /// La liste des artistes à initialiser. Ne peut pas être null. + /// Le logger à utiliser pour enregistrer les messages de journalisation. Ne peut pas être null. + public LocalArtisteRepository(List artistes, ILogger logger) { - this._context = context; + this._logger = logger; + this._artistes = artistes; } - /// - /// Méthode pour ajouter un nouvel artiste à la base de données. - /// - /// L'artiste à ajouter. Ne peut pas être null. + /// public void Add(Artiste artiste) { - this._context.Artistes.Add(artiste); - this._context.SaveChanges(); + try + { + if (artiste == null) + { + this._logger.LogError("L'artiste à ajouter ne peut pas être null."); + throw new ArgumentNullException(nameof(artiste)); + } + + if (this._artistes.Any(a => a.IdArtiste == artiste.IdArtiste)) + { + this._logger.LogWarning("Un artiste avec l'ID {Id} existe déjà. L'ajout est ignoré.", artiste.IdArtiste); + return; + } + + this._artistes.Add(artiste); + this._logger.LogInformation("Artiste ajouté : {Nom}", artiste.Nom); + } + catch (Exception ex) + { + this._logger.LogError(ex, "Erreur lors de l'ajout de l'artiste : {Nom}", artiste?.Nom); + throw; + } } - /// - /// Méthode pour supprimer un artiste de la base de données. - /// - /// L'artiste à supprimer. + /// public void Delete(Artiste artiste) { - this._context.Artistes.Remove(artiste); - this._context.SaveChanges(); + try + { + this._artistes.Remove(artiste); + this._logger.LogInformation("Artiste supprimé : {Nom}", artiste.Nom); + } + catch (Exception ex) + { + this._logger.LogError(ex, "Erreur lors de la suppression de l'artiste : {Nom}", artiste.Nom); + throw; + } } - /// - /// Récupère un artiste avec son id. - /// - /// L'id de l'artiste. - /// L'artiste correspondant à l'identifiant fourni, ou null si aucun artiste trouvé. + /// public Artiste Find(int id) { - return this._context.Artistes - .Include(a => a.Titres) - .FirstOrDefault(a => a.IdArtiste == id); + Artiste artiste = this._artistes.FirstOrDefault(a => a.IdArtiste == id); + if (artiste == null) + { + this._logger.LogWarning("Aucun artiste trouvé avec l'identifiant {Id}", id); + } + return artiste; } - /// - /// Récupère un artiste avec son nom. - /// - /// Nom de l'artiste. - /// L'artiste correspondant à l'identifiant fourni, ou null si aucun artiste trouvé. + /// public Artiste FindByName(string nom) { - return this._context.Artistes - .Include(a => a.Titres) - .FirstOrDefault(a => a.Nom == nom); + Artiste artiste = this._artistes.FirstOrDefault(a => a.Nom == nom); + if (artiste == null) + { + this._logger.LogWarning("Aucun artiste trouvé avec le nom {Nom}", nom); + } + return artiste; } - /// - /// Retourne tous les artistes présents dans la base de données. - /// - /// La liste des artistes. + /// + /// La liste retournée est une copie de la liste interne, donc elle ne peut être nulle. public IEnumerable FindAll() { - return this._context.Artistes.ToList(); + return this._artistes; } - /// - /// Mets à jour un artiste existant dans la base de données avec les nouvelles informations fournies dans l'objet artiste. - /// - /// L'artiste à mettre à jour. + /// public void Update(Artiste artiste) { - this._context.Artistes.Update(artiste); - this._context.SaveChanges(); + if (artiste == null) + { + this._logger.LogError("L'artiste à mettre à jour ne peut pas être null."); + throw new ArgumentNullException(nameof(artiste)); + } + + try + { + var artisteToUpdate = this._artistes.FirstOrDefault(a => a.IdArtiste == artiste.IdArtiste); + + if (artisteToUpdate != null) + { + artisteToUpdate.Nom = artiste.Nom; + artisteToUpdate.Biographie = artiste.Biographie; + artisteToUpdate.Titres = artiste.Titres; + + this._logger.LogInformation("Artiste {Id} mis à jour avec succès.", artiste.IdArtiste); + } + else + { + this._logger.LogWarning("Mise à jour impossible : l'artiste avec l'ID {Id} n'existe pas.", artiste.IdArtiste); + throw new KeyNotFoundException($"L'artiste {artiste.IdArtiste} est introuvable."); + } + } + catch (Exception ex) + { + this._logger.LogError(ex, "Une erreur est survenue lors de la mise à jour de l'artiste {Id}.", artiste.IdArtiste); + throw; + } } } } \ No newline at end of file