using MaBibli.Api.Services.Isbn; using MaBibli.Shared.Dtos; namespace MaBibli.Api.Endpoints; public static class IsbnEndpoints { /// /// Expose le lookup ISBN. Aucune écriture en base : cet endpoint pré-remplit un formulaire, /// il n'enregistre rien. /// 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() .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() .Produces(StatusCodes.Status400BadRequest); return routes; } }