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>
41 lines
1.7 KiB
C#
41 lines
1.7 KiB
C#
using MaBibli.Api.Services.Couvertures;
|
|
|
|
namespace MaBibli.Api.Endpoints;
|
|
|
|
public static class CouverturesEndpoints
|
|
{
|
|
/// <summary>
|
|
/// Relais d'images de couverture, pour la mise en cache hors-ligne.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// ⚠️ <b>Tout refus répond 404</b>, qu'il s'agisse d'une URL inconnue de la base, d'un schéma
|
|
/// interdit, d'une adresse non routable ou d'un hôte injoignable. Distinguer ces cas ferait du
|
|
/// point d'entrée un oracle : on y lirait quelles URL l'application connaît, et quelles
|
|
/// adresses répondent depuis le serveur. Voir <see cref="ServiceCouvertures"/>.
|
|
/// </remarks>
|
|
public static IEndpointRouteBuilder MapCouverturesEndpoints(this IEndpointRouteBuilder routes)
|
|
{
|
|
routes.MapGet("/api/couvertures", async (
|
|
string? url,
|
|
IServiceCouvertures service,
|
|
CancellationToken ct) =>
|
|
{
|
|
var resultat = await service.ObtenirAsync(url, ct);
|
|
|
|
return resultat.Trouvee
|
|
? Results.File(resultat.Octets!, resultat.TypeContenu!)
|
|
: Results.NotFound();
|
|
})
|
|
.WithName("RelayerCouverture")
|
|
.WithTags("Couvertures")
|
|
.WithSummary("Relaie une couverture déjà enregistrée, en même origine.")
|
|
// ⚠️ Pas de `contentType` ici : il varie avec l'image (image/jpeg, image/png…), et
|
|
// l'annotation OpenAPI REFUSE les jokers — « image/* » fait échouer le démarrage du
|
|
// serveur, pas la compilation. Constaté en exécution.
|
|
.Produces(StatusCodes.Status200OK)
|
|
.Produces(StatusCodes.Status404NotFound);
|
|
|
|
return routes;
|
|
}
|
|
}
|