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:
Mathieu Limonier
2026-08-22 22:36:16 +02:00
co-authored by Claude Opus 5
commit 6a6d745af4
207 changed files with 35543 additions and 0 deletions
+70
View File
@@ -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;
}
}