#84 Fix de du LocalRepository: doit prendre seulement une liste d'artiste (donné par la factory). Création du DbRepository qui prendra lui la dbContext. Ajout de logs et meilleure gestion des erreurs.

This commit is contained in:
josephine.vetu
2026-03-26 11:56:26 +01:00
parent b334b1f63d
commit 6c21ef2a26
2 changed files with 232 additions and 49 deletions

View File

@@ -0,0 +1,142 @@
namespace Webzine.Repository
{
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Webzine.EntitiesContext;
using Webzine.Entity;
using Webzine.Repository.Contracts;
/// <summary>
/// Initialise une classe <see cref="DbArtisteRepository"/> qui implémente l'interface <see cref="IArtisteRepository"/> pour gérer les opérations de base de données liées aux artistes.
/// Utilise <see cref="IArtisteRepository"/> en injection de dépendances.
/// </summary>
public class DbArtisteRepository : IArtisteRepository
{
private WebzineDbContext _context;
private readonly ILogger<LocalArtisteRepository> _logger;
/// <summary>
/// Initializes a new instance of the <see cref="DbArtisteRepository"/> class.
/// </summary>
/// <param name="context">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.</param>
public DbArtisteRepository(WebzineDbContext context, ILogger<LocalArtisteRepository> logger)
{
this._logger = logger;
this._context = context;
}
/// <inheritdoc/>
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);
}
}
/// <inheritdoc/>
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);
}
}
/// <inheritdoc/>
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;
}
/// <inheritdoc/>
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;
}
/// <inheritdoc/>
public IEnumerable<Artiste> 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<Artiste>(); // Retourne une liste vide au lieu de faire crash l'UI
}
}
/// <inheritdoc/>
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;
}
}
}
}