/** * Config Service — 配置读写 * * 管理 app_config 表的读写操作。 * 所有配置值以 JSON 格式存储。 * * @see docs/MetonaAI-Desktop 架构与交互设计.html — 数据库配置 */ import type Database from 'better-sqlite3'; import log from 'electron-log'; export interface ConfigRow { key: string; value: string; category: string; updated_at: number; } export class ConfigService { constructor(private getDB: () => Database.Database) {} /** * 获取配置值 */ get(key: string): T | null { const db = this.getDB(); const row = db.prepare('SELECT value FROM app_config WHERE key = ?').get(key) as ConfigRow | undefined; if (!row) return null; try { return JSON.parse(row.value) as T; } catch { return row.value as T; } } /** * 设置配置值(保留已有 category) */ set(key: string, value: unknown): void { const db = this.getDB(); const jsonValue = JSON.stringify(value); // 查询已有 category,避免 INSERT OR REPLACE 覆盖为默认值 const existing = db.prepare('SELECT category FROM app_config WHERE key = ?').get(key) as ConfigRow | undefined; const category = existing?.category ?? 'general'; db.prepare(` INSERT OR REPLACE INTO app_config (key, value, category, updated_at) VALUES (?, ?, ?, ?) `).run(key, jsonValue, category, Date.now()); log.debug(`Config set: ${key}`); } /** * 获取所有配置 */ getAll(): Record { const db = this.getDB(); const rows = db.prepare('SELECT key, value FROM app_config').all() as ConfigRow[]; const config: Record = {}; for (const row of rows) { try { config[row.key] = JSON.parse(row.value); } catch { config[row.key] = row.value; } } return config; } /** * 获取指定分类的所有配置 */ getByCategory(category: string): Record { const db = this.getDB(); const rows = db.prepare('SELECT key, value FROM app_config WHERE category = ?').all(category) as ConfigRow[]; const config: Record = {}; for (const row of rows) { try { config[row.key] = JSON.parse(row.value); } catch { config[row.key] = row.value; } } return config; } /** * 删除配置 */ delete(key: string): boolean { const db = this.getDB(); const result = db.prepare('DELETE FROM app_config WHERE key = ?').run(key); return result.changes > 0; } }