#145 : merge de la branch dev.

This commit is contained in:
Loic Masi
2026-04-03 09:46:13 +02:00
51 changed files with 1118 additions and 315 deletions

View File

@@ -21,6 +21,7 @@
/// </summary>
/// <param name="logger">Service de journalisation injecté pour enregistrer les événements et les erreurs.</param>
/// <param name="configuration">Service d'injection de configuration pour accéder aux paramètres de l'application.</param>
/// <param name="titreRepository"></param>
public AccueilController(
ILogger<AccueilController> logger,
IConfiguration configuration,

View File

@@ -2,12 +2,14 @@ namespace Webzine.WebApplication.Controllers;
using Microsoft.AspNetCore.Mvc;
/// <summary>
/// Controller de version de l'API.
/// </summary>
public class ApiController : ControllerBase
{
private readonly ILogger<ApiController> logger;
/// <summary>
/// Initializes a new instance of the <see cref="ApiController"/> class.
/// Initialise une nouvelle instance de la classe <see cref="ApiController"/>.
/// </summary>
/// <param name="logger">Service de journalisation injecté pour enregistrer les événements et les erreurs.</param>
@@ -21,7 +23,6 @@ public class ApiController : ControllerBase
/// Endpoint de test pour vérifier que l'API fonctionne correctement. Retourne un objet JSON contenant le nom et la version de l'application.
/// </summary>
/// <returns>Un objet JSON avec les propriétés "nom" et "version".</returns>
[HttpGet]
public IActionResult Version()
{
this.logger.LogInformation("Get Version was called");

View File

@@ -5,6 +5,9 @@
using Webzine.Repository.Contracts;
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
{
// Injection du logger via le constructeur
@@ -12,10 +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">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)
@@ -26,11 +29,10 @@
}
/// <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>
[HttpGet("/artiste/{nom}")]
public IActionResult Index(string nom)
{
this.logger.LogInformation("Tentative d'accès à l'artiste avec le nom : {NomArtiste}", nom);
@@ -41,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);

View File

@@ -9,12 +9,21 @@ namespace Webzine.WebApplication.Controllers
using Webzine.Repository.Contracts;
using Webzine.WebApplication.ViewModels.Recherche;
/// <summary>
/// Controller de la page de recherche d'artistes et de titres.
/// </summary>
public class RechercheController : Controller
{
private readonly ILogger<RechercheController> logger;
private readonly ITitreRepository titreRepository;
private readonly IArtisteRepository artisteRepository;
/// <summary>
/// Constructeur du controller de la page de recherche d'artistes et de titres.
/// </summary>
/// <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,
@@ -29,7 +38,7 @@ namespace Webzine.WebApplication.Controllers
/// Affichage de la page Recherche depuis le header de l'app.
/// </summary>
/// <param name="mot">Nom d'artiste ou de titre.</param>
/// <returns>Page de recherche avec les résultats.</returns>
/// <returns>Page de recherche avec les r<EFBFBD>sultats.</returns>
public IActionResult Index(string mot)
{
// Logger la recherche.
@@ -41,7 +50,7 @@ namespace Webzine.WebApplication.Controllers
// Recherche des artistes.
var artistes = this.artisteRepository.Search(mot);
// Paramètres a retourner à la vue.
// Param<EFBFBD>tres a retourner <EFBFBD> la vue.
var vm = new RechercheIndexViewModel
{
Mot = mot,

View File

@@ -15,7 +15,6 @@ namespace Webzine.WebApplication.Controllers
/// affichage des details, filtrage par style,
/// ajout de likes, commentaires et recherche.
/// </summary>
[Route("titre")]
public class TitreController : Controller
{
private readonly ILogger<TitreController> logger;
@@ -40,8 +39,7 @@ namespace Webzine.WebApplication.Controllers
/// </summary>
/// <param name="id">Identifiant du titre.</param>
/// <returns>Vue des details ou 404 si introuvable.</returns>
[HttpGet("{id}")]
public IActionResult Details(int id)
public IActionResult Index(int id)
{
this.logger.LogInformation("Demande d'affichage du detail pour le titre ID {Id}.", id);
@@ -53,6 +51,8 @@ namespace Webzine.WebApplication.Controllers
return this.RedirectToAction("Index");
}
this.titreRepository.IncrementNbLectures(titre);
var vm = new TitreDetail
{
Details = new TitreContent
@@ -83,7 +83,6 @@ namespace Webzine.WebApplication.Controllers
/// </summary>
/// <param name="style">Nom du style musical.</param>
/// <returns>Vue contenant la liste filtree.</returns>
[HttpGet("style/{style}")]
public IActionResult Style(string style)
{
this.logger.LogInformation("Recherche des titres pour le style : {Style}.", style);
@@ -104,7 +103,7 @@ namespace Webzine.WebApplication.Controllers
/// </summary>
/// <param name="model">Modele contenant l'identifiant du titre.</param>
/// <returns>Redirection vers la page detail.</returns>
[HttpPost("like")]
[HttpPost]
public IActionResult Like(TitreLike model)
{
this.logger.LogInformation("Ajout d'un like pour le titre ID {Id}.", model.IdTitre);
@@ -114,12 +113,13 @@ namespace Webzine.WebApplication.Controllers
if (titre == null)
{
this.logger.LogWarning("Impossible d'ajouter un like. Titre ID {Id} introuvable.", model.IdTitre);
return this.RedirectToAction("Index");
}
else
{
this.titreRepository.IncrementNbLikes(titre);
}
titre.NbLikes++;
return this.RedirectToAction("Details", new { id = model.IdTitre });
return this.RedirectToAction("Index", new { id = model.IdTitre });
}
/// <summary>
@@ -127,15 +127,9 @@ namespace Webzine.WebApplication.Controllers
/// </summary>
/// <param name="model">Donnees du commentaire.</param>
/// <returns>Redirection vers la page detail.</returns>
[HttpPost("comment")]
[HttpPost]
public IActionResult Comment(TitreComment model)
{
if (!this.ModelState.IsValid)
{
this.logger.LogWarning("Echec de validation du modele de commentaire pour le titre ID {Id}.", model.IdTitre);
return this.RedirectToAction("Details", new { id = model.IdTitre });
}
var titre = this.titreRepository.Find(model.IdTitre);
if (titre == null)
@@ -156,7 +150,7 @@ namespace Webzine.WebApplication.Controllers
this.logger.LogInformation("Commentaire ajoute avec succes au titre ID {Id}.", model.IdTitre);
return this.RedirectToAction("Details", new { id = model.IdTitre });
return this.RedirectToAction("Index", new { id = model.IdTitre });
}
private static TitreStyleItem MapTitreItem(Titre titre)