87 lines
2.9 KiB
JavaScript
87 lines
2.9 KiB
JavaScript
import { mkdirSync } from "node:fs";
|
|
import { dirname, join } from "node:path";
|
|
import { DatabaseSync } from "node:sqlite";
|
|
|
|
const dbPath = join(process.cwd(), "data", "vitepress-cms.sqlite");
|
|
mkdirSync(dirname(dbPath), { recursive: true });
|
|
|
|
export const db = new DatabaseSync(dbPath);
|
|
db.exec("PRAGMA foreign_keys = ON");
|
|
|
|
export function migrate() {
|
|
db.exec(`
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
email TEXT UNIQUE,
|
|
password_hash TEXT,
|
|
name TEXT NOT NULL,
|
|
avatar_url TEXT,
|
|
role TEXT NOT NULL DEFAULT 'user',
|
|
email_verified INTEGER NOT NULL DEFAULT 0,
|
|
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS oauth_accounts (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
provider TEXT NOT NULL,
|
|
provider_user_id TEXT NOT NULL,
|
|
provider_login TEXT NOT NULL,
|
|
access_token TEXT,
|
|
avatar_url TEXT,
|
|
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE(provider, provider_user_id),
|
|
FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS projects (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
owner_user_id INTEGER NOT NULL,
|
|
name TEXT NOT NULL,
|
|
github_owner TEXT,
|
|
github_repo TEXT,
|
|
github_branch TEXT NOT NULL DEFAULT 'main',
|
|
site_root TEXT NOT NULL DEFAULT '',
|
|
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY(owner_user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS project_members (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL,
|
|
user_id INTEGER NOT NULL,
|
|
role TEXT NOT NULL DEFAULT 'editor',
|
|
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE(project_id, user_id),
|
|
FOREIGN KEY(project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS system_settings (
|
|
key TEXT PRIMARY KEY,
|
|
value TEXT NOT NULL,
|
|
encrypted INTEGER NOT NULL DEFAULT 0,
|
|
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
`);
|
|
}
|
|
|
|
export function getSetting(key, fallback = "") {
|
|
const row = db.prepare("SELECT value FROM system_settings WHERE key = ?").get(key);
|
|
return row?.value ?? fallback;
|
|
}
|
|
|
|
export function setSetting(key, value, encrypted = false) {
|
|
db.prepare(`
|
|
INSERT INTO system_settings (key, value, encrypted, updated_at)
|
|
VALUES (?, ?, ?, CURRENT_TIMESTAMP)
|
|
ON CONFLICT(key) DO UPDATE SET
|
|
value = excluded.value,
|
|
encrypted = excluded.encrypted,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
`).run(key, value, encrypted ? 1 : 0);
|
|
}
|