claude-code-cchui/src/app/api/settings/route.ts
gaoziman 9a27a11385 feat(api): Settings API 支持字体大小设置
- GET 接口返回 fontSize 字段
- PUT 接口支持更新 fontSize 设置
- 添加字体大小范围限制 (12-20)
2025-12-19 13:55:24 +08:00

174 lines
4.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { NextResponse } from 'next/server';
import { db } from '@/drizzle/db';
import { userSettings } from '@/drizzle/schema';
import { eq } from 'drizzle-orm';
// GET /api/settings - 获取用户设置
export async function GET() {
try {
const settings = await db.query.userSettings.findFirst({
where: eq(userSettings.id, 1),
});
if (!settings) {
// 如果没有设置,返回默认值
return NextResponse.json({
cchUrl: process.env.CCH_DEFAULT_URL || 'http://localhost:13500',
cchApiKeyConfigured: false,
defaultModel: 'claude-sonnet-4-20250514',
defaultTools: ['web_search', 'code_execution', 'web_fetch'],
systemPrompt: '',
temperature: '0.7',
theme: 'light',
language: 'zh-CN',
fontSize: 15,
enableThinking: false,
saveChatHistory: true,
});
}
// 不返回 API Key 本身,只返回是否已配置
return NextResponse.json({
cchUrl: settings.cchUrl,
cchApiKeyConfigured: settings.cchApiKeyConfigured,
defaultModel: settings.defaultModel,
defaultTools: settings.defaultTools,
systemPrompt: settings.systemPrompt || '',
temperature: settings.temperature || '0.7',
theme: settings.theme,
language: settings.language,
fontSize: settings.fontSize || 15,
enableThinking: settings.enableThinking,
saveChatHistory: settings.saveChatHistory,
});
} catch (error) {
console.error('Failed to get settings:', error);
return NextResponse.json(
{ error: 'Failed to get settings' },
{ status: 500 }
);
}
}
// PUT /api/settings - 更新用户设置
export async function PUT(request: Request) {
try {
const body = await request.json();
const {
cchUrl,
cchApiKey,
defaultModel,
defaultTools,
systemPrompt,
temperature,
theme,
language,
fontSize,
enableThinking,
saveChatHistory,
} = body;
// 构建更新对象
const updateData: Record<string, unknown> = {
updatedAt: new Date(),
};
if (cchUrl !== undefined) {
updateData.cchUrl = cchUrl;
}
// 如果提供了 API Key更新它
if (cchApiKey !== undefined) {
if (cchApiKey === '') {
// 清除 API Key
updateData.cchApiKey = null;
updateData.cchApiKeyConfigured = false;
} else {
updateData.cchApiKey = cchApiKey;
updateData.cchApiKeyConfigured = true;
}
}
if (defaultModel !== undefined) {
updateData.defaultModel = defaultModel;
}
if (defaultTools !== undefined) {
updateData.defaultTools = defaultTools;
}
if (systemPrompt !== undefined) {
updateData.systemPrompt = systemPrompt;
}
if (temperature !== undefined) {
updateData.temperature = temperature;
}
if (theme !== undefined) {
updateData.theme = theme;
}
if (language !== undefined) {
updateData.language = language;
}
if (fontSize !== undefined) {
// 限制字体大小在 12-20 之间
updateData.fontSize = Math.min(20, Math.max(12, fontSize));
}
if (enableThinking !== undefined) {
updateData.enableThinking = enableThinking;
}
if (saveChatHistory !== undefined) {
updateData.saveChatHistory = saveChatHistory;
}
// 检查是否存在设置记录
const existing = await db.query.userSettings.findFirst({
where: eq(userSettings.id, 1),
});
if (!existing) {
// 创建新的设置记录
await db.insert(userSettings).values({
id: 1,
...updateData,
});
} else {
// 更新现有记录
await db
.update(userSettings)
.set(updateData)
.where(eq(userSettings.id, 1));
}
// 返回更新后的设置(不包含 API Key
const updatedSettings = await db.query.userSettings.findFirst({
where: eq(userSettings.id, 1),
});
return NextResponse.json({
cchUrl: updatedSettings?.cchUrl,
cchApiKeyConfigured: updatedSettings?.cchApiKeyConfigured,
defaultModel: updatedSettings?.defaultModel,
defaultTools: updatedSettings?.defaultTools,
systemPrompt: updatedSettings?.systemPrompt || '',
temperature: updatedSettings?.temperature || '0.7',
theme: updatedSettings?.theme,
language: updatedSettings?.language,
fontSize: updatedSettings?.fontSize || 15,
enableThinking: updatedSettings?.enableThinking,
saveChatHistory: updatedSettings?.saveChatHistory,
});
} catch (error) {
console.error('Failed to update settings:', error);
return NextResponse.json(
{ error: 'Failed to update settings' },
{ status: 500 }
);
}
}