- Journal des Mises à Jour
- Fonctionnalités Principales
- Index du Projet
- Base de Données
- Troubleshooting
connection.js: ouvre la connexionbetter-sqlite3vers le fichier pointé parDB_PATH, activePRAGMA foreign_keyset le modeWAL. Expose un proxy avec une méthodereconnect()utilisée après une restauration de sauvegarde (voirroutes/backup.routes.js).schema.sql: DDL complet (tables, contraintes, seed des genres par défaut), source de vérité appliquée parscripts/init-db.js.
db/
├── connection.js # Connexion partagée (singleton via proxy)
└── schema.sql # DDL + seed
Tables : families, consoles, games, game_platforms, screenshots, app_settings, genres, game_genres, game_platform_ownership_periods, console_ownership_periods, llm_settings (préférences uniquement, jamais de clé API), recommendations, recommendation_history.
Modèle multi-plateforme (depuis la refonte "plateformes multiples") : un jeu (games) est une fiche unique (titre, genres, note, notes, jaquette). Sa présence sur une ou plusieurs plateformes (PS5, Switch, Steam, Mobile...) est représentée par des lignes dans game_platforms — une relation many-to-many enrichie entre games et consoles, chaque ligne portant ses propres hours, completed, platform_type (Physique/Dématérialisé), dates et — pour les instances issues d'une synchronisation Steam — source='steam-sync', steam_appid, last_synced_at. consoles désigne donc toute plateforme de jeu, physique ou dématérialisée, pas seulement une console au sens strict. Les périodes de possession (game_platform_ownership_periods) sont rattachées à l'instance, pas au jeu global, car la date d'acquisition peut différer par support.
Différences notables par rapport à l'ancien schéma front-end :
games.cover_front/cover_backetscreenshots.image_pathstockent un chemin de fichier relatif (ex:covers/12_front.jpg) au lieu d'un data URL base64 inline.llm_settingsne contient plus de colonnesllm_api_key_*— les clés vivent dans les variables d'environnement du serveur.
Une base encore au format "1 jeu = 1 console" (héritage V1) est migrée automatiquement vers ce modèle par scripts/migrate-to-multi-platform.js, invoqué par scripts/init-db.js avant l'application du schéma. L'ancienne table game_ownership_periods est conservée sous le nom game_ownership_periods_deprecated (filet de sécurité, suppression différée).
Catalogue standard de familles/consoles : sur une base tout juste créée (table families vide), scripts/init-db.js pré-remplit automatiquement un catalogue de référence (Sony, Nintendo, Microsoft, SEGA, Atari, PC, Mobile, Web... avec leurs consoles respectives — voir scripts/default-catalog.js). Une base ayant déjà ses propres familles/consoles, même partiellement ou avec une formulation différente (ex: "Playstation 1" au lieu de "PlayStation"), n'est jamais modifiée par ce catalogue — aucun risque de doublon sur une installation existante.
console_ownership_periods porte aussi model et serial_number (nullable, optionnels) — utiles quand la même console a été revendue puis rachetée dans une variante différente (ex: PS5 standard puis PS5 Slim). Ajoutés par scripts/init-db.js via ALTER TABLE ADD COLUMN idempotent sur les bases créées avant leur introduction.
Les deux tables de périodes de possession (console_ownership_periods et game_platform_ownership_periods) portent aussi acquisition_type (nullable, valeurs libres côté application : achat, pret, location) — précise comment le jeu ou la console a été obtenu(e) sur cette période. Pas de contrainte CHECK en base pour rester tolérant si de nouvelles valeurs sont introduites côté UI sans migration de schéma.
Ces deux mêmes tables portent un jeu de colonnes identique, toutes nullables (NULL = non renseigné) :
| Colonne | Type | Rôle |
|---|---|---|
purchase_price |
REAL | Prix d'achat. 0 (obtenu gratuitement) reste distinct de NULL (non renseigné) |
purchase_from |
TEXT | Vendeur (nom libre) |
purchase_from_type |
TEXT | personne | grande_surface | magasin_specialise | autre |
sale_price |
REAL | Prix de revente |
sale_to |
TEXT | Acheteur (nom libre) |
sale_to_type |
TEXT | Mêmes valeurs que purchase_from_type |
purchase_notes |
TEXT | Champ libre (accessoires fournis, état, circonstances de l'achat...) |
Pourquoi sur les périodes et non sur consoles / game_platforms ? Une même console peut être achetée, revendue, puis rachetée : chaque période garde alors son propre prix, son propre vendeur et ses propres notes. Porter ces champs sur la console elle-même écraserait l'historique du premier achat à chaque rachat.
Les montants sont stockés en REAL (et non en centimes entiers) : sur une base personnelle, la lisibilité directe des valeurs en SQL prime sur la précision comptable au centime. Ces colonnes sont ajoutées aux bases antérieures par scripts/init-db.js (ALTER TABLE ADD COLUMN idempotent, comme model/serial_number/acquisition_type).
La normalisation des valeurs entrantes (prix négatif ou non numérique → NULL, texte vide → NULL, type d'interlocuteur hors liste → NULL) est centralisée dans backend/src/services/ownershipFinancials.js, partagé par les routes console et jeu+plateforme.
FOREIGN KEY constraint failed: vérifier que l'entité parente (console, jeu, genre) existe bien avant l'insertion — les contraintes FK sont actives (PRAGMA foreign_keys = ON).- Modifications non persistées après un
docker compose down: vérifier que le volume./bdd:/app/bddest bien monté dansdocker-compose.yml.