feat(api): 添加对话数据导出和清除 API

- 新增 GET /api/conversations/export 导出所有对话数据
- 新增 GET /api/conversations/all 获取对话统计信息
- 新增 DELETE /api/conversations/all 清除所有对话和消息
This commit is contained in:
gaoziman 2025-12-19 15:57:12 +08:00
parent 8aab630af6
commit 199772a95d
2 changed files with 125 additions and 0 deletions

View File

@ -0,0 +1,52 @@
import { NextResponse } from 'next/server';
import { db } from '@/drizzle/db';
import { conversations, messages } from '@/drizzle/schema';
import { sql } from 'drizzle-orm';
// GET /api/conversations/all - 获取统计信息
export async function GET() {
try {
// 获取对话数量
const conversationCount = await db
.select({ count: sql<number>`count(*)` })
.from(conversations);
// 获取消息数量
const messageCount = await db
.select({ count: sql<number>`count(*)` })
.from(messages);
return NextResponse.json({
conversationCount: Number(conversationCount[0]?.count || 0),
messageCount: Number(messageCount[0]?.count || 0),
});
} catch (error) {
console.error('Failed to get stats:', error);
return NextResponse.json(
{ error: 'Failed to get stats' },
{ status: 500 }
);
}
}
// DELETE /api/conversations/all - 清除所有对话和消息
export async function DELETE() {
try {
// 先删除所有消息
await db.delete(messages);
// 再删除所有对话
await db.delete(conversations);
return NextResponse.json({
success: true,
message: 'All conversations and messages have been deleted',
});
} catch (error) {
console.error('Failed to delete all conversations:', error);
return NextResponse.json(
{ error: 'Failed to delete all conversations' },
{ status: 500 }
);
}
}

View File

@ -0,0 +1,73 @@
import { NextResponse } from 'next/server';
import { db } from '@/drizzle/db';
import { conversations, messages } from '@/drizzle/schema';
import { desc, eq } from 'drizzle-orm';
// GET /api/conversations/export - 导出所有对话数据
export async function GET() {
try {
// 获取所有对话
const allConversations = await db.query.conversations.findMany({
orderBy: [desc(conversations.createdAt)],
});
// 获取所有消息
const allMessages = await db.query.messages.findMany({
orderBy: [desc(messages.createdAt)],
});
// 按对话组织数据
const exportData = {
exportedAt: new Date().toISOString(),
version: '1.0',
totalConversations: allConversations.length,
totalMessages: allMessages.length,
conversations: allConversations.map((conv) => {
// 获取该对话的所有消息
const convMessages = allMessages
.filter((msg) => msg.conversationId === conv.conversationId)
.sort((a, b) => new Date(a.createdAt!).getTime() - new Date(b.createdAt!).getTime())
.map((msg) => ({
messageId: msg.messageId,
role: msg.role,
content: msg.content,
thinkingContent: msg.thinkingContent,
toolCalls: msg.toolCalls,
toolResults: msg.toolResults,
inputTokens: msg.inputTokens,
outputTokens: msg.outputTokens,
status: msg.status,
feedback: msg.feedback,
createdAt: msg.createdAt,
}));
return {
conversationId: conv.conversationId,
title: conv.title,
summary: conv.summary,
model: conv.model,
tools: conv.tools,
enableThinking: conv.enableThinking,
systemPrompt: conv.systemPrompt,
temperature: conv.temperature,
messageCount: conv.messageCount,
totalTokens: conv.totalTokens,
isArchived: conv.isArchived,
isPinned: conv.isPinned,
createdAt: conv.createdAt,
updatedAt: conv.updatedAt,
lastMessageAt: conv.lastMessageAt,
messages: convMessages,
};
}),
};
return NextResponse.json(exportData);
} catch (error) {
console.error('Failed to export conversations:', error);
return NextResponse.json(
{ error: 'Failed to export conversations' },
{ status: 500 }
);
}
}