const Database = require('better-sqlite3'); const path = require('path'); const bcrypt = require('bcryptjs'); const dbDir = path.join(__dirname, '..', 'data'); const db = new Database(path.join(dbDir, 'charles.db')); db.pragma('journal_mode = WAL'); db.exec(` CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, name TEXT NOT NULL, role TEXT NOT NULL CHECK(role IN ('admin', 'client')) ); CREATE TABLE IF NOT EXISTS domains ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, company_name TEXT NOT NULL, parent_id INTEGER, sort_order INTEGER DEFAULT 0, has_cloud INTEGER DEFAULT 0, cloud_details TEXT DEFAULT '', has_website INTEGER DEFAULT 0, website_wordpress INTEGER DEFAULT 0, website_managed_by TEXT DEFAULT '', website_details TEXT DEFAULT '', has_emails INTEGER DEFAULT 0, email_count INTEGER DEFAULT 0, email_addresses TEXT DEFAULT '[]', has_team INTEGER DEFAULT 0, team_members TEXT DEFAULT '[]', notes TEXT DEFAULT '', monthly_price REAL DEFAULT 0, cloud_cost REAL DEFAULT 0, website_cost REAL DEFAULT 0, email_cost REAL DEFAULT 0, user_cost REAL DEFAULT 0, created_at TEXT DEFAULT (datetime('now')), updated_at TEXT DEFAULT (datetime('now')), FOREIGN KEY (parent_id) REFERENCES domains(id) ); `); // Migration: add cost columns if missing const columns = db.prepare('PRAGMA table_info(domains)').all().map(c => c.name); const addCostCol = (col) => { if (!columns.includes(col)) db.exec('ALTER TABLE domains ADD COLUMN ' + col + ' REAL DEFAULT 0'); }; addCostCol('cloud_cost'); addCostCol('website_cost'); addCostCol('email_cost'); addCostCol('user_cost'); const userCount = db.prepare('SELECT COUNT(*) as count FROM users').get().count; if (userCount === 0) { const insert = db.prepare('INSERT INTO users (username, password_hash, name, role) VALUES (?, ?, ?, ?)'); insert.run('pierre', bcrypt.hashSync('Charles2026!', 10), 'Pierre', 'admin'); insert.run('charles', bcrypt.hashSync('360partners!', 10), 'Charles', 'client'); } const domainCount = db.prepare('SELECT COUNT(*) as count FROM domains').get().count; if (domainCount === 0) { const insert = db.prepare('INSERT INTO domains (name, company_name, parent_id, sort_order) VALUES (?, ?, ?, ?)'); const result = insert.run('360-partners.fr', '360 Partners', null, 0); const pid = result.lastInsertRowid; insert.run('monsieur-edgar.fr', 'Monsieur Edgar', pid, 1); insert.run('monsieur-edgar.com', 'Monsieur Edgar', pid, 2); insert.run('qwarter.fr', 'Qwarter', pid, 3); insert.run('agenceredo.fr', 'Agence Redo', pid, 4); insert.run('hub-grade.com', 'HUB-GRADE', pid, 5); insert.run('momentz.online', 'MOMENTZ', pid, 6); insert.run('momentz.paris', 'MOMENTZ', pid, 7); } module.exports = db;