Merge remote-tracking branch 'origin/dev' into update_dashboard
This commit is contained in:
@@ -33,7 +33,6 @@ public class DbTitreRepository : ITitreRepository
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.logger.LogInformation("Ajout d'un nouveau titre: {Libelle}", titre.Libelle);
|
this.logger.LogInformation("Ajout d'un nouveau titre: {Libelle}", titre.Libelle);
|
||||||
this.logger.LogDebug("Début de l'ajout du titre en base de données");
|
|
||||||
|
|
||||||
this.context.Titres.Add(titre);
|
this.context.Titres.Add(titre);
|
||||||
this.context.SaveChanges();
|
this.context.SaveChanges();
|
||||||
@@ -57,7 +56,6 @@ public class DbTitreRepository : ITitreRepository
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.logger.LogDebug("Comptage des titres en base de données");
|
|
||||||
var count = this.context.Titres.Count();
|
var count = this.context.Titres.Count();
|
||||||
this.logger.LogDebug("Nombre total de titres: {Count}", count);
|
this.logger.LogDebug("Nombre total de titres: {Count}", count);
|
||||||
return count;
|
return count;
|
||||||
@@ -75,7 +73,6 @@ public class DbTitreRepository : ITitreRepository
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.logger.LogInformation("Suppression du titre avec l'ID: {IdTitre}", titre.IdTitre);
|
this.logger.LogInformation("Suppression du titre avec l'ID: {IdTitre}", titre.IdTitre);
|
||||||
this.logger.LogDebug("Début de la suppression du titre en base de données");
|
|
||||||
|
|
||||||
this.context.Titres.Remove(titre);
|
this.context.Titres.Remove(titre);
|
||||||
this.context.SaveChanges();
|
this.context.SaveChanges();
|
||||||
@@ -100,7 +97,6 @@ public class DbTitreRepository : ITitreRepository
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.logger.LogDebug("Recherche des titres avec offset: {Offset}, limit: {Limit}", offset, limit);
|
this.logger.LogDebug("Recherche des titres avec offset: {Offset}, limit: {Limit}", offset, limit);
|
||||||
this.logger.LogDebug("Préparation de la requête avec les inclusions Artiste et Styles");
|
|
||||||
|
|
||||||
var titres = this.context.Titres
|
var titres = this.context.Titres
|
||||||
.OrderByDescending(t => t.DateCreation)
|
.OrderByDescending(t => t.DateCreation)
|
||||||
@@ -125,12 +121,10 @@ public class DbTitreRepository : ITitreRepository
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.logger.LogInformation("Incrémentation du nombre de lectures pour le titre ID: {IdTitre}", titre.IdTitre);
|
this.logger.LogInformation("Incrémentation du nombre de lectures pour le titre ID: {IdTitre}", titre.IdTitre);
|
||||||
this.logger.LogDebug("Recherche du titre en base de données");
|
|
||||||
|
|
||||||
var existingTitre = this.context.Titres.Find(titre.IdTitre);
|
var existingTitre = this.context.Titres.Find(titre.IdTitre);
|
||||||
if (existingTitre != null)
|
if (existingTitre != null)
|
||||||
{
|
{
|
||||||
this.logger.LogDebug("Titre trouvé, incrémentation du compteur de lectures");
|
|
||||||
existingTitre.NbLectures++;
|
existingTitre.NbLectures++;
|
||||||
this.context.SaveChanges();
|
this.context.SaveChanges();
|
||||||
this.logger.LogDebug("Nouveau nombre de lectures: {NbLectures}", existingTitre.NbLectures);
|
this.logger.LogDebug("Nouveau nombre de lectures: {NbLectures}", existingTitre.NbLectures);
|
||||||
@@ -158,12 +152,10 @@ public class DbTitreRepository : ITitreRepository
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.logger.LogInformation("Incrémentation du nombre de likes pour le titre ID: {IdTitre}", titre.IdTitre);
|
this.logger.LogInformation("Incrémentation du nombre de likes pour le titre ID: {IdTitre}", titre.IdTitre);
|
||||||
this.logger.LogDebug("Recherche du titre en base de données");
|
|
||||||
|
|
||||||
var existingTitre = this.context.Titres.Find(titre.IdTitre);
|
var existingTitre = this.context.Titres.Find(titre.IdTitre);
|
||||||
if (existingTitre != null)
|
if (existingTitre != null)
|
||||||
{
|
{
|
||||||
this.logger.LogDebug("Titre trouvé, incrémentation du compteur de likes");
|
|
||||||
existingTitre.NbLikes++;
|
existingTitre.NbLikes++;
|
||||||
this.context.SaveChanges();
|
this.context.SaveChanges();
|
||||||
this.logger.LogDebug("Nouveau nombre de likes: {NbLikes}", existingTitre.NbLikes);
|
this.logger.LogDebug("Nouveau nombre de likes: {NbLikes}", existingTitre.NbLikes);
|
||||||
@@ -281,9 +273,6 @@ public class DbTitreRepository : ITitreRepository
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.logger.LogDebug("Récupération de tous les titres");
|
|
||||||
this.logger.LogDebug("Préparation de la requête avec les inclusions Artiste et Styles");
|
|
||||||
|
|
||||||
var titres = this.context.Titres
|
var titres = this.context.Titres
|
||||||
.Include(t => t.Artiste)
|
.Include(t => t.Artiste)
|
||||||
.Include(t => t.Styles)
|
.Include(t => t.Styles)
|
||||||
@@ -307,7 +296,6 @@ public class DbTitreRepository : ITitreRepository
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.logger.LogInformation("Recherche des titres par style: {Libelle}", libelle);
|
this.logger.LogInformation("Recherche des titres par style: {Libelle}", libelle);
|
||||||
this.logger.LogDebug("Préparation de la requête de recherche par style");
|
|
||||||
|
|
||||||
var titres = this.context.Titres
|
var titres = this.context.Titres
|
||||||
.Include(t => t.Artiste)
|
.Include(t => t.Artiste)
|
||||||
|
|||||||
@@ -81,8 +81,8 @@ public class ArtisteController : Controller
|
|||||||
Biographie = model.Biographie,
|
Biographie = model.Biographie,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Persister les données.
|
|
||||||
this.artisteRepository.Add(artiste);
|
this.artisteRepository.Add(artiste);
|
||||||
|
this.logger.LogInformation("Création d'un nouvel artiste: {Nom}", artiste.Nom);
|
||||||
|
|
||||||
// Renvoyer sur la page Index.
|
// Renvoyer sur la page Index.
|
||||||
return this.RedirectToAction("Index");
|
return this.RedirectToAction("Index");
|
||||||
|
|||||||
@@ -252,24 +252,18 @@ public class TitreController : Controller
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Méthode POST pour supprimer un titre.
|
/// Méthode POST pour supprimer un titre.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="model">Le titre à supprimer.</param>
|
/// <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>Redirige vers la page d'index d'admin titre.</returns>
|
/// <returns>Redirige vers la page d'index d'admin titre.</returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public IActionResult Delete(AdminTitreDelete model)
|
public IActionResult DeleteTitre(int id)
|
||||||
{
|
{
|
||||||
var titre = this.titreRepository.Find(model.Id);
|
var titre = this.titreRepository.Find(id);
|
||||||
|
|
||||||
if (!this.ModelState.IsValid)
|
|
||||||
{
|
|
||||||
return this.View(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (titre != null)
|
if (titre != null)
|
||||||
{
|
{
|
||||||
this.titreRepository.Delete(titre);
|
this.titreRepository.Delete(titre);
|
||||||
return this.RedirectToAction("Index");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.View(model);
|
return this.RedirectToAction("Index");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,9 @@
|
|||||||
@model Webzine.WebApplication.Areas.Administration.ViewModels.Titre.AdminTitreDelete
|
@model Webzine.WebApplication.Areas.Administration.ViewModels.Titre.AdminTitreDelete
|
||||||
|
|
||||||
|
@{
|
||||||
|
ViewData["Title"] = "Supprimer un titre";
|
||||||
|
}
|
||||||
|
|
||||||
<div class="container mt-4">
|
<div class="container mt-4">
|
||||||
|
|
||||||
<h1 class="mb-3">Supprimer un titre</h1>
|
<h1 class="mb-3">Supprimer un titre</h1>
|
||||||
@@ -13,7 +17,7 @@
|
|||||||
@Model.Artiste ?
|
@Model.Artiste ?
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<form asp-action="Delete" method="post">
|
<form asp-action="DeleteTitre" method="post">
|
||||||
|
|
||||||
<input type="hidden" asp-for="Id"/>
|
<input type="hidden" asp-for="Id"/>
|
||||||
|
|
||||||
|
|||||||
@@ -101,25 +101,18 @@ namespace Webzine.WebApplication.Controllers
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Ajoute un like a un titre.
|
/// Ajoute un like a un titre.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="model">Modele contenant l'identifiant du titre.</param>
|
/// <param name="id">Identifiant du titre a liker.</param>
|
||||||
/// <returns>Redirection vers la page detail.</returns>
|
/// <returns>Redirection vers la page detail.</returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public IActionResult Like(TitreLike model)
|
public IActionResult Like(int id)
|
||||||
{
|
{
|
||||||
this.logger.LogInformation("Ajout d'un like pour le titre ID {Id}.", model.IdTitre);
|
var titre = this.titreRepository.Find(id);
|
||||||
|
if (titre != null)
|
||||||
var titre = this.titreRepository.Find(model.IdTitre);
|
|
||||||
|
|
||||||
if (titre == null)
|
|
||||||
{
|
|
||||||
this.logger.LogWarning("Impossible d'ajouter un like. Titre ID {Id} introuvable.", model.IdTitre);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
this.titreRepository.IncrementNbLikes(titre);
|
this.titreRepository.IncrementNbLikes(titre);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.RedirectToAction("Index", new { id = model.IdTitre });
|
return this.RedirectToAction("Index", new { id });
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -130,29 +123,29 @@ namespace Webzine.WebApplication.Controllers
|
|||||||
[HttpPost]
|
[HttpPost]
|
||||||
public IActionResult Comment(TitreComment model)
|
public IActionResult Comment(TitreComment model)
|
||||||
{
|
{
|
||||||
var titre = this.titreRepository.Find(model.IdTitre);
|
var titreToUpdate = this.titreRepository.Find(model.IdTitre);
|
||||||
|
if (titreToUpdate != null)
|
||||||
if (titre == null)
|
|
||||||
{
|
{
|
||||||
this.logger.LogWarning("Impossible d'ajouter le commentaire. Titre ID {Id} introuvable.", model.IdTitre);
|
var commentaire = new Commentaire
|
||||||
return this.RedirectToAction("Index");
|
{
|
||||||
|
Auteur = model.Auteur,
|
||||||
|
Contenu = model.Contenu,
|
||||||
|
DateCreation = DateTime.Now,
|
||||||
|
IdTitre = model.IdTitre,
|
||||||
|
};
|
||||||
|
|
||||||
|
titreToUpdate.Commentaires.Add(commentaire);
|
||||||
|
this.titreRepository.Update(titreToUpdate);
|
||||||
}
|
}
|
||||||
|
|
||||||
var commentaire = new Commentaire
|
|
||||||
{
|
|
||||||
Auteur = model.Auteur,
|
|
||||||
Contenu = model.Contenu,
|
|
||||||
DateCreation = DateTime.Now,
|
|
||||||
IdTitre = model.IdTitre,
|
|
||||||
};
|
|
||||||
|
|
||||||
titre.Commentaires.Add(commentaire);
|
|
||||||
|
|
||||||
this.logger.LogInformation("Commentaire ajoute avec succes au titre ID {Id}.", model.IdTitre);
|
|
||||||
|
|
||||||
return this.RedirectToAction("Index", new { id = model.IdTitre });
|
return this.RedirectToAction("Index", new { id = model.IdTitre });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Mappe une entite Titre vers un item de la liste de titres pour l'affichage dans la vue de style.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="titre">Le titre à mapper.</param>
|
||||||
|
/// <returns>L'item de la liste de titres.</returns>
|
||||||
private static TitreStyleItem MapTitreItem(Titre titre)
|
private static TitreStyleItem MapTitreItem(Titre titre)
|
||||||
{
|
{
|
||||||
return new TitreStyleItem
|
return new TitreStyleItem
|
||||||
@@ -166,10 +159,10 @@ namespace Webzine.WebApplication.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// Construit une URL d'intégration Spotify à partir de l'URL d'écoute d'un titre.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="urlEcoute"></param>
|
/// <param name="urlEcoute">L'URL d'écoute du titre.</param>
|
||||||
/// <returns></returns>
|
/// <returns>L'URL d'intégration Spotify ou null si l'URL n'est pas valide.</returns>
|
||||||
private static string? BuildSpotifyEmbedUrl(string? urlEcoute)
|
private static string? BuildSpotifyEmbedUrl(string? urlEcoute)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(urlEcoute))
|
if (string.IsNullOrWhiteSpace(urlEcoute))
|
||||||
|
|||||||
@@ -23,6 +23,16 @@ public static class RouteConfiguration
|
|||||||
pattern: "artiste/{nom}",
|
pattern: "artiste/{nom}",
|
||||||
defaults: new { controller = "Artiste", action = "Index" });
|
defaults: new { controller = "Artiste", action = "Index" });
|
||||||
|
|
||||||
|
endpoints.MapControllerRoute(
|
||||||
|
name: "TitreLike",
|
||||||
|
pattern: "titre/{id}/like",
|
||||||
|
defaults: new { controller = "Titre", action = "Like" });
|
||||||
|
|
||||||
|
endpoints.MapControllerRoute(
|
||||||
|
name: "TitreComment",
|
||||||
|
pattern: "titre/{id}/comment",
|
||||||
|
defaults: new { controller = "Titre", action = "Comment" });
|
||||||
|
|
||||||
// ----------- ADMIN -----------
|
// ----------- ADMIN -----------
|
||||||
var adminRoutes = new Dictionary<string, string>
|
var adminRoutes = new Dictionary<string, string>
|
||||||
{
|
{
|
||||||
@@ -37,7 +47,7 @@ public static class RouteConfiguration
|
|||||||
defaults: new { area = "Administration", controller = route.Value, action = "Index" });
|
defaults: new { area = "Administration", controller = route.Value, action = "Index" });
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- AUTRE PROUTES ---
|
// --- AUTRES ROUTES ---
|
||||||
endpoints.MapControllerRoute(
|
endpoints.MapControllerRoute(
|
||||||
name: "areas",
|
name: "areas",
|
||||||
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
|
pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
|
||||||
|
|||||||
@@ -150,11 +150,13 @@ try
|
|||||||
var commentaires = new List<Commentaire>();
|
var commentaires = new List<Commentaire>();
|
||||||
var titres = SeedDataLocal.GenererListeTitre(500, artistes, styles, albums);
|
var titres = SeedDataLocal.GenererListeTitre(500, artistes, styles, albums);
|
||||||
|
|
||||||
|
int commentaireIdStart = 1;
|
||||||
foreach (var titre in titres)
|
foreach (var titre in titres)
|
||||||
{
|
{
|
||||||
var commentairesForTitre = SeedDataLocal.GenererListeCommentaire(titre, 0, 5);
|
var commentairesForTitre = SeedDataLocal.GenererListeCommentaire(titre, 0, 5, commentaireIdStart);
|
||||||
titre.Commentaires.AddRange(commentairesForTitre);
|
titre.Commentaires.AddRange(commentairesForTitre);
|
||||||
commentaires.AddRange(commentairesForTitre);
|
commentaires.AddRange(commentairesForTitre);
|
||||||
|
commentaireIdStart += commentairesForTitre.Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
store.Artistes.AddRange(artistes);
|
store.Artistes.AddRange(artistes);
|
||||||
|
|||||||
@@ -59,12 +59,11 @@
|
|||||||
<!-- ACTION BUTTONS -->
|
<!-- ACTION BUTTONS -->
|
||||||
<div class="d-flex gap-2">
|
<div class="d-flex gap-2">
|
||||||
|
|
||||||
<form asp-action="Like" method="post">
|
<form asp-action="Like" asp-controller="Titre" asp-route-id="@Model.Details.IdTitre" method="post">
|
||||||
<input type="hidden" name="IdTitre" value="@Model.Details.IdTitre"/>
|
<button type="submit" class="btn btn-outline-primary btn-sm">
|
||||||
<button type="submit" class="btn btn-outline-primary btn-sm">
|
<i class="fa fa-thumbs-up me-1"></i> Like
|
||||||
<i class="fa fa-thumbs-up me-1"></i> Like
|
</button>
|
||||||
</button>
|
</form>
|
||||||
</form>
|
|
||||||
|
|
||||||
<a asp-area="Administration" asp-controller="Titre" asp-action="Edit"
|
<a asp-area="Administration" asp-controller="Titre" asp-action="Edit"
|
||||||
asp-route-id="@Model.Details.IdTitre" class="btn text-primary btn-sm">
|
asp-route-id="@Model.Details.IdTitre" class="btn text-primary btn-sm">
|
||||||
@@ -125,7 +124,7 @@
|
|||||||
|
|
||||||
<h4 class="mb-4">Donne ton avis sur le titre</h4>
|
<h4 class="mb-4">Donne ton avis sur le titre</h4>
|
||||||
|
|
||||||
<form asp-action="Comment" method="post">
|
<form asp-action="Comment" asp-controller="Titre" asp-route-id="@Model.Details.IdTitre" method="post">
|
||||||
<input type="hidden" name="IdTitre" value="@Model.Details.IdTitre"/>
|
<input type="hidden" name="IdTitre" value="@Model.Details.IdTitre"/>
|
||||||
|
|
||||||
<div class="row mb-3 align-items-center">
|
<div class="row mb-3 align-items-center">
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
"Logging": {
|
"Logging": {
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
"Default": "Information",
|
"Default": "Information",
|
||||||
"Microsoft.AspNetCore": "Warning"
|
"Microsoft.AspNetCore": "Warning",
|
||||||
|
"Webzine.Repository": "Debug"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Webzine": {
|
"Webzine": {
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
<rules>
|
<rules>
|
||||||
<!-- Vos logs d'application en Debug+ -->
|
<!-- Vos logs d'application en Debug+ -->
|
||||||
<logger name="Webzine.WebApplication.*" minlevel="Info" writeTo="allfile,ownfile-web,console" />
|
<logger name="Webzine.WebApplication.*" minlevel="Info" writeTo="allfile,ownfile-web,console" />
|
||||||
|
<logger name="Webzine.Repository.*" minlevel="Debug" writeTo="allfile,ownfile-web,console" />
|
||||||
|
|
||||||
<!-- Logs Microsoft en Warning+ sauf Hosting.Lifetime -->
|
<!-- Logs Microsoft en Warning+ sauf Hosting.Lifetime -->
|
||||||
<logger name="Microsoft.*" minlevel="Warn" writeTo="allfile" final="true" />
|
<logger name="Microsoft.*" minlevel="Warn" writeTo="allfile" final="true" />
|
||||||
|
|||||||
Reference in New Issue
Block a user