Files
Mathieu LimonierandClaude Opus 5 6a6d745af4 MaBibli 1.0.0
Gestion de bibliothèque personnelle auto-hébergée : catalogue, prêts,
scan de code-barres, consultation hors-ligne.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-22 22:36:16 +02:00

70 lines
2.4 KiB
C#

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