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>
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user