Rebase : Merge conflit entre dev et j3/seed_spotify.

This commit is contained in:
Loic Masi
2026-04-04 20:20:08 +02:00
19 changed files with 119 additions and 27 deletions

View File

@@ -94,7 +94,6 @@ public class DbStyleRepository : IStyleRepository
this.logger.LogDebug("Recherche du style avec l'ID: {Id}", id); this.logger.LogDebug("Recherche du style avec l'ID: {Id}", id);
var style = this.context.Styles var style = this.context.Styles
.AsNoTracking()
.Include(s => s.Titres) .Include(s => s.Titres)
.SingleOrDefault(s => s.IdStyle == id); .SingleOrDefault(s => s.IdStyle == id);
@@ -123,7 +122,6 @@ public class DbStyleRepository : IStyleRepository
this.logger.LogDebug("Tri des styles par libellé"); this.logger.LogDebug("Tri des styles par libellé");
var styles = this.context.Styles var styles = this.context.Styles
.AsNoTracking()
.OrderBy(s => s.Libelle); .OrderBy(s => s.Libelle);
this.logger.LogDebug("La liste de styles a été récupérée."); this.logger.LogDebug("La liste de styles a été récupérée.");

View File

@@ -113,12 +113,15 @@ public class ArtisteController : Controller
[HttpPost] [HttpPost]
public IActionResult Edit(ArtisteEditViewModel model) public IActionResult Edit(ArtisteEditViewModel model)
{ {
var artiste = new Artiste var artiste = this.artisteRepository.Find(model.Id);
if (artiste == null)
{ {
IdArtiste = model.Id, return this.RedirectToAction("Index");
Nom = model.Nom, }
Biographie = model.Biographie,
}; artiste.Nom = model.Nom;
artiste.Biographie = model.Biographie;
this.artisteRepository.Update(artiste); this.artisteRepository.Update(artiste);

View File

@@ -2,9 +2,10 @@ namespace Webzine.WebApplication.Areas.Administration.Controllers;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using ViewModels.Styles;
using Webzine.Entity; using Webzine.Entity;
using Webzine.Repository.Contracts; using Webzine.Repository.Contracts;
using Webzine.WebApplication.Areas.Administration.ViewModels.Style;
/// <summary> /// <summary>
/// Controleur pour la gestion des styles dans l'administration du webzine. /// Controleur pour la gestion des styles dans l'administration du webzine.

View File

@@ -114,6 +114,33 @@ public class TitreController : Controller
[HttpPost] [HttpPost]
public IActionResult Create(TitreAdminDTO model) public IActionResult Create(TitreAdminDTO model)
{ {
if (!this.ModelState.IsValid)
{
var form = new AdminTitreForm
{
IdArtiste = model.IdArtiste,
Libelle = model.Libelle,
Album = model.Album,
Chronique = model.Chronique,
DateSortie = model.DateSortie,
Duree = model.Duree,
UrlJaquette = model.UrlJaquette,
UrlEcoute = model.UrlEcoute,
Styles = model.Styles,
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(form);
}
this.titreAdminService.CreerTitre(model); this.titreAdminService.CreerTitre(model);
return this.RedirectToAction("Index"); return this.RedirectToAction("Index");
} }
@@ -166,6 +193,34 @@ public class TitreController : Controller
[HttpPost] [HttpPost]
public IActionResult Edit(TitreAdminDTO model) public IActionResult Edit(TitreAdminDTO model)
{ {
if (!this.ModelState.IsValid)
{
var form = new AdminTitreForm
{
Id = model.Id,
IdArtiste = model.IdArtiste,
Libelle = model.Libelle,
Album = model.Album,
Chronique = model.Chronique,
DateSortie = model.DateSortie,
Duree = model.Duree,
UrlJaquette = model.UrlJaquette,
UrlEcoute = model.UrlEcoute,
Styles = model.Styles,
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(form);
}
this.titreAdminService.ModifierTitre(model); this.titreAdminService.ModifierTitre(model);
return this.RedirectToAction("Index"); return this.RedirectToAction("Index");
} }

View File

@@ -14,11 +14,11 @@
/// <summary> /// <summary>
/// Définit le nom de l'artiste. /// Définit le nom de l'artiste.
/// </summary> /// </summary>
public string Nom { get; set; } public string? Nom { get; set; }
/// <summary> /// <summary>
/// Définit la biographie de l'artiste. /// Définit la biographie de l'artiste.
/// </summary> /// </summary>
public string Biographie { get; set; } public string? Biographie { get; set; }
} }
} }

View File

@@ -10,12 +10,15 @@
/// <summary> /// <summary>
/// Nom de l'artiste. /// Nom de l'artiste.
/// </summary> /// </summary>
[Required] [Required(ErrorMessage = "Le nom de l'auteur est obligatoire.")]
[StringLength(50, ErrorMessage = "Le nom ne doit pas dépasser 50 caractères.")]
public string Nom { get; set; } public string Nom { get; set; }
/// <summary> /// <summary>
/// Biographie de l'artiste. /// Biographie de l'artiste.
/// </summary> /// </summary>*
[Required(ErrorMessage = "La biographie ne peux pas etre vide.")]
public string Biographie { get; set; } public string Biographie { get; set; }
} }
} }

View File

@@ -16,12 +16,11 @@
/// <summary> /// <summary>
/// Nom de l'artiste. /// Nom de l'artiste.
/// </summary> /// </summary>
[Required] [Required(ErrorMessage = "Le nom de l'auteur est obligatoire.")]
[StringLength(50, ErrorMessage = "Le nom ne doit pas dépasser 50 caractères.")]
public string Nom { get; set; } public string Nom { get; set; }
/// <summary>
/// Biographie de l'artiste.
/// </summary>
public string Biographie { get; set; } public string Biographie { get; set; }
} }
} }

View File

@@ -2,7 +2,7 @@
// Copyright (c) Equipe 1 - BOBIN, MASI, NODON, VETU. All rights reserved. // Copyright (c) Equipe 1 - BOBIN, MASI, NODON, VETU. All rights reserved.
// </copyright> // </copyright>
namespace Webzine.WebApplication.Areas.Administration.ViewModels.Style namespace Webzine.WebApplication.Areas.Administration.ViewModels.Styles
{ {
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
@@ -14,7 +14,7 @@ namespace Webzine.WebApplication.Areas.Administration.ViewModels.Style
/// <summary> /// <summary>
/// Obtient ou définit le libellé du style. /// Obtient ou définit le libellé du style.
/// </summary> /// </summary>
[Required] [Required(ErrorMessage = "Le libelle du style est obligatoire.")]
public string Libelle { get; set; } public string Libelle { get; set; }
} }
} }

View File

@@ -2,7 +2,7 @@
// Copyright (c) Equipe 1 - BOBIN, MASI, NODON, VETU. All rights reserved. // Copyright (c) Equipe 1 - BOBIN, MASI, NODON, VETU. All rights reserved.
// </copyright> // </copyright>
namespace Webzine.WebApplication.Areas.Administration.ViewModels.Style namespace Webzine.WebApplication.Areas.Administration.ViewModels.Styles
{ {
/// <summary> /// <summary>
/// ViewModel pour la suppression d'un style en administration. /// ViewModel pour la suppression d'un style en administration.
@@ -17,6 +17,6 @@ namespace Webzine.WebApplication.Areas.Administration.ViewModels.Style
/// <summary> /// <summary>
/// Obtient ou définit le libellé du style. /// Obtient ou définit le libellé du style.
/// </summary> /// </summary>
public string Libelle { get; set; } public string? Libelle { get; set; }
} }
} }

View File

@@ -2,7 +2,7 @@
// Copyright (c) Equipe 1 - BOBIN, MASI, NODON, VETU. All rights reserved. // Copyright (c) Equipe 1 - BOBIN, MASI, NODON, VETU. All rights reserved.
// </copyright> // </copyright>
namespace Webzine.WebApplication.Areas.Administration.ViewModels.Style namespace Webzine.WebApplication.Areas.Administration.ViewModels.Styles
{ {
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
@@ -19,7 +19,7 @@ namespace Webzine.WebApplication.Areas.Administration.ViewModels.Style
/// <summary> /// <summary>
/// Obtient ou definit le libelle du style. /// Obtient ou definit le libelle du style.
/// </summary> /// </summary>
[Required] [Required(ErrorMessage = "Le libelle du style est obligatoire.")]
public string Libelle { get; set; } public string Libelle { get; set; }
} }
} }

View File

@@ -1,5 +1,7 @@
namespace Webzine.WebApplication.Areas.Administration.ViewModels.Titre; namespace Webzine.WebApplication.Areas.Administration.ViewModels.Titre;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.Rendering;
/// <summary> /// <summary>
@@ -15,36 +17,47 @@ public class AdminTitreForm
/// <summary> /// <summary>
/// Définit l'identifiant de l'artiste associé au titre. /// Définit l'identifiant de l'artiste associé au titre.
/// </summary> /// </summary>
[Required(ErrorMessage = "L'id de l'artiste est obligatoire.")]
public int IdArtiste { get; set; } public int IdArtiste { get; set; }
/// <summary> /// <summary>
/// Définit le titre du titre. /// Définit le titre du titre.
/// </summary> /// </summary>
[Required(ErrorMessage = "Le labelle est obligatoire.")]
public string Libelle { get; set; } public string Libelle { get; set; }
/// <summary> /// <summary>
/// Définit le nom de l'album associé au titre. /// Définit le nom de l'album associé au titre.
/// </summary> /// </summary>
[Required(ErrorMessage = "L'album est obligatoire.")]
public string Album { get; set; } public string Album { get; set; }
/// <summary> /// <summary>
/// Définit la chronique du titre, peut-être une critique ou une description du titre. /// Définit la chronique du titre, peut-être une critique ou une description du titre.
/// </summary> /// </summary>
[Required(ErrorMessage = "La chronique est obligatoire.")]
public string Chronique { get; set; } public string Chronique { get; set; }
/// <summary> /// <summary>
/// Définit la date de sortie du titre. /// Définit la date de sortie du titre.
/// </summary> /// </summary>
[Required(ErrorMessage = "La date de est obligatoire.")]
public DateTime DateSortie { get; set; } public DateTime DateSortie { get; set; }
/// <summary> /// <summary>
/// Définit la durée du titre en secondes. /// Définit la durée du titre en secondes.
/// </summary> /// </summary>
[Required(ErrorMessage = "La durée est obligatoire.")]
public int Duree { get; set; } public int Duree { get; set; }
/// <summary> /// <summary>
/// Définit l'URL de la jaquette de l'album associé au titre. /// Définit l'URL de la jaquette de l'album associé au titre.
/// </summary> /// </summary>
[Required(ErrorMessage = "L'Url de la jaquette est obligatoire.")]
public string UrlJaquette { get; set; } public string UrlJaquette { get; set; }
/// <summary> /// <summary>

View File

@@ -11,6 +11,8 @@
<label class="col-md-3 col-form-label">Nom de l'artiste<span class="text-danger">*</span></label> <label class="col-md-3 col-form-label">Nom de l'artiste<span class="text-danger">*</span></label>
<div class="col-md-9"> <div class="col-md-9">
<input asp-for="Nom" class="form-control" /> <input asp-for="Nom" class="form-control" />
<span asp-validation-for="Nom" class="text-danger"></span>
</div> </div>
</div> </div>
@@ -19,6 +21,8 @@
<label class="col-md-3 col-form-label">Biographie</label> <label class="col-md-3 col-form-label">Biographie</label>
<div class="col-md-9"> <div class="col-md-9">
<textarea asp-for="Biographie" class="form-control" rows="5"></textarea> <textarea asp-for="Biographie" class="form-control" rows="5"></textarea>
<span asp-validation-for="Biographie" class="text-danger"></span>
</div> </div>
</div> </div>

View File

@@ -6,6 +6,8 @@
<label class="col-md-3 col-form-label">Nom de l'artiste<span class="text-danger">*</span></label> <label class="col-md-3 col-form-label">Nom de l'artiste<span class="text-danger">*</span></label>
<div class="col-md-9"> <div class="col-md-9">
<input asp-for="Nom" class="form-control" /> <input asp-for="Nom" class="form-control" />
<span asp-validation-for="Nom" class="text-danger"></span>
</div> </div>
</div> </div>
@@ -14,7 +16,10 @@
<label class="col-md-3 col-form-label">Biographie</label> <label class="col-md-3 col-form-label">Biographie</label>
<div class="col-md-9"> <div class="col-md-9">
<textarea asp-for="Biographie" class="form-control" rows="5"></textarea> <textarea asp-for="Biographie" class="form-control" rows="5"></textarea>
<span asp-validation-for="Biographie" class="text-danger"></span>
</div> </div>
</div> </div>
<!-- BOUTONS --> <!-- BOUTONS -->

View File

@@ -1,4 +1,4 @@
@model Webzine.WebApplication.Areas.Administration.ViewModels.Style.StyleCreateViewModel @model Webzine.WebApplication.Areas.Administration.ViewModels.Styles.StyleCreateViewModel
@{ @{
ViewData["Title"] = "Créer un style"; ViewData["Title"] = "Créer un style";

View File

@@ -1,4 +1,4 @@
@model Webzine.WebApplication.Areas.Administration.ViewModels.Style.StyleDeleteViewModel @model Webzine.WebApplication.Areas.Administration.ViewModels.Styles.StyleDeleteViewModel
@{ @{
ViewData["Title"] = "Supprimer un style"; ViewData["Title"] = "Supprimer un style";

View File

@@ -1,4 +1,4 @@
@model Webzine.WebApplication.Areas.Administration.ViewModels.Style.StyleEditViewModel @model Webzine.WebApplication.Areas.Administration.ViewModels.Styles.StyleEditViewModel
@{ @{
ViewData["Title"] = "Editer un style"; ViewData["Title"] = "Editer un style";

View File

@@ -8,6 +8,8 @@
<select asp-for="IdArtiste" <select asp-for="IdArtiste"
asp-items="Model.Artistes" asp-items="Model.Artistes"
class="form-select"></select> class="form-select"></select>
<span asp-validation-for="IdArtiste" class="text-danger"></span>
</div> </div>
</div> </div>
@@ -16,6 +18,7 @@
<label class="col-md-3 col-form-label">Titre<span class="text-danger">*</span></label> <label class="col-md-3 col-form-label">Titre<span class="text-danger">*</span></label>
<div class="col-md-9"> <div class="col-md-9">
<input asp-for="Libelle" class="form-control"/> <input asp-for="Libelle" class="form-control"/>
<span asp-validation-for="Libelle" class="text-danger"></span>
</div> </div>
</div> </div>
@@ -24,6 +27,7 @@
<label class="col-md-3 col-form-label">Album<span class="text-danger">*</span></label> <label class="col-md-3 col-form-label">Album<span class="text-danger">*</span></label>
<div class="col-md-9"> <div class="col-md-9">
<input asp-for="Album" class="form-control"/> <input asp-for="Album" class="form-control"/>
<span asp-validation-for="Album" class="text-danger"></span>
</div> </div>
</div> </div>
@@ -34,6 +38,8 @@
<textarea asp-for="Chronique" <textarea asp-for="Chronique"
class="form-control" class="form-control"
rows="5"></textarea> rows="5"></textarea>
<span asp-validation-for="Chronique" class="text-danger"></span>
</div> </div>
</div> </div>
@@ -55,6 +61,8 @@
class="form-control" class="form-control"
type="number" type="number"
min="0" /> min="0" />
<span asp-validation-for="Duree" class="text-danger"></span>
<span class="input-group-text text-muted">seconds</span> <span class="input-group-text text-muted">seconds</span>
</div> </div>
</div> </div>
@@ -66,6 +74,8 @@
<div class="col-md-9"> <div class="col-md-9">
<input asp-for="UrlJaquette" <input asp-for="UrlJaquette"
class="form-control"/> class="form-control"/>
<span asp-validation-for="UrlJaquette" class="text-danger"></span>
</div> </div>
</div> </div>

View File

@@ -31,6 +31,7 @@ try
// controllers avec des vues. // controllers avec des vues.
builder.Services.AddControllersWithViews(options => builder.Services.AddControllersWithViews(options =>
{ {
// options.Filters.Add<GlobalExceptionFilter>();
options.Filters.Add<ValidationActionFilter>(); options.Filters.Add<ValidationActionFilter>();
options.Filters.Add<GlobalExceptionFilter>(); options.Filters.Add<GlobalExceptionFilter>();
}); });
@@ -55,7 +56,7 @@ try
}); });
builder.Services.AddSingleton<EfSlowQueryInterceptor>(); builder.Services.AddSingleton<EfSlowQueryInterceptor>();
// 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. // 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.
// En fonction de la configuration, utilise soit les repositories bases sur une base de donnees, soit les repositories bases sur des listes locales. // En fonction de la configuration, utilise soit les repositories bases sur une base de donnees, soit les repositories bases sur des listes locales.
var repositoryType = builder.Configuration.GetValue<RepositoryType>("Repository"); var repositoryType = builder.Configuration.GetValue<RepositoryType>("Repository");
var seederType = builder.Configuration.GetValue<SeederType>("Seeder"); var seederType = builder.Configuration.GetValue<SeederType>("Seeder");

View File

@@ -26,6 +26,6 @@
}, },
"AllowedHosts": "*", "AllowedHosts": "*",
"EfPerformance": { "EfPerformance": {
"SeuilMs": 10 "SeuilMs": 60
} }
} }