4.4 KiB
4.4 KiB
Awards en BDD — Design Spec
Contexte
Actuellement, les récompenses des acteurs sont récupérées à la volée depuis Wikidata (SPARQL) lors de la génération d'une partie. Elles ne sont pas persistées en base de données, ce qui rend le système fragile (dépendance réseau à chaque partie) et empêche tout filtrage par type de récompense.
Objectifs
- Stocker les awards en BDD dès l'import des films
- Introduire une notion de type de récompense (Oscar, Golden Globe, BAFTA...)
- Adapter la génération des indices pour piocher en BDD au lieu d'appeler Wikidata
- Préparer le terrain pour un futur filtrage par type (choix du joueur avant la partie) — hors scope de cette itération
Modèle de données
Nouvelle entité : AwardType
| Champ | Type | Description |
|---|---|---|
id |
int (PK) | Auto-increment |
name |
string | Nom affiché, ex: "Oscar", "Golden Globe", "BAFTA", "César" |
pattern |
string | Préfixe/mot-clé pour le matching sur les noms Wikidata, ex: "Academy Award" |
Nouvelle entité : Award
| Champ | Type | Description |
|---|---|---|
id |
int (PK) | Auto-increment |
awardType |
ManyToOne → AwardType | Type de la récompense |
actor |
ManyToOne → Actor | Acteur récompensé |
name |
string | Nom complet Wikidata, ex: "Academy Award for Best Actor" |
year |
int (nullable) | Année de la récompense |
Modification entité Actor
| Champ | Type | Description |
|---|---|---|
awardsImported |
bool | false par défaut. Passe à true après import. |
Relations
ActorOneToMany →AwardAwardTypeOneToMany →Award
Flux d'import des awards
L'import se greffe sur le batch existant (ImportFilmsBatchMessageHandler), après ActorSyncer::syncActorsForMovie().
Étapes pour chaque acteur du film importé
- Vérifier
actor.awardsImported - Si
true→ skip - Si
false→ appelerWikidataGateway::getAwards(actor) - Pour chaque award retourné :
- Parcourir les
AwardTypeexistants et matcher le nom de l'award contre leurpattern - Si un
AwardTypematche → l'utiliser - Si aucun ne matche → créer un nouvel
AwardTypedynamiquement en extrayant le préfixe commun du nom (ex: "Screen Actors Guild Award for Outstanding Performance..." → type "Screen Actors Guild Award") - Créer l'entité
Award(name, year, actor, awardType)
- Parcourir les
- Passer
actor.awardsImported = true - Flush
Gestion d'erreur
Si Wikidata est indisponible ou retourne une erreur :
- Ne pas mettre
awardsImported = true - L'import du film continue normalement (les awards seront retentés au prochain import contenant cet acteur)
- Log de l'erreur
Génération des indices (hints)
Changements dans GameGridGenerator
Avant : appel à WikidataGateway::getAwards() à la volée pour chaque acteur du grid.
Après :
- Pour un hint de type "award", requêter les
Awarden BDD pour l'acteur - Si l'acteur a des awards → en choisir un au hasard
- Si l'acteur n'a pas d'awards → fallback sur les types "film" ou "character" (comportement existant quand Wikidata échouait)
Stockage du hint
GameRow.hintDatastocke l'ID de l'Award(au lieu d'une string brute comme avant)resolveHintText()récupère le nom complet + année depuis l'entitéAward
Pas de filtrage par AwardType
Pour cette itération, on pioche dans tous les awards de l'acteur sans filtrer par type. Le filtrage (choix du joueur : "mode Oscars", "mode Golden Globes"...) sera ajouté ultérieurement.
Hors scope
- UI de choix du type de récompense avant la partie
- Filtrage des awards par type lors de la génération des indices
- Commande de re-sync des awards pour les acteurs déjà importés