Files
crowdlending-app/backend/diag.mjs
T
Olivier CROGUENNEC 48ed7fe65e Initial commit
2026-06-13 14:57:15 +02:00

73 lines
3.2 KiB
JavaScript

/**
* Diagnostic rapide de la base de données crowdlending
* Exécuter depuis D:\dev\crowdlending-app\backend :
* node diag.mjs
*/
import Database from 'better-sqlite3';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const DB_PATH = path.resolve(__dirname, 'data/crowdlending.db');
const db = new Database(DB_PATH, { readonly: true });
console.log('\n=== COMPTES PAR TABLE ===');
for (const t of ['users','investisseurs','investissements','plateformes','remboursements','simul_remboursements','depots_retraits','investissement_historique']) {
try {
const n = db.prepare(`SELECT COUNT(*) AS n FROM "${t}"`).get().n;
console.log(` ${t.padEnd(30)} ${n} lignes`);
} catch (e) {
console.log(` ${t.padEnd(30)} ERREUR: ${e.message}`);
}
}
console.log('\n=== TABLES __repair_* RESTANTES ===');
const repairTables = db.prepare("SELECT name FROM sqlite_master WHERE name LIKE '__repair_%'").all();
if (repairTables.length === 0) console.log(' (aucune)');
else repairTables.forEach(r => console.log(` ${r.name}`));
console.log('\n=== USERS ===');
db.prepare('SELECT id, email FROM users').all().forEach(r =>
console.log(` user id=${r.id} email=${r.email}`)
);
console.log('\n=== INVESTISSEURS ===');
db.prepare('SELECT id, nom, user_id FROM investisseurs').all().forEach(r =>
console.log(` investisseur id=${r.id} nom="${r.nom}" user_id=${r.user_id}`)
);
console.log('\n=== INVESTISSEMENTS (5 premiers) ===');
const invs = db.prepare('SELECT id, nom_projet, investisseur_id, statut FROM investissements LIMIT 5').all();
if (invs.length === 0) console.log(' (TABLE VIDE!)');
else invs.forEach(r =>
console.log(` inv id=${r.id} investisseur_id=${r.investisseur_id} statut=${r.statut} projet="${r.nom_projet}"`)
);
console.log('\n=== VÉRIFICATION FK investissements → investisseurs ===');
const broken = db.prepare(`
SELECT COUNT(*) AS n FROM investissements i
WHERE NOT EXISTS (SELECT 1 FROM investisseurs v WHERE v.id = i.investisseur_id)
`).get().n;
console.log(broken === 0 ? ' OK (pas de FK cassée)' : ` ⚠️ ${broken} investissements avec investisseur_id introuvable!`);
console.log('\n=== VÉRIFICATION FK remboursements → investissements ===');
const broken2 = db.prepare(`
SELECT COUNT(*) AS n FROM remboursements r
WHERE NOT EXISTS (SELECT 1 FROM investissements i WHERE i.id = r.investissement_id)
`).get().n;
console.log(broken2 === 0 ? ' OK' : ` ⚠️ ${broken2} remboursements avec investissement_id introuvable!`);
console.log('\n=== CHECK CONSTRAINT de investissements ===');
const schemaInv = db.prepare("SELECT sql FROM sqlite_master WHERE type='table' AND name='investissements'").get()?.sql ?? '';
const checkLine = schemaInv.split('\n').find(l => l.includes('statut') && l.includes('CHECK'));
console.log(' ', checkLine?.trim() ?? '(non trouvé)');
console.log('\n=== RÉFÉRENCES _investissements_old RESTANTES ===');
const refs = db.prepare("SELECT type, name FROM sqlite_master WHERE sql LIKE '%_investissements_old%'").all();
if (refs.length === 0) console.log(' (aucune) ✓');
else refs.forEach(r => console.log(` [${r.type}] ${r.name}`));
db.close();
console.log('\nDiagnostic terminé.\n');