Files
webzine/Webzine.WebApplication/Areas/Administration/Controllers/TitreController.cs
2026-04-03 09:46:13 +02:00

201 lines
8.1 KiB
C#

namespace Webzine.WebApplication.Areas.Administration.Controllers;
using Business.Contracts;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Webzine.Business.Contracts.Dto;
using Webzine.Entity;
using Webzine.Repository.Contracts;
using Webzine.WebApplication.Areas.Administration.ViewModels.Titre;
/// <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. 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 ITitreRepository titreRepository;
private readonly IArtisteRepository artisteRepository;
private readonly IStyleRepository styleRepository;
private readonly ITitreAdminService titreAdminService;
/// <summary>
/// Initializes a new instance of the <see cref="TitreController"/> class.
/// Initialise une nouvelle instance de la classe <see cref="TitreController"/>.
/// </summary>
/// <param name="logger">Service de journalisation injecté.</param>
/// <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>
/// <param name="titreAdminService">Service Titre Administration injecté gérant Edit et Crée.</param>
public TitreController(ILogger<TitreController> logger, ITitreRepository titreRepository, IArtisteRepository artisteRepository, IStyleRepository styleRepository, ITitreAdminService titreAdminService)
{
this.logger = logger;
this.titreRepository = titreRepository;
this.artisteRepository = artisteRepository;
this.styleRepository = styleRepository;
this.titreAdminService = titreAdminService;
}
/// <summary>
/// Affiche la liste des titres dans la vue Index.
/// </summary>
/// <returns>La vue Index avec le ViewModel contenant la liste des titres.</returns>
public IActionResult Index()
{
IEnumerable<Titre> titres = this.titreRepository.FindAll().Take(10);
var model = titres.Select(t => new AdminTitreList
{
Id = t.IdTitre,
Nom = 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,
}).ToList();
return this.View(model);
}
/// <summary>
/// Affiche le formulaire de création d'un nouveau titre dans la vue Create.
/// </summary>
/// <returns>La vue Create avec le ViewModel contenant les listes déroulantes pour les artistes et les styles.</returns>
public IActionResult Create()
{
var model = new AdminTitreForm
{
Artistes = this.artisteRepository.FindAll().Select(a => new SelectListItem
{
Value = a.IdArtiste.ToString(),
Text = a.Nom,
}).ToList(),
AllStyles = this.styleRepository.FindAll().Select(s => new SelectListItem
{
Value = s.IdStyle.ToString(),
Text = s.Libelle,
}).ToList(),
};
return this.View(model);
}
/// <summary>
/// Traite la soumission du formulaire de création d'un titre.
/// </summary>
/// <param name="model">Données saisies dans le formulaire.</param>
/// <returns>Redirection vers Index en cas de succès, réaffichage du formulaire sinon.</returns>
[HttpPost]
public IActionResult Create(TitreAdminDTO model)
{
this.titreAdminService.CreerTitre(model);
return this.RedirectToAction("Index");
}
/// <summary>
/// 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. </returns>
public IActionResult Edit(int id)
{
var titre = this.titreRepository.Find(id);
var model = new AdminTitreForm
{
Id = titre.IdTitre,
IdArtiste = titre.IdArtiste,
Libelle = titre.Libelle,
Album = titre.Album,
Chronique = titre.Chronique,
DateSortie = titre.DateSortie,
Duree = titre.Duree,
UrlJaquette = titre.UrlJaquette,
UrlEcoute = titre.UrlEcoute,
NbLectures = titre.NbLectures,
NbLikes = titre.NbLikes,
Styles = titre.Styles.Select(s => s.IdStyle).ToList(),
Artistes = this.artisteRepository.FindAll().Select(a => new SelectListItem
{
Value = a.IdArtiste.ToString(),
Text = a.Nom,
}).ToList(),
AllStyles = this.styleRepository.FindAll().Select(s => new SelectListItem
{
Value = s.IdStyle.ToString(),
Text = s.Libelle,
}).ToList(),
};
return this.View(model);
}
/// <summary>
/// Traite la soumission du formulaire de modification d'un titre.
/// </summary>
/// <param name="model">Données saisies dans le formulaire.</param>
/// <returns>Redirection vers Index en cas de succès, réaffichage du formulaire sinon.</returns>
[HttpPost]
public IActionResult Edit(TitreAdminDTO model)
{
this.titreAdminService.ModifierTitre(model);
return this.RedirectToAction("Index");
}
/// <summary>
/// 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.</returns>
public IActionResult Delete(int id)
{
var titre = this.titreRepository.Find(id);
if (titre == null)
{
return this.RedirectToAction("Index");
}
var model = new AdminTitreDelete
{
Id = titre.IdTitre,
Titre = titre.Libelle,
Artiste = titre.Artiste.Nom,
};
return this.View(model);
}
/// <summary>
/// Méthode POST pour supprimer un titre.
/// </summary>
/// <param name="model">Le titre à supprimer.</param>
/// <returns>Redirige vers la page d'index d'admin titre.</returns>
[HttpPost]
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);
return this.RedirectToAction("Index");
}
return this.View(model);
}
}