Merge branch 'dev' into j3/feat/filter
# Conflicts: # Webzine.WebApplication/Areas/Administration/Controllers/CommentaireController.cs # Webzine.WebApplication/Controllers/ArtisteController.cs # Webzine.WebApplication/Controllers/RechercheController.cs
This commit is contained in:
@@ -31,8 +31,7 @@ public class ArtisteController : Controller
|
||||
}
|
||||
|
||||
/// <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.
|
||||
/// Affiche la liste des artistes.
|
||||
/// </summary>
|
||||
/// <returns>Redirection.</returns>
|
||||
public IActionResult Index()
|
||||
@@ -148,7 +147,6 @@ public class ArtisteController : Controller
|
||||
this.artisteRepository.Delete(artiste);
|
||||
}
|
||||
|
||||
// 3. Redirect back to the list (or wherever you want them to go after)
|
||||
return this.RedirectToAction("Index");
|
||||
}
|
||||
}
|
||||
@@ -6,7 +6,7 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
|
||||
using Webzine.WebApplication.Areas.Administration.ViewModels.Commentaire;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Contrôleur pour la gestion des commentaires dans l'administration du webzine. Ce contrôleur permet d'afficher la liste des commentaires, de supprimer un commentaire spécifique et de gérer les interactions liées aux commentaires dans l'interface d'administration.
|
||||
/// </summary>
|
||||
[Area("Administration")]
|
||||
public class CommentaireController : Controller
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
namespace Webzine.WebApplication.Areas.Administration.Controllers;
|
||||
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
using Webzine.Business.Contracts;
|
||||
using Webzine.Business.Contracts.Dto;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Webzine.Repository.Contracts;
|
||||
|
||||
/// <summary>
|
||||
/// Contrôleur pour gérer le tableau de bord de l'administration.
|
||||
/// </summary>
|
||||
[Area("Administration")]
|
||||
public class DashboardController : Controller
|
||||
{
|
||||
|
||||
@@ -184,6 +184,12 @@ public class TitreController : Controller
|
||||
public IActionResult Delete(AdminTitreDelete model)
|
||||
{
|
||||
var titre = this.titreRepository.Find(model.Id);
|
||||
|
||||
if (!this.ModelState.IsValid)
|
||||
{
|
||||
return this.View(model);
|
||||
}
|
||||
|
||||
if (titre != null)
|
||||
{
|
||||
this.titreRepository.Delete(titre);
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
using Webzine.WebApplication.ViewModels.Artiste;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Contrôleur pour la gestion des artistes dans l'administration du webzine. Ce contrôleur gère les opérations de création, modification, suppression et affichage des artistes dans l'interface d'administration du webzine. Chaque action du contrôleur prépare un ViewModel spécifique pour la vue correspondante, permettant ainsi une séparation claire entre la logique métier et la présentation des données.
|
||||
/// </summary>
|
||||
public class ArtisteController : Controller
|
||||
{
|
||||
@@ -15,11 +15,10 @@
|
||||
private readonly IArtisteRepository artisteRepository;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ArtisteController"/> class.
|
||||
/// Initialise une nouvelle instance du <see cref="ArtisteController"/>. avec un service de journalisation injecté.
|
||||
/// </summary>
|
||||
/// <param name="logger">Service de journalisation injecté pour enregistrer les événements et les erreurs.</param>
|
||||
/// <param name="artisteRepository"></param>
|
||||
/// <param name="artisteRepository">Repository pour accéder aux données des artistes, injecté pour permettre les opérations de création, modification, suppression et affichage des artistes.</param>
|
||||
public ArtisteController(
|
||||
ILogger<ArtisteController> logger,
|
||||
IArtisteRepository artisteRepository)
|
||||
@@ -30,7 +29,7 @@
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Prend en paramètre le nom de l'artiste (ex: "fatal-bazooka"), utilise la factory pour trouver l'artiste correspondant, et affiche sa page dédiée.
|
||||
/// Affiche la liste des artistes.
|
||||
/// </summary>
|
||||
/// <param name="nom">Le nom de l'artiste à rechercher, formaté en kebab-case (ex: "fatal-bazooka").</param>
|
||||
/// <returns>La vue de l'artiste avec son ViewModel, ou une redirection vers l'accueil si le nom est vide, ou une erreur 404 si l'artiste n'est pas trouvé.</returns>
|
||||
@@ -44,14 +43,12 @@
|
||||
return this.RedirectToAction("Index", "Accueil");
|
||||
}
|
||||
|
||||
// On transforme "fatal-bazooka" en "Fatal Bazooka" pour la factory
|
||||
// On transforme "fatal-bazooka" en "Fatal Bazooka"
|
||||
string nomPropre = System.Globalization.CultureInfo.CurrentCulture.TextInfo
|
||||
.ToTitleCase(nom.Replace("-", " "));
|
||||
|
||||
// On appelle la factory pour obtenir l'artiste unique
|
||||
var artiste = this.artisteRepository.FindByName(nomPropre);
|
||||
|
||||
// Check if artiste was found
|
||||
if (artiste == null)
|
||||
{
|
||||
this.logger.LogWarning("Artiste non trouvé avec le nom : {NomArtiste}", nomPropre);
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace Webzine.WebApplication.Controllers
|
||||
using Webzine.WebApplication.ViewModels.Recherche;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// Controller de la page de recherche d'artistes et de titres.
|
||||
/// </summary>
|
||||
public class RechercheController : Controller
|
||||
{
|
||||
@@ -19,11 +19,11 @@ namespace Webzine.WebApplication.Controllers
|
||||
private readonly IArtisteRepository artisteRepository;
|
||||
|
||||
/// <summary>
|
||||
/// Initialise une nouvelle instance de la classe <see cref="RechercheController"/>.
|
||||
/// Constructeur du controller de la page de recherche d'artistes et de titres.
|
||||
/// </summary>
|
||||
/// <param name="logger"></param>
|
||||
/// <param name="titreRepository"></param>
|
||||
/// <param name="artisteRepository"></param>
|
||||
/// <param name="logger">Le logger pour enregistrer les événements.</param>
|
||||
/// <param name="titreRepository">Le repository pour gérer les opérations sur les titres.</param>
|
||||
/// <param name="artisteRepository">Le repository pour gérer les opérations sur les artistes.</param>
|
||||
public RechercheController(
|
||||
ILogger<RechercheController> logger,
|
||||
ITitreRepository titreRepository,
|
||||
|
||||
@@ -39,7 +39,6 @@ namespace Webzine.WebApplication.Controllers
|
||||
/// </summary>
|
||||
/// <param name="id">Identifiant du titre.</param>
|
||||
/// <returns>Vue des details ou 404 si introuvable.</returns>
|
||||
|
||||
public IActionResult Index(int id)
|
||||
{
|
||||
this.logger.LogInformation("Demande d'affichage du detail pour le titre ID {Id}.", id);
|
||||
|
||||
@@ -23,9 +23,7 @@ public static class RouteConfiguration
|
||||
pattern: "artiste/{nom}",
|
||||
defaults: new { controller = "Artiste", action = "Index" });
|
||||
|
||||
|
||||
// ----------- ADMIN -----------
|
||||
|
||||
var adminRoutes = new Dictionary<string, string>
|
||||
{
|
||||
{ "artistes", "Artiste" }, { "commentaires", "Commentaire" }, { "styles", "Style" }, { "titres", "Titre" },
|
||||
@@ -39,9 +37,7 @@ public static class RouteConfiguration
|
||||
defaults: new { area = "Administration", controller = route.Value, action = "Index" });
|
||||
}
|
||||
|
||||
|
||||
// --- AUTRE PROUTES ---
|
||||
|
||||
endpoints.MapControllerRoute(
|
||||
name: "areas",
|
||||
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
namespace Webzine.WebApplication.Middlewares
|
||||
{
|
||||
using System.Diagnostics;
|
||||
|
||||
public class LogTempsExecutionMiddleware
|
||||
{
|
||||
/// <summary>
|
||||
/// log à chaque requete http.
|
||||
/// </summary>
|
||||
// _next représente le maillon suivant dans la chaîne (le prochain middleware ou le contrôleur)
|
||||
private readonly RequestDelegate next;
|
||||
private readonly ILogger<LogTempsExecutionMiddleware> logger;
|
||||
|
||||
// Le constructeur récupère "_next" et le Logger
|
||||
public LogTempsExecutionMiddleware(RequestDelegate next, ILogger<LogTempsExecutionMiddleware> logger)
|
||||
{
|
||||
this.next = next;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
// méthode appelée à chaque requête HTTP
|
||||
|
||||
/// <summary>
|
||||
/// Middleware chargé de journaliser le cycle de vie d'une requête HTTP (entrée, exécution, sortie et temps de réponse).
|
||||
/// </summary>
|
||||
/// <param name="context">Le contexte HTTP encapsulant toutes les informations de la requête et de la réponse.</param>
|
||||
/// <returns>Une tâche (<see cref="Task"/>) représentant l'opération asynchrone.</returns>
|
||||
public async Task InvokeAsync(HttpContext context)
|
||||
{
|
||||
// (Avant le contrôleur)
|
||||
var chronometre = Stopwatch.StartNew(); // lance le chrono
|
||||
|
||||
// --- IN ---
|
||||
var methode = context.Request.Method;
|
||||
var endpoint = context.Request.Path;
|
||||
var traceId = context.TraceIdentifier; // Identifiant unique généré par .NET
|
||||
|
||||
this.logger.LogInformation("[IN] TraceId: {traceId} | Méthode: {methode} | Endpoint: {endpoint}", traceId, methode, endpoint);
|
||||
|
||||
await this.next(context);
|
||||
|
||||
// (Après le contrôleur)
|
||||
chronometre.Stop(); // arrête le chrono
|
||||
var tempsEcoule = chronometre.ElapsedMilliseconds;
|
||||
|
||||
var httpCode = context.Response.StatusCode; // exemple: 200, 404, 500
|
||||
|
||||
// --- OUT ---
|
||||
if (httpCode >= 500)
|
||||
{
|
||||
this.logger.LogError("[OUT] TraceId: {traceId} | HTTP {httpCode} | Temps: {tempsEcoule} ms | Endpoint: {endpoint}", traceId, httpCode, tempsEcoule, endpoint);
|
||||
}
|
||||
else if (httpCode >= 400)
|
||||
{
|
||||
this.logger.LogWarning("[OUT] TraceId: {traceId} | HTTP {httpCode} | Temps: {tempsEcoule} ms | Endpoint: {endpoint}", traceId, httpCode, tempsEcoule, endpoint);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.logger.LogInformation("[OUT] TraceId: {traceId} | HTTP {httpCode} | Temps: {tempsEcoule} ms | Endpoint: {endpoint}", traceId, httpCode, tempsEcoule, endpoint);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -100,6 +100,8 @@ try
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
app.UseMiddleware<Webzine.WebApplication.Middlewares.LogTempsExecutionMiddleware>();
|
||||
|
||||
if (repositoryType == RepositoryType.Db)
|
||||
{
|
||||
using (var scope = app.Services.CreateScope())
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
<rules>
|
||||
<!-- Vos logs d'application en Debug+ -->
|
||||
<logger name="Webzine.WebApplication.*" minlevel="Debug" writeTo="allfile,ownfile-web,console" />
|
||||
<logger name="Webzine.WebApplication.*" minlevel="Info" writeTo="allfile,ownfile-web,console" />
|
||||
|
||||
<!-- Logs Microsoft en Warning+ sauf Hosting.Lifetime -->
|
||||
<logger name="Microsoft.*" minlevel="Warn" writeTo="allfile" final="true" />
|
||||
|
||||
Reference in New Issue
Block a user