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 = { 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 } ); } }