#89 Supprimer les méthodes de controllers inutiles, les using non utilisés. Remplacer NotFound par des redirections vers les index et des logs.

This commit is contained in:
josephine.vetu
2026-03-25 10:47:52 +01:00
parent 175a3083fe
commit bea1e21039
19 changed files with 76 additions and 158 deletions

View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;
using System.Timers;
using System.ComponentModel.DataAnnotations;
namespace Webzine.Entity
{

View File

@@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;
using System.ComponentModel.DataAnnotations;
namespace Webzine.Entity
{

View File

@@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;
using System.ComponentModel.DataAnnotations;
namespace Webzine.Entity
{

View File

@@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;
using System.ComponentModel.DataAnnotations;
namespace Webzine.Entity
{

View File

@@ -20,8 +20,8 @@ public class LocalEntityRepository : ITitreRepository
/// <param name="logger">Service de journalisation injecte pour suivre les operations du repository.</param>
public LocalEntityRepository(ILogger<LocalEntityRepository> logger)
{
_logger = logger;
_logger.LogDebug(1, "NLog injected into LocalEntityRepository");
this._logger = logger;
this._logger.LogDebug(1, "NLog injected into LocalEntityRepository");
var factory = new DataFactory();
var artistes = factory.GenerateArtists(10);

View File

@@ -1,9 +1,7 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Webzine.Entity;
using Webzine.Entity.Fixtures;
using Webzine.WebApplication.Areas.Administration.ViewModels.Artiste;
using Webzine.WebApplication.Areas.Administration.ViewModels.Titre;
namespace Webzine.WebApplication.Areas.Administration.Controllers;
@@ -17,15 +15,16 @@ public class ArtisteController : Controller
public ArtisteController(ILogger<ArtisteController> logger)
{
_logger = logger;
this._logger = logger;
this._logger.LogDebug(1, "initialisation du ArtisteController d'administration");
var factory = new DataFactory();
_artistes = factory.GenerateArtists(10);
}
/// <summary>
/// Affiche la liste des artistes. Pour l'instant, les artistes sont générés à partir de noms prédéfinis via la méthode SeedArtisteByName de la classe ArtisteFactory.
/// Chaque artiste est ensuite ajouté à une liste d'artistes qui est passée à la vue via un objet GroupeArtisteViewModel.
/// Affiche la liste des artistes. Pour l'instant, les artistes sont générés à partir de noms prédéfinis via la méthode SeedArtisteByName de la classe ArtisteFactory.
/// Chaque artiste est ensuite ajouté à une liste d'artistes qui est passée à la vue.
/// </summary>
/// <returns>Redirection.</returns>
public IActionResult Index()
@@ -33,14 +32,9 @@ public class ArtisteController : Controller
var _artistes_ordre = _artistes.OrderBy(t => t.Nom).ToList();
_logger.LogInformation("Initialisation du contrôleur TitreController pour l'Administration.");
this._logger.LogInformation("Initialisation du contrôleur TitreController pour l'Administration.");
GroupeArtisteViewModel groupeArtisteModel = new GroupeArtisteViewModel
{
Artistes = _artistes_ordre
};
return View(groupeArtisteModel);
return View(_artistes_ordre);
}
/// <summary>

View File

@@ -18,9 +18,9 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
/// <param name="logger">Service de journalisation injecté.</param>
public CommentaireController(ILogger<CommentaireController> logger)
{
_logger = logger;
this._logger = logger;
_logger.LogInformation("Initialisation du contrôleur CommentaireController.");
this._logger.LogInformation("Initialisation du contrôleur CommentaireController.");
var factory = new DataFactory(); // TODO injecter le factory via DI pour éviter de le recréer à chaque fois
// faire une classe statique
@@ -31,7 +31,7 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
_commentaires = factory.GenerateCommentaires(50, _titres);
_logger.LogInformation("Données fictives générées avec succès.");
this._logger.LogInformation("Données fictives générées avec succès.");
}
/// <summary>
@@ -84,15 +84,17 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
/// Affiche la vue de confirmation de suppression d'un commentaire, en récupérant les détails du commentaire à supprimer à partir de l'identifiant fourni.
/// </summary>
/// <param name="id">L'identifiant du commentaire à supprimer.</param>
/// <returns>La vue de confirmation de suppression avec le ViewModel contenant les détails du commentaire à supprimer, ou une réponse NotFound si le commentaire n'existe pas.</returns>
/// <returns>La vue de confirmation de suppression avec le ViewModel contenant les détails du commentaire à supprimer, ou une redirection vers l'index si le commentaire n'existe pas.</returns>
public IActionResult Delete(int id)
{
var commentaire = _commentaires
.FirstOrDefault(c => c.IdCommentaire == id);
if (commentaire == null)
return NotFound(); // TODO faire une page d'erreur personnalisée pour les 404, et pas juste un message d'erreur dans la console
// mettre des accolades dans les if pour éviter les erreurs de maintenance, même pour une seule ligne de code
{
this._logger.LogWarning("Commentaire avec ID {Id} introuvable pour suppression.", id);
return RedirectToAction("Index");
}
var vm = new CommentaireDeleteViewModel
{

View File

@@ -20,9 +20,9 @@ public class DashboardController : Controller
/// <param name="logger">Service de journalisation injecté.</param>
public DashboardController(ILogger<DashboardController> logger)
{
_logger = logger;
this._logger = logger;
_logger.LogInformation("Initialisation du contrôleur TitreController.");
this._logger.LogInformation("Initialisation du contrôleur TitreController.");
var factory = new DataFactory();
@@ -32,7 +32,7 @@ public class DashboardController : Controller
factory.GenerateCommentaires(50, _titres);
_logger.LogInformation("Données fictives générées avec succès.");
this._logger.LogInformation("Données fictives générées avec succès.");
}
/// <summary>

View File

@@ -21,39 +21,22 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
/// <param name="logger">Service de journalisation injecté.</param>
public StyleController(ILogger<StyleController> logger)
{
_logger = logger;
this._logger = logger;
_logger.LogInformation("Initialisation du contrôleur StyleController.");
this._logger.LogInformation("Initialisation du contrôleur StyleController.");
var factory = new DataFactory();
_styles = factory.GenerateStyles(10);
_logger.LogInformation("Données fictives générées avec succès.");
this._logger.LogInformation("Données fictives générées avec succès.");
}
// GET: Administration/Styles
public IActionResult Index()
{
// Création de données "bouchon" (mock) pour tester l'affichage
var listeStyles = new List<Style> // TODO remplacer par les données générées dans le constructeur (la Factory)
{
new Style
{
IdStyle = 1,
Libelle = "Rock",
},
new Style
{
IdStyle = 2,
Libelle = "Pop",
},
new Style
{
IdStyle = 3,
Libelle = "Jazz",
},
};
var listeStyles = this._styles;
// Initialisation du ViewModel
var viewModel = new StyleViewModel
@@ -78,7 +61,9 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
if (style == null)
{
return this.NotFound();
this._logger.LogWarning("Style avec ID {Id} introuvable pour suppression.", id);
return RedirectToAction("Index");
}
var vm = new StyleDeleteViewModel
@@ -99,7 +84,8 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
if (style == null)
{
return NotFound();
this._logger.LogWarning("Style avec ID {Id} introuvable pour style.", id);
return RedirectToAction("Index");
}
// Mapping vers le ViewModel

View File

@@ -22,9 +22,9 @@ public class TitreController : Controller
/// <param name="logger">Service de journalisation injecté.</param>
public TitreController(ILogger<TitreController> logger)
{
_logger = logger;
this._logger = logger;
_logger.LogInformation("Initialisation du contrôleur TitreController pour l'Administration.");
this._logger.LogInformation("Initialisation du contrôleur TitreController pour l'Administration.");
var factory = new DataFactory();
@@ -34,7 +34,7 @@ public class TitreController : Controller
factory.GenerateCommentaires(50, _titres);
_logger.LogInformation("Données fictives générées avec succès.");
this._logger.LogInformation("Données fictives générées avec succès.");
}
/// <summary>
@@ -86,7 +86,7 @@ public class TitreController : Controller
/// Affiche le formulaire de modification d'un titre existant dans la vue Edit, en préremplissant les champs avec les données du titre sélectionné. Les listes déroulantes pour les artistes et les styles sont également remplies pour permettre à l'utilisateur de modifier ces associations.
/// </summary>
/// <param name="id">L'identifiant du titre à modifier, utilisé pour récupérer les données du titre à partir de la liste des titres générés.</param>
/// <returns>La vue Edit avec le ViewModel contenant les données du titre à modifier, ainsi que les listes déroulantes pour les artistes et les styles. En cas d'erreur, retourne une réponse NotFound si le titre n'existe pas.</returns>
/// <returns>La vue Edit avec le ViewModel contenant les données du titre à modifier, ainsi que les listes déroulantes pour les artistes et les styles. </returns>
public IActionResult Edit(int id)
{
var titre = _titres.First(t => t.IdTitre == id);
@@ -126,7 +126,7 @@ public class TitreController : Controller
/// Affiche la vue de confirmation de suppression d'un titre, en récupérant les détails du titre à supprimer à partir de l'identifiant fourni. Le ViewModel contient les informations essentielles du titre, telles que le libellé et le nom de l'artiste, pour permettre à l'utilisateur de confirmer la suppression.
/// </summary>
/// <param name="id">L'identifiant du titre à supprimer, utilisé pour récupérer les données du titre à partir de la liste des titres générés.</param>
/// <returns>La vue de confirmation de suppression avec le ViewModel contenant les détails du titre à supprimer, ou une réponse NotFound si le titre n'existe pas.</returns>
/// <returns>La vue de confirmation de suppression avec le ViewModel contenant les détails du titre à supprimer.</returns>
public IActionResult Delete(int id)
{
var titre = _titres.First(t => t.IdTitre == id);

View File

@@ -1,14 +0,0 @@
namespace Webzine.WebApplication.Areas.Administration.ViewModels.Artiste
{
using Webzine.Entity;
/// <summary>
/// ViewModel pour afficher un groupe d'artiste.
/// </summary>
public class GroupeArtisteViewModel // TODO groupe view model pas bien, pas pertinent
{
/// <summary>
/// Liste d'artistes.
/// </summary>
public IEnumerable<Artiste> Artistes { get; set; } = new List<Artiste>();
}
}

View File

@@ -1,4 +1,4 @@
@model Webzine.WebApplication.Areas.Administration.ViewModels.Artiste.GroupeArtisteViewModel
@model IEnumerable<Webzine.Entity.Artiste>
@{
ViewData["Title"] = "Artiste";
@@ -21,7 +21,7 @@
</thead>
<tbody>
@foreach (var artiste in Model.Artistes)
@foreach (var artiste in Model)
{
<tr class="align-middle">
<td class="p-2">
@@ -29,13 +29,11 @@
</td>
<td class="text-center p-2">
<a asp-action="Edit" asp-route-id="@artiste.IdArtiste"
>
<a asp-action="Edit" asp-route-id="@artiste.IdArtiste">
<i class="fa fa-edit"></i>
</a>
<a asp-action="Delete" asp-route-id="@artiste.IdArtiste"
>
<a asp-action="Delete" asp-route-id="@artiste.IdArtiste">
<i class="fa fa-trash"></i>
</a>

View File

@@ -1,7 +1,5 @@
using Microsoft.AspNetCore.Mvc;
using Webzine.Entity.Fixtures;
using Webzine.WebApplication.ViewModels;
using Webzine.WebApplication.ViewModels.Artiste;
namespace Webzine.WebApplication.Controllers
{
@@ -16,7 +14,7 @@ namespace Webzine.WebApplication.Controllers
/// <param name="logger">Service de journalisation injecté pour enregistrer les événements et les erreurs.</param>
public ArtisteController(ILogger<ArtisteController> logger)
{
_logger = logger;
this._logger = logger;
this._logger.LogDebug(1, "initialisation du ArtisteController");
}
@@ -28,9 +26,13 @@ namespace Webzine.WebApplication.Controllers
[HttpGet("/artiste/{nom}")]
public IActionResult Index(string nom)
{
_logger.LogInformation("Tentative d'accès à l'artiste avec le nom : {NomArtiste}", nom);
this._logger.LogInformation("Tentative d'accès à l'artiste avec le nom : {NomArtiste}", nom);
if (string.IsNullOrEmpty(nom)) return RedirectToAction("Index", "Accueil");
if (string.IsNullOrEmpty(nom))
{
this._logger.LogWarning("Nom de l'artiste manquant dans la requête.");
return RedirectToAction("Index", "Accueil");
}
// On transforme "fatal-bazooka" en "Fatal Bazooka" pour la factory
string nomPropre = System.Globalization.CultureInfo.CurrentCulture.TextInfo
@@ -41,20 +43,13 @@ namespace Webzine.WebApplication.Controllers
if (artiste == null)
{
_logger.LogWarning("Artiste non trouvé pour le nom : {NomArtiste}", nomPropre);
return NotFound();
this._logger.LogWarning("Artiste non trouvé pour le nom : {NomArtiste}", nomPropre);
return RedirectToAction("Index");
}
_logger.LogInformation("Artiste trouvé : {NomArtiste}", nom);
this._logger.LogInformation("Artiste trouvé : {NomArtiste}", nom);
// On remplit le ViewModel
var viewModel = new ArtisteModel
{
Artiste = artiste,
Titres = artiste.Titres
};
return View(viewModel);
return View(artiste);
}
}
}

View File

@@ -16,7 +16,7 @@ namespace Webzine.WebApplication.Controllers
/// <param name="logger">Service de journalisation injecté pour enregistrer les événements et les erreurs.</param>
public ContactController(ILogger<ContactController> logger)
{
_logger = logger;
this._logger = logger;
this._logger.LogDebug(1, "initialisation du ContactController");
}

View File

@@ -13,14 +13,14 @@ public class RechercheController : Controller
public RechercheController(ILogger<RechercheController> logger, ITitreRepository titreRepository)
{
_logger = logger;
_titreRepository = titreRepository;
this._logger = logger;
this._titreRepository = titreRepository;
}
[HttpPost("")]
public IActionResult Index(string mot)
{
_logger.LogInformation("Recherche artistes/titres pour le mot : {Mot}.", mot);
this._logger.LogInformation("Recherche artistes/titres pour le mot : {Mot}.", mot);
var titres = _titreRepository.Search(mot)
.Concat(_titreRepository.SearchByStyle(mot))

View File

@@ -23,10 +23,10 @@ public class TitreController : Controller
/// <param name="titreRepository">Repository des titres injecte.</param>
public TitreController(ILogger<TitreController> logger, ITitreRepository titreRepository)
{
_logger = logger;
_titreRepository = titreRepository;
this._logger = logger;
this._titreRepository = titreRepository;
_logger.LogInformation("Initialisation du controleur TitreController.");
this._logger.LogInformation("Initialisation du controleur TitreController.");
}
/// <summary>
@@ -37,14 +37,14 @@ public class TitreController : Controller
[HttpGet("{id}")]
public IActionResult Details(int id)
{
_logger.LogInformation("Demande d'affichage du detail pour le titre ID {Id}.", id);
this._logger.LogInformation("Demande d'affichage du detail pour le titre ID {Id}.", id);
var titre = FindById(id);
var titre = this._titreRepository.Find(id);
if (titre == null)
{
_logger.LogWarning("Titre avec ID {Id} introuvable.", id);
return NotFound();
this._logger.LogWarning("Titre avec ID {Id} introuvable.", id);
return RedirectToAction("Index");
}
var vm = new TitreDetail
@@ -79,7 +79,7 @@ public class TitreController : Controller
[HttpGet("style/{style}")]
public IActionResult Style(string style)
{
_logger.LogInformation("Recherche des titres pour le style : {Style}.", style);
this._logger.LogInformation("Recherche des titres pour le style : {Style}.", style);
var titresFiltres = _titreRepository.SearchByStyle(style).ToList();
@@ -102,15 +102,12 @@ public class TitreController : Controller
{
this._logger.LogInformation("Ajout d'un like pour le titre ID {Id}.", model.IdTitre);
var titre = FindById(model.IdTitre); //TODO appeler directement le repository pour éviter une requête supplémentaire
var titre = this._titreRepository.Find(model.IdTitre);
// TODO faut mettre des autres cas d'erreur, ça va faire un 404
if (titre == null)
{
_logger.LogWarning("Impossible d'ajouter un like. Titre ID {Id} introuvable.", model.IdTitre);
return NotFound(); // TODO va pas faire une page d'erreur personnalisée, ça va faire un 404
// faudrait faire une page d'erreur personnalisée pour les 404, et pas juste un message d'erreur dans la console
// ou rediriger vers page accueil si le titre est pas trouvé, ça serait plus user-friendly
this._logger.LogWarning("Impossible d'ajouter un like. Titre ID {Id} introuvable.", model.IdTitre);
return RedirectToAction("Index");
}
titre.NbLikes++;
@@ -128,16 +125,16 @@ public class TitreController : Controller
{
if (!ModelState.IsValid)
{
_logger.LogWarning("Echec de validation du modele de commentaire pour le titre ID {Id}.", model.IdTitre);
this._logger.LogWarning("Echec de validation du modele de commentaire pour le titre ID {Id}.", model.IdTitre);
return RedirectToAction("Details", new { id = model.IdTitre });
}
var titre = FindById(model.IdTitre);
var titre = this._titreRepository.Find(model.IdTitre);
if (titre == null)
{
_logger.LogWarning("Impossible d'ajouter le commentaire. Titre ID {Id} introuvable.", model.IdTitre);
return NotFound();
this._logger.LogWarning("Impossible d'ajouter le commentaire. Titre ID {Id} introuvable.", model.IdTitre);
return RedirectToAction("Index");
}
var commentaire = new Commentaire
@@ -150,16 +147,11 @@ public class TitreController : Controller
titre.Commentaires.Add(commentaire);
_logger.LogInformation("Commentaire ajoute avec succes au titre ID {Id}.", model.IdTitre);
this._logger.LogInformation("Commentaire ajoute avec succes au titre ID {Id}.", model.IdTitre);
return RedirectToAction("Details", new { id = model.IdTitre });
}
private Titre? FindById(int id) // TODO virer ça vu que ça appelle directement le repository
{
return _titreRepository.Find(id);
}
private static TitreStyleItem MapTitreItem(Titre titre)
{
return new TitreStyleItem

View File

@@ -1,6 +1,4 @@
using Webzine.Entity;
namespace Webzine.WebApplication.ViewModels.Accueil
namespace Webzine.WebApplication.ViewModels.Accueil
{
/// <summary>
/// ViewModel pour la page d'accueil du webzine, affichant les derniers titres et les titres les plus populaires.

View File

@@ -1,20 +0,0 @@
using Webzine.Entity;
namespace Webzine.WebApplication.ViewModels.Artiste
{
/// <summary>
/// ViewModel pour afficher les détails d'un artiste, incluant les informations de l'artiste et la liste de ses titres.
/// </summary>
public class ArtisteModel // TODO viewmodel sert à rien, c'est juste un artiste et une liste de titres, on peut faire ça directement dans la vue non ?
{
/// <summary>
/// Artiste dont on affiche les détails.
/// </summary>
public Entity.Artiste Artiste { get; set; }
/// <summary>
/// Liste des titres de l'artiste.
/// </summary>
public List<Entity.Titre> Titres { get; set; }
}
}

View File

@@ -1,4 +1,4 @@
@model Webzine.WebApplication.ViewModels.Artiste.ArtisteModel
@model Webzine.Entity.Artiste
@{
ViewData["Title"] = "Artiste";
@@ -6,11 +6,11 @@
<div class="container">
<h1>@Model.Artiste.Nom</h1>
<h1>@Model.Nom</h1>
<hr class="mb-5" />
<p class="lead">@Model.Artiste.Biographie</p>
<p class="lead">@Model.Biographie</p>
<h2 class="mt-5 mb-4">Albums</h2>
<hr class="mb-5" />