Ajoute les thèmes communs sur les fiches de livres

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
LIMONIER Mathieu
2026-08-20 14:38:19 +02:00
co-authored by Copilot
parent e28d5bce32
commit c2d408afc6
17 changed files with 992 additions and 8 deletions
@@ -31,6 +31,9 @@ public record EnregistrementLivre
/// </summary>
public List<AuteurSaisi> Auteurs { get; set; } = [];
/// <summary>Thèmes saisis manuellement, séparés par des virgules dans l'interface.</summary>
public List<string> Themes { get; set; } = [];
public string? Editeur { get; set; }
public Format Format { get; set; }
@@ -67,6 +70,13 @@ public record EnregistrementLivre
set => Auteurs = Decouper(value, Auteurs);
}
[JsonIgnore]
public string? ThemesTexte
{
get => Themes.Count == 0 ? null : string.Join(", ", Themes);
set => Themes = DecouperThemes(value);
}
/// <summary>
/// Découpe une saisie texte en auteurs, en écartant les entrées vides.
/// </summary>
@@ -99,6 +109,20 @@ public record EnregistrementLivre
nom, roles.GetValueOrDefault(NormalisationTexte.Normaliser(nom), RoleAuteur.NonPrecise)))
.ToList();
}
public static List<string> DecouperThemes(string? saisie)
{
if (string.IsNullOrWhiteSpace(saisie))
{
return [];
}
var vus = new HashSet<string>(StringComparer.Ordinal);
return saisie
.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
.Where(theme => vus.Add(NormalisationTexte.Normaliser(theme)))
.ToList();
}
}
/// <summary>Un auteur tel qu'il est saisi : son nom, et son rôle sur ce livre.</summary>
+2
View File
@@ -37,6 +37,8 @@ public record LivreDto
/// <summary>Auteurs, dans l'ordre de la couverture. Peut être vide.</summary>
public IReadOnlyList<AuteurDto> Auteurs { get; init; } = [];
public IReadOnlyList<string> Themes { get; init; } = [];
public string? Editeur { get; init; }
public required Format Format { get; init; }
+6
View File
@@ -56,6 +56,12 @@ public class Livre
/// <summary>Auteurs du livre, ordonnés par <see cref="LivreAuteur.Position"/>.</summary>
public List<LivreAuteur> Auteurs { get; set; } = [];
/// <summary>
/// Thèmes du livre. Ils décrivent l'œuvre et sont donc communs au foyer, contrairement aux
/// statuts de lecture et aux envies.
/// </summary>
public List<LivreTheme> Themes { get; set; } = [];
/// <summary>
/// Statuts de lecture, <b>un par personne</b> et seulement pour celles qui en ont posé un.
/// </summary>
+33
View File
@@ -0,0 +1,33 @@
using MaBibli.Shared.Textes;
namespace MaBibli.Shared.Entites;
/// <summary>Étiquette thématique commune au catalogue.</summary>
public class Theme
{
public int Id { get; set; }
public string Nom { get; set; } = string.Empty;
public string NomNormalise { get; set; } = string.Empty;
public List<LivreTheme> Livres { get; set; } = [];
public void RecalculerFormes()
{
Nom = Nom.Trim();
NomNormalise = NormalisationTexte.Normaliser(Nom);
}
}
/// <summary>Lien entre un livre et une étiquette thématique.</summary>
public class LivreTheme
{
public int LivreId { get; set; }
public Livre? Livre { get; set; }
public int ThemeId { get; set; }
public Theme? Theme { get; set; }
}