up
This commit is contained in:
@@ -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.
|
||||
Reference in New Issue
Block a user