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 @@ -