From cc8ca35539b5ef8477b7a065bdfc3bc0a74dcfda Mon Sep 17 00:00:00 2001 From: "josephine.vetu" Date: Wed, 4 Mar 2026 10:59:20 +0100 Subject: [PATCH 01/58] =?UTF-8?q?#2=20Cr=C3=A9ation=20de=20l'entit=C3=A9?= =?UTF-8?q?=20artiste=20correspondant=20aux=20tests=20unitaires=20ArtisteT?= =?UTF-8?q?ests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Webzine.Entity/Artiste.cs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Webzine.Entity/Artiste.cs diff --git a/Webzine.Entity/Artiste.cs b/Webzine.Entity/Artiste.cs new file mode 100644 index 0000000..257fe56 --- /dev/null +++ b/Webzine.Entity/Artiste.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; +using System.Timers; + +namespace Webzine.Entity +{ + /// + /// Classe représentant un artiste. + /// Lien avec l'entité : un artiste peut avoir plusieurs titres, mais un titre n'a qu'un seul artiste. + /// + public class Artiste + { + public int IdArtiste { get; set; } + + [Required] + [MinLength(2)] + [MaxLength(50)] + [Display(Name = "Nom de l'artiste")] + public string Nom { get; set; } + + public string Biographie { get; set; } + + public List Titres { get; set; } + } +} From c22f737867dff2212fc743cf59fd5604bdbdff6d Mon Sep 17 00:00:00 2001 From: "josephine.vetu" Date: Wed, 4 Mar 2026 11:00:07 +0100 Subject: [PATCH 02/58] =?UTF-8?q?#4=20Cr=C3=A9ation=20de=20l'entit=C3=A9?= =?UTF-8?q?=20commentaire=20correspondant=20aux=20tests=20unitaires=20Comm?= =?UTF-8?q?entaireTests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Webzine.Entity/Commentaire.cs | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 Webzine.Entity/Commentaire.cs diff --git a/Webzine.Entity/Commentaire.cs b/Webzine.Entity/Commentaire.cs new file mode 100644 index 0000000..36530b6 --- /dev/null +++ b/Webzine.Entity/Commentaire.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; + +namespace Webzine.Entity +{ + /// + /// Classe représentant un commentaire laissé par un utilisateur sur un titre. + /// Lien avec l'entité : un titre peut avoir plusieurs commentaires, mais un commentaire n'a qu'un seul titre. + /// + public class Commentaire + { + public int IdCommentaire { get; set; } + + [Required] + [MinLength(10)] + [MaxLength(1000)] + [Display(Name = "Commentaire")] + public string Contenu { get; set; } + + [Required] + [MinLength(2)] + [MaxLength(30)] + [Display(Name = "Nom")] + public string Auteur { get; set; } + + [Required] + [Display(Name = "Date de création")] + public DateTime DateCreation { get; set; } + + public int IdTitre { get; set; } + + public Titre Titre { get; set; } + } +} From 509df1f2ff95aac3f14623a513aa837958a4f76e Mon Sep 17 00:00:00 2001 From: "josephine.vetu" Date: Wed, 4 Mar 2026 11:00:47 +0100 Subject: [PATCH 03/58] =?UTF-8?q?#3=20Cr=C3=A9ation=20de=20l'entit=C3=A9?= =?UTF-8?q?=20style=20correspondant=20aux=20tests=20unitaires=20StyleTests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Webzine.Entity/Style.cs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 Webzine.Entity/Style.cs diff --git a/Webzine.Entity/Style.cs b/Webzine.Entity/Style.cs new file mode 100644 index 0000000..11c6f32 --- /dev/null +++ b/Webzine.Entity/Style.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; + +namespace Webzine.Entity +{ + /// + /// Classe représentant un style de musique. + /// + public class Style + { + public int IdStyle { get; set; } + + [Required] + [MinLength(2)] + [MaxLength(50)] + [Display(Name = "Libellé")] + public string Libelle { get; set; } + + } +} From d0a95328226c30d611212c798f77b1374cf21ce8 Mon Sep 17 00:00:00 2001 From: "josephine.vetu" Date: Wed, 4 Mar 2026 11:02:00 +0100 Subject: [PATCH 04/58] =?UTF-8?q?#1=20Cr=C3=A9ation=20de=20l'entit=C3=A9?= =?UTF-8?q?=20titre=20correspondant=20aux=20tests=20unitaires=20TitreTests?= =?UTF-8?q?=20+=20modification=20du=20gitignore.=20Tous=20les=20tests=20un?= =?UTF-8?q?itaires=20sont=20en=20r=C3=A9ussite.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- .../Webzine.Entity.Tests.csproj | 8 ++- Webzine.Entity/Titre.cs | 67 +++++++++++++++++++ .../Webzine.WebApplication.csproj.user | 6 ++ 4 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 Webzine.Entity/Titre.cs create mode 100644 Webzine.WebApplication/Webzine.WebApplication.csproj.user diff --git a/.gitignore b/.gitignore index a1d490a..b5fad81 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ obj/ riderModule.iml /_ReSharper.Caches/ [Ll]ogs/ -.idea/ \ No newline at end of file +.idea/ +/vs/ +/.vs/ \ No newline at end of file diff --git a/Webzine.Entity.Tests/Webzine.Entity.Tests.csproj b/Webzine.Entity.Tests/Webzine.Entity.Tests.csproj index 2e335bf..d7e20a3 100644 --- a/Webzine.Entity.Tests/Webzine.Entity.Tests.csproj +++ b/Webzine.Entity.Tests/Webzine.Entity.Tests.csproj @@ -8,7 +8,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -16,7 +16,7 @@ - + @@ -25,4 +25,8 @@ + + + + diff --git a/Webzine.Entity/Titre.cs b/Webzine.Entity/Titre.cs new file mode 100644 index 0000000..2fd9671 --- /dev/null +++ b/Webzine.Entity/Titre.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text; + +namespace Webzine.Entity +{ + /// + /// Classe représentant un titre de musique. + /// Lien avec l'entité : un artiste peut avoir plusieurs titres, mais un titre n'a qu'un seul artiste. + /// Lien avec l'entité : un titre peut avoir plusieurs commentaires, mais un commentaire n'a qu'un seul titre. + /// + public class Titre + { + public int IdTitre { get; set; } + + public int IdArtiste { get; set; } + + public Artiste Artiste { get; set; } + + [Required] + [MinLength(1)] + [MaxLength(200)] + [Display(Name = "Titre")] + public string Libelle { get; set; } + + [Required] + [MinLength(10)] + [MaxLength(4000)] + public string Chronique { get; set; } + + [Required] + [Display(Name = "Date de création")] + public DateTime DateCreation { get; set; } + + [Display(Name = "Durée en secondes")] + public int Duree { get; set; } + + [Required] + [Display(Name = "Date de sortie")] + public DateTime DateSortie { get; set; } + + [Required] + [MaxLength(250)] + [Display(Name = "Jaquette de l'album")] + public string UrlJaquette { get; set; } + + [MinLength(13)] + [MaxLength(250)] + [Display(Name = "URL d'écoute")] + public string UrlEcoute { get; set; } + + [Required] + [Display(Name = "Nombre de lectures")] + public int NbLectures { get; set; } + + [Required] + [Display(Name = "Nombre de likes")] + public int NbLikes { get; set; } + + [Required] + public string Album { get; set; } + + public List Commentaires { get; set; } + + } + } diff --git a/Webzine.WebApplication/Webzine.WebApplication.csproj.user b/Webzine.WebApplication/Webzine.WebApplication.csproj.user new file mode 100644 index 0000000..9ff5820 --- /dev/null +++ b/Webzine.WebApplication/Webzine.WebApplication.csproj.user @@ -0,0 +1,6 @@ + + + + https + + \ No newline at end of file From 15b0dd6a1aadceb440b74a07a6f08109620639bd Mon Sep 17 00:00:00 2001 From: mirage <119869686+ClementBobin@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:55:58 +0100 Subject: [PATCH 05/58] =?UTF-8?q?Ajout=20des=20entit=C3=A9s=20Artiste,=20S?= =?UTF-8?q?tyle,=20Titre=20et=20Commentaire=20avec=20une=20m=C3=A9thode=20?= =?UTF-8?q?de=20peuplement=20dans=20LocalEntityRepository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Webzine.Repository.Contracts.csproj | 4 ++++ Webzine.Repository/LocalEntityRepository.cs | 17 +++++++++++++++++ Webzine.Repository/Webzine.Repository.csproj | 4 ++++ 3 files changed, 25 insertions(+) diff --git a/Webzine.Repository.Contracts/Webzine.Repository.Contracts.csproj b/Webzine.Repository.Contracts/Webzine.Repository.Contracts.csproj index 33c0658..00cfc3d 100644 --- a/Webzine.Repository.Contracts/Webzine.Repository.Contracts.csproj +++ b/Webzine.Repository.Contracts/Webzine.Repository.Contracts.csproj @@ -21,4 +21,8 @@ + + + + diff --git a/Webzine.Repository/LocalEntityRepository.cs b/Webzine.Repository/LocalEntityRepository.cs index e74e4e1..a2113b2 100644 --- a/Webzine.Repository/LocalEntityRepository.cs +++ b/Webzine.Repository/LocalEntityRepository.cs @@ -1,5 +1,22 @@ namespace Webzine.Repository; +using Entity; +using Entity.Fixtures; + public class LocalEntityRepository { + public List Artistes { get; set; } + public List + +

Commentaires

+ +
+ + + + + + + + + + + + @foreach (Webzine.Entity.Commentaire commentaire in Model.Commentaires) + { + + + + + + + + } + +
TitreAuteurCommentaireDate de créationActions
+ + @(commentaire.Titre != null ? commentaire.Titre.Libelle : "Titre inconnu") + + + @commentaire.Auteur + + @commentaire.Contenu + + @commentaire.DateCreation.ToString("dd/MM/yyyy HH:mm:ss") + + +
+ @Html.AntiForgeryToken() + +
+
+
diff --git a/Webzine.WebApplication/Areas/Admin/Views/Shared/_Layout.cshtml b/Webzine.WebApplication/Areas/Admin/Views/Shared/_Layout.cshtml new file mode 100644 index 0000000..559941b --- /dev/null +++ b/Webzine.WebApplication/Areas/Admin/Views/Shared/_Layout.cshtml @@ -0,0 +1,181 @@ + + + + + + @ViewData["Title"] - Administration + + + + + + +
+
+ @RenderBody() +
+
+ + \ No newline at end of file diff --git a/Webzine.WebApplication/Controllers/CommentairesController.cs b/Webzine.WebApplication/Controllers/CommentairesController.cs new file mode 100644 index 0000000..9c60b25 --- /dev/null +++ b/Webzine.WebApplication/Controllers/CommentairesController.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Webzine.Entity; +using Webzine.WebApplication.ViewModels; + +namespace Webzine.WebApplication.Controllers +{ + [Area("Admin")] + public class CommentairesController : Controller + { + // GET: Admin/Commentaires + public ActionResult Index() + { + // Création de données "bouchon" (mock) pour tester l'affichage + var listeCommentaires = new List + { + new Commentaire + { + IdCommentaire = 1, // Correction: Id -> IdCommentaire + Auteur = "Michel", // Correction: Nom -> Auteur + Contenu = "Nulla sed velit nec tellus gravida molestie", + DateCreation = new DateTime(2023, 1, 22, 15, 59, 28), + // Important : On initialise l'objet Titre pour accéder à Titre.Libelle + Titre = new Titre { Libelle = "St Germain - So Flute" }, + }, + new Commentaire + { + IdCommentaire = 2, + Auteur = "Jeff", + Contenu = "Lorem ipsum dolor sit.", + DateCreation = new DateTime(2023, 1, 22, 14, 27, 8), + Titre = new Titre { Libelle = "Queen - Bohemian Rapsody" }, + }, + new Commentaire + { + IdCommentaire = 3, + Auteur = "Eva", + Contenu = "Aenean vulputate eleifend tellus.", + DateCreation = new DateTime(2023, 1, 22, 13, 2, 17), + Titre = new Titre { Libelle = "Rammstein - Du hast" }, + }, + }; + + // Initialisation du ViewModel + var viewModel = new CommentaireViewModel + { + Commentaires = listeCommentaires + }; + + return View(viewModel); + } + + + + // GET: CommentairesController/Details/5 + public ActionResult Details(int id) + { + return View(); + } + + // GET: CommentairesController/Create + public ActionResult Create() + { + return View(); + } + + // POST: CommentairesController/Create + [HttpPost] + [ValidateAntiForgeryToken] + public ActionResult Create(IFormCollection collection) + { + try + { + return RedirectToAction(nameof(Index)); + } + catch + { + return View(); + } + } + + // GET: CommentairesController/Edit/5 + public ActionResult Edit(int id) + { + return View(); + } + + // POST: CommentairesController/Edit/5 + [HttpPost] + [ValidateAntiForgeryToken] + public ActionResult Edit(int id, IFormCollection collection) + { + try + { + return RedirectToAction(nameof(Index)); + } + catch + { + return View(); + } + } + + // GET: CommentairesController/Delete/5 + public ActionResult Delete(int id) + { + return View(); + } + + // POST: CommentairesController/Delete/5 + } +} \ No newline at end of file diff --git a/Webzine.WebApplication/Program.cs b/Webzine.WebApplication/Program.cs index 575f1cf..c9ca7ea 100644 --- a/Webzine.WebApplication/Program.cs +++ b/Webzine.WebApplication/Program.cs @@ -30,6 +30,12 @@ try // Active le middleware permettant le routage des requ�tes entrantes. app.UseRouting(); + + // Ajoute une route pour les zones (Areas) comme Admin + app.MapControllerRoute( + name: "areas", + pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); + // Ajoute un endpoint permettant de router les urls // avec la forme /controller/action/id(optionnel). // Equivalent � app.MapDefaultControllerRoute() diff --git a/Webzine.WebApplication/ViewModels/CommentaireViewModel.cs b/Webzine.WebApplication/ViewModels/CommentaireViewModel.cs new file mode 100644 index 0000000..cbd09da --- /dev/null +++ b/Webzine.WebApplication/ViewModels/CommentaireViewModel.cs @@ -0,0 +1,19 @@ +// +// Copyright (c) Webzine. All rights reserved. +// + +using Webzine.Entity; + +namespace Webzine.WebApplication.ViewModels +{ + /// + /// ViewModel pour afficher la liste des commentaires en administration. + /// + public class CommentaireViewModel + { + /// + /// Obtient ou définit la liste des commentaires. + /// + public IEnumerable Commentaires { get; set; } = new List(); + } +} \ No newline at end of file diff --git a/Webzine.WebApplication/Webzine.WebApplication.csproj b/Webzine.WebApplication/Webzine.WebApplication.csproj index 5651896..4f72671 100644 --- a/Webzine.WebApplication/Webzine.WebApplication.csproj +++ b/Webzine.WebApplication/Webzine.WebApplication.csproj @@ -17,6 +17,7 @@ + @@ -25,12 +26,16 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive + + + + From aa5bffee27e6200debce0c496fa131395221ac0e Mon Sep 17 00:00:00 2001 From: "b.nodon" Date: Thu, 5 Mar 2026 13:22:36 +0100 Subject: [PATCH 16/58] =?UTF-8?q?Feat:=20Commentaire=20-=20cr=C3=A9ation?= =?UTF-8?q?=20de=20la=20route=20commentaire=20dans=20program.cs=20-=20cr?= =?UTF-8?q?=C3=A9ation=20du=20CommentairesController=20-=20cr=C3=A9ation?= =?UTF-8?q?=20du=20CommentaireViewModel=20-=20cr=C3=A9ation=20de=20la=20vu?= =?UTF-8?q?e=20index.cshtml=20des=20commentaire=20-=20cr=C3=A9ation=20du?= =?UTF-8?q?=20layout=20Admin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Admin/Views/Commentaires/Index.cshtml | 90 +++++++++ .../Areas/Admin/Views/Shared/_Layout.cshtml | 181 ++++++++++++++++++ .../Controllers/CommentairesController.cs | 113 +++++++++++ Webzine.WebApplication/Program.cs | 6 + .../ViewModels/CommentaireViewModel.cs | 19 ++ .../Webzine.WebApplication.csproj | 9 +- 6 files changed, 416 insertions(+), 2 deletions(-) create mode 100644 Webzine.WebApplication/Areas/Admin/Views/Commentaires/Index.cshtml create mode 100644 Webzine.WebApplication/Areas/Admin/Views/Shared/_Layout.cshtml create mode 100644 Webzine.WebApplication/Controllers/CommentairesController.cs create mode 100644 Webzine.WebApplication/ViewModels/CommentaireViewModel.cs diff --git a/Webzine.WebApplication/Areas/Admin/Views/Commentaires/Index.cshtml b/Webzine.WebApplication/Areas/Admin/Views/Commentaires/Index.cshtml new file mode 100644 index 0000000..0199999 --- /dev/null +++ b/Webzine.WebApplication/Areas/Admin/Views/Commentaires/Index.cshtml @@ -0,0 +1,90 @@ +@using Webzine.WebApplication.ViewModels +@using Webzine.Entity +@model CommentaireViewModel + +@{ + ViewData["Title"] = "Commentaires"; + Layout = "~/Areas/Admin/Views/Shared/_Layout.cshtml"; +} + + + +

Commentaires

+ +
+ + + + + + + + + + + + @foreach (Webzine.Entity.Commentaire commentaire in Model.Commentaires) + { + + + + + + + + } + +
TitreAuteurCommentaireDate de créationActions
+ + @(commentaire.Titre != null ? commentaire.Titre.Libelle : "Titre inconnu") + + + @commentaire.Auteur + + @commentaire.Contenu + + @commentaire.DateCreation.ToString("dd/MM/yyyy HH:mm:ss") + + +
+ @Html.AntiForgeryToken() + +
+
+
diff --git a/Webzine.WebApplication/Areas/Admin/Views/Shared/_Layout.cshtml b/Webzine.WebApplication/Areas/Admin/Views/Shared/_Layout.cshtml new file mode 100644 index 0000000..559941b --- /dev/null +++ b/Webzine.WebApplication/Areas/Admin/Views/Shared/_Layout.cshtml @@ -0,0 +1,181 @@ + + + + + + @ViewData["Title"] - Administration + + + + + + +
+
+ @RenderBody() +
+
+ + \ No newline at end of file diff --git a/Webzine.WebApplication/Controllers/CommentairesController.cs b/Webzine.WebApplication/Controllers/CommentairesController.cs new file mode 100644 index 0000000..9c60b25 --- /dev/null +++ b/Webzine.WebApplication/Controllers/CommentairesController.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Webzine.Entity; +using Webzine.WebApplication.ViewModels; + +namespace Webzine.WebApplication.Controllers +{ + [Area("Admin")] + public class CommentairesController : Controller + { + // GET: Admin/Commentaires + public ActionResult Index() + { + // Création de données "bouchon" (mock) pour tester l'affichage + var listeCommentaires = new List + { + new Commentaire + { + IdCommentaire = 1, // Correction: Id -> IdCommentaire + Auteur = "Michel", // Correction: Nom -> Auteur + Contenu = "Nulla sed velit nec tellus gravida molestie", + DateCreation = new DateTime(2023, 1, 22, 15, 59, 28), + // Important : On initialise l'objet Titre pour accéder à Titre.Libelle + Titre = new Titre { Libelle = "St Germain - So Flute" }, + }, + new Commentaire + { + IdCommentaire = 2, + Auteur = "Jeff", + Contenu = "Lorem ipsum dolor sit.", + DateCreation = new DateTime(2023, 1, 22, 14, 27, 8), + Titre = new Titre { Libelle = "Queen - Bohemian Rapsody" }, + }, + new Commentaire + { + IdCommentaire = 3, + Auteur = "Eva", + Contenu = "Aenean vulputate eleifend tellus.", + DateCreation = new DateTime(2023, 1, 22, 13, 2, 17), + Titre = new Titre { Libelle = "Rammstein - Du hast" }, + }, + }; + + // Initialisation du ViewModel + var viewModel = new CommentaireViewModel + { + Commentaires = listeCommentaires + }; + + return View(viewModel); + } + + + + // GET: CommentairesController/Details/5 + public ActionResult Details(int id) + { + return View(); + } + + // GET: CommentairesController/Create + public ActionResult Create() + { + return View(); + } + + // POST: CommentairesController/Create + [HttpPost] + [ValidateAntiForgeryToken] + public ActionResult Create(IFormCollection collection) + { + try + { + return RedirectToAction(nameof(Index)); + } + catch + { + return View(); + } + } + + // GET: CommentairesController/Edit/5 + public ActionResult Edit(int id) + { + return View(); + } + + // POST: CommentairesController/Edit/5 + [HttpPost] + [ValidateAntiForgeryToken] + public ActionResult Edit(int id, IFormCollection collection) + { + try + { + return RedirectToAction(nameof(Index)); + } + catch + { + return View(); + } + } + + // GET: CommentairesController/Delete/5 + public ActionResult Delete(int id) + { + return View(); + } + + // POST: CommentairesController/Delete/5 + } +} \ No newline at end of file diff --git a/Webzine.WebApplication/Program.cs b/Webzine.WebApplication/Program.cs index 575f1cf..c9ca7ea 100644 --- a/Webzine.WebApplication/Program.cs +++ b/Webzine.WebApplication/Program.cs @@ -30,6 +30,12 @@ try // Active le middleware permettant le routage des requ�tes entrantes. app.UseRouting(); + + // Ajoute une route pour les zones (Areas) comme Admin + app.MapControllerRoute( + name: "areas", + pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"); + // Ajoute un endpoint permettant de router les urls // avec la forme /controller/action/id(optionnel). // Equivalent � app.MapDefaultControllerRoute() diff --git a/Webzine.WebApplication/ViewModels/CommentaireViewModel.cs b/Webzine.WebApplication/ViewModels/CommentaireViewModel.cs new file mode 100644 index 0000000..cbd09da --- /dev/null +++ b/Webzine.WebApplication/ViewModels/CommentaireViewModel.cs @@ -0,0 +1,19 @@ +// +// Copyright (c) Webzine. All rights reserved. +// + +using Webzine.Entity; + +namespace Webzine.WebApplication.ViewModels +{ + /// + /// ViewModel pour afficher la liste des commentaires en administration. + /// + public class CommentaireViewModel + { + /// + /// Obtient ou définit la liste des commentaires. + /// + public IEnumerable Commentaires { get; set; } = new List(); + } +} \ No newline at end of file diff --git a/Webzine.WebApplication/Webzine.WebApplication.csproj b/Webzine.WebApplication/Webzine.WebApplication.csproj index 5651896..4f72671 100644 --- a/Webzine.WebApplication/Webzine.WebApplication.csproj +++ b/Webzine.WebApplication/Webzine.WebApplication.csproj @@ -17,6 +17,7 @@
+ @@ -25,12 +26,16 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive + + + + From 94b84bdfb1a043eb573f56bae03d911d3ee13b79 Mon Sep 17 00:00:00 2001 From: Loic Masi Date: Thu, 5 Mar 2026 13:54:09 +0100 Subject: [PATCH 17/58] =?UTF-8?q?Modification=20de=20la=20page=20d'accueil?= =?UTF-8?q?.=20Ajout=20des=20param=C3=A8tres=20dans=20le=20fichier=20appse?= =?UTF-8?q?ttings=20pour=20choisir=20le=20nombre=20de=20chronique=20ou=20d?= =?UTF-8?q?e=20titres=20les=20plus=20likes=20=C3=A0=20afficher.=20Ajout=20?= =?UTF-8?q?des=20relations=20qui=20permettent=20de=20fakes=20les=20donn?= =?UTF-8?q?=C3=A9es=20affich=C3=A9s=20sur=20la=20page=20d'accueil.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Webzine.Entity/Titre.cs | 2 +- Webzine.Repository/Fake/TitreFactory.cs | 63 ++++++ Webzine.Repository/Webzine.Repository.csproj | 4 + .../Controllers/AccueilController.cs | 89 +++------ .../Accueil/AccueilIndexViewModel.cs | 10 + .../Views/Accueil/Index.cshtml | 185 ++++++------------ .../Webzine.WebApplication.csproj | 14 +- Webzine.WebApplication/appsettings.json | 4 + 8 files changed, 170 insertions(+), 201 deletions(-) create mode 100644 Webzine.Repository/Fake/TitreFactory.cs create mode 100644 Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs diff --git a/Webzine.Entity/Titre.cs b/Webzine.Entity/Titre.cs index 2fd9671..f8d299c 100644 --- a/Webzine.Entity/Titre.cs +++ b/Webzine.Entity/Titre.cs @@ -64,4 +64,4 @@ namespace Webzine.Entity public List Commentaires { get; set; } } - } +} diff --git a/Webzine.Repository/Fake/TitreFactory.cs b/Webzine.Repository/Fake/TitreFactory.cs new file mode 100644 index 0000000..f92bf9d --- /dev/null +++ b/Webzine.Repository/Fake/TitreFactory.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using Faker; +using Webzine.Entity; + +namespace Webzine.Repository.Fake +{ + public static class FakeDataFactory + { + //https://cdn-images.dzcdn.net/images/cover/311bba0fc112d15f72c8b5a65f0456c1/1900x1900-000000-80-0-0.jpg", + public static List GetArtistes(int count = 10) + { + var artistes = new List(); + + for (int i = 1; i <= count; i++) + { + artistes.Add(new Artiste + { + IdArtiste = i, + Nom = Name.FullName(), + Biographie = Lorem.Paragraph(), + Titres = new List() + }); + } + + return artistes; + } + + public static List GetTitres(int count = 40) + { + var artistes = GetArtistes(); + var titres = new List(); + + for (int i = 1; i <= count; i++) + { + var artiste = artistes[RandomNumber.Next(0, artistes.Count - 1)]; + + var titre = new Titre + { + IdTitre = i, + IdArtiste = artiste.IdArtiste, + Artiste = artiste, + Libelle = Lorem.Sentence(3), + Chronique = Lorem.Paragraph(), + DateCreation = DateTime.Now.AddDays(-RandomNumber.Next(1, 100)), + DateSortie = DateTime.Now.AddYears(-RandomNumber.Next(1, 20)), + Duree = RandomNumber.Next(120, 420), + UrlJaquette = "https://picsum.photos/300", + UrlEcoute = Internet.Url(), + NbLectures = RandomNumber.Next(0, 500), + NbLikes = RandomNumber.Next(0, 200), + Album = Lorem.Sentence(2), + Commentaires = new List() + }; + + titres.Add(titre); + artiste.Titres.Add(titre); + } + + return titres; + } + } +} diff --git a/Webzine.Repository/Webzine.Repository.csproj b/Webzine.Repository/Webzine.Repository.csproj index 33c0658..00cfc3d 100644 --- a/Webzine.Repository/Webzine.Repository.csproj +++ b/Webzine.Repository/Webzine.Repository.csproj @@ -21,4 +21,8 @@ + + + + diff --git a/Webzine.WebApplication/Controllers/AccueilController.cs b/Webzine.WebApplication/Controllers/AccueilController.cs index 32e2e49..5be79f9 100644 --- a/Webzine.WebApplication/Controllers/AccueilController.cs +++ b/Webzine.WebApplication/Controllers/AccueilController.cs @@ -1,83 +1,40 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Webzine.Repository.Fake; +using Webzine.WebApplication.ViewModels.Accueil; namespace Webzine.WebApplication.Controllers { public class AccueilController : Controller { + private readonly IConfiguration _configuration; + + public AccueilController(IConfiguration configuration) + { + _configuration = configuration; + } + // GET: AccueilController public ActionResult Index() { - return View(); - } + var derniereChronique = _configuration.GetValue("Webzine:NombreDerniereChronique"); + var topTitres = _configuration.GetValue("Webzine:NombreDeTopTitres"); + var titres = FakeDataFactory.GetTitres(); - // GET: AccueilController/Details/5 - public ActionResult Details(int id) - { - return View(); - } - - // GET: AccueilController/Create - public ActionResult Create() - { - return View(); - } - - // POST: AccueilController/Create - [HttpPost] - [ValidateAntiForgeryToken] - public ActionResult Create(IFormCollection collection) - { - try + var vm = new AccueilIndexViewModel { - return RedirectToAction(nameof(Index)); - } - catch - { - return View(); - } - } + DerniersTitres = titres + .OrderByDescending(t => t.DateCreation) + .Take(derniereChronique) + .ToList(), - // GET: AccueilController/Edit/5 - public ActionResult Edit(int id) - { - return View(); - } + TopTitres = titres + .OrderByDescending(t => t.NbLikes) + .Take(topTitres) + .ToList() + }; - // POST: AccueilController/Edit/5 - [HttpPost] - [ValidateAntiForgeryToken] - public ActionResult Edit(int id, IFormCollection collection) - { - try - { - return RedirectToAction(nameof(Index)); - } - catch - { - return View(); - } - } - - // GET: AccueilController/Delete/5 - public ActionResult Delete(int id) - { - return View(); - } - - // POST: AccueilController/Delete/5 - [HttpPost] - [ValidateAntiForgeryToken] - public ActionResult Delete(int id, IFormCollection collection) - { - try - { - return RedirectToAction(nameof(Index)); - } - catch - { - return View(); - } + return View(vm); } } } diff --git a/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs b/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs new file mode 100644 index 0000000..bd57abf --- /dev/null +++ b/Webzine.WebApplication/ViewModels/Accueil/AccueilIndexViewModel.cs @@ -0,0 +1,10 @@ +using Webzine.Entity; + +namespace Webzine.WebApplication.ViewModels.Accueil +{ + public class AccueilIndexViewModel + { + public IEnumerable DerniersTitres { get; set; } = []; + public IEnumerable TopTitres { get; set; } = []; + } +} diff --git a/Webzine.WebApplication/Views/Accueil/Index.cshtml b/Webzine.WebApplication/Views/Accueil/Index.cshtml index ca80480..0312cde 100644 --- a/Webzine.WebApplication/Views/Accueil/Index.cshtml +++ b/Webzine.WebApplication/Views/Accueil/Index.cshtml @@ -1,118 +1,75 @@ -@* - For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 -*@ +@model Webzine.WebApplication.ViewModels.Accueil.AccueilIndexViewModel @{ ViewData["Title"] = "Accueil"; }

Derniers titres chroniqués

-
+@* TEMPLATE *@ +@*
Alternate Text + src="" />
Justice - D.A.N.C.E

- Duis aute irure dolor in reprehenderit in voluptate velit esse cillum - dolore eu fugiat nulla pariatur, Ut enim ad minim veniam quis nostrud - exercitation ullamco laboris nisi ut aliquip ex ea commodo ... + Insérer texte

Lire la suite
+ Date : 17/12/2022 11:08:08
-
-
- Alternate Text -
-
- Justice - D.A.N.C.E -

- Duis aute irure dolor in reprehenderit in voluptate velit esse cillum - dolore eu fugiat nulla pariatur, Ut enim ad minim veniam quis nostrud - exercitation ullamco laboris nisi ut aliquip ex ea commodo ... -

- *@ -
- - 17/12/2022 11:08:08 -
+
+ @foreach (var titre in Model.DerniersTitres) + { +
+
+ +
+
+ @* Artiste - Titre @titre.Artiste - @titre.Libelle*@ + @titre.Artiste.Nom - @titre.Libelle + @* Chronique *@ +

+ @titre.Chronique +

+
+ Lire la suite -
- - Electro disco +
+ + @* Date de création *@ + @titre.DateCreation +
+ +
+ + @* Style *@ + STYLE +
-
-
-
- Alternate Text -
-
- Justice - D.A.N.C.E -

- Duis aute irure dolor in reprehenderit in voluptate velit esse cillum - dolore eu fugiat nulla pariatur, Ut enim ad minim veniam quis nostrud - exercitation ullamco laboris nisi ut aliquip ex ea commodo ... -

-
- Lire la suite - -
- - 17/12/2022 11:08:08 -
- - -
-
-
+ }
@@ -121,53 +78,12 @@

Titres les plus populaires

-
+@* TEMPLATE *@ +@*
Alternate Text - -
- Album
- par Artiste -
-
-
- Alternate Text - -
- Album
- par Artiste -
-
-
- Alternate Text + src="" alt="Alternate Text" />
Album
@@ -175,4 +91,21 @@
+
*@ +
+
+ @foreach (var titre in Model.TopTitres) + { +
+ + + +
+ } +
+
\ No newline at end of file diff --git a/Webzine.WebApplication/Webzine.WebApplication.csproj b/Webzine.WebApplication/Webzine.WebApplication.csproj index 7a445ec..cce23e9 100644 --- a/Webzine.WebApplication/Webzine.WebApplication.csproj +++ b/Webzine.WebApplication/Webzine.WebApplication.csproj @@ -7,13 +7,6 @@ Linux - - - - - - - .dockerignore @@ -32,11 +25,16 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + diff --git a/Webzine.WebApplication/appsettings.json b/Webzine.WebApplication/appsettings.json index 10f68b8..24a6a17 100644 --- a/Webzine.WebApplication/appsettings.json +++ b/Webzine.WebApplication/appsettings.json @@ -5,5 +5,9 @@ "Microsoft.AspNetCore": "Warning" } }, + "Webzine": { + "NombreDerniereChronique": 3, + "NombreDeTopTitres" : 5 + }, "AllowedHosts": "*" } 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 18/58] =?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 6b29f9c08fd031249b08957ef8bf21fb79e48181 Mon Sep 17 00:00:00 2001 From: Loic Masi Date: Thu, 5 Mar 2026 14:00:07 +0100 Subject: [PATCH 19/58] =?UTF-8?q?Mis=20=C3=A0=20jour=20du=20rapport?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Webzine.Documentation/Rapport/equipe 1 - rapport.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Webzine.Documentation/Rapport/equipe 1 - rapport.md b/Webzine.Documentation/Rapport/equipe 1 - rapport.md index d713c03..8236725 100644 --- a/Webzine.Documentation/Rapport/equipe 1 - rapport.md +++ b/Webzine.Documentation/Rapport/equipe 1 - rapport.md @@ -1,6 +1,14 @@ **Loïc Masi** : + +04/03 : - Création de 'AccueilController' - Création de la fonction Index() -> afficher l'accueil du webzine - Ajout de la vue 'Views/Accueil/Index.cshtml' - Mise en place d'un Header dans 'Views/Shared/_Header.cshtml' -- Mise en place de la Sidebar dans 'Views/Shared/_Sidebar.cshtml' \ No newline at end of file +- Mise en place de la Sidebar dans 'Views/Shared/_Sidebar.cshtml' + +05/03 : +- Mise en place de fausse données dans 'Webzine.Repository' à l'aide de Faker +- Ajout du ViewModel pour afficher les informations nécessaire sur la page d'accueil +- Adaptation de quelques éléments sur la page (Bootstrap) +- Mise en place du parametrage du nombre d'elements a afficher sur la page dans appsettings \ No newline at end of file From eeddeb4e43d3276aa4357468c02a58ca72defe4e Mon Sep 17 00:00:00 2001 From: mirage <119869686+ClementBobin@users.noreply.github.com> Date: Thu, 5 Mar 2026 14:01:35 +0100 Subject: [PATCH 20/58] fix: Corrige les chemins des fichiers CSS et JS dans le layout --- Webzine.WebApplication/Views/Shared/_Layout.cshtml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Webzine.WebApplication/Views/Shared/_Layout.cshtml b/Webzine.WebApplication/Views/Shared/_Layout.cshtml index 64e7978..9d5545a 100644 --- a/Webzine.WebApplication/Views/Shared/_Layout.cshtml +++ b/Webzine.WebApplication/Views/Shared/_Layout.cshtml @@ -6,9 +6,9 @@ @ViewData["Title"] - Webzine @* Ajout de bootstrap *@ - - - + + + @* Ajout de font-awesome *@ From b407317e95e59f63b38668105d019e336cb65451 Mon Sep 17 00:00:00 2001 From: "josephine.vetu" Date: Thu, 5 Mar 2026 14:10:56 +0100 Subject: [PATCH 21/58] =?UTF-8?q?#21=20Cr=C3=A9ation=20d'un=20ArtisteFacto?= =?UTF-8?q?ry=20qui=20g=C3=A9n=C3=A8re=20des=20titres=20et=20deux=20albums?= =?UTF-8?q?=20par=20artiste.=20Le=20viewmod=C3=A8le=20est=20pass=C3=A9=20d?= =?UTF-8?q?ans=20la=20vue=20par=20le=20controleur.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Webzine.Entity/Fixtures/ArtisteFactory.cs | 54 ++++++++++++++ Webzine.Entity/Webzine.Entity.csproj | 1 + .../Controllers/AccueilController.cs | 9 +++ .../Controllers/ArtisteController.cs | 54 ++++++++++++++ .../ViewModels/ArtisteModel.cs | 17 +++++ .../Views/Artiste/Index.cshtml | 70 +++++++++++++++++++ .../Views/Shared/_Layout.cshtml | 2 +- .../Webzine.WebApplication.csproj.user | 5 +- 8 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 Webzine.Entity/Fixtures/ArtisteFactory.cs create mode 100644 Webzine.WebApplication/Controllers/ArtisteController.cs create mode 100644 Webzine.WebApplication/ViewModels/ArtisteModel.cs create mode 100644 Webzine.WebApplication/Views/Artiste/Index.cshtml diff --git a/Webzine.Entity/Fixtures/ArtisteFactory.cs b/Webzine.Entity/Fixtures/ArtisteFactory.cs new file mode 100644 index 0000000..4161e35 --- /dev/null +++ b/Webzine.Entity/Fixtures/ArtisteFactory.cs @@ -0,0 +1,54 @@ +using Bogus; + +namespace Webzine.Entity.Fixtures +{ + /// + /// Factory pour générer des artistes avec des titres associés, à l'aide de la bibliothèque Bogus. + /// + /// + public class ArtisteFactory + { + /// + /// Récupère un artiste par son nom, en générant des données fictives pour ses titres associés. + /// + /// + /// + public static Artiste FindByName(string nom) + { + // On définit nos albums "bouchonnés" + var albumsData = new[] + { + new { Nom = "Bohemian Rhapsody", Image = "https://upload.wikimedia.org/wikipedia/en/9/9f/Bohemian_Rhapsody.png" }, + new { Nom = "Born This Way", Image = "https://static.wikia.nocookie.net/ladygaga/images/2/2d/BornThisWay-DeluxeEdition.jpg/revision/latest/scale-to-width-down/3500?cb=20111120030308" } + }; + + var faker = new Bogus.Faker("fr"); + var tousLesTitres = new List(); + + // Pour chaque album, on génère un paquet de titres + foreach (var album in albumsData) + { + var nombreDeTitres = faker.Random.Number(3, 6); + + var titresDeLalbum = new Faker("fr") + .RuleFor(t => t.IdTitre, f => f.IndexFaker + 1 + tousLesTitres.Count) + .RuleFor(t => t.UrlJaquette, _ => album.Image) + .RuleFor(t => t.Album, _ => album.Nom) + .RuleFor(t => t.Duree, f => f.Random.Number(90, 180)) + .RuleFor(t => t.Libelle, f => f.Music.Genre() + " - " + f.Commerce.ProductName()) + .Generate(nombreDeTitres); + + tousLesTitres.AddRange(titresDeLalbum); + } + + // On crée l'artiste final + var artisteFaker = new Faker("fr") + .RuleFor(a => a.IdArtiste, f => f.IndexFaker + 1) + .RuleFor(a => a.Nom, _ => nom) + .RuleFor(a => a.Biographie, f => f.Lorem.Paragraphs(2)) + .RuleFor(a => a.Titres, _ => tousLesTitres); + + return artisteFaker.Generate(); + } + } +} \ No newline at end of file diff --git a/Webzine.Entity/Webzine.Entity.csproj b/Webzine.Entity/Webzine.Entity.csproj index 33c0658..06e46f1 100644 --- a/Webzine.Entity/Webzine.Entity.csproj +++ b/Webzine.Entity/Webzine.Entity.csproj @@ -7,6 +7,7 @@ + diff --git a/Webzine.WebApplication/Controllers/AccueilController.cs b/Webzine.WebApplication/Controllers/AccueilController.cs index 32e2e49..1602c40 100644 --- a/Webzine.WebApplication/Controllers/AccueilController.cs +++ b/Webzine.WebApplication/Controllers/AccueilController.cs @@ -5,9 +5,18 @@ namespace Webzine.WebApplication.Controllers { public class AccueilController : Controller { + // Injection du logger via le constructeur + private readonly ILogger _logger; + + public AccueilController(ILogger logger) + { + _logger = logger; + } + // GET: AccueilController public ActionResult Index() { + _logger.LogInformation("Arrivée sur la page d'accueil"); return View(); } diff --git a/Webzine.WebApplication/Controllers/ArtisteController.cs b/Webzine.WebApplication/Controllers/ArtisteController.cs new file mode 100644 index 0000000..0f26971 --- /dev/null +++ b/Webzine.WebApplication/Controllers/ArtisteController.cs @@ -0,0 +1,54 @@ +using Microsoft.AspNetCore.Mvc; +using Webzine.Entity.Fixtures; +using Webzine.WebApplication.ViewModels; + +namespace Webzine.WebApplication.Controllers +{ + public class ArtisteController : Controller + { + // Injection du logger via le constructeur + private readonly ILogger _logger; + + public ArtisteController(ILogger logger) + { + _logger = logger; + } + + /// + /// 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. + /// + /// + /// + [HttpGet("/artiste/{nom}")] + public IActionResult Index(string nom) + { + _logger.LogInformation("Tentative d'accès à l'artiste avec le nom : {NomArtiste}", nom); + + if (string.IsNullOrEmpty(nom)) return RedirectToAction("Index", "Accueil"); + + // On transforme "fatal-bazooka" en "Fatal Bazooka" pour la factory + string nomPropre = System.Globalization.CultureInfo.CurrentCulture.TextInfo + .ToTitleCase(nom.Replace("-", " ")); + + // On appelle la factory pour obtenir l'artiste unique + var artiste = ArtisteFactory.FindByName(nomPropre); + + if (artiste == null) + { + _logger.LogWarning("Artiste non trouvé pour le nom : {NomArtiste}", nomPropre); + return NotFound(); + } + + _logger.LogInformation("Artiste trouvé : {NomArtiste}", nom); + + // On remplit le ViewModel + var viewModel = new ArtisteModel + { + Artiste = artiste, + Titres = artiste.Titres + }; + + return View(viewModel); + } + } +} diff --git a/Webzine.WebApplication/ViewModels/ArtisteModel.cs b/Webzine.WebApplication/ViewModels/ArtisteModel.cs new file mode 100644 index 0000000..176623c --- /dev/null +++ b/Webzine.WebApplication/ViewModels/ArtisteModel.cs @@ -0,0 +1,17 @@ +using Webzine.Entity; + +namespace Webzine.WebApplication.ViewModels +{ + public class ArtisteModel + { + /// + /// Artiste dont on affiche les détails. + /// + public Artiste Artiste { get; set; } + + /// + /// Liste des titres de l'artiste. + /// + public List Titres { get; set; } + } +} diff --git a/Webzine.WebApplication/Views/Artiste/Index.cshtml b/Webzine.WebApplication/Views/Artiste/Index.cshtml new file mode 100644 index 0000000..2063243 --- /dev/null +++ b/Webzine.WebApplication/Views/Artiste/Index.cshtml @@ -0,0 +1,70 @@ +@model Webzine.WebApplication.ViewModels.ArtisteModel + +@{ + ViewData["Title"] = "Artiste"; +} + + +
+

@Model.Artiste.Nom

+ +
+ +

@Model.Artiste.Biographie

+ +

Albums

+
+ + @* On groupe les titres par nom d'album *@ + @{ + var albumsGroupes = Model.Titres + .OrderBy(t => t.Libelle) // Trie les titres par ordre alphabétique au sein de chaque groupe futur + .GroupBy(t => t.Album) // Groupe par nom d'album + .OrderBy(g => g.Key); // Trie les albums par ordre alphabétique (la clé du groupe) + } + + @foreach (var groupe in albumsGroupes) + { + // On récupère le premier titre du groupe pour afficher l'image de l'album + var premierTitre = groupe.First(); + +
+
+ Pochette de @groupe.Key +
+ +
+

@groupe.Key

+ + + + + + + + + + @foreach (var titre in groupe) + { + // Conversion des secondes en format MM:SS + var minutes = titre.Duree / 60; + var secondes = titre.Duree % 60; + var dureeFormatee = $"{minutes}:{secondes:D2}"; + + + + + + } + +
DuréeTitre
@dureeFormatee + + @titre.Libelle + +
+
+
+ } +
\ No newline at end of file diff --git a/Webzine.WebApplication/Views/Shared/_Layout.cshtml b/Webzine.WebApplication/Views/Shared/_Layout.cshtml index 2f42ca0..b807a6d 100644 --- a/Webzine.WebApplication/Views/Shared/_Layout.cshtml +++ b/Webzine.WebApplication/Views/Shared/_Layout.cshtml @@ -7,7 +7,7 @@ @* Ajout de bootstrap *@ - + @* Ajout de font-awesome *@ diff --git a/Webzine.WebApplication/Webzine.WebApplication.csproj.user b/Webzine.WebApplication/Webzine.WebApplication.csproj.user index ea9a183..2702025 100644 --- a/Webzine.WebApplication/Webzine.WebApplication.csproj.user +++ b/Webzine.WebApplication/Webzine.WebApplication.csproj.user @@ -2,9 +2,12 @@ https - MvcControllerWithActionsScaffolder + MvcControllerEmptyScaffolder root/Common/MVC/Controller RazorViewEmptyScaffolder root/Common/MVC/View + + ProjectDebugger + \ No newline at end of file From c26e48f4f22af4c71997378b2b80ddaef786460b Mon Sep 17 00:00:00 2001 From: "josephine.vetu" Date: Thu, 5 Mar 2026 14:31:04 +0100 Subject: [PATCH 22/58] =?UTF-8?q?fix/=20Nom=20de=20la=20m=C3=A9thode=20Art?= =?UTF-8?q?isteFactory=20modifi=C3=A9.=20Changement=20du=20nom=20du=20doss?= =?UTF-8?q?ier=20Controller=20en=20Controllers.=20Changement=20des=20impor?= =?UTF-8?q?ts=20de=20bootstrap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Webzine.Entity/Fixtures/ArtisteFactory.cs | 2 +- .../{Controller => Controllers}/AccueilController.cs | 0 .../{Controller => Controllers}/ApiController.cs | 2 +- .../{Controller => Controllers}/ArtisteController.cs | 2 +- .../{Controller => Controllers}/TitreController.cs | 2 +- Webzine.WebApplication/Views/Shared/_Layout.cshtml | 3 ++- 6 files changed, 6 insertions(+), 5 deletions(-) rename Webzine.WebApplication/{Controller => Controllers}/AccueilController.cs (100%) rename Webzine.WebApplication/{Controller => Controllers}/ApiController.cs (93%) rename Webzine.WebApplication/{Controller => Controllers}/ArtisteController.cs (96%) rename Webzine.WebApplication/{Controller => Controllers}/TitreController.cs (99%) diff --git a/Webzine.Entity/Fixtures/ArtisteFactory.cs b/Webzine.Entity/Fixtures/ArtisteFactory.cs index 4161e35..e9af87b 100644 --- a/Webzine.Entity/Fixtures/ArtisteFactory.cs +++ b/Webzine.Entity/Fixtures/ArtisteFactory.cs @@ -13,7 +13,7 @@ namespace Webzine.Entity.Fixtures /// /// /// - public static Artiste FindByName(string nom) + public static Artiste SeedArtisteByName(string nom) { // On définit nos albums "bouchonnés" var albumsData = new[] diff --git a/Webzine.WebApplication/Controller/AccueilController.cs b/Webzine.WebApplication/Controllers/AccueilController.cs similarity index 100% rename from Webzine.WebApplication/Controller/AccueilController.cs rename to Webzine.WebApplication/Controllers/AccueilController.cs diff --git a/Webzine.WebApplication/Controller/ApiController.cs b/Webzine.WebApplication/Controllers/ApiController.cs similarity index 93% rename from Webzine.WebApplication/Controller/ApiController.cs rename to Webzine.WebApplication/Controllers/ApiController.cs index 70d2c51..39e8825 100644 --- a/Webzine.WebApplication/Controller/ApiController.cs +++ b/Webzine.WebApplication/Controllers/ApiController.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Mvc; -namespace Webzine.WebApplication.Controller; +namespace Webzine.WebApplication.Controllers; public class ApiController : ControllerBase { diff --git a/Webzine.WebApplication/Controller/ArtisteController.cs b/Webzine.WebApplication/Controllers/ArtisteController.cs similarity index 96% rename from Webzine.WebApplication/Controller/ArtisteController.cs rename to Webzine.WebApplication/Controllers/ArtisteController.cs index 0f26971..0f5b91a 100644 --- a/Webzine.WebApplication/Controller/ArtisteController.cs +++ b/Webzine.WebApplication/Controllers/ArtisteController.cs @@ -31,7 +31,7 @@ namespace Webzine.WebApplication.Controllers .ToTitleCase(nom.Replace("-", " ")); // On appelle la factory pour obtenir l'artiste unique - var artiste = ArtisteFactory.FindByName(nomPropre); + var artiste = ArtisteFactory.SeedArtisteByName(nomPropre); if (artiste == null) { diff --git a/Webzine.WebApplication/Controller/TitreController.cs b/Webzine.WebApplication/Controllers/TitreController.cs similarity index 99% rename from Webzine.WebApplication/Controller/TitreController.cs rename to Webzine.WebApplication/Controllers/TitreController.cs index 42693d4..23d400f 100644 --- a/Webzine.WebApplication/Controller/TitreController.cs +++ b/Webzine.WebApplication/Controllers/TitreController.cs @@ -3,7 +3,7 @@ using Webzine.Entity; using Webzine.Entity.Fixtures; using Webzine.WebApplication.ViewsModels.Titre; -namespace Webzine.WebApplication.Controller; +namespace Webzine.WebApplication.Controllers; /// /// Contrôleur responsable de la gestion des titres musicaux : diff --git a/Webzine.WebApplication/Views/Shared/_Layout.cshtml b/Webzine.WebApplication/Views/Shared/_Layout.cshtml index b807a6d..9573fa6 100644 --- a/Webzine.WebApplication/Views/Shared/_Layout.cshtml +++ b/Webzine.WebApplication/Views/Shared/_Layout.cshtml @@ -6,7 +6,8 @@ @ViewData["Title"] - Webzine @* Ajout de bootstrap *@ - + + @* Ajout de font-awesome *@ From 0c7996ae1f04ff9d21cec19729e1efa201f20b9c Mon Sep 17 00:00:00 2001 From: "b.nodon" Date: Thu, 5 Mar 2026 15:28:27 +0100 Subject: [PATCH 23/58] =?UTF-8?q?Rework=20#30=20#31=20#43=20:=20-=20Change?= =?UTF-8?q?ment=20de=20la=20route=20-=20CSS=20remplac=C3=A9=20par=20bootst?= =?UTF-8?q?rap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Webzine.Entity/Style.cs | 2 + Webzine.Entity/Titre.cs | 2 + Webzine.Repository/LocalEntityRepository.cs | 30 +-- .../Admin/Views/Commentaires/Index.cshtml | 90 --------- .../Areas/Admin/Views/Shared/_Layout.cshtml | 181 ------------------ .../Controllers/CommentairesController.cs | 113 +++++++++++ .../ViewModels/CommentaireViewModel.cs | 24 +++ .../Views/Commentaires/Index.cshtml | 52 +++++ .../Views/Shared/_Header.cshtml | 58 ++++++ .../Views/Shared/_Layout.cshtml | 19 ++ .../Administration/Views/_ViewImports.cshtml | 2 + .../Administration/Views/_ViewStart.cshtml | 3 + Webzine.WebApplication/Program.cs | 9 +- .../Webzine.WebApplication.csproj | 6 +- 14 files changed, 284 insertions(+), 307 deletions(-) delete mode 100644 Webzine.WebApplication/Areas/Admin/Views/Commentaires/Index.cshtml delete mode 100644 Webzine.WebApplication/Areas/Admin/Views/Shared/_Layout.cshtml create mode 100644 Webzine.WebApplication/Areas/Administration/Controllers/CommentairesController.cs create mode 100644 Webzine.WebApplication/Areas/Administration/ViewModels/CommentaireViewModel.cs create mode 100644 Webzine.WebApplication/Areas/Administration/Views/Commentaires/Index.cshtml create mode 100644 Webzine.WebApplication/Areas/Administration/Views/Shared/_Header.cshtml create mode 100644 Webzine.WebApplication/Areas/Administration/Views/Shared/_Layout.cshtml create mode 100644 Webzine.WebApplication/Areas/Administration/Views/_ViewImports.cshtml create mode 100644 Webzine.WebApplication/Areas/Administration/Views/_ViewStart.cshtml diff --git a/Webzine.Entity/Style.cs b/Webzine.Entity/Style.cs index 11c6f32..655e272 100644 --- a/Webzine.Entity/Style.cs +++ b/Webzine.Entity/Style.cs @@ -18,5 +18,7 @@ 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..41aa07f 100644 --- a/Webzine.Entity/Titre.cs +++ b/Webzine.Entity/Titre.cs @@ -63,5 +63,7 @@ namespace Webzine.Entity public List Commentaires { get; set; } + + public List - -

Commentaires

- -
- - - - - - - - - - - - @foreach (Webzine.Entity.Commentaire commentaire in Model.Commentaires) - { - - - - - - - - } - -
TitreAuteurCommentaireDate de créationActions
- - @(commentaire.Titre != null ? commentaire.Titre.Libelle : "Titre inconnu") - - - @commentaire.Auteur - - @commentaire.Contenu - - @commentaire.DateCreation.ToString("dd/MM/yyyy HH:mm:ss") - - -
- @Html.AntiForgeryToken() - -
-
-
diff --git a/Webzine.WebApplication/Areas/Admin/Views/Shared/_Layout.cshtml b/Webzine.WebApplication/Areas/Admin/Views/Shared/_Layout.cshtml deleted file mode 100644 index 559941b..0000000 --- a/Webzine.WebApplication/Areas/Admin/Views/Shared/_Layout.cshtml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - @ViewData["Title"] - Administration - - - - - - -
-
- @RenderBody() -
-
- - \ No newline at end of file diff --git a/Webzine.WebApplication/Areas/Administration/Controllers/CommentairesController.cs b/Webzine.WebApplication/Areas/Administration/Controllers/CommentairesController.cs new file mode 100644 index 0000000..8f47c7f --- /dev/null +++ b/Webzine.WebApplication/Areas/Administration/Controllers/CommentairesController.cs @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Webzine.Entity; +using Webzine.WebApplication.Areas.Administration.ViewModels; + +namespace Webzine.WebApplication.Areas.Administration.Controllers +{ + [Area("Administration")] + public class CommentairesController : Controller + { + // GET: Administration/Commentaires + public ActionResult Index() + { + // Création de données "bouchon" (mock) pour tester l'affichage + var listeCommentaires = new List + { + new Commentaire + { + IdCommentaire = 1, // Correction: Id -> IdCommentaire + Auteur = "Michel", // Correction: Nom -> Auteur + Contenu = "Nulla sed velit nec tellus gravida molestie", + DateCreation = new DateTime(2023, 1, 22, 15, 59, 28), + // Important : On initialise l'objet Titre pour accéder à Titre.Libelle + Titre = new Titre { Libelle = "St Germain - So Flute" }, + }, + new Commentaire + { + IdCommentaire = 2, + Auteur = "Jeff", + Contenu = "Lorem ipsum dolor sit.", + DateCreation = new DateTime(2023, 1, 22, 14, 27, 8), + Titre = new Titre { Libelle = "Queen - Bohemian Rapsody" }, + }, + new Commentaire + { + IdCommentaire = 3, + Auteur = "Eva", + Contenu = "Aenean vulputate eleifend tellus.", + DateCreation = new DateTime(2023, 1, 22, 13, 2, 17), + Titre = new Titre { Libelle = "Rammstein - Du hast" }, + }, + }; + + // Initialisation du ViewModel + var viewModel = new CommentaireViewModel + { + Commentaires = listeCommentaires + }; + + return View(viewModel); + } + + + + // GET: CommentairesController/Details/5 + public ActionResult Details(int id) + { + return View(); + } + + // GET: CommentairesController/Create + public ActionResult Create() + { + return View(); + } + + // POST: CommentairesController/Create + [HttpPost] + [ValidateAntiForgeryToken] + public ActionResult Create(IFormCollection collection) + { + try + { + return RedirectToAction(nameof(Index)); + } + catch + { + return View(); + } + } + + // GET: CommentairesController/Edit/5 + public ActionResult Edit(int id) + { + return View(); + } + + // POST: CommentairesController/Edit/5 + [HttpPost] + [ValidateAntiForgeryToken] + public ActionResult Edit(int id, IFormCollection collection) + { + try + { + return RedirectToAction(nameof(Index)); + } + catch + { + return View(); + } + } + + // GET: CommentairesController/Delete/5 + public ActionResult Delete(int id) + { + return View(); + } + + // POST: CommentairesController/Delete/5 + } +} \ No newline at end of file diff --git a/Webzine.WebApplication/Areas/Administration/ViewModels/CommentaireViewModel.cs b/Webzine.WebApplication/Areas/Administration/ViewModels/CommentaireViewModel.cs new file mode 100644 index 0000000..f2d8c5c --- /dev/null +++ b/Webzine.WebApplication/Areas/Administration/ViewModels/CommentaireViewModel.cs @@ -0,0 +1,24 @@ +// +// Copyright (c) Webzine. All rights reserved. +// + + +// +// Copyright (c) Webzine. All rights reserved. +// + +using Webzine.Entity; + +namespace Webzine.WebApplication.Areas.Administration.ViewModels +{ + /// + /// ViewModel pour afficher la liste des commentaires en administration. + /// + public class CommentaireViewModel + { + /// + /// Obtient ou définit la liste des commentaires. + /// + public IEnumerable Commentaires { get; set; } = new List(); + } +} \ No newline at end of file diff --git a/Webzine.WebApplication/Areas/Administration/Views/Commentaires/Index.cshtml b/Webzine.WebApplication/Areas/Administration/Views/Commentaires/Index.cshtml new file mode 100644 index 0000000..fbb1915 --- /dev/null +++ b/Webzine.WebApplication/Areas/Administration/Views/Commentaires/Index.cshtml @@ -0,0 +1,52 @@ +@model Webzine.WebApplication.Areas.Administration.ViewModels.CommentaireViewModel + +@{ + ViewData["Title"] = "Commentaires"; +} + + +
+

Commentaires

+ +
+ + + + + + + + + + + + @foreach (Webzine.Entity.Commentaire commentaire in Model.Commentaires) + { + + + + + + + + } + +
TitreAuteurCommentaireDate de créationActions
+ @(commentaire.Titre != null ? commentaire.Titre.Libelle : "Titre inconnu") + + @commentaire.Auteur + + @commentaire.Contenu + + @commentaire.DateCreation.ToString("dd/MM/yyyy HH:mm:ss") + +
+ @Html.AntiForgeryToken() + + +
+
+
+
\ No newline at end of file diff --git a/Webzine.WebApplication/Areas/Administration/Views/Shared/_Header.cshtml b/Webzine.WebApplication/Areas/Administration/Views/Shared/_Header.cshtml new file mode 100644 index 0000000..9a66f6e --- /dev/null +++ b/Webzine.WebApplication/Areas/Administration/Views/Shared/_Header.cshtml @@ -0,0 +1,58 @@ +@* + For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 +*@ +@{ +} +
+ +
\ No newline at end of file diff --git a/Webzine.WebApplication/Areas/Administration/Views/Shared/_Layout.cshtml b/Webzine.WebApplication/Areas/Administration/Views/Shared/_Layout.cshtml new file mode 100644 index 0000000..a3cfc53 --- /dev/null +++ b/Webzine.WebApplication/Areas/Administration/Views/Shared/_Layout.cshtml @@ -0,0 +1,19 @@ + + + + + + @ViewData["Title"] - Webzine + + @* Ajout de bootstrap *@ + + + + @* Ajout de font-awesome *@ + + + + @await Html.PartialAsync("_Header") + @RenderBody() + + \ No newline at end of file diff --git a/Webzine.WebApplication/Areas/Administration/Views/_ViewImports.cshtml b/Webzine.WebApplication/Areas/Administration/Views/_ViewImports.cshtml new file mode 100644 index 0000000..505b08b --- /dev/null +++ b/Webzine.WebApplication/Areas/Administration/Views/_ViewImports.cshtml @@ -0,0 +1,2 @@ +@* Permet de factoriser les imports de tag helpers *@ +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers \ No newline at end of file diff --git a/Webzine.WebApplication/Areas/Administration/Views/_ViewStart.cshtml b/Webzine.WebApplication/Areas/Administration/Views/_ViewStart.cshtml new file mode 100644 index 0000000..d641c67 --- /dev/null +++ b/Webzine.WebApplication/Areas/Administration/Views/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_Layout"; +} \ No newline at end of file diff --git a/Webzine.WebApplication/Program.cs b/Webzine.WebApplication/Program.cs index 52780d6..e52b728 100644 --- a/Webzine.WebApplication/Program.cs +++ b/Webzine.WebApplication/Program.cs @@ -24,7 +24,7 @@ try builder.Host.UseNLog(); // Register LocalEntityRepository as a singleton - builder.Services.AddSingleton(); + //builder.Services.AddSingleton(); var app = builder.Build(); @@ -49,12 +49,7 @@ try // Permet de remplir les listes d'entités du repository avec des donn�es de test. - using (var scope = app.Services.CreateScope()) - { - var repository = scope.ServiceProvider.GetRequiredService(); - repository.Seed(); - } - + app.Run(); } catch (Exception exception) diff --git a/Webzine.WebApplication/Webzine.WebApplication.csproj b/Webzine.WebApplication/Webzine.WebApplication.csproj index e63f5dd..66802fe 100644 --- a/Webzine.WebApplication/Webzine.WebApplication.csproj +++ b/Webzine.WebApplication/Webzine.WebApplication.csproj @@ -24,7 +24,6 @@ - @@ -40,4 +39,9 @@ + + + + + From a70b5563799802302affb427fddf4e1006301f73 Mon Sep 17 00:00:00 2001 From: "josephine.vetu" Date: Thu, 5 Mar 2026 15:42:18 +0100 Subject: [PATCH 24/58] #23 Controleur et vue contact ok --- .../AccueilController.cs | 0 .../ApiController.cs | 2 +- .../Controllers/ContactController.cs | 15 +++++ .../TitreController.cs | 2 +- .../Views/Contact/Index.cshtml | 66 +++++++++++++++++++ .../Views/Shared/_Layout.cshtml | 6 +- .../Webzine.WebApplication.csproj.user | 2 +- 7 files changed, 87 insertions(+), 6 deletions(-) rename Webzine.WebApplication/{Controller => Controllers}/AccueilController.cs (100%) rename Webzine.WebApplication/{Controller => Controllers}/ApiController.cs (93%) create mode 100644 Webzine.WebApplication/Controllers/ContactController.cs rename Webzine.WebApplication/{Controller => Controllers}/TitreController.cs (99%) create mode 100644 Webzine.WebApplication/Views/Contact/Index.cshtml diff --git a/Webzine.WebApplication/Controller/AccueilController.cs b/Webzine.WebApplication/Controllers/AccueilController.cs similarity index 100% rename from Webzine.WebApplication/Controller/AccueilController.cs rename to Webzine.WebApplication/Controllers/AccueilController.cs diff --git a/Webzine.WebApplication/Controller/ApiController.cs b/Webzine.WebApplication/Controllers/ApiController.cs similarity index 93% rename from Webzine.WebApplication/Controller/ApiController.cs rename to Webzine.WebApplication/Controllers/ApiController.cs index 70d2c51..39e8825 100644 --- a/Webzine.WebApplication/Controller/ApiController.cs +++ b/Webzine.WebApplication/Controllers/ApiController.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Mvc; -namespace Webzine.WebApplication.Controller; +namespace Webzine.WebApplication.Controllers; public class ApiController : ControllerBase { diff --git a/Webzine.WebApplication/Controllers/ContactController.cs b/Webzine.WebApplication/Controllers/ContactController.cs new file mode 100644 index 0000000..557e1fb --- /dev/null +++ b/Webzine.WebApplication/Controllers/ContactController.cs @@ -0,0 +1,15 @@ +using Microsoft.AspNetCore.Mvc; + +namespace Webzine.WebApplication.Controllers +{ + /// + /// Controller pour la page contact. + /// + public class ContactController : Controller + { + public IActionResult Index() + { + return View(); + } + } +} diff --git a/Webzine.WebApplication/Controller/TitreController.cs b/Webzine.WebApplication/Controllers/TitreController.cs similarity index 99% rename from Webzine.WebApplication/Controller/TitreController.cs rename to Webzine.WebApplication/Controllers/TitreController.cs index 42693d4..23d400f 100644 --- a/Webzine.WebApplication/Controller/TitreController.cs +++ b/Webzine.WebApplication/Controllers/TitreController.cs @@ -3,7 +3,7 @@ using Webzine.Entity; using Webzine.Entity.Fixtures; using Webzine.WebApplication.ViewsModels.Titre; -namespace Webzine.WebApplication.Controller; +namespace Webzine.WebApplication.Controllers; /// /// Contrôleur responsable de la gestion des titres musicaux : diff --git a/Webzine.WebApplication/Views/Contact/Index.cshtml b/Webzine.WebApplication/Views/Contact/Index.cshtml new file mode 100644 index 0000000..d2c892b --- /dev/null +++ b/Webzine.WebApplication/Views/Contact/Index.cshtml @@ -0,0 +1,66 @@ +@{ + ViewData["Title"] = "Contact"; +} + +
+

Contact

+
+ C.U.C.D.B - DIIAGE
+ 69 Avenue Aristide Briand
+ 21000 Dijon

+
+
+ Phone : 03 80 40 50 60
+ secretariat@cucdb.fr +
+ +
+ + \ No newline at end of file diff --git a/Webzine.WebApplication/Views/Shared/_Layout.cshtml b/Webzine.WebApplication/Views/Shared/_Layout.cshtml index 9d5545a..80e4341 100644 --- a/Webzine.WebApplication/Views/Shared/_Layout.cshtml +++ b/Webzine.WebApplication/Views/Shared/_Layout.cshtml @@ -6,9 +6,9 @@ @ViewData["Title"] - Webzine @* Ajout de bootstrap *@ - - - + + + @* Ajout de font-awesome *@ diff --git a/Webzine.WebApplication/Webzine.WebApplication.csproj.user b/Webzine.WebApplication/Webzine.WebApplication.csproj.user index ea9a183..9aaa4d4 100644 --- a/Webzine.WebApplication/Webzine.WebApplication.csproj.user +++ b/Webzine.WebApplication/Webzine.WebApplication.csproj.user @@ -2,7 +2,7 @@ https - MvcControllerWithActionsScaffolder + MvcControllerEmptyScaffolder root/Common/MVC/Controller RazorViewEmptyScaffolder root/Common/MVC/View 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 25/58] 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