From a52c08ec326543d13f374dc2a65e3bcecb251f59 Mon Sep 17 00:00:00 2001 From: mirage <119869686+ClementBobin@users.noreply.github.com> Date: Tue, 31 Mar 2026 15:32:19 +0200 Subject: [PATCH 01/13] feat: incrementer le nombre de lectures et de likes dans TitreController --- Webzine.WebApplication/Controllers/TitreController.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Webzine.WebApplication/Controllers/TitreController.cs b/Webzine.WebApplication/Controllers/TitreController.cs index 01b1239..e4c0cd7 100644 --- a/Webzine.WebApplication/Controllers/TitreController.cs +++ b/Webzine.WebApplication/Controllers/TitreController.cs @@ -53,6 +53,8 @@ namespace Webzine.WebApplication.Controllers return this.RedirectToAction("Index"); } + this.titreRepository.IncrementNbLectures(titre); + var vm = new TitreDetail { Details = new TitreContent @@ -113,10 +115,11 @@ 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"); } - - titre.NbLikes++; + else + { + this.titreRepository.IncrementNbLikes(titre); + } return this.RedirectToAction("Details", new { id = model.IdTitre }); } From 7c373d081b33dc352ec79bb0055716ac8a2c1fad Mon Sep 17 00:00:00 2001 From: mirage <119869686+ClementBobin@users.noreply.github.com> Date: Tue, 31 Mar 2026 16:53:34 +0200 Subject: [PATCH 02/13] =?UTF-8?q?feat:=20impl=C3=A9mentation=20TitreAdminS?= =?UTF-8?q?ervice=20pour=20la=20gestion=20des=20titres=20et=20ajout=20Titr?= =?UTF-8?q?eAdminMod=C3=A8le=20de=20commande?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ITitreAdminService.cs | 22 +++ .../Models/TitreAdminCommande.cs | 58 ++++++++ Webzine.Business/TitreAdminService.cs | 130 ++++++++++++++++++ Webzine.Business/Webzine.Business.csproj | 11 ++ Webzine.Repository/DbTitreRepository.cs | 27 +--- .../Controllers/TitreController.cs | 45 +++++- Webzine.WebApplication/Program.cs | 4 + .../Webzine.WebApplication.csproj | 2 + 8 files changed, 276 insertions(+), 23 deletions(-) create mode 100644 Webzine.Business.Contracts/ITitreAdminService.cs create mode 100644 Webzine.Business.Contracts/Models/TitreAdminCommande.cs create mode 100644 Webzine.Business/TitreAdminService.cs diff --git a/Webzine.Business.Contracts/ITitreAdminService.cs b/Webzine.Business.Contracts/ITitreAdminService.cs new file mode 100644 index 0000000..72f6a0a --- /dev/null +++ b/Webzine.Business.Contracts/ITitreAdminService.cs @@ -0,0 +1,22 @@ +namespace Webzine.Business.Contracts; + +using Webzine.Business.Contracts.Models; + +/// +/// Service responsable des opérations d'administration sur les titres. +/// Orchestre la résolution des dépendances (artiste, styles) et la persistance. +/// +public interface ITitreAdminService +{ + /// + /// Crée un nouveau titre à partir des données du formulaire d'administration. + /// + /// Les données saisies dans le formulaire de création. + void CreerTitre(TitreAdminCommande commande); + + /// + /// Met à jour un titre existant à partir des données du formulaire d'administration. + /// + /// Les données saisies dans le formulaire de modification. + void ModifierTitre(TitreAdminCommande commande); +} \ No newline at end of file diff --git a/Webzine.Business.Contracts/Models/TitreAdminCommande.cs b/Webzine.Business.Contracts/Models/TitreAdminCommande.cs new file mode 100644 index 0000000..b97c4c0 --- /dev/null +++ b/Webzine.Business.Contracts/Models/TitreAdminCommande.cs @@ -0,0 +1,58 @@ +namespace Webzine.Business.Contracts.Models; + +/// +/// Commande transportant les données métier d'un titre saisi en administration. +/// Ne contient pas les listes de sélection (celles-ci restent dans le ViewModel). +/// +public class TitreAdminCommande +{ + /// + /// Identifiant du titre (0 lors d'une création). + /// + public int Id { get; set; } + + /// + /// Identifiant de l'artiste sélectionné. + /// + public int IdArtiste { get; set; } + + /// + /// Libellé du titre. + /// + public string Libelle { get; set; } = string.Empty; + + /// + /// Nom de l'album. + /// + public string Album { get; set; } = string.Empty; + + /// + /// Texte de la chronique. + /// + public string Chronique { get; set; } = string.Empty; + + /// + /// Date de sortie du titre. + /// + public DateTime DateSortie { get; set; } + + /// + /// Durée en secondes. + /// + public int Duree { get; set; } + + /// + /// URL de la jaquette. + /// + public string UrlJaquette { get; set; } = string.Empty; + + /// + /// URL d'écoute. + /// + public string? UrlEcoute { get; set; } + + /// + /// Identifiants des styles sélectionnés. + /// + public List Styles { get; set; } = new (); +} \ No newline at end of file diff --git a/Webzine.Business/TitreAdminService.cs b/Webzine.Business/TitreAdminService.cs new file mode 100644 index 0000000..2357811 --- /dev/null +++ b/Webzine.Business/TitreAdminService.cs @@ -0,0 +1,130 @@ +namespace Webzine.Business; + +using Microsoft.Extensions.Logging; + +using Webzine.Business.Contracts; +using Webzine.Business.Contracts.Models; +using Webzine.Entity; +using Webzine.Repository.Contracts; + +/// +/// Implémentation de . +/// Orchestre la résolution des styles, la construction de l'entité +/// et la délégation au repository. +/// +public class TitreAdminService : ITitreAdminService +{ + private readonly ITitreRepository titreRepository; + private readonly IArtisteRepository artisteRepository; + private readonly IStyleRepository styleRepository; + private readonly ILogger logger; + + /// + /// Initializes a new instance of the class. + /// + /// Repository des titres. + /// Repository des artistes. + /// Repository des styles. + /// Service de journalisation. + public TitreAdminService( + ITitreRepository titreRepository, + IArtisteRepository artisteRepository, + IStyleRepository styleRepository, + ILogger logger) + { + this.titreRepository = titreRepository; + this.artisteRepository = artisteRepository; + this.styleRepository = styleRepository; + this.logger = logger; + } + + /// + public void CreerTitre(TitreAdminCommande commande) + { + this.logger.LogInformation( + "Création d'un nouveau titre '{Libelle}' pour l'artiste ID {IdArtiste}.", + commande.Libelle, + commande.IdArtiste); + + Artiste artiste = this.artisteRepository.Find(commande.IdArtiste); + List