174 lines
4.7 KiB
TypeScript
174 lines
4.7 KiB
TypeScript
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 }
|
||
);
|
||
}
|
||
}
|