Skip to content

feat: extend card-patch system with name/subTypes fields + backfill u… - #76

Open
julesduroux wants to merge 1 commit into
mainfrom
feature/patch-system-name-subtypes
Open

julesduroux wants to merge 1 commit into
mainfrom
feature/patch-system-name-subtypes

Conversation

@julesduroux

Copy link
Copy Markdown
Contributor

1. Extension du patch system

CardPatchValidator/CardPatchService ne géraient que des champs scalaires
(Card) et des booléens (CardGroup). Ajout de deux catégories :

  • name (localisé) : objet {locale: texte}, routé vers CardTranslation,
    référence exacte uniquement (chaque exemplaire a sa propre traduction).
  • subTypes (liste) : remplacement complet du tableau de sous-types, routé
    vers CardGroup, référence exacte ou wildcard. CardGroup::removeSubType()
    n'existait pas encore, ajouté pour permettre ce remplacement.

Inclut le seul correctif subTypes confirmé (4 imprimés : famille COREKS
AX_28, EOLE LY_108_R2).

2. Backfill des noms des cartes uniques (migration)

En auditant les écarts CardsData vs Equinox, on a découvert que les cartes
uniques sont importées depuis leur propre JSON Equinox par exemplaire, et
que pour un certain nombre de familles ce JSON porte un nom erroné dans
certaines langues (texte anglais qui a fuité dans le mauvais champ de
langue) — alors que la carte commune/rare partageant le même couple
faction+numéro (le même personnage dans l'univers du jeu) a déjà la bonne
traduction.

Vérifié sur l'intégralité du référentiel CardsData (3 469 impressions
non-uniques + 5,4M impressions uniques) : un couple (faction, numéro) ne
pointe jamais vers plus d'une famille, ni entre sets, ni entre unique/non-
unique — le rapprochement par ce seul couple est donc fiable, sans risque de
collision.

La migration (Version20260911180000) réaffecte le nom de chaque carte/
groupe unique depuis sa commune, famille par famille (une transaction
par famille via une procédure PL/pgSQL temporaire) plutôt qu'un seul gros
UPDATE — certaines familles dépassent 10 000 exemplaires sérialisés, un
UPDATE global aurait verrouillé la table card_translation trop longtemps.

⚠️ Non réversible (les anciennes valeurs erronées ne sont conservées nulle
part) — recommandé de tester le dry-run/l'effet sur un échantillon avant
déploiement en prod, je n'ai pas pu le valider en conditions réelles faute
de temps sur cette itération.

À exécuter après merge

php bin/console app:meilisearch:index --fields=variation # si pas déjà fait en Phase 2
php bin/console app:cards:apply-patches --dry-run
php bin/console app:cards:apply-patches

…nique names from their family

CardPatchValidator/CardPatchService only supported scalar Card fields
and boolean CardGroup flags. Adds two more field categories needed to
fix the real discrepancies found while auditing CardsData vs Equinox:

- LOCALIZED_CARD_FIELDS ("name"): an object {locale: text}, routed to
  Card's own CardTranslation, exact reference only.
- LIST_CARD_GROUP_FIELDS ("subTypes"): a full-replacement array of
  references, routed to CardGroup, exact or wildcard reference.
  CardGroup::removeSubType() didn't exist yet, needed for the replace.

Includes the one confirmed subTypes correction (4 prints: COREKS
AX_28 family, EOLE LY_108_R2).

Separately: a broad backfill migration for unique card names. Unique
prints are imported from their own per-instance Equinox JSON, and for
a number of families that JSON carries a wrong/English-leaked name in
some locales - while the non-unique printing sharing the same
faction+number slot (same in-universe character) already has the
correct translation. Verified against CardsData's full referential
that a (faction, number) pair never maps to more than one card family,
across sets or between unique/non-unique, so matching purely on that
pair is safe. Runs family by family (own transaction each, via a
temporary PL/pgSQL procedure) rather than one bulk UPDATE, since some
families have 10k+ serialized instances.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant