using System.Text.Json.Serialization; namespace MaBibli.Shared.Dtos; /// /// Un prêt tel qu'exposé par l'API — en cours ou clos, la table gardant l'historique complet. /// /// /// Les champs Livre* recopient de quoi afficher le livre sans second appel : la vue /// « prêts en cours » liste des prêts, mais ce que l'utilisateur y cherche est le livre /// qui n'est plus à la maison. /// public record PretDto { public required int Id { get; init; } public required int LivreId { get; init; } /// Nom de l'emprunteur, texte libre : aucun lien avec les comptes YunoHost. public required string Emprunteur { get; init; } public required DateTime DatePret { get; init; } /// null tant que le livre n'a pas été rendu. public DateTime? DateRetour { get; init; } public string? LivreTitre { get; init; } /// Auteurs du livre sur une ligne, déjà mis en forme par le serveur. public string? LivreAuteurs { get; init; } public string? LivreCoverUrl { get; init; } [JsonIgnore] public bool EstEnCours => DateRetour is null; /// Nombre de jours écoulés depuis le départ du livre — ou durée totale s'il est rendu. [JsonIgnore] public int JoursEcoules => Math.Max(0, (int)((DateRetour ?? DateTime.UtcNow) - DatePret).TotalDays); } /// Charge utile d'un nouveau prêt. /// /// Le livre n'y figure pas : il vient de l'URL. On ne prête pas « un livre quelconque », on prête /// ce livre-ci, depuis sa fiche. /// public record EnregistrementPret { /// Obligatoire : un prêt sans emprunteur ne se retrouve pas. public string Emprunteur { get; set; } = string.Empty; /// /// Date du prêt en UTC. null = maintenant. /// /// /// Modifiable parce qu'on enregistre souvent un prêt après l'avoir fait — « tiens, /// Paul a mon Zola depuis Noël ». Une date future est en revanche refusée : elle ne /// correspondrait à rien de constatable. /// public DateTime? DatePret { get; set; } } /// Charge utile du retour d'un livre. public record RetourPret { /// Date du retour en UTC. null = maintenant. public DateTime? DateRetour { get; set; } }