2025-07-18 04:13:46 +00:00
|
|
|
|
2025-07-17 11:12:35 +00:00
|
|
|
import Database from 'better-sqlite3';
|
|
|
|
|
|
|
|
|
|
// Use a file-based database in development
|
|
|
|
|
const db = new Database('local.db');
|
2025-09-01 06:34:12 +00:00
|
|
|
db.pragma('journal_mode = WAL');
|
2025-07-17 11:12:35 +00:00
|
|
|
|
2025-07-18 04:52:21 +00:00
|
|
|
// --- SCHEMA CREATION ---
|
2025-09-01 06:34:12 +00:00
|
|
|
// Auth.js tables
|
2025-07-17 11:12:35 +00:00
|
|
|
db.exec(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS users (
|
2025-09-01 06:34:12 +00:00
|
|
|
id TEXT PRIMARY KEY,
|
|
|
|
|
name TEXT,
|
|
|
|
|
email TEXT UNIQUE,
|
|
|
|
|
emailVerified INTEGER,
|
|
|
|
|
image TEXT,
|
|
|
|
|
password TEXT
|
|
|
|
|
)
|
|
|
|
|
`);
|
|
|
|
|
|
|
|
|
|
db.exec(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS accounts (
|
|
|
|
|
userId TEXT NOT NULL,
|
|
|
|
|
type TEXT NOT NULL,
|
|
|
|
|
provider TEXT NOT NULL,
|
|
|
|
|
providerAccountId TEXT NOT NULL,
|
|
|
|
|
refresh_token TEXT,
|
|
|
|
|
access_token TEXT,
|
|
|
|
|
expires_at INTEGER,
|
|
|
|
|
token_type TEXT,
|
|
|
|
|
scope TEXT,
|
|
|
|
|
id_token TEXT,
|
|
|
|
|
session_state TEXT,
|
|
|
|
|
PRIMARY KEY (provider, providerAccountId),
|
|
|
|
|
FOREIGN KEY (userId) REFERENCES users (id) ON DELETE CASCADE
|
|
|
|
|
)
|
|
|
|
|
`);
|
|
|
|
|
|
|
|
|
|
db.exec(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS sessions (
|
|
|
|
|
sessionToken TEXT NOT NULL PRIMARY KEY,
|
|
|
|
|
userId TEXT NOT NULL,
|
|
|
|
|
expires INTEGER NOT NULL,
|
|
|
|
|
FOREIGN KEY (userId) REFERENCES users (id) ON DELETE CASCADE
|
2025-07-17 11:12:35 +00:00
|
|
|
)
|
|
|
|
|
`);
|
|
|
|
|
|
2025-09-01 06:34:12 +00:00
|
|
|
db.exec(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS verification_tokens (
|
|
|
|
|
identifier TEXT NOT NULL,
|
|
|
|
|
token TEXT NOT NULL,
|
|
|
|
|
expires INTEGER NOT NULL,
|
|
|
|
|
PRIMARY KEY (identifier, token)
|
|
|
|
|
)
|
|
|
|
|
`);
|
|
|
|
|
|
|
|
|
|
|
2025-07-17 11:21:35 +00:00
|
|
|
db.exec(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS settings (
|
|
|
|
|
key TEXT PRIMARY KEY,
|
|
|
|
|
value TEXT
|
|
|
|
|
)
|
|
|
|
|
`);
|
|
|
|
|
|
2025-07-18 03:22:48 +00:00
|
|
|
db.exec(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS email_templates (
|
|
|
|
|
id INTEGER PRIMARY KEY,
|
|
|
|
|
subject TEXT,
|
|
|
|
|
body TEXT
|
|
|
|
|
)
|
|
|
|
|
`);
|
|
|
|
|
|
2025-07-18 04:13:46 +00:00
|
|
|
db.exec(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS leads (
|
|
|
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
|
|
name TEXT NOT NULL,
|
|
|
|
|
email TEXT NOT NULL,
|
2025-07-18 04:46:40 +00:00
|
|
|
phone TEXT,
|
2025-07-18 04:13:46 +00:00
|
|
|
createdAt DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
)
|
|
|
|
|
`);
|
|
|
|
|
|
2025-07-18 04:51:03 +00:00
|
|
|
db.exec(`
|
|
|
|
|
CREATE TABLE IF NOT EXISTS flows (
|
|
|
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
|
|
name TEXT NOT NULL,
|
|
|
|
|
description TEXT,
|
2025-07-18 04:52:21 +00:00
|
|
|
path TEXT NOT NULL UNIQUE,
|
2025-07-18 04:51:03 +00:00
|
|
|
createdAt DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
|
updatedAt DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
)
|
|
|
|
|
`);
|
|
|
|
|
|
2025-07-18 04:52:21 +00:00
|
|
|
// --- SEEDING LOGIC ---
|
|
|
|
|
console.log('Running database checks and seeding if necessary...');
|
|
|
|
|
|
|
|
|
|
// Seed default user
|
2025-09-01 06:34:12 +00:00
|
|
|
const userStmt = db.prepare('SELECT id FROM users WHERE email = ?');
|
|
|
|
|
const defaultUser = userStmt.get('admin@example.com');
|
2025-07-18 04:52:21 +00:00
|
|
|
if (!defaultUser) {
|
|
|
|
|
const insertUser = db.prepare(
|
|
|
|
|
"INSERT INTO users (id, email, password, name) VALUES (?, ?, ?, ?)"
|
|
|
|
|
);
|
2025-09-01 06:34:12 +00:00
|
|
|
// Note: In a real app, hash the password!
|
|
|
|
|
insertUser.run('cl-admin-user-id', 'admin@example.com', 'password', 'Admin User');
|
2025-07-18 04:52:21 +00:00
|
|
|
console.log('Default user created.');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Seed default flow
|
|
|
|
|
const flowStmt = db.prepare("SELECT id FROM flows WHERE path = ?");
|
|
|
|
|
const defaultFlow = flowStmt.get('/');
|
|
|
|
|
if (!defaultFlow) {
|
|
|
|
|
const insertFlow = db.prepare(
|
|
|
|
|
"INSERT INTO flows (name, description, path) VALUES (?, ?, ?)"
|
|
|
|
|
);
|
|
|
|
|
insertFlow.run('Cost Estimator', 'The main cost estimation tool for clients.', '/');
|
|
|
|
|
console.log('Default flow created.');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
console.log('Database setup complete.');
|
2025-07-17 11:21:35 +00:00
|
|
|
|
2025-07-17 11:12:35 +00:00
|
|
|
export default db;
|