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 1/3] =?UTF-8?q?feat:=20impl=C3=A9mentation=20TitreAdminSer?=
=?UTF-8?q?vice=20pour=20la=20gestion=20des=20titres=20et=20ajout=20TitreA?=
=?UTF-8?q?dminMod=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