feat: Ajoutez des commentaires de documentation XML à divers modèles et contrôleurs pour une meilleure clarté

This commit is contained in:
mirage
2026-03-06 10:10:42 +01:00
parent d34c7ade13
commit f732e3c2a5
32 changed files with 415 additions and 50 deletions

View File

@@ -12,16 +12,28 @@ namespace Webzine.Entity
/// </summary> /// </summary>
public class Artiste public class Artiste
{ {
/// <summary>
/// Identifiant unique de l'artiste.
/// </summary>
public int IdArtiste { get; set; } public int IdArtiste { get; set; }
/// <summary>
/// Nom de l'artiste. Doit être compris entre 2 et 50 caractères et est obligatoire.
/// </summary>
[Required] [Required]
[MinLength(2)] [MinLength(2)]
[MaxLength(50)] [MaxLength(50)]
[Display(Name = "Nom de l'artiste")] [Display(Name = "Nom de l'artiste")]
public string Nom { get; set; } public string Nom { get; set; }
/// <summary>
/// Biographie de l'artiste, qui peut contenir une description de sa carrière, de son style musical, etc. Doit être compris entre 10 et 4000 caractères et est obligatoire.
/// </summary>
public string Biographie { get; set; } public string Biographie { get; set; }
/// <summary>
/// Date de création de l'artiste. Représente la date à laquelle l'artiste a été ajouté à la base de données. Doit être une date valide et est obligatoire.
/// </summary>
public List<Titre> Titres { get; set; } public List<Titre> Titres { get; set; }
} }
} }

View File

@@ -11,26 +11,44 @@ namespace Webzine.Entity
/// </summary> /// </summary>
public class Commentaire public class Commentaire
{ {
/// <summary>
/// Identifiant unique du commentaire.
/// </summary>
public int IdCommentaire { get; set; } public int IdCommentaire { get; set; }
/// <summary>
/// Contenu du commentaire laissé par l'utilisateur. Doit être compris entre 10 et 1000 caractères et est obligatoire.
/// </summary>
[Required] [Required]
[MinLength(10)] [MinLength(10)]
[MaxLength(1000)] [MaxLength(1000)]
[Display(Name = "Commentaire")] [Display(Name = "Commentaire")]
public string Contenu { get; set; } public string Contenu { get; set; }
/// <summary>
/// Nom de l'auteur du commentaire. Doit être compris entre 2 et 30 caractères et est obligatoire.
/// </summary>
[Required] [Required]
[MinLength(2)] [MinLength(2)]
[MaxLength(30)] [MaxLength(30)]
[Display(Name = "Nom")] [Display(Name = "Nom")]
public string Auteur { get; set; } public string Auteur { get; set; }
/// <summary>
/// Date de création du commentaire. Représente la date à laquelle le commentaire a été laissé par l'utilisateur. Doit être une date valide et est obligatoire.
/// </summary>
[Required] [Required]
[Display(Name = "Date de création")] [Display(Name = "Date de création")]
public DateTime DateCreation { get; set; } public DateTime DateCreation { get; set; }
/// <summary>
/// Identifiant du titre associé à ce commentaire. Clé étrangère vers l'entité <see cref="Titre"/>.
/// </summary>
public int IdTitre { get; set; } public int IdTitre { get; set; }
/// <summary>
/// Référence au titre associé à ce commentaire. Permet d'accéder aux informations du titre à partir du commentaire.
/// </summary>
public Titre Titre { get; set; } public Titre Titre { get; set; }
} }
} }

View File

@@ -4,15 +4,14 @@ namespace Webzine.Entity.Fixtures
{ {
/// <summary> /// <summary>
/// Factory pour générer des artistes avec des titres associés, à l'aide de la bibliothèque Bogus. /// Factory pour générer des artistes avec des titres associés, à l'aide de la bibliothèque Bogus.
///
/// </summary> /// </summary>
public class ArtisteFactory public class ArtisteFactory
{ {
/// <summary> /// <summary>
/// Récupère un artiste par son nom, en générant des données fictives pour ses titres associés. /// Récupère un artiste par son nom, en générant des données fictives pour ses titres associés.
/// </summary> /// </summary>
/// <param name="nom"></param> /// <param name="nom">Le nom de l'artiste à générer.</param>
/// <returns></returns> /// <returns>Un objet Artiste avec des titres associés générés de manière aléatoire.</returns>
public static Artiste SeedArtisteByName(string nom) public static Artiste SeedArtisteByName(string nom)
{ {
// On définit nos albums "bouchonnés" // On définit nos albums "bouchonnés"

View File

@@ -57,6 +57,11 @@ public class DataFactory
"https://img.youtube.com/vi/1fjA68k8DAU/maxresdefault.jpg") }, "https://img.youtube.com/vi/1fjA68k8DAU/maxresdefault.jpg") },
}; };
/// <summary>
/// Génère une liste d'artistes de musique en utilisant la bibliothèque Faker pour créer des noms d'artistes et des biographies réalistes.
/// </summary>
/// <param name="count">Nombre d'artistes à générer</param>
/// <returns>Liste d'artistes de musique générés</returns>
public List<Artiste> GenerateArtists(int count) public List<Artiste> GenerateArtists(int count)
{ {
var artists = new List<Artiste>(); var artists = new List<Artiste>();
@@ -103,6 +108,7 @@ public class DataFactory
/// </summary> /// </summary>
/// <param name="count">Nombre de titres à générer</param> /// <param name="count">Nombre de titres à générer</param>
/// <param name="artists">Liste des artistes à associer aux titres générés</param> /// <param name="artists">Liste des artistes à associer aux titres générés</param>
/// <param name="styles">Liste des styles à associer aux titres générés</param>
/// <returns>Liste de titres de musique générés</returns> /// <returns>Liste de titres de musique générés</returns>
public List<Titre> GenerateTitres(int count, List<Artiste> artists, List<Style> styles) public List<Titre> GenerateTitres(int count, List<Artiste> artists, List<Style> styles)
{ {

View File

@@ -10,14 +10,23 @@ namespace Webzine.Entity
/// </summary> /// </summary>
public class Style public class Style
{ {
/// <summary>
/// Identifiant unique du style.
/// </summary>
public int IdStyle { get; set; } public int IdStyle { get; set; }
/// <summary>
/// Libellé du style de musique. Doit être compris entre 2 et 50 caractères et est obligatoire.
/// </summary>
[Required] [Required]
[MinLength(2)] [MinLength(2)]
[MaxLength(50)] [MaxLength(50)]
[Display(Name = "Libellé")] [Display(Name = "Libellé")]
public string Libelle { get; set; } public string Libelle { get; set; }
/// <summary>
/// Liste des titres associés à ce style de musique. Un style peut être associé à plusieurs titres, mais un titre n'est associé qu'à un seul style.
/// </summary>
public List<Titre> Titres { get; set; } = new List<Titre>(); public List<Titre> Titres { get; set; } = new List<Titre>();
} }
} }

View File

@@ -12,56 +12,102 @@ namespace Webzine.Entity
/// </summary> /// </summary>
public class Titre public class Titre
{ {
/// <summary>
/// Identifiant unique du titre.
/// </summary>
public int IdTitre { get; set; } public int IdTitre { get; set; }
/// <summary>
/// Identifiant de l'artiste associé à ce titre. Clé étrangère vers l'entité <see cref="Artiste"/>.
/// </summary>
public int IdArtiste { get; set; } public int IdArtiste { get; set; }
/// <summary>
/// Référence à l'artiste associé à ce titre. Permet d'accéder aux informations de l'artiste à partir du titre.
/// </summary>
public Artiste Artiste { get; set; } public Artiste Artiste { get; set; }
/// <summary>
/// Titre de la musique. Doit être compris entre 1 et 200 caractères.
/// </summary>
[Required] [Required]
[MinLength(1)] [MinLength(1)]
[MaxLength(200)] [MaxLength(200)]
[Display(Name = "Titre")] [Display(Name = "Titre")]
public string Libelle { get; set; } public string Libelle { get; set; }
/// <summary>
/// Chronique du titre, qui peut contenir une description ou une critique de la musique. Doit être compris entre 10 et 4000 caractères.
/// </summary>
[Required] [Required]
[MinLength(10)] [MinLength(10)]
[MaxLength(4000)] [MaxLength(4000)]
public string Chronique { get; set; } public string Chronique { get; set; }
/// <summary>
/// Date de création du titre. Représente la date à laquelle le titre a été ajouté à la base de données. Doit être une date valide et est obligatoire.
/// </summary>
[Required] [Required]
[Display(Name = "Date de création")] [Display(Name = "Date de création")]
public DateTime DateCreation { get; set; } public DateTime DateCreation { get; set; }
/// <summary>
/// Durée du titre en secondes. Doit être un entier positif et est obligatoire.
/// </summary>
[Display(Name = "Durée en secondes")] [Display(Name = "Durée en secondes")]
public int Duree { get; set; } public int Duree { get; set; }
/// <summary>
/// Date de sortie du titre. Représente la date à laquelle le titre a été publié ou rendu disponible au public. Doit être une date valide et est obligatoire.
/// </summary>
[Required] [Required]
[Display(Name = "Date de sortie")] [Display(Name = "Date de sortie")]
public DateTime DateSortie { get; set; } public DateTime DateSortie { get; set; }
/// <summary>
/// URL de la jaquette de l'album associé au titre. Doit être une chaîne de caractères comprise entre 1 et 250 caractères, et est obligatoire. Représente l'image de couverture de l'album auquel le titre appartient.
/// </summary>
[Required] [Required]
[MaxLength(250)] [MaxLength(250)]
[Display(Name = "Jaquette de l'album")] [Display(Name = "Jaquette de l'album")]
public string UrlJaquette { get; set; } public string UrlJaquette { get; set; }
/// <summary>
/// URL d'écoute du titre. Doit être une chaîne de caractères comprise entre 13 et 250 caractères, et est obligatoire. Représente le lien vers la plateforme ou le service où le titre peut être écouté en ligne.
/// </summary>
[MinLength(13)] [MinLength(13)]
[MaxLength(250)] [MaxLength(250)]
[Display(Name = "URL d'écoute")] [Display(Name = "URL d'écoute")]
public string UrlEcoute { get; set; } public string UrlEcoute { get; set; }
/// <summary>
/// Nombre de lectures du titre. Représente le nombre de fois que le titre a été écouté ou joué. Doit être un entier positif et est obligatoire.
/// </summary>
[Required] [Required]
[Display(Name = "Nombre de lectures")] [Display(Name = "Nombre de lectures")]
public int NbLectures { get; set; } public int NbLectures { get; set; }
/// <summary>
/// Nombre de likes du titre. Représente le nombre de fois que le titre a été aimé ou apprécié par les utilisateurs. Doit être un entier positif et est obligatoire.
/// </summary>
[Required] [Required]
[Display(Name = "Nombre de likes")] [Display(Name = "Nombre de likes")]
public int NbLikes { get; set; } public int NbLikes { get; set; }
/// <summary>
/// Nom de l'album associé au titre. Doit être une chaîne de caractères comprise entre 1 et 200 caractères, et est obligatoire. Représente le nom de l'album auquel le titre appartient.
/// </summary>
[Required] [Required]
public string Album { get; set; } public string Album { get; set; }
/// <summary>
/// Liste des commentaires associés à ce titre. Permet d'accéder à tous les commentaires laissés par les utilisateurs sur ce titre. Un titre peut avoir plusieurs commentaires, mais un commentaire n'a qu'un seul titre.
/// </summary>
public List<Commentaire> Commentaires { get; set; } public List<Commentaire> Commentaires { get; set; }
/// <summary>
/// Liste des styles associés à ce titre. Permet d'accéder à tous les styles musicaux auxquels ce titre appartient. Un titre peut appartenir à plusieurs styles, et un style peut être associé à plusieurs titres (relation many-to-many).
/// </summary>
public List<Style> Styles { get; set; } = new List<Style>(); public List<Style> Styles { get; set; } = new List<Style>();
} }
} }

View File

@@ -5,9 +5,17 @@ using Webzine.Entity;
namespace Webzine.Repository.Fake namespace Webzine.Repository.Fake
{ {
/// <summary>
/// Classe de fabrique pour générer des données factices (fake data) pour les entités Artiste et Titre.
/// </summary>
public static class FakeDataFactory public static class FakeDataFactory
{ {
//https://cdn-images.dzcdn.net/images/cover/311bba0fc112d15f72c8b5a65f0456c1/1900x1900-000000-80-0-0.jpg", //https://cdn-images.dzcdn.net/images/cover/311bba0fc112d15f72c8b5a65f0456c1/1900x1900-000000-80-0-0.jpg",
/// <summary>
/// Génère une liste d'artistes avec des données factices, incluant des titres associés à chaque artiste.
/// </summary>
/// <param name="count">Le nombre d'artistes à générer. Par défaut, 10 artistes seront générés.</param>
/// <returns>Une liste d'objets Artiste avec des titres associés, générés de manière aléatoire.</returns>
public static List<Artiste> GetArtistes(int count = 10) public static List<Artiste> GetArtistes(int count = 10)
{ {
var artistes = new List<Artiste>(); var artistes = new List<Artiste>();
@@ -26,6 +34,11 @@ namespace Webzine.Repository.Fake
return artistes; return artistes;
} }
/// <summary>
/// Génère une liste de titres avec des données factices, en associant chaque titre à un artiste existant.
/// </summary>
/// <param name="count">Le nombre de titres à générer. Par défaut, 40 titres seront générés.</param>
/// <returns>Une liste d'objets Titre avec des données factices, associés à des artistes générés de manière aléatoire.</returns>
public static List<Titre> GetTitres(int count = 40) public static List<Titre> GetTitres(int count = 40)
{ {
var artistes = GetArtistes(); var artistes = GetArtistes();

View File

@@ -5,6 +5,12 @@ namespace Webzine.Repository;
public class LocalEntityRepository public class LocalEntityRepository
{ {
private readonly ILogger<LocalEntityRepository> _logger; private readonly ILogger<LocalEntityRepository> _logger;
/// <summary>
/// Initializes a new instance of the <see cref="LocalEntityRepository"/> class.
/// Initialise une nouvelle instance du <see cref="LocalEntityRepository"/> avec un service de journalisation injecté.
/// </summary>
/// <param name="logger">Service de journalisation injecté pour suivre les opérations du repository.</param>
public LocalEntityRepository(ILogger<LocalEntityRepository> logger) public LocalEntityRepository(ILogger<LocalEntityRepository> logger)
{ {
this._logger = logger; this._logger = logger;

View File

@@ -13,7 +13,9 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
{ {
private readonly ILogger<CommentaireController> _logger; private readonly ILogger<CommentaireController> _logger;
private readonly List<Commentaire> _commentaires; private readonly List<Commentaire> _commentaires;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="CommentaireController"/> class.
/// Initialise une nouvelle instance du <see cref="CommentaireController"/>. /// Initialise une nouvelle instance du <see cref="CommentaireController"/>.
/// Les données sont générées dynamiquement via <see cref="DataFactory"/>. /// Les données sont générées dynamiquement via <see cref="DataFactory"/>.
/// </summary> /// </summary>
@@ -35,7 +37,10 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
_logger.LogInformation("Données fictives générées avec succès."); _logger.LogInformation("Données fictives générées avec succès.");
} }
// GET: Administration/Commentaires /// <summary>
/// Affiche la liste des commentaires dans la vue Index.
/// </summary>
/// <returns>>La vue Index avec le ViewModel contenant la liste des commentaires.</returns>
public ActionResult Index() public ActionResult Index()
{ {
// Création de données "bouchon" (mock) pour tester l'affichage // Création de données "bouchon" (mock) pour tester l'affichage
@@ -78,7 +83,11 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
} }
// GET: Administration/Commentaires/Delete/5 /// <summary>
/// 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.
/// </summary>
/// <param name="id">L'identifiant du commentaire à supprimer.</param>
/// <returns>La vue de confirmation de suppression avec le ViewModel contenant les détails du commentaire à supprimer, ou une réponse NotFound si le commentaire n'existe pas.</returns>
public ActionResult Delete(int id) public ActionResult Delete(int id)
{ {
var commentaire = _commentaires var commentaire = _commentaires
@@ -99,7 +108,12 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
return View(vm); return View(vm);
} }
// POST: Administration/Commentaires/Delete/5 /// <summary>
/// Traite la confirmation de suppression d'un commentaire. En cas de succès, redirige vers la liste des commentaires. En cas d'erreur, affiche à nouveau la vue de confirmation avec le message d'erreur.
/// </summary>
/// <param name="id">L'identifiant du commentaire à supprimer.</param>
/// <param name="model">Le ViewModel contenant les détails du commentaire à supprimer, utilisé pour afficher les informations en cas d'erreur.</param>
/// <returns>Redirection vers la liste des commentaires en cas de succès, ou la vue de confirmation avec le message d'erreur en cas d'échec.</returns>
[HttpPost] [HttpPost]
[ValidateAntiForgeryToken] [ValidateAntiForgeryToken]
public ActionResult Delete(int id, CommentaireDeleteViewModel model) public ActionResult Delete(int id, CommentaireDeleteViewModel model)

View File

@@ -16,6 +16,7 @@ public class TitreController : Controller
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="TitreController"/> class.
/// Initialise une nouvelle instance du <see cref="TitreController"/>. /// Initialise une nouvelle instance du <see cref="TitreController"/>.
/// Les données sont générées dynamiquement via <see cref="DataFactory"/>. /// Les données sont générées dynamiquement via <see cref="DataFactory"/>.
/// </summary> /// </summary>
@@ -37,6 +38,10 @@ public class TitreController : Controller
_logger.LogInformation("Données fictives générées avec succès."); _logger.LogInformation("Données fictives générées avec succès.");
} }
/// <summary>
/// Affiche la liste des titres dans la vue Index.
/// </summary>
/// <returns>La vue Index avec le ViewModel contenant la liste des titres.</returns>
public ActionResult Index() public ActionResult Index()
{ {
var model = _titres.Select(t => new AdminTitreList var model = _titres.Select(t => new AdminTitreList
@@ -54,6 +59,10 @@ public class TitreController : Controller
return View(model); return View(model);
} }
/// <summary>
/// Affiche le formulaire de création d'un nouveau titre dans la vue Create.
/// </summary>
/// <returns>La vue Create avec le ViewModel contenant les listes déroulantes pour les artistes et les styles.</returns>
public ActionResult Create() public ActionResult Create()
{ {
var model = new AdminTitreForm var model = new AdminTitreForm
@@ -74,6 +83,12 @@ public class TitreController : Controller
return View(model); return View(model);
} }
/// <summary>
/// Traite la soumission du formulaire de création d'un nouveau titre. Actuellement, cette méthode est un stub qui redirige vers l'index sans effectuer de logique de création réelle.
/// </summary>
/// <param name="collection">Le formulaire soumis contenant les données du nouveau titre. Actuellement, ce paramètre n'est pas utilisé.</param>
/// <returns>Redirige vers l'action Index après la soumission du formulaire. En cas d'erreur, retourne la vue Create pour permettre à l'utilisateur de corriger les données.</returns>
[HttpPost] [HttpPost]
[ValidateAntiForgeryToken] [ValidateAntiForgeryToken]
public ActionResult Create(IFormCollection collection) public ActionResult Create(IFormCollection collection)
@@ -88,6 +103,11 @@ public class TitreController : Controller
} }
} }
/// <summary>
/// Affiche le formulaire de modification d'un titre existant dans la vue Edit, en préremplissant les champs avec les données du titre sélectionné. Les listes déroulantes pour les artistes et les styles sont également remplies pour permettre à l'utilisateur de modifier ces associations.
/// </summary>
/// <param name="id">L'identifiant du titre à modifier, utilisé pour récupérer les données du titre à partir de la liste des titres générés.</param>
/// <returns>La vue Edit avec le ViewModel contenant les données du titre à modifier, ainsi que les listes déroulantes pour les artistes et les styles. En cas d'erreur, retourne une réponse NotFound si le titre n'existe pas.</returns>
public ActionResult Edit(int id) public ActionResult Edit(int id)
{ {
var titre = _titres.First(t => t.IdTitre == id); var titre = _titres.First(t => t.IdTitre == id);
@@ -123,6 +143,12 @@ public class TitreController : Controller
return View(model); return View(model);
} }
/// <summary>
/// Traite la soumission du formulaire de modification d'un titre existant. Actuellement, cette méthode est un stub qui redirige vers l'index sans effectuer de logique de modification réelle.
/// </summary>
/// <param name="id">L'identifiant du titre à modifier, utilisé pour identifier le titre à mettre à jour. Actuellement, ce paramètre n'est pas utilisé dans la logique de traitement.</param>
/// <param name="collection">Le formulaire soumis contenant les données modifiées du titre. Actuellement, ce paramètre n'est pas utilisé dans la logique de traitement.</param>
/// <returns>Redirige vers l'action Index après la soumission du formulaire. En cas d'erreur, retourne la vue Edit pour permettre à l'utilisateur de corriger les données.</returns>
[HttpPost] [HttpPost]
[ValidateAntiForgeryToken] [ValidateAntiForgeryToken]
public ActionResult Edit(int id, IFormCollection collection) public ActionResult Edit(int id, IFormCollection collection)
@@ -137,6 +163,11 @@ public class TitreController : Controller
} }
} }
/// <summary>
/// Affiche la vue de confirmation de suppression d'un titre, en récupérant les détails du titre à supprimer à partir de l'identifiant fourni. Le ViewModel contient les informations essentielles du titre, telles que le libellé et le nom de l'artiste, pour permettre à l'utilisateur de confirmer la suppression.
/// </summary>
/// <param name="id">L'identifiant du titre à supprimer, utilisé pour récupérer les données du titre à partir de la liste des titres générés.</param>
/// <returns>La vue de confirmation de suppression avec le ViewModel contenant les détails du titre à supprimer, ou une réponse NotFound si le titre n'existe pas.</returns>
public ActionResult Delete(int id) public ActionResult Delete(int id)
{ {
var titre = _titres.First(t => t.IdTitre == id); var titre = _titres.First(t => t.IdTitre == id);
@@ -151,6 +182,11 @@ public class TitreController : Controller
return View(model); return View(model);
} }
/// <summary>
/// Traite la confirmation de suppression d'un titre. En cas de succès, redirige vers la liste des titres après avoir supprimé le titre de la liste. En cas d'erreur, affiche à nouveau la vue de confirmation avec le message d'erreur.
/// </summary>
/// <param name="model">Le ViewModel contenant les détails du titre à supprimer, utilisé pour identifier le titre à supprimer et pour afficher les informations en cas d'erreur.</param>
/// <returns>Redirection vers la liste des titres en cas de succès, ou la vue de confirmation avec le message d'erreur en cas d'échec.</returns>
[HttpPost] [HttpPost]
[ValidateAntiForgeryToken] [ValidateAntiForgeryToken]
public ActionResult Delete(AdminTitreDelete model) public ActionResult Delete(AdminTitreDelete model)

View File

@@ -1,14 +1,32 @@
namespace Webzine.WebApplication.Areas.Administration.ViewModels.Commentaire; namespace Webzine.WebApplication.Areas.Administration.ViewModels.Commentaire;
/// <summary>
/// ViewModel pour la suppression d'un commentaire, contenant les informations nécessaires pour afficher les détails du commentaire à supprimer.
/// </summary>
public class CommentaireDeleteViewModel public class CommentaireDeleteViewModel
{ {
/// <summary>
/// Définit l'identifiant du commentaire à supprimer.
/// </summary>
public int IdCommentaire { get; set; } public int IdCommentaire { get; set; }
/// <summary>
/// Définit le nom de l'auteur du commentaire à supprimer.
/// </summary>
public string? Auteur { get; set; } public string? Auteur { get; set; }
/// <summary>
/// Définit le contenu du commentaire à supprimer.
/// </summary>
public string? Contenu { get; set; } public string? Contenu { get; set; }
/// <summary>
/// Définit la date de création du commentaire à supprimer.
/// </summary>
public DateTime DateCreation { get; set; } public DateTime DateCreation { get; set; }
/// <summary>
/// Définit le titre du commentaire à supprimer.
/// </summary>
public string? TitreLibelle { get; set; } public string? TitreLibelle { get; set; }
} }

View File

@@ -2,10 +2,6 @@
// Copyright (c) Webzine. All rights reserved. // Copyright (c) Webzine. All rights reserved.
// </copyright> // </copyright>
// <copyright file="CommentaireViewModel.cs" company="Webzine">
// Copyright (c) Webzine. All rights reserved.
// </copyright>
namespace Webzine.WebApplication.Areas.Administration.ViewModels.Commentaire namespace Webzine.WebApplication.Areas.Administration.ViewModels.Commentaire
{ {
/// <summary> /// <summary>

View File

@@ -1,19 +0,0 @@
// <copyright file="CommentaireViewModel.cs" company="Webzine">
// Copyright (c) Webzine. All rights reserved.
// </copyright>
using Webzine.Entity;
namespace Webzine.WebApplication.ViewModels
{
/// <summary>
/// ViewModel pour afficher la liste des commentaires en administration.
/// </summary>
public class CommentaireViewModel
{
/// <summary>
/// Obtient ou définit la liste des commentaires.
/// </summary>
public IEnumerable<Commentaire> Commentaires { get; set; } = new List<Commentaire>();
}
}

View File

@@ -1,10 +1,22 @@
namespace Webzine.WebApplication.Areas.Administration.ViewModels.Titre; namespace Webzine.WebApplication.Areas.Administration.ViewModels.Titre;
/// <summary>
/// ViewModel pour la suppression d'un titre dans l'administration.
/// </summary>
public class AdminTitreDelete public class AdminTitreDelete
{ {
/// <summary>
/// Définit l'identifiant du titre à supprimer.
/// </summary>
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Définit le titre du titre à supprimer.
/// </summary>
public string Titre { get; set; } public string Titre { get; set; }
/// <summary>
/// Définit le nom de l'artiste associé au titre à supprimer.
/// </summary>
public string Artiste { get; set; } public string Artiste { get; set; }
} }

View File

@@ -2,33 +2,78 @@ using Microsoft.AspNetCore.Mvc.Rendering;
namespace Webzine.WebApplication.Areas.Administration.ViewModels.Titre; namespace Webzine.WebApplication.Areas.Administration.ViewModels.Titre;
/// <summary>
/// ViewModel pour la création et la modification d'un titre dans l'administration.
/// </summary>
public class AdminTitreForm public class AdminTitreForm
{ {
/// <summary>
/// Définit l'identifiant du titre.
/// </summary>
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Définit l'identifiant de l'artiste associé au titre.
/// </summary>
public int IdArtiste { get; set; } public int IdArtiste { get; set; }
/// <summary>
/// Définit le titre du titre.
/// </summary>
public string Libelle { get; set; } public string Libelle { get; set; }
/// <summary>
/// Définit le nom de l'album associé au titre.
/// </summary>
public string Album { get; set; } public string Album { get; set; }
/// <summary>
/// Définit la chronique du titre, peut-être une critique ou une description du titre.
/// </summary>
public string Chronique { get; set; } public string Chronique { get; set; }
/// <summary>
/// Définit la date de sortie du titre.
/// </summary>
public DateTime DateSortie { get; set; } public DateTime DateSortie { get; set; }
/// <summary>
/// Définit la durée du titre en secondes.
/// </summary>
public int Duree { get; set; } public int Duree { get; set; }
/// <summary>
/// Définit l'URL de la jaquette de l'album associé au titre.
/// </summary>
public string UrlJaquette { get; set; } public string UrlJaquette { get; set; }
/// <summary>
/// Définit l'URL d'écoute du titre.
/// </summary>
public string UrlEcoute { get; set; } public string UrlEcoute { get; set; }
/// <summary>
/// Définit le nombre de lectures du titre.
/// </summary>
public int NbLectures { get; set; } public int NbLectures { get; set; }
/// <summary>
/// Définit le nombre de likes du titre.
/// </summary>
public int NbLikes { get; set; } public int NbLikes { get; set; }
/// <summary>
/// Définit la liste des identifiants des styles associés au titre.
/// </summary>
public List<int> Styles { get; set; } = new(); public List<int> Styles { get; set; } = new();
/// <summary>
/// Définit la liste des artistes disponibles pour la sélection dans le formulaire de création ou de modification d'un titre.
/// </summary>
public List<SelectListItem> Artistes { get; set; } public List<SelectListItem> Artistes { get; set; }
/// <summary>
/// Définit la liste des styles disponibles pour la sélection dans le formulaire de création ou de modification d'un titre.
/// </summary>
public List<SelectListItem> AllStyles { get; set; } public List<SelectListItem> AllStyles { get; set; }
} }

View File

@@ -1,21 +1,48 @@
namespace Webzine.WebApplication.Areas.Administration.ViewModels.Titre namespace Webzine.WebApplication.Areas.Administration.ViewModels.Titre
{ {
/// <summary>
/// ViewModel pour la liste des titres dans l'administration, affichant les informations essentielles pour chaque titre.
/// </summary>
public class AdminTitreList public class AdminTitreList
{ {
/// <summary>
/// Définit l'identifiant du titre.
/// </summary>
public int Id { get; set; } public int Id { get; set; }
/// <summary>
/// Définit le nom de l'artiste associé au titre.
/// </summary>
public string Artiste { get; set; } public string Artiste { get; set; }
/// <summary>
/// Définit le titre du titre.
/// </summary>
public string Titre { get; set; } public string Titre { get; set; }
/// <summary>
/// Définit le nom de l'album associé au titre.
/// </summary>
public string Duree { get; set; } public string Duree { get; set; }
/// <summary>
/// Définit la date de sortie du titre, affichée dans un format lisible pour les utilisateurs de l'administration.
/// </summary>
public DateTime DateSortie { get; set; } public DateTime DateSortie { get; set; }
/// <summary>
/// Définit le nombre de lectures du titre.
/// </summary>
public int NbLectures { get; set; } public int NbLectures { get; set; }
/// <summary>
/// Définit le nombre de likes du titre.
/// </summary>
public int NbLikes { get; set; } public int NbLikes { get; set; }
/// <summary>
/// Définit le nombre de commentaires associés au titre.
/// </summary>
public int NbCommentaires { get; set; } public int NbCommentaires { get; set; }
} }
} }

View File

@@ -59,16 +59,3 @@
</table> </table>
</div> </div>
<style>
.action-column{
width:120px;
white-space:nowrap;
}
.action-column .btn{
margin-right:4px;
}
</style>

View File

@@ -10,13 +10,22 @@ namespace Webzine.WebApplication.Controllers
private readonly ILogger<AccueilController> _logger; private readonly ILogger<AccueilController> _logger;
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
/// <summary>
/// Initializes a new instance of the <see cref="AccueilController"/> class.
/// </summary>
/// <param name="logger">Service de journalisation injecté pour enregistrer les événements et les erreurs.</param>
/// <param name="configuration">Service d'injection de configuration pour accéder aux paramètres de l'application.</param>
public AccueilController(ILogger<AccueilController> logger, IConfiguration configuration) public AccueilController(ILogger<AccueilController> logger, IConfiguration configuration)
{ {
_logger = logger; _logger = logger;
_configuration = configuration; _configuration = configuration;
this._logger.LogDebug(1, "NLog injected into AccueilController");
} }
// GET: AccueilController /// <summary>
/// Affiche la page d'accueil du webzine, présentant les derniers titres et les titres les plus populaires.
/// </summary>
/// <returns>La vue Index avec le ViewModel contenant les listes de titres à afficher.</returns>
public ActionResult Index() public ActionResult Index()
{ {
_logger.LogInformation("Arrivée sur la page d'accueil"); _logger.LogInformation("Arrivée sur la page d'accueil");

View File

@@ -6,18 +6,30 @@ public class ApiController : ControllerBase
{ {
private readonly ILogger<ApiController> _logger; private readonly ILogger<ApiController> _logger;
/// <summary>
/// Initializes a new instance of the <see cref="ApiController"/> class.
/// </summary>
/// <param name="logger">Service de journalisation injecté pour enregistrer les événements et les erreurs.</param>
public ApiController(ILogger<ApiController> logger) public ApiController(ILogger<ApiController> logger)
{ {
this._logger = logger; this._logger = logger;
this._logger.LogDebug(1, "NLog injected into VersionController"); this._logger.LogDebug(1, "NLog injected into VersionController");
} }
/// <summary>
/// Endpoint de test pour vérifier que l'API fonctionne correctement. Retourne une chaîne de caractères "Hello World !".
/// </summary>
/// <returns>Une chaîne de caractères "Hello World !".</returns>
[HttpGet] [HttpGet]
public string HelloWorld() public string HelloWorld()
{ {
return "Hello World !"; return "Hello World !";
} }
/// <summary>
/// Endpoint de test pour vérifier que l'API fonctionne correctement. Retourne un objet JSON contenant le nom et la version de l'application.
/// </summary>
/// <returns>Un objet JSON avec les propriétés "nom" et "version".</returns>
[HttpGet] [HttpGet]
public IActionResult Version() public IActionResult Version()
{ {

View File

@@ -9,16 +9,21 @@ namespace Webzine.WebApplication.Controllers
// Injection du logger via le constructeur // Injection du logger via le constructeur
private readonly ILogger<ArtisteController> _logger; private readonly ILogger<ArtisteController> _logger;
/// <summary>
/// Initializes a new instance of the <see cref="ArtisteController"/> class.
/// </summary>
/// <param name="logger">Service de journalisation injecté pour enregistrer les événements et les erreurs.</param>
public ArtisteController(ILogger<ArtisteController> logger) public ArtisteController(ILogger<ArtisteController> logger)
{ {
_logger = logger; _logger = logger;
this._logger.LogDebug(1, "NLog injected into ArtisteController");
} }
/// <summary> /// <summary>
/// Prend en paramètre le nom de l'artiste (ex: "fatal-bazooka"), utilise la factory pour trouver l'artiste correspondant, et affiche sa page dédiée. /// Prend en paramètre le nom de l'artiste (ex: "fatal-bazooka"), utilise la factory pour trouver l'artiste correspondant, et affiche sa page dédiée.
/// </summary> /// </summary>
/// <param name="nom"></param> /// <param name="nom">Le nom de l'artiste à rechercher, formaté en kebab-case (ex: "fatal-bazooka").</param>
/// <returns></returns> /// <returns>La vue de l'artiste avec son ViewModel, ou une redirection vers l'accueil si le nom est vide, ou une erreur 404 si l'artiste n'est pas trouvé.</returns>
[HttpGet("/artiste/{nom}")] [HttpGet("/artiste/{nom}")]
public IActionResult Index(string nom) public IActionResult Index(string nom)
{ {

View File

@@ -7,6 +7,23 @@ namespace Webzine.WebApplication.Controllers
/// </summary> /// </summary>
public class ContactController : Controller public class ContactController : Controller
{ {
// Injection du logger via le constructeur
private readonly ILogger<ContactController> _logger;
/// <summary>
/// Initializes a new instance of the <see cref="ContactController"/> class.
/// </summary>
/// <param name="logger">Service de journalisation injecté pour enregistrer les événements et les erreurs.</param>
public ContactController(ILogger<ContactController> logger)
{
_logger = logger;
this._logger.LogDebug(1, "NLog injected into ContactController");
}
/// <summary>
/// Affiche la page de contact du webzine.
/// </summary>
/// <returns>La vue Index de la page de contact.</returns>
public IActionResult Index() public IActionResult Index()
{ {
return View(); return View();

View File

@@ -19,6 +19,7 @@ public class TitreController : Controller
private readonly List<Artiste> _artistes; private readonly List<Artiste> _artistes;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="TitreController"/> class.
/// Initialise une nouvelle instance du <see cref="TitreController"/>. /// Initialise une nouvelle instance du <see cref="TitreController"/>.
/// Les données sont générées dynamiquement via <see cref="DataFactory"/>. /// Les données sont générées dynamiquement via <see cref="DataFactory"/>.
/// </summary> /// </summary>

View File

@@ -1,10 +1,20 @@
using Webzine.Entity; using Webzine.Entity;
namespace Webzine.WebApplication.ViewModels.Accueil namespace Webzine.WebApplication.ViewModels.Accueil
{ {
/// <summary>
/// ViewModel pour la page d'accueil du webzine, affichant les derniers titres et les titres les plus populaires.
/// </summary>
public class AccueilIndexViewModel public class AccueilIndexViewModel
{ {
/// <summary>
/// Définit la liste des derniers titres ajoutés au webzine.
/// </summary>
public List<Entity.Titre> DerniersTitres { get; set; } = []; public List<Entity.Titre> DerniersTitres { get; set; } = [];
/// <summary>
/// Définit la liste des titres les plus populaires du webzine.
/// </summary>
public List<Entity.Titre> TopTitres { get; set; } = []; public List<Entity.Titre> TopTitres { get; set; } = [];
} }
} }

View File

@@ -1,7 +1,10 @@
using Webzine.Entity; using Webzine.Entity;
namespace Webzine.WebApplication.ViewModels namespace Webzine.WebApplication.ViewModels
{ {
/// <summary>
/// ViewModel pour afficher les détails d'un artiste, incluant les informations de l'artiste et la liste de ses titres.
/// </summary>
public class ArtisteModel public class ArtisteModel
{ {
/// <summary> /// <summary>

View File

@@ -2,16 +2,28 @@ using System.ComponentModel.DataAnnotations;
namespace Webzine.WebApplication.ViewModels.Titre; namespace Webzine.WebApplication.ViewModels.Titre;
/// <summary>
/// Classe représentant un commentaire sur un titre, utilisée pour la validation des données lors de la soumission d'un commentaire.
/// </summary>
public class TitreComment public class TitreComment
{ {
/// <summary>
/// Définit l'identifiant du titre auquel le commentaire est associé.
/// </summary>
[Required] [Required]
public int IdTitre { get; set; } public int IdTitre { get; set; }
/// <summary>
/// Définit le nom de l'auteur du commentaire.
/// </summary>
[Required] [Required]
[MinLength(2)] [MinLength(2)]
[MaxLength(30)] [MaxLength(30)]
public string Auteur { get; set; } public string Auteur { get; set; }
/// <summary>
/// Définit le contenu du commentaire.
/// </summary>
[Required] [Required]
[MinLength(10)] [MinLength(10)]
[MaxLength(1000)] [MaxLength(1000)]

View File

@@ -2,25 +2,58 @@ using Webzine.Entity;
namespace Webzine.WebApplication.ViewModels.Titre; namespace Webzine.WebApplication.ViewModels.Titre;
/// <summary>
/// Contient les détails d'un titre, ainsi que les commentaires associés.
/// </summary>
public class TitreContent public class TitreContent
{ {
/// <summary>
/// Définit l'identifiant du titre.
/// </summary>
public int IdTitre { get; set; } public int IdTitre { get; set; }
/// <summary>
/// Définit le titre du titre.
/// </summary>
public string Libelle { get; set; } public string Libelle { get; set; }
/// <summary>
/// Définit la chronique du titre.
/// </summary>
public string Chronique { get; set; } public string Chronique { get; set; }
/// <summary>
/// Définit la date de sortie du titre.
/// </summary>
public DateTime DateSortie { get; set; } public DateTime DateSortie { get; set; }
/// <summary>
/// Définit le nombre de likes du titre.
/// </summary>
public int NbLikes { get; set; } public int NbLikes { get; set; }
/// <summary>
/// Définit l'url de la jaquette de l'album associé au titre.
/// </summary>
public string UrlJaquette { get; set; } public string UrlJaquette { get; set; }
/// <summary>
/// Définit l'url d'écoute du titre.
/// </summary>
public string UrlEcoute { get; set; } public string UrlEcoute { get; set; }
/// <summary>
/// Définit le nom de l'artiste associé au titre.
/// </summary>
public string ArtisteNom { get; set; } public string ArtisteNom { get; set; }
/// <summary>
/// Définit le nom de l'album associé au titre.
/// </summary>
public List<Style> Styles { get; set; } = new(); public List<Style> Styles { get; set; } = new();
/// <summary>
/// Définit la liste des commentaires associés au titre.
/// </summary>
public List<Commentaire> Commentaires { get; set; } = new(); public List<Commentaire> Commentaires { get; set; } = new();
} }

View File

@@ -1,7 +1,17 @@
namespace Webzine.WebApplication.ViewModels.Titre; namespace Webzine.WebApplication.ViewModels.Titre;
/// <summary>
/// ViewModel pour la page de détails d'un titre, contenant les informations du titre et le formulaire de commentaire.
/// </summary>
public class TitreDetail public class TitreDetail
{ {
/// <summary>
/// Définit les détails du titre à afficher, y compris les informations sur le titre et les commentaires associés.
/// </summary>
public TitreContent Details { get; set; } public TitreContent Details { get; set; }
/// <summary>
/// Définit le formulaire de commentaire pour permettre aux utilisateurs de laisser un commentaire sur le titre affiché.
/// </summary>
public TitreComment CommentForm { get; set; } public TitreComment CommentForm { get; set; }
} }

View File

@@ -1,6 +1,12 @@
namespace Webzine.WebApplication.ViewModels.Titre; namespace Webzine.WebApplication.ViewModels.Titre;
/// <summary>
/// ViewModel pour représenter un "like" sur un titre, contenant l'identifiant du titre aimé.
/// </summary>
public class TitreLike public class TitreLike
{ {
/// <summary>
/// Définit l'identifiant du titre qui a reçu le "like".
/// </summary>
public int IdTitre { get; set; } public int IdTitre { get; set; }
} }

View File

@@ -1,8 +1,17 @@
namespace Webzine.WebApplication.ViewModels.Titre; namespace Webzine.WebApplication.ViewModels.Titre;
/// <summary>
/// ViewModel pour représenter une collection de titres associés à un style musical spécifique, avec le nom du style et une liste d'items de titre.
/// </summary>
public class TitreStyle public class TitreStyle
{ {
/// <summary>
/// Définit le nom du style musical associé à la collection de titres.
/// </summary>
public string? StyleName { get; set; } public string? StyleName { get; set; }
/// <summary>
/// Définit la liste des items de titre associés au style musical.
/// </summary>
public List<TitreStyleItem> Titres { get; set; } = new(); public List<TitreStyleItem> Titres { get; set; } = new();
} }

View File

@@ -1,13 +1,28 @@
namespace Webzine.WebApplication.ViewModels.Titre; namespace Webzine.WebApplication.ViewModels.Titre;
/// <summary>
/// ViewModel pour représenter un titre dans une liste de titres, contenant les informations essentielles telles que l'identifiant, le libellé, le nom de l'artiste, l'URL de la jaquette et la durée du titre.
/// </summary>
public class TitreStyleItem public class TitreStyleItem
{ {
/// <summary>
/// Définit l'identifiant du titre.
/// </summary>
public int IdTitre { get; set; } public int IdTitre { get; set; }
/// <summary>
/// Définit le libellé du titre.
/// </summary>
public string? Libelle { get; set; } public string? Libelle { get; set; }
/// <summary>
/// Définit le nom de l'artiste associé au titre.
/// </summary>
public string? ArtisteNom { get; set; } public string? ArtisteNom { get; set; }
/// <summary>
/// Définit l'URL de la jaquette du titre.
/// </summary>
public string? UrlJaquette { get; set; } public string? UrlJaquette { get; set; }
public int Duree { get; set; } public int Duree { get; set; }