feat: 全局设置系统 — settings 表、CRUD 路由、主题偏好持久化

This commit is contained in:
2026-06-05 23:10:32 +08:00
parent e2eba6dc1f
commit 3f88e33bd1
23 changed files with 652 additions and 54 deletions

View File

@@ -0,0 +1,38 @@
import type Database from "bun:sqlite";
import type { RuntimeMode, SettingsData } from "../../shared/api";
import type { Logger } from "../logger";
import { getSettings, updateSettings } from "../db/settings";
import { createApiError, jsonResponse } from "../helpers";
export function handleGetSettings(_req: Request, db: Database, mode: RuntimeMode, _logger: Logger): Response {
const data = getSettings(db);
return jsonResponse(data, { mode });
}
export async function handleUpdateSettings(
req: Request,
db: Database,
mode: RuntimeMode,
logger: Logger,
): Promise<Response> {
let body: Partial<SettingsData>;
try {
body = (await req.json()) as Partial<SettingsData>;
} catch {
return jsonResponse(createApiError("Invalid JSON body", 400), { mode, status: 400 });
}
if (body.theme !== undefined && typeof body.theme !== "string") {
return jsonResponse(createApiError("theme must be a string", 400), { mode, status: 400 });
}
if (body.theme !== undefined && body.theme !== "dark" && body.theme !== "light" && body.theme !== "system") {
return jsonResponse(createApiError("theme 仅支持 dark、light、system", 400), { mode, status: 400 });
}
const result = updateSettings(db, body, logger);
logger.info({ data: result }, "设置已更新");
return jsonResponse(result, { mode });
}