From 423b37009163328333c285ec324ee216032f6f5e Mon Sep 17 00:00:00 2001 From: mirage <119869686+ClementBobin@users.noreply.github.com> Date: Thu, 5 Mar 2026 13:57:41 +0100 Subject: [PATCH 01/12] =?UTF-8?q?feat:=20#25=20#24=20Ajouter=20les=20vues?= =?UTF-8?q?=20et=20mod=C3=A8les=20pour=20la=20gestion=20des=20titres=20dan?= =?UTF-8?q?s=20l'administration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Webzine.Entity/Style.cs | 1 + Webzine.Entity/Titre.cs | 2 +- .../Controllers/Admin/Titre2Controller.cs | 163 ++++++++++++++++++ Webzine.WebApplication/Program.cs | 13 -- .../Admin/Titre2/AdminTitreDelete.cs | 10 ++ .../ViewModels/Admin/Titre2/AdminTitreForm.cs | 34 ++++ .../ViewModels/Admin/Titre2/AdminTitreList.cs | 21 +++ .../Views/Shared/_Layout.cshtml | 5 +- .../Views/Titre2/Create.cshtml | 11 ++ .../Views/Titre2/Delete.cshtml | 34 ++++ .../Views/Titre2/Edit.cshtml | 13 ++ .../Views/Titre2/Index.cshtml | 74 ++++++++ .../Views/Titre2/_Form.cshtml | 135 +++++++++++++++ Webzine.WebApplication/wwwroot/css/app.css | 3 + 14 files changed, 503 insertions(+), 16 deletions(-) create mode 100644 Webzine.WebApplication/Controllers/Admin/Titre2Controller.cs create mode 100644 Webzine.WebApplication/ViewModels/Admin/Titre2/AdminTitreDelete.cs create mode 100644 Webzine.WebApplication/ViewModels/Admin/Titre2/AdminTitreForm.cs create mode 100644 Webzine.WebApplication/ViewModels/Admin/Titre2/AdminTitreList.cs create mode 100644 Webzine.WebApplication/Views/Titre2/Create.cshtml create mode 100644 Webzine.WebApplication/Views/Titre2/Delete.cshtml create mode 100644 Webzine.WebApplication/Views/Titre2/Edit.cshtml create mode 100644 Webzine.WebApplication/Views/Titre2/Index.cshtml create mode 100644 Webzine.WebApplication/Views/Titre2/_Form.cshtml diff --git a/Webzine.Entity/Style.cs b/Webzine.Entity/Style.cs index 11c6f32..ed1cd12 100644 --- a/Webzine.Entity/Style.cs +++ b/Webzine.Entity/Style.cs @@ -18,5 +18,6 @@ namespace Webzine.Entity [Display(Name = "Libellé")] public string Libelle { get; set; } + public List Titres { get; set; } = new List(); } } diff --git a/Webzine.Entity/Titre.cs b/Webzine.Entity/Titre.cs index 2fd9671..4b00924 100644 --- a/Webzine.Entity/Titre.cs +++ b/Webzine.Entity/Titre.cs @@ -62,6 +62,6 @@ namespace Webzine.Entity public string Album { get; set; } public List Commentaires { get; set; } - + public List \ No newline at end of file diff --git a/Webzine.WebApplication/Views/Titre2/_Form.cshtml b/Webzine.WebApplication/Views/Titre2/_Form.cshtml new file mode 100644 index 0000000..e25215b --- /dev/null +++ b/Webzine.WebApplication/Views/Titre2/_Form.cshtml @@ -0,0 +1,135 @@ +@model Webzine.WebApplication.ViewModels.Admin.Titre.AdminTitreForm + +
+ +
+ +
+ +
+
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+ + +
+
+ + seconds +
+
+
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+
+ + +
+ +
+
+ @foreach (var style in Model.AllStyles) + { +
+ + + +
+ } +
+
+
+ + +
+ +
+ @Model.NbLectures +
+
+
+ +
+ @Model.NbLikes +
+
+ + +
+
+ + + +
+
+ +
+
+ + Retour à l'administration des titres + +
\ No newline at end of file diff --git a/Webzine.WebApplication/wwwroot/css/app.css b/Webzine.WebApplication/wwwroot/css/app.css index e69de29..3ca026d 100644 --- a/Webzine.WebApplication/wwwroot/css/app.css +++ b/Webzine.WebApplication/wwwroot/css/app.css @@ -0,0 +1,3 @@ +a { + text-decoration: none !important; +} \ No newline at end of file From de6ca18eac94b4d67113ee21b246d379fc1e3a22 Mon Sep 17 00:00:00 2001 From: mirage <119869686+ClementBobin@users.noreply.github.com> Date: Thu, 5 Mar 2026 15:55:07 +0100 Subject: [PATCH 02/12] feat: Refactor Titre views and view models to use Administration area --- .../Controllers/TitreController.cs | 7 ++++--- .../ViewModels/CommentaireViewModel.cs | 0 .../ViewModels/Titre}/AdminTitreDelete.cs | 2 +- .../ViewModels/Titre}/AdminTitreForm.cs | 2 +- .../ViewModels/Titre}/AdminTitreList.cs | 2 +- .../Views/Commentaires/Index.cshtml | 1 - .../Views/Shared/_Layout.cshtml | 0 .../Administration/Views/Titre}/Create.cshtml | 2 +- .../Administration/Views/Titre}/Delete.cshtml | 2 +- .../Administration/Views/Titre}/Edit.cshtml | 2 +- .../Administration/Views/Titre}/Index.cshtml | 2 +- .../Administration/Views/Titre}/_Form.cshtml | 2 +- .../Webzine.WebApplication.csproj | 16 ++++++++++++++++ 13 files changed, 28 insertions(+), 12 deletions(-) rename Webzine.WebApplication/Areas/{Admin => Administration}/Controllers/TitreController.cs (95%) rename Webzine.WebApplication/{ => Areas/Administration}/ViewModels/CommentaireViewModel.cs (100%) rename Webzine.WebApplication/{ViewModels/Admin/Titre2 => Areas/Administration/ViewModels/Titre}/AdminTitreDelete.cs (66%) rename Webzine.WebApplication/{ViewModels/Admin/Titre2 => Areas/Administration/ViewModels/Titre}/AdminTitreForm.cs (90%) rename Webzine.WebApplication/{ViewModels/Admin/Titre2 => Areas/Administration/ViewModels/Titre}/AdminTitreList.cs (84%) rename Webzine.WebApplication/Areas/{Admin => Administration}/Views/Commentaires/Index.cshtml (97%) rename Webzine.WebApplication/Areas/{Admin => Administration}/Views/Shared/_Layout.cshtml (100%) rename Webzine.WebApplication/{Views/Titre2 => Areas/Administration/Views/Titre}/Create.cshtml (57%) rename Webzine.WebApplication/{Views/Titre2 => Areas/Administration/Views/Titre}/Delete.cshtml (86%) rename Webzine.WebApplication/{Views/Titre2 => Areas/Administration/Views/Titre}/Edit.cshtml (64%) rename Webzine.WebApplication/{Views/Titre2 => Areas/Administration/Views/Titre}/Index.cshtml (95%) rename Webzine.WebApplication/{Views/Titre2 => Areas/Administration/Views/Titre}/_Form.cshtml (98%) diff --git a/Webzine.WebApplication/Areas/Admin/Controllers/TitreController.cs b/Webzine.WebApplication/Areas/Administration/Controllers/TitreController.cs similarity index 95% rename from Webzine.WebApplication/Areas/Admin/Controllers/TitreController.cs rename to Webzine.WebApplication/Areas/Administration/Controllers/TitreController.cs index ccca532..da23839 100644 --- a/Webzine.WebApplication/Areas/Admin/Controllers/TitreController.cs +++ b/Webzine.WebApplication/Areas/Administration/Controllers/TitreController.cs @@ -2,11 +2,12 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Webzine.Entity; using Webzine.Entity.Fixtures; -using Webzine.WebApplication.ViewModels.Admin.Titre; +using Webzine.WebApplication.Areas.Administration.ViewModels.Titre; -namespace Webzine.WebApplication.Areas.Admin.Controllers; +namespace Webzine.WebApplication.Areas.Administration.Controllers; -public class TitreController : Microsoft.AspNetCore.Mvc.Controller +[Area("Administration")] +public class TitreController : Controller { private readonly ILogger _logger; private readonly List _titres; diff --git a/Webzine.WebApplication/ViewModels/CommentaireViewModel.cs b/Webzine.WebApplication/Areas/Administration/ViewModels/CommentaireViewModel.cs similarity index 100% rename from Webzine.WebApplication/ViewModels/CommentaireViewModel.cs rename to Webzine.WebApplication/Areas/Administration/ViewModels/CommentaireViewModel.cs diff --git a/Webzine.WebApplication/ViewModels/Admin/Titre2/AdminTitreDelete.cs b/Webzine.WebApplication/Areas/Administration/ViewModels/Titre/AdminTitreDelete.cs similarity index 66% rename from Webzine.WebApplication/ViewModels/Admin/Titre2/AdminTitreDelete.cs rename to Webzine.WebApplication/Areas/Administration/ViewModels/Titre/AdminTitreDelete.cs index 1678948..6d2ee69 100644 --- a/Webzine.WebApplication/ViewModels/Admin/Titre2/AdminTitreDelete.cs +++ b/Webzine.WebApplication/Areas/Administration/ViewModels/Titre/AdminTitreDelete.cs @@ -1,4 +1,4 @@ -namespace Webzine.WebApplication.ViewModels.Admin.Titre; +namespace Webzine.WebApplication.Areas.Administration.ViewModels.Titre; public class AdminTitreDelete { diff --git a/Webzine.WebApplication/ViewModels/Admin/Titre2/AdminTitreForm.cs b/Webzine.WebApplication/Areas/Administration/ViewModels/Titre/AdminTitreForm.cs similarity index 90% rename from Webzine.WebApplication/ViewModels/Admin/Titre2/AdminTitreForm.cs rename to Webzine.WebApplication/Areas/Administration/ViewModels/Titre/AdminTitreForm.cs index 020a231..ceb49b9 100644 --- a/Webzine.WebApplication/ViewModels/Admin/Titre2/AdminTitreForm.cs +++ b/Webzine.WebApplication/Areas/Administration/ViewModels/Titre/AdminTitreForm.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Mvc.Rendering; -namespace Webzine.WebApplication.ViewModels.Admin.Titre; +namespace Webzine.WebApplication.Areas.Administration.ViewModels.Titre; public class AdminTitreForm { diff --git a/Webzine.WebApplication/ViewModels/Admin/Titre2/AdminTitreList.cs b/Webzine.WebApplication/Areas/Administration/ViewModels/Titre/AdminTitreList.cs similarity index 84% rename from Webzine.WebApplication/ViewModels/Admin/Titre2/AdminTitreList.cs rename to Webzine.WebApplication/Areas/Administration/ViewModels/Titre/AdminTitreList.cs index 410b34b..5ca77e0 100644 --- a/Webzine.WebApplication/ViewModels/Admin/Titre2/AdminTitreList.cs +++ b/Webzine.WebApplication/Areas/Administration/ViewModels/Titre/AdminTitreList.cs @@ -1,4 +1,4 @@ -namespace Webzine.WebApplication.ViewModels.Admin.Titre +namespace Webzine.WebApplication.Areas.Administration.ViewModels.Titre { public class AdminTitreList { diff --git a/Webzine.WebApplication/Areas/Admin/Views/Commentaires/Index.cshtml b/Webzine.WebApplication/Areas/Administration/Views/Commentaires/Index.cshtml similarity index 97% rename from Webzine.WebApplication/Areas/Admin/Views/Commentaires/Index.cshtml rename to Webzine.WebApplication/Areas/Administration/Views/Commentaires/Index.cshtml index 0199999..fadf546 100644 --- a/Webzine.WebApplication/Areas/Admin/Views/Commentaires/Index.cshtml +++ b/Webzine.WebApplication/Areas/Administration/Views/Commentaires/Index.cshtml @@ -4,7 +4,6 @@ @{ ViewData["Title"] = "Commentaires"; - Layout = "~/Areas/Admin/Views/Shared/_Layout.cshtml"; } \ No newline at end of file + \ No newline at end of file diff --git a/Webzine.WebApplication/Controllers/AccueilController.cs b/Webzine.WebApplication/Controllers/AccueilController.cs index 7e18194..354f1f3 100644 --- a/Webzine.WebApplication/Controllers/AccueilController.cs +++ b/Webzine.WebApplication/Controllers/AccueilController.cs @@ -10,13 +10,22 @@ namespace Webzine.WebApplication.Controllers private readonly ILogger _logger; private readonly IConfiguration _configuration; + /// + /// Initializes a new instance of the class. + /// + /// Service de journalisation injecté pour enregistrer les événements et les erreurs. + /// Service d'injection de configuration pour accéder aux paramètres de l'application. public AccueilController(ILogger logger, IConfiguration configuration) { _logger = logger; _configuration = configuration; + this._logger.LogDebug(1, "NLog injected into AccueilController"); } - // GET: AccueilController + /// + /// Affiche la page d'accueil du webzine, présentant les derniers titres et les titres les plus populaires. + /// + /// La vue Index avec le ViewModel contenant les listes de titres à afficher. public ActionResult Index() { _logger.LogInformation("Arrivée sur la page d'accueil"); diff --git a/Webzine.WebApplication/Controllers/ApiController.cs b/Webzine.WebApplication/Controllers/ApiController.cs index 39e8825..40e6ba2 100644 --- a/Webzine.WebApplication/Controllers/ApiController.cs +++ b/Webzine.WebApplication/Controllers/ApiController.cs @@ -6,18 +6,30 @@ public class ApiController : ControllerBase { private readonly ILogger _logger; + /// + /// Initializes a new instance of the class. + /// + /// Service de journalisation injecté pour enregistrer les événements et les erreurs. public ApiController(ILogger logger) { this._logger = logger; this._logger.LogDebug(1, "NLog injected into VersionController"); } + /// + /// Endpoint de test pour vérifier que l'API fonctionne correctement. Retourne une chaîne de caractères "Hello World !". + /// + /// Une chaîne de caractères "Hello World !". [HttpGet] public string HelloWorld() { return "Hello World !"; } + /// + /// Endpoint de test pour vérifier que l'API fonctionne correctement. Retourne un objet JSON contenant le nom et la version de l'application. + /// + /// Un objet JSON avec les propriétés "nom" et "version". [HttpGet] public IActionResult Version() { diff --git a/Webzine.WebApplication/Controllers/ArtisteController.cs b/Webzine.WebApplication/Controllers/ArtisteController.cs index 0f5b91a..08df8f6 100644 --- a/Webzine.WebApplication/Controllers/ArtisteController.cs +++ b/Webzine.WebApplication/Controllers/ArtisteController.cs @@ -9,16 +9,21 @@ namespace Webzine.WebApplication.Controllers // Injection du logger via le constructeur private readonly ILogger _logger; + /// + /// Initializes a new instance of the class. + /// + /// Service de journalisation injecté pour enregistrer les événements et les erreurs. public ArtisteController(ILogger logger) { _logger = logger; + this._logger.LogDebug(1, "NLog injected into ArtisteController"); } /// /// 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. /// - /// - /// + /// Le nom de l'artiste à rechercher, formaté en kebab-case (ex: "fatal-bazooka"). + /// 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é. [HttpGet("/artiste/{nom}")] public IActionResult Index(string nom) { diff --git a/Webzine.WebApplication/Controllers/ContactController.cs b/Webzine.WebApplication/Controllers/ContactController.cs index 557e1fb..2aa8c32 100644 --- a/Webzine.WebApplication/Controllers/ContactController.cs +++ b/Webzine.WebApplication/Controllers/ContactController.cs @@ -7,6 +7,23 @@ namespace Webzine.WebApplication.Controllers /// public class ContactController : Controller { + // Injection du logger via le constructeur + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the class. + /// + /// Service de journalisation injecté pour enregistrer les événements et les erreurs. + public ContactController(ILogger logger) + { + _logger = logger; + this._logger.LogDebug(1, "NLog injected into ContactController"); + } + + /// + /// Affiche la page de contact du webzine. + /// + /// La vue Index de la page de contact. public IActionResult Index() { return View(); diff --git a/Webzine.WebApplication/Controllers/TitreController.cs b/Webzine.WebApplication/Controllers/TitreController.cs index b89c757..3cfdfbd 100644 --- a/Webzine.WebApplication/Controllers/TitreController.cs +++ b/Webzine.WebApplication/Controllers/TitreController.cs @@ -19,6 +19,7 @@ public class TitreController : Controller private readonly List _artistes; /// + /// Initializes a new instance of the class. /// Initialise une nouvelle instance du . /// Les données sont générées dynamiquement via . /// diff --git a/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs b/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs index 8a163d1..fa29cd2 100644 --- a/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs +++ b/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs @@ -1,10 +1,20 @@ -using Webzine.Entity; +using Webzine.Entity; namespace Webzine.WebApplication.ViewModels.Accueil { + /// + /// ViewModel pour la page d'accueil du webzine, affichant les derniers titres et les titres les plus populaires. + /// public class AccueilIndexViewModel { + /// + /// Définit la liste des derniers titres ajoutés au webzine. + /// public List DerniersTitres { get; set; } = []; + + /// + /// Définit la liste des titres les plus populaires du webzine. + /// public List TopTitres { get; set; } = []; } } \ No newline at end of file diff --git a/Webzine.WebApplication/ViewModels/ArtisteModel.cs b/Webzine.WebApplication/ViewModels/ArtisteModel.cs index c362cd9..426af29 100644 --- a/Webzine.WebApplication/ViewModels/ArtisteModel.cs +++ b/Webzine.WebApplication/ViewModels/ArtisteModel.cs @@ -1,7 +1,10 @@ -using Webzine.Entity; +using Webzine.Entity; namespace Webzine.WebApplication.ViewModels { + /// + /// ViewModel pour afficher les détails d'un artiste, incluant les informations de l'artiste et la liste de ses titres. + /// public class ArtisteModel { /// diff --git a/Webzine.WebApplication/ViewModels/Titre/TitreComment.cs b/Webzine.WebApplication/ViewModels/Titre/TitreComment.cs index da0dc16..1281c77 100644 --- a/Webzine.WebApplication/ViewModels/Titre/TitreComment.cs +++ b/Webzine.WebApplication/ViewModels/Titre/TitreComment.cs @@ -2,16 +2,28 @@ using System.ComponentModel.DataAnnotations; namespace Webzine.WebApplication.ViewModels.Titre; +/// +/// Classe représentant un commentaire sur un titre, utilisée pour la validation des données lors de la soumission d'un commentaire. +/// public class TitreComment { + /// + /// Définit l'identifiant du titre auquel le commentaire est associé. + /// [Required] public int IdTitre { get; set; } + /// + /// Définit le nom de l'auteur du commentaire. + /// [Required] [MinLength(2)] [MaxLength(30)] public string Auteur { get; set; } + /// + /// Définit le contenu du commentaire. + /// [Required] [MinLength(10)] [MaxLength(1000)] diff --git a/Webzine.WebApplication/ViewModels/Titre/TitreContent.cs b/Webzine.WebApplication/ViewModels/Titre/TitreContent.cs index b1ee798..7c49ce4 100644 --- a/Webzine.WebApplication/ViewModels/Titre/TitreContent.cs +++ b/Webzine.WebApplication/ViewModels/Titre/TitreContent.cs @@ -2,25 +2,58 @@ using Webzine.Entity; namespace Webzine.WebApplication.ViewModels.Titre; +/// +/// Contient les détails d'un titre, ainsi que les commentaires associés. +/// public class TitreContent { + /// + /// Définit l'identifiant du titre. + /// public int IdTitre { get; set; } + /// + /// Définit le titre du titre. + /// public string Libelle { get; set; } + /// + /// Définit la chronique du titre. + /// public string Chronique { get; set; } + /// + /// Définit la date de sortie du titre. + /// public DateTime DateSortie { get; set; } + /// + /// Définit le nombre de likes du titre. + /// public int NbLikes { get; set; } + /// + /// Définit l'url de la jaquette de l'album associé au titre. + /// public string UrlJaquette { get; set; } + /// + /// Définit l'url d'écoute du titre. + /// public string UrlEcoute { get; set; } + /// + /// Définit le nom de l'artiste associé au titre. + /// public string ArtisteNom { get; set; } + /// + /// Définit le nom de l'album associé au titre. + /// public List