using System.Text.Json.Serialization; using MaBibli.Shared.Entites; namespace MaBibli.Shared.Dtos; /// /// Charge utile de création et de modification d'un livre. /// /// /// n'y figure pas volontairement : il est déterminé par le serveur /// à partir de l'utilisateur authentifié, jamais par le client. /// public record EnregistrementLivre { /// Séparateur des auteurs dans la forme texte d'un champ de saisie. /// /// Le point-virgule, et non la virgule : celle-ci est déjà prise par la forme /// bibliographique « Zola, Émile », qu'on doit pouvoir taper telle quelle. /// public const char SeparateurAuteurs = ';'; /// Facultatif : certains livres n'ont pas d'ISBN. Normalisé par le serveur. public string? Isbn { get; set; } public string Titre { get; set; } = string.Empty; /// /// Noms des auteurs, dans l'ordre de la couverture. Le serveur les rattache aux fiches /// existantes quand c'est sûr, et en crée sinon. /// public List Auteurs { get; set; } = []; public string? Editeur { get; set; } public Format Format { get; set; } /// Roman, bande dessinée… Facultatif : « non précisé » est une réponse valable. public TypeDocument TypeDocument { get; set; } /// /// Statut de lecture de l'appelant. null = non commencé, et aucune ligne n'est /// alors écrite en base. /// public Statut? Statut { get; set; } public string? CoverUrl { get; set; } /// /// Vue « une seule ligne » de , pour les champs de saisie simples. /// /// /// Non sérialisée : est la forme de référence sur le fil. Cette /// propriété existe pour que l'interface puisse lier un <input> unique sans /// avoir à gérer une liste dynamique — un foyer saisit un auteur dans l'immense majorité /// des cas, et les rares livres à quatre auteurs se tapent avec des « ; ». /// [JsonIgnore] public string? Auteur { get => Auteurs.Count == 0 ? null : string.Join($"{SeparateurAuteurs} ", Auteurs); set => Auteurs = Decouper(value); } /// Découpe une saisie texte en noms d'auteurs, en écartant les entrées vides. public static List Decouper(string? saisie) => string.IsNullOrWhiteSpace(saisie) ? [] : saisie.Split(SeparateurAuteurs, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) .ToList(); } /// Charge utile du changement de statut de lecture — l'action la plus fréquente. /// /// Le statut posé est toujours celui de l'appelant : il n'y a pas de champ « utilisateur », /// et il ne doit jamais y en avoir. Personne ne coche « lu » à la place d'un autre. /// public record ChangementStatut { /// null retire le statut : le livre redevient « non commencé » pour l'appelant. public Statut? Statut { get; set; } }