Format disait physique ou numérique, jamais roman ou BD. Trois valeurs seulement : une valeur s'ajoute sans migration, la renommer une fois posée sur des centaines de fiches, non. Le défaut est « non précisé », pas « roman » : les fiches existantes n'ont pas été saisies avec cette question en tête, et un AddColumn suffit justement parce que la valeur par défaut ne prétend rien. L'interface n'affiche donc que ce qui a été choisi, comme pour le format. Filtre ajouté aux DEUX implémentations, serveur et hors-ligne, avec quatre jeux de critères de plus dans le test qui les confronte. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
50 lines
2.0 KiB
C#
50 lines
2.0 KiB
C#
using MaBibli.Shared.Entites;
|
|
|
|
namespace MaBibli.Shared.Catalogue;
|
|
|
|
/// <summary>
|
|
/// Critères de consultation du catalogue.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// <b>Il n'existe volontairement aucun critère sur <c>AjoutePar</c>.</b> La bibliothèque est
|
|
/// commune à tout le foyer : filtrer les lectures sur ce champ serait un bug de conception.
|
|
/// L'absence de ce critère est l'endroit où l'invariant est le plus visible.
|
|
/// <para>
|
|
/// <see cref="Statut"/> n'est pas une exception : il filtre sur le statut de <b>l'appelant</b>,
|
|
/// que le serveur connaît par les en-têtes SSOwat. Le client ne désigne jamais de qui il parle.
|
|
/// </para>
|
|
/// </remarks>
|
|
public record CritereLivres
|
|
{
|
|
/// <summary>
|
|
/// Texte cherché dans le titre <i>ou</i> les auteurs. Insensible à la casse
|
|
/// <b>et aux accents</b> : « emile » trouve « Émile ».
|
|
/// </summary>
|
|
public string? Recherche { get; init; }
|
|
|
|
/// <summary>Physique ou numérique. <c>null</c> = les deux : le catalogue est unique.</summary>
|
|
public Format? Format { get; init; }
|
|
|
|
/// <summary>
|
|
/// Roman, bande dessinée… <c>null</c> = tous.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// <c>TypeDocument.NonPrecise</c> <b>est</b> une valeur filtrable : « ce que je n'ai pas
|
|
/// encore rangé » est justement la question qu'on se pose après avoir introduit ce champ.
|
|
/// C'est ce qui la distingue du statut de lecture, dont l'absence n'est pas une valeur.
|
|
/// </remarks>
|
|
public TypeDocument? TypeDocument { get; init; }
|
|
|
|
/// <summary>
|
|
/// Statut de lecture de l'utilisateur courant. <c>null</c> = tous.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Un livre sans statut pour cette personne ne remonte sous <b>aucune</b> valeur : « non
|
|
/// commencé » n'est pas un statut, c'est l'absence de statut. Il reste visible sans filtre.
|
|
/// </remarks>
|
|
public Statut? Statut { get; init; }
|
|
|
|
/// <summary>Ne garder que les livres d'un auteur — le « cliquer sur un auteur » d'IDEES.md.</summary>
|
|
public int? AuteurId { get; init; }
|
|
}
|