73 lines
3.2 KiB
JavaScript
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');
|