refactor: standardiser la journalisation des contrôleurs et l’utilisation des référentiels

This commit is contained in:
mirage
2026-03-25 15:14:14 +01:00
parent adeb2a0550
commit cceff9a02d
18 changed files with 214 additions and 252 deletions

View File

@@ -12,6 +12,7 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
private readonly List<Commentaire> _commentaires;
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="CommentaireController"/>.
/// Initialise une nouvelle instance du <see cref="CommentaireController"/>.
/// Les données sont générées dynamiquement via <see cref="DataFactory"/>.
/// </summary>

View File

@@ -1,6 +1,8 @@
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using Webzine.Entity;
using Webzine.Entity.Fixtures;
using Webzine.Repository.Contracts;
using Webzine.WebApplication.Areas.Administration.ViewModels;
namespace Webzine.WebApplication.Areas.Administration.Controllers;
@@ -8,31 +10,24 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers;
[Area("Administration")]
public class DashboardController : Controller
{
private readonly ILogger<DashboardController> _logger;
private readonly List<Titre> _titres;
private readonly List<Style> _styles;
private readonly List<Artiste> _artistes;
private readonly ILogger<DashboardController> logger;
private readonly IStyleRepository styleRepository;
private readonly IArtisteRepository artisteRepository;
private readonly ITitreRepository titreRepository;
/// <summary>
/// Initialise une nouvelle instance du <see cref="DashboardController"/>.
/// Les données sont générées dynamiquement via <see cref="DataFactory"/>.
/// Initialise une nouvelle instance de la classe <see cref="DashboardController"/>.
/// </summary>
/// <param name="logger">Service de journalisation injecté.</param>
public DashboardController(ILogger<DashboardController> logger)
/// <param name="styleRepository">Repository des styles injecté.</param>
public DashboardController(ILogger<DashboardController> logger, IStyleRepository styleRepository, IArtisteRepository artisteRepository, ITitreRepository titreRepository)
{
this._logger = logger;
this.logger = logger;
this.styleRepository = styleRepository;
this.artisteRepository = artisteRepository;
this.titreRepository = titreRepository;
this._logger.LogInformation("Initialisation du contrôleur TitreController.");
var factory = new DataFactory();
_artistes = factory.GenerateArtists(10);
_styles = factory.GenerateStyles(10);
_titres = factory.GenerateTitres(30, _artistes, _styles);
factory.GenerateCommentaires(50, _titres);
this._logger.LogInformation("Données fictives générées avec succès.");
this.logger.LogInformation("Initialisation du contrôleur TitreController.");
}
/// <summary>
@@ -41,42 +36,42 @@ public class DashboardController : Controller
/// <returns>La vue Index du tableau de bord.</returns>
public IActionResult Index()
{
var artisteLePlusChronique = _titres
var artisteLePlusChronique = this.titreRepository.FindAll()
.GroupBy(t => t.Artiste)
.OrderByDescending(g => g.Count())
.FirstOrDefault();
.First();
var albumLePlusChronique = _titres
var albumLePlusChronique = this.titreRepository.FindAll()
.GroupBy(t => t.Artiste)
.OrderByDescending(g => g.Select(t => t.Album).Distinct().Count())
.FirstOrDefault();
.First();
var musiqueLaPlusJouee = _titres
var musiqueLaPlusJouee = this.titreRepository.FindAll()
.OrderByDescending(t => t.NbLectures)
.FirstOrDefault();
.First();
var model = new DashboardViewModel
{
NombreArtistes = _artistes.Count,
NombreArtistes = this.artisteRepository.FindAll().Count(),
ArtisteLePlusChronique = artisteLePlusChronique?.Key.Nom,
ArtisteLePlusChronique = artisteLePlusChronique.Key.Nom,
AlbumLePlusChronique = albumLePlusChronique?.Key.Nom,
AlbumLePlusChronique = albumLePlusChronique.Key.Nom,
NombreBiographies = _artistes.Count(a => !string.IsNullOrEmpty(a.Biographie)),
NombreBiographies = this.artisteRepository.FindAll().Count(a => !string.IsNullOrEmpty(a.Biographie)),
IdMusiqueLaPlusJouee = musiqueLaPlusJouee?.IdTitre ?? 0,
MusiqueLaPlusJouee = musiqueLaPlusJouee?.Libelle,
IdMusiqueLaPlusJouee = musiqueLaPlusJouee.IdTitre,
MusiqueLaPlusJouee = musiqueLaPlusJouee.Libelle,
NombreTitres = _titres.Count,
NombreTitres = this.titreRepository.Count(),
NombreGenres = _styles.Count,
NombreGenres = this.styleRepository.FindAll().Count(),
NombreLectures = _titres.Sum(t => t.NbLectures),
NombreLectures = this.titreRepository.FindAll().Sum(t => t.NbLectures),
NombreLikes = _titres.Sum(t => t.NbLikes)
NombreLikes = this.titreRepository.FindAll().Sum(t => t.NbLikes),
};
return View(model);
return this.View(model);
}
}

View File

@@ -1,70 +1,62 @@
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Webzine.Entity;
using Webzine.Entity.Fixtures;
using Webzine.Repository.Contracts;
using Webzine.WebApplication.Areas.Administration.ViewModels.Style;
namespace Webzine.WebApplication.Areas.Administration.Controllers
{
/// <summary>
/// Contrôleur pour la gestion des styles dans l'administration du webzine.
/// </summary>
[Area("Administration")]
public class StyleController : Controller
{
private readonly ILogger<StyleController> _logger;
private readonly List<Style> _styles;
private readonly ILogger<StyleController> logger;
private readonly IStyleRepository styles;
/// <summary>
/// Initialise une nouvelle instance du <see cref="StyleController"/>.
/// Les données sont générées dynamiquement via <see cref="DataFactory"/>.
/// Initialise une nouvelle instance de la classe <see cref="StyleController"/>.
/// </summary>
/// <param name="logger">Service de journalisation injecté.</param>
public StyleController(ILogger<StyleController> logger)
/// <param name="styles">Repository des styles injecté.</param>
public StyleController(ILogger<StyleController> logger, IStyleRepository styles)
{
this._logger = logger;
this.logger = logger;
this._logger.LogInformation("Initialisation du contrôleur StyleController.");
this.logger.LogInformation("Initialisation du contrôleur StyleController.");
var factory = new DataFactory();
_styles = factory.GenerateStyles(10);
this._logger.LogInformation("Données fictives générées avec succès.");
this.styles = styles;
}
// GET: Administration/Styles
/// <summary>
/// Affiche la liste des styles dans la vue Index.
/// </summary>
/// <returns>La vue Index avec le ViewModel contenant la liste des styles.</returns>
public IActionResult Index()
{
// Création de données "bouchon" (mock) pour tester l'affichage
var listeStyles = this._styles;
var listeStyles = this.styles.FindAll().Take(10);
// Initialisation du ViewModel
var viewModel = new StyleViewModel
{
Styles = listeStyles,
};
return View(viewModel);
return this.View(listeStyles);
}
// GET: Administration/Styles/Create
/// <summary>
/// Affiche la vue de création d'un nouveau style.
/// </summary>
/// <returns>La vue Create pour ajouter un nouveau style.</returns>
public IActionResult Create()
{
return View();
return this.View();
}
// GET: Administration/Styles/Delete/5
/// <summary>
/// Affiche la vue de confirmation de suppression d'un style, en récupérant les détails du style à supprimer à partir de l'identifiant fourni.
/// </summary>
/// <param name="id">L'identifiant du style à supprimer.</param>
/// <returns>La vue de confirmation de suppression avec le ViewModel contenant les détails du style à supprimer, ou une redirection vers l'index si le style n'existe pas.</returns>
public IActionResult Delete(int id)
{
var style = this._styles
.FirstOrDefault(c => c.IdStyle == id);
if (style == null)
{
this._logger.LogWarning("Style avec ID {Id} introuvable pour suppression.", id);
return RedirectToAction("Index");
}
var style = this.styles.Find(id);
var vm = new StyleDeleteViewModel
{
@@ -72,30 +64,26 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers
Libelle = style.Libelle,
};
return View(vm);
return this.View(vm);
}
// GET: Administration/Styles/Edit/5
/// <summary>
/// Affiche la vue d'édition d'un style existant, en récupérant les détails du style à éditer à partir de l'identifiant fourni.
/// </summary>
/// <param name="id">L'identifiant du style à éditer.</param>
/// <returns>La vue d'édition avec le ViewModel contenant les détails du style à éditer, ou une redirection vers l'index si le style n'existe pas.</returns>
[HttpGet]
public IActionResult Edit(int id)
{
// Recherche du style (simulation avec la liste _styles)
var style = _styles.FirstOrDefault(s => s.IdStyle == id);
var style = styles.Find(id);
if (style == null)
{
this._logger.LogWarning("Style avec ID {Id} introuvable pour style.", id);
return RedirectToAction("Index");
}
// Mapping vers le ViewModel
var model = new StyleEditViewModel
{
IdStyle = style.IdStyle,
Libelle = style.Libelle
Libelle = style.Libelle,
};
return View(model);
return this.View(model);
}
}
}

View File

@@ -2,39 +2,39 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Webzine.Entity;
using Webzine.Entity.Fixtures;
using Webzine.Repository.Contracts;
using Webzine.WebApplication.Areas.Administration.ViewModels.Titre;
namespace Webzine.WebApplication.Areas.Administration.Controllers;
/// <summary>
/// Contrôleur pour la gestion des titres en administration. Ce contrôleur gère les opérations de création, modification, suppression et affichage des titres dans l'interface d'administration du webzine. Les données sont générées dynamiquement à l'aide de la classe <see cref="DataFactory"/> pour simuler un environnement de développement sans accès à une base de données réelle. 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>
[Area("Administration")]
public class TitreController : Controller
{
private readonly ILogger<TitreController> _logger;
private readonly List<Titre> _titres;
private readonly List<Style> _styles;
private readonly List<Artiste> _artistes;
private readonly ILogger<TitreController> logger;
private readonly ITitreRepository titreRepository;
private readonly IArtisteRepository artisteRepository;
private readonly IStyleRepository styleRepository;
/// <summary>
/// Initialise une nouvelle instance du <see cref="TitreController"/>.
/// Les données sont générées dynamiquement via <see cref="DataFactory"/>.
/// Initialise une nouvelle instance de la classe <see cref="TitreController"/>.
/// </summary>
/// <param name="logger">Service de journalisation injecté.</param>
public TitreController(ILogger<TitreController> logger)
/// <param name="titreRepository">Repository des titres injecté pour accéder aux données des titres.</param>
/// <param name="artisteRepository">Repository des artistes injecté pour accéder aux données des artistes, nécessaires pour les associations avec les titres.</param>
/// <param name="styleRepository">Repository des styles injecté pour accéder aux données des styles, nécessaires pour les associations avec les titres.</param>
public TitreController(ILogger<TitreController> logger, ITitreRepository titreRepository, IArtisteRepository artisteRepository, IStyleRepository styleRepository)
{
this._logger = logger;
this.logger = logger;
this._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();
_artistes = factory.GenerateArtists(10);
_styles = factory.GenerateStyles(10);
_titres = factory.GenerateTitres(30, _artistes, _styles);
factory.GenerateCommentaires(50, _titres);
this._logger.LogInformation("Données fictives générées avec succès.");
this.titreRepository = titreRepository;
this.artisteRepository = artisteRepository;
this.styleRepository = styleRepository;
}
/// <summary>
@@ -43,19 +43,19 @@ public class TitreController : Controller
/// <returns>La vue Index avec le ViewModel contenant la liste des titres.</returns>
public IActionResult Index()
{
var model = _titres.Select(t => new AdminTitreList
var model = this.titreRepository.FindAll().Take(10).Select(t => new AdminTitreList
{
Id = t.IdTitre,
Artiste = t.Artiste?.Nom,
Artiste = t.Artiste.Nom,
Titre = t.Libelle,
Duree = TimeSpan.FromSeconds(t.Duree).ToString(@"mm\:ss"),
DateSortie = t.DateSortie,
NbLectures = t.NbLectures,
NbLikes = t.NbLikes,
NbCommentaires = t.Commentaires?.Count ?? 0
NbCommentaires = t.Commentaires.Count,
}).ToList();
return View(model);
return this.View(model);
}
/// <summary>
@@ -66,20 +66,20 @@ public class TitreController : Controller
{
var model = new AdminTitreForm
{
Artistes = _artistes.Select(a => new SelectListItem
Artistes = this.artisteRepository.FindAll().Select(a => new SelectListItem
{
Value = a.IdArtiste.ToString(),
Text = a.Nom
Text = a.Nom,
}).ToList(),
AllStyles = _styles.Select(s => new SelectListItem
AllStyles = this.styleRepository.FindAll().Select(s => new SelectListItem
{
Value = s.IdStyle.ToString(),
Text = s.Libelle
}).ToList()
Text = s.Libelle,
}).ToList(),
};
return View(model);
return this.View(model);
}
/// <summary>
@@ -89,7 +89,7 @@ public class TitreController : Controller
/// <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);
var titre = this.titreRepository.Find(id);
var model = new AdminTitreForm
{
@@ -106,20 +106,20 @@ public class TitreController : Controller
NbLikes = titre.NbLikes,
Styles = titre.Styles.Select(s => s.IdStyle).ToList(),
Artistes = _artistes.Select(a => new SelectListItem
Artistes = this.artisteRepository.FindAll().Select(a => new SelectListItem
{
Value = a.IdArtiste.ToString(),
Text = a.Nom
Text = a.Nom,
}).ToList(),
AllStyles = _styles.Select(s => new SelectListItem
AllStyles = this.styleRepository.FindAll().Select(s => new SelectListItem
{
Value = s.IdStyle.ToString(),
Text = s.Libelle
}).ToList()
Text = s.Libelle,
}).ToList(),
};
return View(model);
return this.View(model);
}
/// <summary>
@@ -129,15 +129,15 @@ public class TitreController : Controller
/// <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);
var titre = this.titreRepository.Find(id);
var model = new AdminTitreDelete
{
Id = titre.IdTitre,
Titre = titre.Libelle,
Artiste = titre.Artiste?.Nom
Artiste = titre.Artiste.Nom,
};
return View(model);
return this.View(model);
}
}

View File

@@ -1,17 +0,0 @@
// <copyright file="StyleViewModel.cs" company="Webzine">
// Copyright (c) Webzine. Tout droit réservé.
// </copyright>
namespace Webzine.WebApplication.Areas.Administration.ViewModels.Style
{
/// <summary>
/// ViewModel pour afficher la liste des commentaires en administration.
/// </summary>
public class StyleViewModel
{
/// <summary>
/// Obtient ou définit la liste des commentaires.
/// </summary>
public IEnumerable<Entity.Style> Styles { get; set; } = new List<Entity.Style>();
}
}

View File

@@ -1,4 +1,4 @@
@model Webzine.WebApplication.Areas.Administration.ViewModels.Style.StyleViewModel
@model IEnumerable<Webzine.Entity.Style>
@{
ViewData["Title"] = "Styles";
@@ -24,9 +24,9 @@
</tr>
</thead>
<tbody>
@if (Model.Styles != null && Model.Styles.Any())
@if ( Model.Any())
{
@foreach (Webzine.Entity.Style style in Model.Styles)
@foreach (Webzine.Entity.Style style in Model)
{
<tr class="align-middle">
<td class="p-2">
@@ -36,7 +36,7 @@
<a asp-action="Edit" asp-route-id="@style.IdStyle" class="text-primary me-2" title="Éditer">
<i class="fas fa-edit"></i>
</a>
<a asp-action="Delete" asp-route-id="@style.IdStyle" title="Supprimer">
<a asp-action="Delete" asp-route-id="@style.IdStyle" title="Supprimer">
<i class="fas fa-trash"></i>
</a>
</td>