using MaBibli.Shared.Textes; namespace MaBibli.Shared.Entites; /// /// Un auteur du catalogue. Table dédiée, et non plus un champ texte sur . /// /// /// Deux besoins imposaient la table : regrouper les livres d'un même auteur d'un clic, et /// retrouver « Émile » en tapant « Emile ». Un champ texte libre ne sait faire ni l'un ni l'autre. /// public class Auteur { public int Id { get; set; } /// Nom tel qu'affiché, accents et casse compris : « Émile Zola ». public string Nom { get; set; } = string.Empty; /// /// Forme normalisée du nom (minuscules, sans accents), dans l'ordre de saisie. /// Sert à la recherche. /// public string NomNormalise { get; set; } = string.Empty; /// /// Clé de regroupement : mêmes mots normalisés mais triés, ce qui rend l'ordre /// indifférent. Unique en base : c'est elle qui empêche « Zola, Émile » et /// « Émile Zola » de coexister. /// public string CleRegroupement { get; set; } = string.Empty; public List Livres { get; set; } = []; /// Renseigne les deux formes dérivées à partir du nom d'affichage. public void RecalculerFormes() { Nom = Nom.Trim(); NomNormalise = NormalisationTexte.Normaliser(Nom); CleRegroupement = RapprochementAuteurs.Cle(Nom); } } /// /// Table de liaison livre ↔ auteur : un livre peut avoir plusieurs auteurs. /// /// /// Le cas n'est pas théorique : le lookup ISBN d'Introduction to Algorithms renvoie /// quatre noms (Cormen, Leiserson, Rivest, Stein). conserve l'ordre de /// la couverture, qui n'est pas alphabétique et fait partie de l'information. /// public class LivreAuteur { public int LivreId { get; set; } public Livre? Livre { get; set; } public int AuteurId { get; set; } public Auteur? Auteur { get; set; } /// Rang de l'auteur sur la couverture, à partir de 0. public int Position { get; set; } /// /// Rôle sur ce livre : scénario, dessin, couleurs. Voir . /// /// /// Il est porté par le lien et non par l'auteur : le même dessinateur peut avoir scénarisé /// un autre album, et il ne doit pas pour autant exister en deux fiches. /// public RoleAuteur Role { get; set; } } /// /// Rapprochement d'auteurs explicitement refusé par l'utilisateur. /// /// /// Sans cette mémoire, une suggestion écartée reviendrait à chaque affichage : « Hamilton » et /// « Peter F. Hamilton » se ressembleront toujours autant. On ne stocke que les refus ; /// les suggestions elles-mêmes sont recalculées à la demande, et une acceptation ne laisse rien /// à mémoriser puisque l'un des deux auteurs disparaît. /// /// Le couple est toujours rangé avec le plus petit identifiant en premier, pour qu'un refus vaille /// dans les deux sens. /// /// public class RapprochementRefuse { public int Id { get; set; } public int AuteurAId { get; set; } public int AuteurBId { get; set; } }