diff --git a/todo.txt b/todo.txt new file mode 100644 index 0000000..d88c74c --- /dev/null +++ b/todo.txt @@ -0,0 +1,107 @@ +REVIEW DE CODE — 2026-04-26 +============================================ + +Outil CLI one-shot pour synchroniser la BDD `dvf` (Demandes de +Valeurs Foncieres, donnees publiques data.gouv.fr) avec une table +MySQL. 2 scripts (parse.js 70 lignes, sync.js 155 lignes) + lib/ +dotenv. Pas de service Docker, lance manuellement. + +Le dossier contient ~4 Go de data CSV/GZ telechargees (gitignored). +Probablement utilise par flatbay pour les estimations immobilieres. + +SECURITE +-------- +[ ] sync.js : fetch sans verification d'integrite + sync.js:51 : `const res = await fetch(url)`. Pas de check du + sha256 du fichier. data.gouv.fr est trusted, mais MITM ou + DNS hijack pourrait empoisonner les imports. Risque + theorique pour une source publique. + +BUGS / FRAGILITE +---------------- +[ ] parse.js : code mort — INSERT commente + parse.js:37-40 : + // connection.query(sql, (error, results) => { + // if (error) throw error; + // console.log('Inserted rows:', results.affectedRows); + // }); + Le script ne fait que `console.log(sql)`. Donc parse.js ne + fonctionne PAS, il print juste le SQL. Soit reactiver le + query, soit delete tout le fichier (sync.js le remplace). + +[ ] parse.js et sync.js : 2 scripts qui font le meme job + parse.js : ancienne version pour CSV brut DVF. Charge un seul + fichier en parametre, gere CSV avec delimiteur `|` ou `,` selon + extension. + sync.js : version moderne pour geodvf, telecharge auto + + insertion batch via prepared statements. + A consolider en un seul script. + +[ ] sync.js : pas de reprise sur erreur + sync.js:43-58 (downloadYear) : si la connexion casse au milieu + d'un download de plusieurs Go, le fichier .gz est partiel mais + `fs.existsSync` ligne 45 retourne true => skip le re-download. + Erreur silencieuse au parse. A check la taille ou utiliser + `.tmp` puis rename atomique. + +[ ] sync.js : pas de DELETE/REPLACE pour les annees deja en BDD + sync.js:131 : `missing = serverYears.filter(y => !dbYears. + includes(y))`. Ne re-importe pas. Mais si les donnees d'une + annee sont mises a jour cote source (ex: 2024 corrige), pas + de mecanisme pour rafraichir. A faire un mode `--force` ou + upsert. + +[ ] sync.js : forceYear traite seulement + sync.js:131-135 : `forceYear` ecrase le filter des manquantes, + importe une annee specifique. Mais ne supprime pas les rows + existantes => duplicates en BDD. Bug si execute 2 fois pour + la meme annee. + +[ ] sync.js : `process.argv[2]` pour forceYear + sync.js:119. Pas de yargs ou argument parser. Fragile (pas + d'aide, pas de validation). Cf scripts/assistant/release.js + dans check/ qui utilise yargs. + +[ ] sync.js : `inserted % 100_000 < BATCH_SIZE` modulo log progress + sync.js:76 : `if (inserted % 100_000 < BATCH_SIZE)`. Si BATCH_SIZE + ne divise pas exactement 100_000, le log peut etre saute ou + duplique. Edge case mineur. + +[ ] parse.js : fragile sur extensions multiples + parse.js:13 : `const delimiter = (file.match(/\\.gz$/)) ? ',' : + '|';`. Si le fichier est `2025.full.csv` (sans .gz), utilise + `|`. Si c'est un fichier geodvf .csv sans .gz, faux delimiteur. + A baser sur le contenu (autodetection). + +[ ] sync.js : connection.end() jamais en cas d'erreur + sync.js:139, 152 : end() appele sur les paths ok/done. Si une + exception throw entre-temps, connection reste ouverte. A + passer en try/finally. + +[ ] columns : Object.keys(record).map(col => `\`${col}\``) + sync.js:89. Si le nom de colonne contient un backtick (peu + probable cote data.gouv), escape cassé. A passer en + `connection.escapeId(col)` (utilise dans parse.js:53). + +[ ] geodvf/sample.json + A verifier le contenu. + +CODE MORT / POLLUTION +--------------------- +[ ] parse.js : 70 lignes inutiles (INSERT commente) + A delete et garder uniquement sync.js. + +[ ] README.md : 30+ lignes de curl manuels + Inutile depuis sync.js qui fait le download auto. A simplifier. + +[ ] Pas de tests + Pas de test/. Pas de lib/ pure. sync.js a une logique non- + triviale (parse + batch + flush + final), merite des tests + sur la decoupe en batches au moins. + +CONVENTIONS +----------- +[ ] Mauvaise pratique : parse.js fait du concat avec escape + parse.js:32 : `batch.map(row => '(' + row.map(val => connection. + escape(val)).join(', ') + ')')`. Theoriquement OK avec escape, + mais prepared statements sont preferes. A migrer ou delete.