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>
70 lines
2.4 KiB
C#
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; }
|
|
}
|