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>
71 lines
2.9 KiB
C#
71 lines
2.9 KiB
C#
using MaBibli.Api.Services.Isbn;
|
|
using MaBibli.Shared.Dtos;
|
|
|
|
namespace MaBibli.Api.Endpoints;
|
|
|
|
public static class IsbnEndpoints
|
|
{
|
|
/// <summary>
|
|
/// Expose le lookup ISBN. Aucune écriture en base : cet endpoint pré-remplit un formulaire,
|
|
/// il n'enregistre rien.
|
|
/// </summary>
|
|
public static IEndpointRouteBuilder MapIsbnEndpoints(this IEndpointRouteBuilder routes)
|
|
{
|
|
var groupe = routes.MapGroup("/api/isbn").WithTags("ISBN");
|
|
|
|
groupe.MapGet("/{isbn}", async (
|
|
string isbn,
|
|
IIsbnLookupService service,
|
|
CancellationToken ct) =>
|
|
{
|
|
var resultat = await service.RechercherAsync(isbn, ct);
|
|
|
|
return resultat is null
|
|
? Results.BadRequest(new { erreur = $"« {isbn} » n'est pas un ISBN valide." })
|
|
: Results.Ok(resultat);
|
|
})
|
|
.WithName("RechercherIsbn")
|
|
.WithSummary("Cherche les notices correspondant à un ISBN (cascade BnF → OpenLibrary).")
|
|
.WithDescription(
|
|
"Renvoie TOUS les candidats trouvés (jusqu'à 5) : un même ISBN peut correspondre à "
|
|
+ "plusieurs rééditions. Le choix revient à l'utilisateur.")
|
|
.Produces<ResultatLookupIsbn>()
|
|
.Produces(StatusCodes.Status400BadRequest);
|
|
|
|
// Recherche par titre : on ne connaît pas toujours l'ISBN d'un livre qu'on souhaite —
|
|
// c'est même le cas normal, puisqu'on ne l'a pas en main. Hors du groupe /api/isbn,
|
|
// qui parle d'un code-barres, alors qu'ici on part de mots.
|
|
routes.MapGet("/api/notices", async (
|
|
string? titre,
|
|
string? auteur,
|
|
IBnfClient bnf,
|
|
CancellationToken ct) =>
|
|
{
|
|
if (string.IsNullOrWhiteSpace(titre))
|
|
{
|
|
return Results.BadRequest(new { erreur = "Indiquez au moins un titre à chercher." });
|
|
}
|
|
|
|
var (candidats, avertissement) = await bnf.RechercherParTitreAsync(titre, auteur, ct);
|
|
|
|
return Results.Ok(new ResultatLookupIsbn
|
|
{
|
|
IsbnDemande = string.Empty,
|
|
Candidats = candidats,
|
|
Avertissements = avertissement is null ? [] : [avertissement],
|
|
});
|
|
})
|
|
.WithTags("ISBN")
|
|
.WithName("RechercherNotices")
|
|
.WithSummary("Cherche des notices BnF par titre, éventuellement restreint à un auteur.")
|
|
.WithDescription(
|
|
"Les notices qui ne décrivent pas un livre (film, disque, jeu) sont écartées. "
|
|
+ "L'auteur n'est PAS post-filtré : le choix revient à l'utilisateur, qui voit "
|
|
+ "les auteurs de chaque notice.")
|
|
.Produces<ResultatLookupIsbn>()
|
|
.Produces(StatusCodes.Status400BadRequest);
|
|
|
|
return routes;
|
|
}
|
|
}
|