80 lines
2.8 KiB
JavaScript
80 lines
2.8 KiB
JavaScript
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;
|