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
+15
View File
@@ -29,6 +29,21 @@ public record SouhaitDto
public string? Note { get; init; }
public required DateTime DateAjout { get; init; }
/// <summary>
/// Vrai si un livre du catalogue correspond à cette envie.
/// </summary>
/// <remarks>
/// <b>C'est un signalement, jamais une suppression.</b> Le catalogue est commun, la liste
/// d'envies personnelle : retirer l'envie de quelqu'un d'autre modifierait sa liste en
/// silence et lui ferait perdre sa note (« demandé à Noël »). Le rapprochement est en outre
/// faillible (voir <c>CleOeuvre</c>) — un signalement erroné s'ignore d'un coup d'œil, une
/// suppression erronée ne se rattrape pas.
/// </remarks>
public bool Possede { get; init; }
/// <summary>Le livre du catalogue en cause, s'il y en a un : de quoi ouvrir sa fiche.</summary>
public int? LivreId { get; init; }
}
/// <summary>Charge utile d'ajout d'une envie.</summary>
@@ -90,6 +90,33 @@ public static class RapprochementAuteurs
public static bool SontLeMemeAuteur(string? a, string? b) =>
Comparer(a, b) == NiveauRapprochement.Certain;
/// <summary>
/// Deux jeux de noms ont-ils au moins un auteur en commun ?
/// </summary>
/// <remarks>
/// Sert partout où l'on rapproche deux fiches par leur titre : le titre seul ne suffit
/// jamais — deux recueils « Nouvelles » sans rapport se confondraient — mais un auteur
/// commun tranche.
/// <para>
/// <b>Convention</b> : deux jeux <b>tous deux vides</b> concordent. Le titre est alors la
/// seule information disponible des deux côtés, et exiger un auteur reviendrait à ne jamais
/// rien rapprocher. Un jeu vide face à un jeu renseigné, en revanche, ne concorde pas :
/// l'information manque d'un seul côté, ce qui n'est pas une raison de conclure.
/// </para>
/// </remarks>
public static bool PartagentUnAuteur(IEnumerable<string?> a, IEnumerable<string?> b)
{
var gauche = a.Where(n => !string.IsNullOrWhiteSpace(n)).ToList();
var droite = b.Where(n => !string.IsNullOrWhiteSpace(n)).ToList();
if (gauche.Count == 0 && droite.Count == 0)
{
return true;
}
return gauche.Any(g => droite.Any(d => SontLeMemeAuteur(g, d)));
}
/// <summary>
/// Cherche à placer chaque mot de <paramref name="aPlacer"/> sur un mot distinct de
/// <paramref name="cible"/>, par égalité ou par initiale.