Signaler les envies déjà entrées au catalogue, sans les supprimer

La demande initiale était de retirer l'envie ; c'est refusé. Le catalogue
est commun et la liste d'envies personnelle : supprimer modifierait la
liste d'un autre en silence, avec sa note. Et le rapprochement par clé
d'œuvre est faillible, alors qu'une suppression ne se rattrape pas.

L'étiquette « Déjà au catalogue » mène à la fiche, pour vérifier avant de
retirer. Le critère est celui des doublons, la convention d'auteur commun
étant désormais partagée par les deux (RapprochementAuteurs).

Au passage : accolade manquante sur .etiquette-souhaite, qui avalait la
règle suivante — le bandeau de mise à jour perdait son style.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mathieu
2026-08-19 21:30:55 +02:00
co-authored by Claude Opus 5
parent 383ed43227
commit a49125ddc3
9 changed files with 301 additions and 42 deletions
+44
View File
@@ -1049,6 +1049,50 @@ ISBN est connu, y compris pour les résultats d'une recherche par titre (l'ISBN
vignette retombe sur son substitut à initiale. Décidé de **ne pas** offrir de champ « URL de
couverture » : il inviterait à coller des liens morts pour un gain nul.
## Une envie déjà au catalogue est signalée, jamais supprimée (2026-08-19)
Demande d'origine : quand un livre souhaité entre au catalogue, retirer l'envie correspondante.
**Décidé : on signale.** `SouhaitDto.Possede` / `LivreId` portent le rapprochement, et l'écran
des envies affiche une étiquette « Déjà au catalogue » **cliquable vers la fiche**.
Deux raisons, dont la première est structurelle :
- **le catalogue est commun, la liste d'envies personnelle.** L'envie n'est pas forcément celle
de la personne qui a saisi le livre : la supprimer modifierait la liste d'un autre en silence,
et lui ferait perdre sa note (« demandé à Noël »). L'API ne sait pas — délibérément — écrire
dans la liste d'autrui, et lui ouvrir cette porte percerait un invariant tenu partout ailleurs ;
- **le rapprochement est faillible** (`CleOeuvre` : titre retraduit, tome, intégrale). Une
suppression fondée sur un rapprochement faux est irréversible ; un signalement se corrige d'un
coup d'œil — d'où l'étiquette qui **mène à la fiche**, pour vérifier avant de retirer.
C'est la même règle que le grisage de la bibliographie, dans l'autre sens : on **marque**, on ne
masque ni ne supprime jamais une ligne.
### Le critère est celui des doublons, et c'est voulu
ISBN identique (il tranche seul, désignant une édition précise), sinon même clé d'œuvre **et**
un auteur commun. La convention « deux jeux de noms tous deux vides concordent » vit désormais
en un seul endroit, `RapprochementAuteurs.PartagentUnAuteur`, partagée avec la détection de
doublons du catalogue — deux règles voisines qui divergeraient en silence seraient pires qu'une
règle imparfaite.
⚠️ `LivreSouhaite.TitreNormalise` **est déjà** la clé d'œuvre (voir l'entité) : rien à
recalculer de ce côté, contrairement au catalogue dont `TitreNormalise` garde le titre entier.
⚠️ **Le catalogue est chargé en entier** (projection minimale) pour ce rapprochement. Assumé à
l'échelle d'un foyer, et cohérent avec l'instantané hors-ligne qui l'emporte déjà tout entier
dans le navigateur. Le jour où la bibliothèque compterait des milliers de fiches, c'est là qu'il
faudrait dégrossir en SQL — pas renoncer au signalement.
⚠️ Piège rencontré, et pris par les tests seuls : `GetValueOrDefault` sur un
`Dictionary<int, int>` rend **zéro**, pas `null`. Toute envie se disait donc possédée, en
pointant vers un livre inexistant. Le compilateur ne pouvait rien dire — `0` est un `int`
parfaitement valide.
**Ce qui n'est délibérément pas fait** : les exports `.txt` et `.csv` ne portent pas la mention.
Ce sont des instantanés qu'on emporte, alors que le signalement appelle une action — vérifier,
puis retirer — qui a lieu dans l'application.
## Bibliographie par auteur — SRU BnF, validé le 2026-08-18
Le déclencheur décrit dans IDEES.md : depuis un auteur déjà présent, voir tout ce qu'il a écrit,