| import bcrypt from "bcryptjs"; | |
| const MANAGEMENT_PASSWORD_SALT_ROUNDS = 12; | |
| export async function hashManagementPassword(password) { | |
| return bcrypt.hash(password, MANAGEMENT_PASSWORD_SALT_ROUNDS); | |
| } | |
| export function ensureSettingsSchema(db) { | |
| db.prepare( | |
| `CREATE TABLE IF NOT EXISTS key_value ( | |
| namespace TEXT NOT NULL, | |
| key TEXT NOT NULL, | |
| value TEXT NOT NULL, | |
| PRIMARY KEY (namespace, key) | |
| )` | |
| ).run(); | |
| } | |
| export function updateSettings(db, updates) { | |
| ensureSettingsSchema(db); | |
| const insert = db.prepare( | |
| "INSERT OR REPLACE INTO key_value (namespace, key, value) VALUES ('settings', ?, ?)" | |
| ); | |
| const tx = db.transaction(() => { | |
| for (const [key, value] of Object.entries(updates)) { | |
| insert.run(key, JSON.stringify(value)); | |
| } | |
| }); | |
| tx(); | |
| } | |
| export function getSettings(db) { | |
| ensureSettingsSchema(db); | |
| const rows = db.prepare("SELECT key, value FROM key_value WHERE namespace = 'settings'").all(); | |
| const settings = {}; | |
| for (const row of rows) { | |
| try { | |
| settings[row.key] = JSON.parse(row.value); | |
| } catch { | |
| settings[row.key] = row.value; | |
| } | |
| } | |
| return settings; | |
| } | |