llm-chat/backend/routes/conversations.js

410 lines
9.2 KiB
JavaScript

const express = require('express');
const ConversationService = require('../services/ConversationService');
const router = express.Router();
const conversationService = new ConversationService();
/**
* 创建新对话
* POST /api/conversations
*/
router.post('/', async (req, res) => {
try {
const { title } = req.body;
const conversation = await conversationService.createConversation(title);
res.status(201).json({
success: true,
data: conversation,
message: '对话创建成功'
});
} catch (error) {
console.error('创建对话API错误:', error);
res.status(500).json({
success: false,
error: error.message,
message: '创建对话失败'
});
}
});
/**
* 获取对话列表
* GET /api/conversations?limit=50
*/
router.get('/', async (req, res) => {
try {
const limit = parseInt(req.query.limit) || 50;
// 限制查询数量
if (limit > 100) {
return res.status(400).json({
success: false,
error: '查询数量不能超过100',
message: '参数错误'
});
}
const conversations = await conversationService.getConversations(limit);
res.json({
success: true,
data: conversations,
count: conversations.length,
message: '获取对话列表成功'
});
} catch (error) {
console.error('获取对话列表API错误:', error);
res.status(500).json({
success: false,
error: error.message,
message: '获取对话列表失败'
});
}
});
/**
* 获取对话详情
* GET /api/conversations/:id
*/
router.get('/:id', async (req, res) => {
try {
const { id } = req.params;
if (!id || isNaN(id)) {
return res.status(400).json({
success: false,
error: '无效的对话ID',
message: '参数错误'
});
}
const conversation = await conversationService.getConversationById(parseInt(id));
if (!conversation) {
return res.status(404).json({
success: false,
error: '对话不存在',
message: '对话未找到'
});
}
res.json({
success: true,
data: conversation,
message: '获取对话详情成功'
});
} catch (error) {
console.error('获取对话详情API错误:', error);
if (error.message === '对话不存在') {
res.status(404).json({
success: false,
error: error.message,
message: '对话未找到'
});
} else {
res.status(500).json({
success: false,
error: error.message,
message: '获取对话详情失败'
});
}
}
});
/**
* 获取对话的消息列表
* GET /api/conversations/:id/messages?limit=100&offset=0
*/
router.get('/:id/messages', async (req, res) => {
try {
const { id } = req.params;
const limit = parseInt(req.query.limit) || 100;
const offset = parseInt(req.query.offset) || 0;
if (!id || isNaN(id)) {
return res.status(400).json({
success: false,
error: '无效的对话ID',
message: '参数错误'
});
}
// 限制查询数量
if (limit > 200) {
return res.status(400).json({
success: false,
error: '查询数量不能超过200',
message: '参数错误'
});
}
const messages = await conversationService.getConversationMessages(
parseInt(id),
limit,
offset
);
res.json({
success: true,
data: messages,
count: messages.length,
limit,
offset,
message: '获取消息列表成功'
});
} catch (error) {
console.error('获取消息列表API错误:', error);
if (error.message === '对话不存在') {
res.status(404).json({
success: false,
error: error.message,
message: '对话未找到'
});
} else {
res.status(500).json({
success: false,
error: error.message,
message: '获取消息列表失败'
});
}
}
});
/**
* 更新对话标题
* PUT /api/conversations/:id
*/
router.put('/:id', async (req, res) => {
try {
const { id } = req.params;
const { title } = req.body;
if (!id || isNaN(id)) {
return res.status(400).json({
success: false,
error: '无效的对话ID',
message: '参数错误'
});
}
if (!title || title.trim().length === 0) {
return res.status(400).json({
success: false,
error: '标题不能为空',
message: '参数错误'
});
}
if (title.length > 100) {
return res.status(400).json({
success: false,
error: '标题长度不能超过100个字符',
message: '参数错误'
});
}
const conversation = await conversationService.updateConversationTitle(
parseInt(id),
title.trim()
);
res.json({
success: true,
data: conversation,
message: '更新对话标题成功'
});
} catch (error) {
console.error('更新对话标题API错误:', error);
if (error.message === '对话不存在') {
res.status(404).json({
success: false,
error: error.message,
message: '对话未找到'
});
} else {
res.status(500).json({
success: false,
error: error.message,
message: '更新对话标题失败'
});
}
}
});
/**
* 删除对话
* DELETE /api/conversations/:id
*/
router.delete('/:id', async (req, res) => {
try {
const { id } = req.params;
if (!id || isNaN(id)) {
return res.status(400).json({
success: false,
error: '无效的对话ID',
message: '参数错误'
});
}
await conversationService.deleteConversation(parseInt(id));
res.json({
success: true,
message: '删除对话成功'
});
} catch (error) {
console.error('删除对话API错误:', error);
if (error.message === '对话不存在') {
res.status(404).json({
success: false,
error: error.message,
message: '对话未找到'
});
} else {
res.status(500).json({
success: false,
error: error.message,
message: '删除对话失败'
});
}
}
});
/**
* 批量删除对话
* DELETE /api/conversations
*/
router.delete('/', async (req, res) => {
try {
const { ids } = req.body;
if (!Array.isArray(ids) || ids.length === 0) {
return res.status(400).json({
success: false,
error: '请提供有效的对话ID列表',
message: '参数错误'
});
}
// 限制批量删除数量
if (ids.length > 50) {
return res.status(400).json({
success: false,
error: '单次最多删除50个对话',
message: '参数错误'
});
}
const deletedCount = await conversationService.deleteMultipleConversations(ids);
res.json({
success: true,
data: { deletedCount },
message: `成功删除${deletedCount}个对话`
});
} catch (error) {
console.error('批量删除对话API错误:', error);
res.status(500).json({
success: false,
error: error.message,
message: '批量删除对话失败'
});
}
});
/**
* 搜索对话
* GET /api/conversations/search?q=关键词&limit=20
*/
router.get('/search', async (req, res) => {
try {
const { q: query, limit = 20 } = req.query;
if (!query || query.trim().length === 0) {
return res.status(400).json({
success: false,
error: '搜索关键词不能为空',
message: '参数错误'
});
}
if (query.length > 100) {
return res.status(400).json({
success: false,
error: '搜索关键词长度不能超过100个字符',
message: '参数错误'
});
}
const conversations = await conversationService.searchConversations(
query.trim(),
parseInt(limit)
);
res.json({
success: true,
data: conversations,
count: conversations.length,
query: query.trim(),
message: '搜索对话成功'
});
} catch (error) {
console.error('搜索对话API错误:', error);
res.status(500).json({
success: false,
error: error.message,
message: '搜索对话失败'
});
}
});
/**
* 获取对话统计信息
* GET /api/conversations/:id/stats
*/
router.get('/:id/stats', async (req, res) => {
try {
const { id } = req.params;
if (!id || isNaN(id)) {
return res.status(400).json({
success: false,
error: '无效的对话ID',
message: '参数错误'
});
}
const stats = await conversationService.getConversationStats(parseInt(id));
res.json({
success: true,
data: stats,
message: '获取对话统计成功'
});
} catch (error) {
console.error('获取对话统计API错误:', error);
if (error.message === '对话不存在') {
res.status(404).json({
success: false,
error: error.message,
message: '对话未找到'
});
} else {
res.status(500).json({
success: false,
error: error.message,
message: '获取对话统计失败'
});
}
}
});
module.exports = router;