Signaler les doublons à l'ajout d'un livre, sans jamais les refuser
Rien n'empêchait de rescanner un livre déjà catalogué. Plutôt qu'un index unique — qui interdirait le second exemplaire, cas parfaitement légitime — la création répond 409 avec les fiches semblables, et « confirmerDoublon » enregistre la même saisie. Deux critères, dont aucun n'est une clé : ISBN identique, ou clé d'œuvre et auteur communs. La clé d'œuvre étant un préfixe de TitreNormalise, SQL dégrossit sur la colonne indexée et l'égalité exacte se vérifie ensuite en mémoire. Vérifié en exécution : avertissement, retour au formulaire intact, et ajout confirmé créant bien un second exemplaire. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -69,21 +69,36 @@ public static class LivresEndpoints
|
||||
|
||||
groupe.MapPost("/", async (
|
||||
EnregistrementLivre saisie,
|
||||
bool? confirmerDoublon,
|
||||
IServiceCatalogue service,
|
||||
IFournisseurUtilisateur utilisateurs,
|
||||
CancellationToken ct) =>
|
||||
{
|
||||
// AjoutePar vient du serveur, pas de la charge utile.
|
||||
var utilisateur = utilisateurs.Obtenir();
|
||||
var resultat = await service.CreerAsync(saisie, utilisateur.Identifiant, ct);
|
||||
var resultat = await service.CreerAsync(
|
||||
saisie, utilisateur.Identifiant, confirmerDoublon ?? false, ct);
|
||||
|
||||
return resultat.Erreur is not null
|
||||
? Results.BadRequest(new { erreur = resultat.Erreur })
|
||||
if (resultat.Erreur is not null)
|
||||
{
|
||||
return Results.BadRequest(new { erreur = resultat.Erreur });
|
||||
}
|
||||
|
||||
// 409 et non 400 : la saisie est valide, c'est le catalogue qui contient déjà
|
||||
// quelque chose de semblable. Le même appel avec « confirmerDoublon » aboutira.
|
||||
return resultat.Doublons is { } doublons
|
||||
? Results.Conflict(doublons)
|
||||
: Results.Created($"/api/livres/{resultat.Livre!.Id}", resultat.Livre);
|
||||
})
|
||||
.WithName("CreerLivre")
|
||||
.WithSummary("Ajoute un livre. « AjoutePar » est déterminé par le serveur.")
|
||||
.WithDescription(
|
||||
"Répond 409 quand le catalogue contient déjà un livre de même ISBN, ou de même "
|
||||
+ "titre et même auteur, en donnant les fiches en cause. Ce n'est pas un refus : "
|
||||
+ "posséder deux exemplaires est légitime, et « confirmerDoublon=true » "
|
||||
+ "enregistre la même saisie sans plus rien demander.")
|
||||
.Produces<LivreDto>(StatusCodes.Status201Created)
|
||||
.Produces<DoublonsLivre>(StatusCodes.Status409Conflict)
|
||||
.Produces(StatusCodes.Status400BadRequest);
|
||||
|
||||
groupe.MapPut("/{id:int}", async (
|
||||
|
||||
Reference in New Issue
Block a user