using Microsoft.Extensions.Logging; using Webzine.Entity; using Webzine.Repository.Contracts; namespace Webzine.Repository; /// /// Classe qui implémente le repository pour les titres en utilisant une liste locale comme source de données. /// public class LocalTitreRepository : ITitreRepository { private readonly ILogger logger; private readonly List titres; /// /// Initializes a new instance of the class. /// /// Le service de journalisation injecté pour suivre les opérations du repository. /// La liste de titres à utiliser comme source de données pour le repository. public LocalTitreRepository(ILogger logger, List titres) { this.logger = logger; this.titres = titres; this.logger.LogDebug(1, "NLog injected into LocalTitreRepository"); } /// /// Ajoute un titre à la liste des titres. /// /// L'objet titre à ajouter. public void Add(Titre titre) { this.titres.Add(titre); } /// /// Remonte le nombre de titres. /// /// Le nombre total de titres présents dans la liste après l'incrémentation du nombre de lectures. public int Count() { return this.titres.Count; } /// /// Supprime un titre de la liste des titres. /// /// L'objet titre à supprimer. public void Delete(Titre titre) { if (!this.titres.Contains(titre)) { this.logger.LogWarning("Le titre avec l'identifiant {IdTitre} n'existe pas dans la liste.", titre.IdTitre); } this.titres.Remove(titre); } /// /// Recherche les titres dans la liste des titres en fonction de l'offset et de la limite spécifiés, permettant ainsi une pagination des résultats. /// /// Le nombre de titres à ignorer avant de commencer à retourner les résultats. /// Le nombre maximum de titres à retourner. /// Une collection de titres correspondant au critère de pagination, triée par libellé. public IEnumerable FindTitres(int offset, int limit) { if (offset < 0 || limit <= 0) { this.logger.LogWarning("FindTitres called with invalid offset {Offset} or limit {Limit}.", offset, limit); return Enumerable.Empty(); } return this.titres.Skip(offset).Take(limit).ToList(); } /// /// Incrémente le nombre de lectures d'un titre donné. Si le titre est null, un message d'avertissement est enregistré dans les logs et aucune action n'est effectuée. /// /// L'objet titre dont le nombre de lectures doit être incrémenté. public void IncrementNbLectures(Titre titre) { titre.NbLectures++; } /// /// Incrémente le nombre de likes d'un titre donné. Si le titre est null, un message d'avertissement est enregistré dans les logs et aucune action n'est effectuée. /// /// L'objet titre dont le nombre de likes doit être incrémenté. public void IncrementNbLikes(Titre titre) { titre.NbLikes++; } /// /// Recherche les titres dont le libellé contient le mot spécifié, en ignorant la casse. /// /// Le mot à rechercher dans les libellés des titres. /// Une collection de titres correspondant au critère de recherche, triée par libellé. public IEnumerable Search(string mot) { if (string.IsNullOrWhiteSpace(mot)) { this.logger.LogWarning("Search called with an empty or whitespace string."); return Enumerable.Empty(); } IEnumerable list = this.titres .Where(t => !string.IsNullOrWhiteSpace(t.Libelle) && t.Libelle.Contains(mot, StringComparison.OrdinalIgnoreCase)) .OrderBy(t => t.Libelle) .ToList(); if (!list.Any()) { this.logger.LogInformation("No titres found matching the search term '{Mot}'.", mot); } return list; } /// /// Trouve un titre dans la liste des titres en fonction de son identifiant. /// /// L'identifiant du titre à trouver. /// Le titre correspondant à l'identifiant fourni, ou null si aucun titre n'est trouvé. public Titre? Find(int idTitre) { Titre? titre = titres.FirstOrDefault(t => t.IdTitre == idTitre); if (titre == null) { this.logger.LogInformation("No titre found with IdTitre {IdTitre}.", idTitre); } return titre; } /// /// Trouve tous les titres dans la liste des titres. /// /// Une collection de tous les titres présents dans la liste. public IEnumerable FindAll() { return this.titres; } /// /// Recherche les titres associés à un style dont le libellé contient la chaîne spécifiée, en ignorant la casse. /// /// Le libellé du style à rechercher dans les titres. /// Une collection de titres correspondant au critère de recherche, triée par libellé. public IEnumerable SearchByStyle(string libelle) { if (string.IsNullOrWhiteSpace(libelle)) { this.logger.LogWarning("SearchByStyle called with an empty or whitespace string."); return Enumerable.Empty(); } IEnumerable list = this.titres .Where(t => t.Styles.Any(s => !string.IsNullOrWhiteSpace(s.Libelle) && s.Libelle.Contains(libelle, StringComparison.OrdinalIgnoreCase))) .OrderBy(t => t.Libelle) .ToList(); if (!list.Any()) { this.logger.LogInformation("No titres found matching the style '{Libelle}'.", libelle); } return list; } /// /// Met à jour un titre dans la liste des titres en fonction de son identifiant. Si aucun titre correspondant à l'identifiant du titre fourni n'est trouvé, un message d'avertissement est enregistré dans les logs et aucune mise à jour n'est effectuée. /// /// L'objet titre à mettre à jour. public void Update(Titre titre) { int index = this.titres.FindIndex(t => t.IdTitre == titre.IdTitre); if (index == -1) { this.logger.LogWarning("Aucun titre trouvé avec l'identifiant {IdTitre}.", titre.IdTitre); } this.titres[index] = titre; } }