refactor: standardiser la journalisation des contrôleurs et l’utilisation des référentiels
This commit is contained in:
@@ -1,17 +1,17 @@
|
||||
// using Webzine.Entity;
|
||||
using Webzine.Entity;
|
||||
|
||||
namespace Webzine.Repository.Contracts
|
||||
{
|
||||
public interface IArtisteRepository
|
||||
{
|
||||
// void Add(Artiste artiste);
|
||||
void Add(Artiste artiste);
|
||||
|
||||
// void Delete(Artiste artiste);
|
||||
void Delete(Artiste artiste);
|
||||
|
||||
// Artiste Find(int id);
|
||||
Artiste Find(int id);
|
||||
|
||||
// IEnumerable<Artiste> FindAll();
|
||||
IEnumerable<Artiste> FindAll();
|
||||
|
||||
// void Update(Artiste artiste);
|
||||
void Update(Artiste artiste);
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
// using Webzine.Entity;
|
||||
using Webzine.Entity;
|
||||
|
||||
namespace Webzine.Repository.Contracts
|
||||
{
|
||||
public interface ICommentaireRepository
|
||||
{
|
||||
// void Add(Commentaire commentaire);
|
||||
void Add(Commentaire commentaire);
|
||||
|
||||
// void Delete(Commentaire commentaire);
|
||||
void Delete(Commentaire commentaire);
|
||||
|
||||
// Commentaire Find(int id);
|
||||
Commentaire Find(int id);
|
||||
|
||||
// IEnumerable<Commentaire> FindAll();
|
||||
IEnumerable<Commentaire> FindAll();
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,3 @@
|
||||
// using Webzine.Entity;
|
||||
|
||||
using Webzine.Entity;
|
||||
|
||||
namespace Webzine.Repository.Contracts
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace Webzine.Repository.Contracts
|
||||
|
||||
void Delete(Titre titre);
|
||||
|
||||
Titre? Find(int idTitre);
|
||||
Titre Find(int idTitre);
|
||||
|
||||
IEnumerable<Titre> FindTitres(int offset, int limit);
|
||||
|
||||
|
||||
@@ -180,7 +180,7 @@ public class DbTitreRepository : ITitreRepository
|
||||
/// </summary>
|
||||
/// <param name="idTitre">L'identifiant du titre à trouver.</param>
|
||||
/// <returns>Le titre correspondant à l'identifiant fourni, ou null si aucun titre n'est trouvé.</returns>
|
||||
public Titre? Find(int idTitre)
|
||||
public Titre Find(int idTitre)
|
||||
{
|
||||
this.logger.LogDebug($"Finding titre with Id: {idTitre}");
|
||||
|
||||
@@ -188,16 +188,7 @@ public class DbTitreRepository : ITitreRepository
|
||||
.Include(t => t.Artiste)
|
||||
.Include(t => t.Styles)
|
||||
.Include(t => t.Commentaires)
|
||||
.FirstOrDefault(t => t.IdTitre == idTitre);
|
||||
|
||||
if (titre == null)
|
||||
{
|
||||
this.logger.LogWarning($"Titre with Id {idTitre} not found");
|
||||
}
|
||||
else
|
||||
{
|
||||
this.logger.LogDebug($"Found titre: {titre.Libelle}");
|
||||
}
|
||||
.First(t => t.IdTitre == idTitre);
|
||||
|
||||
return titre;
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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>();
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
// Copyright (c) Equipe 1 - . All rights reserved.
|
||||
// </copyright>
|
||||
|
||||
using Webzine.Repository.Contracts;
|
||||
|
||||
namespace Webzine.WebApplication.Controllers
|
||||
{
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
@@ -16,16 +18,19 @@ namespace Webzine.WebApplication.Controllers
|
||||
// Injection du logger via le constructeur
|
||||
private readonly ILogger<AccueilController> logger;
|
||||
private readonly IConfiguration configuration;
|
||||
private readonly ITitreRepository titreRepository;
|
||||
|
||||
/// <summary>
|
||||
/// Initialise une nouvelle instance de la classe <see cref="AccueilController"/>.
|
||||
/// </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>
|
||||
public AccueilController(ILogger<AccueilController> logger, IConfiguration configuration)
|
||||
/// <param name="titreRepository">Repository des titres injecté pour accéder aux données des titres.</param>
|
||||
public AccueilController(ILogger<AccueilController> logger, IConfiguration configuration, ITitreRepository titreRepository)
|
||||
{
|
||||
this.logger = logger;
|
||||
this.configuration = configuration;
|
||||
this.titreRepository = titreRepository;
|
||||
this.logger.LogDebug(1, "initialisation du AccueilController");
|
||||
}
|
||||
|
||||
@@ -39,7 +44,8 @@ namespace Webzine.WebApplication.Controllers
|
||||
|
||||
var derniereChronique = this.configuration.GetValue<int>("Webzine:NombreDerniereChronique");
|
||||
var topTitres = this.configuration.GetValue<int>("Webzine:NombreDeTopTitres");
|
||||
var titres = FakeDataFactory.GetTitres();
|
||||
var titres = this.titreRepository.FindAll()
|
||||
.ToList();
|
||||
|
||||
var vm = new AccueilIndexViewModel
|
||||
{
|
||||
|
||||
@@ -4,26 +4,16 @@ namespace Webzine.WebApplication.Controllers;
|
||||
|
||||
public class ApiController : ControllerBase
|
||||
{
|
||||
private readonly ILogger<ApiController> _logger;
|
||||
private readonly ILogger<ApiController> logger;
|
||||
|
||||
/// <summary>
|
||||
/// Initialise une nouvelle instance du <see cref="ApiController"/> avec un service de journalisation injecté.
|
||||
/// 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>
|
||||
public ApiController(ILogger<ApiController> logger)
|
||||
{
|
||||
this._logger = logger;
|
||||
this._logger.LogDebug(1, "initialisation du ApiController");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Endpoint de test pour vérifier que l'API fonctionne correctement. Retourne une chaîne de caractères "Hello World !".
|
||||
/// </summary>
|
||||
/// <returns>Une chaîne de caractères "Hello World !".</returns>
|
||||
[HttpGet]
|
||||
public string HelloWorld()
|
||||
{
|
||||
return "Hello World !";
|
||||
this.logger = logger;
|
||||
this.logger.LogDebug(1, "initialisation du ApiController");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -33,7 +23,7 @@ public class ApiController : ControllerBase
|
||||
[HttpGet]
|
||||
public IActionResult Version()
|
||||
{
|
||||
this._logger.LogInformation("Get Version was called");
|
||||
this.logger.LogInformation("Get Version was called");
|
||||
|
||||
return Ok(new
|
||||
{
|
||||
|
||||
@@ -6,16 +6,16 @@ namespace Webzine.WebApplication.Controllers
|
||||
public class ArtisteController : Controller
|
||||
{
|
||||
// Injection du logger via le constructeur
|
||||
private readonly ILogger<ArtisteController> _logger;
|
||||
private readonly ILogger<ArtisteController> logger;
|
||||
|
||||
/// <summary>
|
||||
/// Initialise une nouvelle instance du <see cref="ArtisteController"/> avec un service de journalisation injecté.
|
||||
/// Initialise une nouvelle instance de la classe <see cref="ArtisteController"/>.
|
||||
/// </summary>
|
||||
/// <param name="logger">Service de journalisation injecté pour enregistrer les événements et les erreurs.</param>
|
||||
public ArtisteController(ILogger<ArtisteController> logger)
|
||||
{
|
||||
this._logger = logger;
|
||||
this._logger.LogDebug(1, "initialisation du ArtisteController");
|
||||
this.logger = logger;
|
||||
this.logger.LogDebug(1, "initialisation du ArtisteController");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -26,12 +26,12 @@ namespace Webzine.WebApplication.Controllers
|
||||
[HttpGet("/artiste/{nom}")]
|
||||
public IActionResult Index(string nom)
|
||||
{
|
||||
this._logger.LogInformation("Tentative d'accès à l'artiste avec le nom : {NomArtiste}", nom);
|
||||
this.logger.LogInformation("Tentative d'accès à l'artiste avec le nom : {NomArtiste}", nom);
|
||||
|
||||
if (string.IsNullOrEmpty(nom))
|
||||
{
|
||||
this._logger.LogWarning("Nom de l'artiste manquant dans la requête.");
|
||||
return RedirectToAction("Index", "Accueil");
|
||||
this.logger.LogWarning("Nom de l'artiste manquant dans la requête.");
|
||||
return this.RedirectToAction("Index", "Accueil");
|
||||
}
|
||||
|
||||
// On transforme "fatal-bazooka" en "Fatal Bazooka" pour la factory
|
||||
@@ -41,15 +41,9 @@ namespace Webzine.WebApplication.Controllers
|
||||
// On appelle la factory pour obtenir l'artiste unique
|
||||
var artiste = ArtisteFactory.SeedArtisteByName(nomPropre);
|
||||
|
||||
if (artiste == null)
|
||||
{
|
||||
this._logger.LogWarning("Artiste non trouvé pour le nom : {NomArtiste}", nomPropre);
|
||||
return RedirectToAction("Index");
|
||||
}
|
||||
this.logger.LogInformation("Artiste trouvé : {NomArtiste}", nom);
|
||||
|
||||
this._logger.LogInformation("Artiste trouvé : {NomArtiste}", nom);
|
||||
|
||||
return View(artiste);
|
||||
return this.View(artiste);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,16 +8,16 @@ namespace Webzine.WebApplication.Controllers
|
||||
public class ContactController : Controller
|
||||
{
|
||||
// Injection du logger via le constructeur
|
||||
private readonly ILogger<ContactController> _logger;
|
||||
private readonly ILogger<ContactController> logger;
|
||||
|
||||
/// <summary>
|
||||
/// Initialise une nouvelle instance du <see cref="ContactController"/> avec un service de journalisation injecté.
|
||||
/// Initialise une nouvelle instance de la classe <see cref="ContactController"/>.
|
||||
/// </summary>
|
||||
/// <param name="logger">Service de journalisation injecté pour enregistrer les événements et les erreurs.</param>
|
||||
public ContactController(ILogger<ContactController> logger)
|
||||
{
|
||||
this._logger = logger;
|
||||
this._logger.LogDebug(1, "initialisation du ContactController");
|
||||
this.logger = logger;
|
||||
this.logger.LogDebug(1, "initialisation du ContactController");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -26,7 +26,7 @@ namespace Webzine.WebApplication.Controllers
|
||||
/// <returns>La vue Index de la page de contact.</returns>
|
||||
public IActionResult Index()
|
||||
{
|
||||
return View();
|
||||
return this.View();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,25 +5,38 @@ using Webzine.WebApplication.ViewModels.Titre;
|
||||
|
||||
namespace Webzine.WebApplication.Controllers;
|
||||
|
||||
/// <summary>
|
||||
/// Controleur responsable de la recherche d'artistes et de titres musicaux.
|
||||
/// </summary>
|
||||
[Route("recherche")]
|
||||
public class RechercheController : Controller
|
||||
{
|
||||
private readonly ILogger<RechercheController> _logger;
|
||||
private readonly ITitreRepository _titreRepository;
|
||||
private readonly ILogger<RechercheController> logger;
|
||||
private readonly ITitreRepository titreRepository;
|
||||
|
||||
/// <summary>
|
||||
/// Initialise une nouvelle instance de la classe <see cref="RechercheController"/>.
|
||||
/// </summary>
|
||||
/// <param name="logger">Service de journalisation injecté pour suivre les opérations du contrôleur.</param>
|
||||
/// <param name="titreRepository">Repository des titres injecté pour effectuer les recherches d'artistes et de titres.</param>
|
||||
public RechercheController(ILogger<RechercheController> logger, ITitreRepository titreRepository)
|
||||
{
|
||||
this._logger = logger;
|
||||
this._titreRepository = titreRepository;
|
||||
this.logger = logger;
|
||||
this.titreRepository = titreRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Affiche les résultats de la recherche d'artistes et de titres en fonction du mot-clé fourni.
|
||||
/// </summary>
|
||||
/// <param name="mot">Le mot-clé de recherche utilisé pour trouver les artistes et les titres correspondants.</param>
|
||||
/// <returns>Une vue contenant les résultats de la recherche d'artistes et de titres.</returns>
|
||||
[HttpPost("")]
|
||||
public IActionResult Index(string mot)
|
||||
{
|
||||
this._logger.LogInformation("Recherche artistes/titres pour le mot : {Mot}.", mot);
|
||||
this.logger.LogInformation("Recherche artistes/titres pour le mot : {Mot}.", mot);
|
||||
|
||||
var titres = _titreRepository.Search(mot)
|
||||
.Concat(_titreRepository.SearchByStyle(mot))
|
||||
var titres = this.titreRepository.Search(mot)
|
||||
.Concat(this.titreRepository.SearchByStyle(mot))
|
||||
.DistinctBy(t => t.IdTitre)
|
||||
.OrderBy(t => t.Libelle)
|
||||
.Select(t => new TitreStyleItem
|
||||
@@ -32,14 +45,13 @@ public class RechercheController : Controller
|
||||
Libelle = t.Libelle,
|
||||
ArtisteNom = t.Artiste?.Nom,
|
||||
UrlJaquette = t.UrlJaquette,
|
||||
Duree = t.Duree
|
||||
Duree = t.Duree,
|
||||
})
|
||||
.ToList();
|
||||
|
||||
var artistes = _titreRepository.FindAll()
|
||||
var artistes = this.titreRepository.FindAll()
|
||||
.Select(t => t.Artiste)
|
||||
.Where(a => a != null
|
||||
&& !string.IsNullOrWhiteSpace(a.Nom)
|
||||
.Where(a => !string.IsNullOrWhiteSpace(a.Nom)
|
||||
&& !string.IsNullOrWhiteSpace(mot)
|
||||
&& a.Nom.Contains(mot, StringComparison.OrdinalIgnoreCase))
|
||||
.DistinctBy(a => a!.IdArtiste)
|
||||
@@ -47,7 +59,7 @@ public class RechercheController : Controller
|
||||
.Select(a => new RechercheArtisteItem
|
||||
{
|
||||
Nom = a!.Nom,
|
||||
NombreDeTitres = a.Titres?.Count ?? 0
|
||||
NombreDeTitres = a.Titres?.Count ?? 0,
|
||||
})
|
||||
.ToList();
|
||||
|
||||
@@ -55,9 +67,9 @@ public class RechercheController : Controller
|
||||
{
|
||||
Mot = mot,
|
||||
Artistes = artistes,
|
||||
Titres = titres
|
||||
Titres = titres,
|
||||
};
|
||||
|
||||
return View(vm);
|
||||
return this.View(vm);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ public class TitreController : Controller
|
||||
private readonly ITitreRepository _titreRepository;
|
||||
|
||||
/// <summary>
|
||||
/// Initialise une nouvelle instance du <see cref="TitreController"/>.
|
||||
/// Initialise une nouvelle instance de la classe <see cref="TitreController"/>.
|
||||
/// </summary>
|
||||
/// <param name="logger">Service de journalisation injecte.</param>
|
||||
/// <param name="titreRepository">Repository des titres injecte.</param>
|
||||
@@ -44,7 +44,7 @@ public class TitreController : Controller
|
||||
if (titre == null)
|
||||
{
|
||||
this._logger.LogWarning("Titre avec ID {Id} introuvable.", id);
|
||||
return RedirectToAction("Index");
|
||||
return this.RedirectToAction("Index");
|
||||
}
|
||||
|
||||
var vm = new TitreDetail
|
||||
@@ -58,17 +58,17 @@ public class TitreController : Controller
|
||||
NbLikes = titre.NbLikes,
|
||||
UrlJaquette = titre.UrlJaquette,
|
||||
UrlEcoute = titre.UrlEcoute,
|
||||
ArtisteNom = titre.Artiste?.Nom,
|
||||
ArtisteNom = titre.Artiste.Nom,
|
||||
Styles = titre.Styles,
|
||||
Commentaires = titre.Commentaires
|
||||
Commentaires = titre.Commentaires,
|
||||
},
|
||||
CommentForm = new TitreComment
|
||||
{
|
||||
IdTitre = titre.IdTitre
|
||||
}
|
||||
IdTitre = titre.IdTitre,
|
||||
},
|
||||
};
|
||||
|
||||
return View(vm);
|
||||
return this.View(vm);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -81,15 +81,15 @@ public class TitreController : Controller
|
||||
{
|
||||
this._logger.LogInformation("Recherche des titres pour le style : {Style}.", style);
|
||||
|
||||
var titresFiltres = _titreRepository.SearchByStyle(style).ToList();
|
||||
var titresFiltres = this._titreRepository.SearchByStyle(style).ToList();
|
||||
|
||||
var vm = new TitreStyle
|
||||
{
|
||||
StyleName = style,
|
||||
Titres = titresFiltres.Select(MapTitreItem).ToList()
|
||||
Titres = titresFiltres.Select(MapTitreItem).ToList(),
|
||||
};
|
||||
|
||||
return View(vm);
|
||||
return this.View(vm);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -107,12 +107,12 @@ public class TitreController : Controller
|
||||
if (titre == null)
|
||||
{
|
||||
this._logger.LogWarning("Impossible d'ajouter un like. Titre ID {Id} introuvable.", model.IdTitre);
|
||||
return RedirectToAction("Index");
|
||||
return this.RedirectToAction("Index");
|
||||
}
|
||||
|
||||
titre.NbLikes++;
|
||||
|
||||
return RedirectToAction("Details", new { id = model.IdTitre });
|
||||
return this.RedirectToAction("Details", new { id = model.IdTitre });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -123,10 +123,10 @@ public class TitreController : Controller
|
||||
[HttpPost("comment")]
|
||||
public IActionResult Comment(TitreComment model)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
if (!this.ModelState.IsValid)
|
||||
{
|
||||
this._logger.LogWarning("Echec de validation du modele de commentaire pour le titre ID {Id}.", model.IdTitre);
|
||||
return RedirectToAction("Details", new { id = model.IdTitre });
|
||||
return this.RedirectToAction("Details", new { id = model.IdTitre });
|
||||
}
|
||||
|
||||
var titre = this._titreRepository.Find(model.IdTitre);
|
||||
@@ -134,7 +134,7 @@ public class TitreController : Controller
|
||||
if (titre == null)
|
||||
{
|
||||
this._logger.LogWarning("Impossible d'ajouter le commentaire. Titre ID {Id} introuvable.", model.IdTitre);
|
||||
return RedirectToAction("Index");
|
||||
return this.RedirectToAction("Index");
|
||||
}
|
||||
|
||||
var commentaire = new Commentaire
|
||||
@@ -142,14 +142,14 @@ public class TitreController : Controller
|
||||
Auteur = model.Auteur,
|
||||
Contenu = model.Contenu,
|
||||
DateCreation = DateTime.Now,
|
||||
IdTitre = model.IdTitre
|
||||
IdTitre = model.IdTitre,
|
||||
};
|
||||
|
||||
titre.Commentaires.Add(commentaire);
|
||||
|
||||
this._logger.LogInformation("Commentaire ajoute avec succes au titre ID {Id}.", model.IdTitre);
|
||||
|
||||
return RedirectToAction("Details", new { id = model.IdTitre });
|
||||
return this.RedirectToAction("Details", new { id = model.IdTitre });
|
||||
}
|
||||
|
||||
private static TitreStyleItem MapTitreItem(Titre titre)
|
||||
@@ -160,7 +160,7 @@ public class TitreController : Controller
|
||||
Libelle = titre.Libelle,
|
||||
ArtisteNom = titre.Artiste?.Nom,
|
||||
UrlJaquette = titre.UrlJaquette,
|
||||
Duree = titre.Duree
|
||||
Duree = titre.Duree,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,6 +28,23 @@ try
|
||||
builder.Logging.ClearProviders();
|
||||
builder.Host.UseNLog();
|
||||
|
||||
// En fonction de la configuration, utilise soit les repositories basés sur une base de données, soit les repositories basés sur des listes locales.
|
||||
bool useDatabase = builder.Configuration.GetValue<bool>("UseDatabase");
|
||||
if (useDatabase)
|
||||
{
|
||||
builder.Services.AddScoped<ITitreRepository, DbTitreRepository>();
|
||||
builder.Services.AddScoped<IStyleRepository, DbStyleRepository>();
|
||||
//builder.Services.AddScoped<IArtisteRepository, DbArtisteRepository>();
|
||||
//builder.Services.AddScoped<ICommentaireRepository, DbCommentaireRepository>();
|
||||
}
|
||||
else
|
||||
{
|
||||
builder.Services.AddScoped<ITitreRepository, LocalTitreRepository>();
|
||||
builder.Services.AddScoped<IStyleRepository, LocalStyleRepository>();
|
||||
//builder.Services.AddScoped<IArtisteRepository, LocalArtisteRepository>();
|
||||
//builder.Services.AddScoped<ICommentaireRepository, LocalCommentaireRepository>();
|
||||
}
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Active la possibilite de servir des fichiers statiques presents dans
|
||||
@@ -40,19 +57,6 @@ try
|
||||
db.Database.EnsureCreated();
|
||||
}
|
||||
|
||||
// En fonction de la configuration, utilise soit les repositories basés sur une base de données, soit les repositories basés sur des listes locales.
|
||||
bool useDatabase = builder.Configuration.GetValue<bool>("UseDatabase");
|
||||
if (useDatabase)
|
||||
{
|
||||
builder.Services.AddScoped<ITitreRepository, DbTitreRepository>();
|
||||
builder.Services.AddScoped<IStyleRepository, DbStyleRepository>();
|
||||
}
|
||||
else
|
||||
{
|
||||
builder.Services.AddScoped<ITitreRepository, LocalTitreRepository>();
|
||||
builder.Services.AddScoped<IStyleRepository, LocalStyleRepository>();
|
||||
}
|
||||
|
||||
// Active le middleware permettant le routage des requetes entrantes.
|
||||
app.UseRouting();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user