using System.Text.Json.Serialization; using MaBibli.Shared.Entites; namespace MaBibli.Shared.Dtos; /// Un auteur tel qu'exposé par l'API : de quoi l'afficher et cliquer dessus. public record AuteurDto { public required int Id { get; init; } public required string Nom { get; init; } /// Nombre de livres du catalogue rattachés à cet auteur. Renseigné par la liste des auteurs. public int NombreDeLivres { get; init; } /// /// Rôle sur le livre où cet auteur figure. N'a de sens qu'à l'intérieur d'un /// : la liste des auteurs, elle, ne parle d'aucun livre en /// particulier et le laisse à NonPrecise. /// public RoleAuteur Role { get; init; } } /// /// Un livre tel qu'exposé par l'API. Volontairement sans la collection de ses prêts : /// le catalogue n'a besoin que de savoir si le livre est dehors, et l'historique complet se /// demande à part (GET /api/livres/{id}/prets) pour ne pas alourdir chaque liste. /// public record LivreDto { public required int Id { get; init; } public string? Isbn { get; init; } public required string Titre { get; init; } /// Auteurs, dans l'ordre de la couverture. Peut être vide. public IReadOnlyList Auteurs { get; init; } = []; public IReadOnlyList Themes { get; init; } = []; public string? Editeur { get; init; } public required Format Format { get; init; } /// /// Roman, bande dessinée… NonPrecise par défaut, qui ne veut pas dire « roman ». /// public TypeDocument TypeDocument { get; init; } /// /// Statut de lecture de l'utilisateur courant, ou null s'il n'en a jamais posé /// (« non commencé »). /// /// /// Ce champ dépend de qui appelle : le même livre remonte « Lu » pour l'un et null /// pour l'autre. C'est voulu — le livre est commun, sa lecture ne l'est pas. /// public Statut? Statut { get; init; } /// Nombre de pages, ou null s'il n'a jamais été renseigné. /// ⚠️ Jamais 0 pour dire « inconnu » : l'interface ne l'affiche que renseigné. public int? NombrePages { get; init; } public string? CoverUrl { get; init; } public string? UrlNotice { get; init; } public required DateTime DateAjout { get; init; } /// /// Qui a saisi le livre. Information d'affichage, pas une frontière : /// la bibliothèque est commune et aucune lecture ne filtre sur ce champ. /// public string? AjoutePar { get; init; } /// /// Nom de la personne qui a le livre en ce moment, ou null s'il est à la maison. /// /// /// Commun à tout le foyer, contrairement au statut de lecture : un livre absent l'est /// pour tout le monde. Renseigné depuis le prêt ouvert du livre — il ne peut y en avoir qu'un. /// public string? PreteA { get; init; } /// Date du prêt en cours, s'il y en a un. public DateTime? PreteDepuis { get; init; } [JsonIgnore] public bool EstPrete => PreteA is not null; /// Auteurs sur une ligne, pour un affichage compact. [JsonIgnore] public string? AuteursAffiches => Auteurs.Count == 0 ? null : string.Join(", ", Auteurs.Select(a => a.Nom)); }