Phase 2 : service de lookup ISBN en cascade BnF puis OpenLibrary
Recuperation des metadonnees d'un livre a partir de son ISBN, cote serveur uniquement (aucune interface, aucune persistance). Cascade : BnF en ISBN-13, puis BnF en ISBN-10 converti, puis OpenLibrary. La conversion 13 -> 10 est indispensable et non optionnelle : la BnF indexe l'ISBN tel qu'imprime, les ouvrages d'avant 2007 ne portent qu'un ISBN-10 et sont introuvables par l'EAN-13 que lit le scanner. Toutes les notices trouvees sont remontees (jusqu'a 5) : un meme ISBN peut correspondre a plusieurs reeditions, le choix revient a l'utilisateur. Le double appel /isbn puis /authors d'OpenLibrary est bien fait, avec repli sur l'oeuvre quand l'edition ne porte aucun auteur : c'est le bug de BookLogr (titre rempli, auteur vide) qu'il ne faut pas reproduire. La couverture vient toujours d'OpenLibrary, avec ?default=false pour obtenir un 404 plutot qu'une image placeholder. 87 tests xUnit, sur fixtures enregistrees : aucune dependance au reseau. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
namespace MaBibli.Shared.Dtos;
|
||||
|
||||
/// <summary>
|
||||
/// Résultat complet d'un lookup ISBN : la liste des candidats trouvés par la cascade
|
||||
/// BnF → OpenLibrary, plus de quoi expliquer à l'utilisateur ce qui s'est passé.
|
||||
/// </summary>
|
||||
public record ResultatLookupIsbn
|
||||
{
|
||||
/// <summary>ISBN normalisé tel que demandé (tirets et espaces retirés).</summary>
|
||||
public required string IsbnDemande { get; init; }
|
||||
|
||||
/// <summary>ISBN-10 dérivé, si la conversion était possible (préfixe <c>978</c> uniquement).</summary>
|
||||
public string? Isbn10 { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Tous les candidats trouvés, dans l'ordre de la cascade. Peut être vide.
|
||||
/// La sélection revient à l'utilisateur.
|
||||
/// </summary>
|
||||
public required IReadOnlyList<CandidatLivre> Candidats { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Messages non bloquants : source injoignable, réponse illisible…
|
||||
/// Une source en panne ne fait pas échouer la cascade, elle laisse une trace ici.
|
||||
/// </summary>
|
||||
public IReadOnlyList<string> Avertissements { get; init; } = [];
|
||||
}
|
||||
Reference in New Issue
Block a user