using System.Text.Json.Serialization; using MaBibli.Shared.Textes; namespace MaBibli.Shared.Dtos; /// /// Une revue et les numéros qu'on en possède. /// /// /// Comme pour les séries, une seule lecture rend tout : la liste des revues sert aussi /// le détail de chacune, ce qui donne un unique instantané hors-ligne à tenir à jour. /// public record RevueDto { public required int Id { get; init; } public required string Titre { get; init; } /// ISSN à tiret, quand il est connu. Identifiant de la revue, jamais un ISBN. public string? Issn { get; init; } public string? Editeur { get; init; } public string? AjoutePar { get; init; } /// Numéros possédés, du plus récent au plus ancien. public IReadOnlyList Numeros { get; init; } = []; } /// Un numéro possédé. Recensé seulement : ni prêt, ni statut de lecture. public record NumeroRevueDto { public required int Id { get; init; } public required string Numero { get; init; } public DateTime? DateParution { get; init; } public string? Note { get; init; } /// Couverture du numéro, quand une URL a été collée. Aucune source ne la fournit. public string? CoverUrl { get; init; } /// Articles annoncés à la une, dans l'ordre de saisie. public IReadOnlyList Articles { get; init; } = []; } /// Charge utile de création ou de modification d'une revue. public record EnregistrementRevue { public string Titre { get; set; } = string.Empty; public string? Issn { get; set; } public string? Editeur { get; set; } } /// Charge utile d'ajout ou de modification d'un numéro. public record AjoutNumeroRevue { /// Obligatoire : deux numéros sans numéro seraient indiscernables. public string Numero { get; set; } = string.Empty; public DateTime? DateParution { get; set; } public string? Note { get; set; } /// /// URL d'une image de couverture. Aucune source ne peut la fournir — l'ISSN désigne /// la revue, pas la parution : elle est collée à la main, ou absente. /// public string? CoverUrl { get; set; } /// Articles à la une, dans l'ordre de la couverture. public List Articles { get; set; } = []; /// /// Vue « une seule ligne » des , pour un champ de saisie simple. /// /// /// ⚠️ Séparateur : le point-virgule seul, contrairement aux thèmes d'un livre. Un /// titre d'article contient souvent une virgule (« Ukraine, deux ans après »), qui le /// couperait en deux. /// [JsonIgnore] public string? ArticlesTexte { get => Articles.Count == 0 ? null : ListeSaisie.Joindre(Articles); set => Articles = ListeSaisie.Decouper(value, virguleAussi: false); } }