using MaBibli.Shared.Textes; namespace MaBibli.Shared.Entites; /// /// Un livre que l'on aimerait acquérir. Personnel : chacun sa liste. /// /// /// Pourquoi une entité séparée plutôt qu'un statut de plus sur ? /// Un livre souhaité n'est pas un livre possédé. S'il était une ligne de Livres, il /// entrerait mécaniquement dans le catalogue, dans les compteurs, dans les prêts et dans le /// cache hors-ligne — et il faudrait ajouter « et qui n'est pas souhaité » à chaque /// lecture du catalogue. Un invariant qu'il faut réécrire à chaque requête finit toujours par /// être oublié quelque part ; ici l'inventaire et l'envie ne se croisent tout simplement pas, /// parce qu'ils ne vivent pas dans la même table. /// /// C'est aussi la seule forme qui accepte une envie sans ISBN ni édition arrêtée : on /// souhaite une œuvre (« le dernier Werber »), on possède un exemplaire. Un souhait n'a donc /// ni ni couverture obligatoire, et ne peut pas être prêté. /// /// /// La portée personnelle suit , dont la documentation annonçait déjà /// ce voisinage : est une frontière, contrairement à /// . On ne lit jamais la liste d'envies de quelqu'un d'autre — /// c'est précisément ce qui permet d'offrir un livre sans vendre la mèche. /// /// public class LivreSouhaite { public int Id { get; set; } /// /// YNH_USER du propriétaire de l'envie. Frontière : toute lecture filtre dessus. /// public string Utilisateur { get; set; } = string.Empty; public string Titre { get; set; } = string.Empty; /// /// Titre mis à plat, servant à la fois au dédoublonnage et au rapprochement avec le /// catalogue (« ai-je déjà ce livre ? »). Recalculé à chaque écriture. /// public string TitreNormalise { get; set; } = string.Empty; /// /// Auteur en texte libre, volontairement pas une clé étrangère vers . /// /// /// La table Auteurs décrit qui est dans la bibliothèque : y insérer les auteurs /// souhaités les ferait apparaître sur l'écran des auteurs avec « 0 livre », et exposerait la /// liste d'envies d'une personne à tout le foyer — l'inverse de ce qu'on veut. Le texte libre /// survit en outre à la disparition de l'auteur du catalogue. /// public string? Auteur { get; set; } /// /// Auteur mis à plat. Jamais null (chaîne vide si l'auteur est inconnu) : /// SQLite considère deux NULL comme distincts, et l'index unique laisserait alors /// passer des doublons d'envies sans auteur. /// public string AuteurNormalise { get; set; } = string.Empty; public string? Editeur { get; set; } /// Année de publication, telle que la source la donne. Texte : la BnF écrit « 2012 », mais aussi « [DL 2012] ». public string? Annee { get; set; } /// ISBN d'une édition repérée, quand il y en a une. Facultatif : on souhaite une œuvre, pas forcément une édition. public string? Isbn { get; set; } public string? CoverUrl { get; set; } /// Note libre : « demandé à Noël », « en poche seulement », « chez Untel ». public string? Note { get; set; } public DateTime DateAjout { get; set; } /// /// Rang dans la liste, du plus désiré (0) au moins désiré. /// /// /// L'ordre est choisi à la main : c'est une préférence, elle ne se calcule pas. Il est /// personnel comme le reste de la table — le rang n'a de sens qu'à l'intérieur de la /// liste d'une personne, et deux utilisateurs numérotent la leur indépendamment. /// /// Une envie nouvelle se pose en fin de liste, jamais en tête : on vient de la noter, /// on n'a pas dit qu'on la voulait plus que les autres. C'est à l'utilisateur de la remonter. /// /// public int Rang { get; set; } public void RecalculerFormes() { Titre = Titre.Trim(); TitreNormalise = CleOeuvre.Cle(Titre); Auteur = string.IsNullOrWhiteSpace(Auteur) ? null : Auteur.Trim(); AuteurNormalise = RapprochementAuteurs.Cle(Auteur); } }