Files
upage-git/app/routes/api.chat.$action/delete.server.ts
2025-09-24 17:02:44 +08:00

94 lines
2.7 KiB
TypeScript

import type { ActionFunctionArgs } from '@remix-run/node';
import { deleteChat, getUserChatById } from '~/lib/.server/chat';
import { errorResponse, successResponse } from '~/utils/api-response';
import { createScopedLogger } from '~/utils/logger';
const logger = createScopedLogger('api.chat.delete');
export type HandleDeleteActionArgs = ActionFunctionArgs & {
userId: string;
};
/**
* 处理删除聊天操作
*/
export async function handleDeleteAction({ request, userId }: HandleDeleteActionArgs) {
if (request.method !== 'DELETE' && request.method !== 'POST') {
return errorResponse(405, '请求方法不支持');
}
try {
// 获取请求数据
const formData = await request.formData();
const id = formData.get('id')?.toString();
const idsString = formData.get('ids')?.toString();
let ids: string[] | undefined;
if (idsString) {
try {
ids = JSON.parse(idsString);
} catch (error) {
logger.error('解析 ids 参数失败', error);
return errorResponse(400, 'ids 参数格式无效');
}
}
if (!id && (!ids || !Array.isArray(ids) || ids.length === 0)) {
return errorResponse(400, '缺少有效的聊天ID');
}
if (id) {
const chat = await getUserChatById(id, userId);
if (!chat) {
return errorResponse(404, '未找到聊天记录或无权限操作');
}
await deleteChat(id);
logger.debug(`用户 ${userId} 删除了聊天 ${id}`);
return successResponse(id, '删除聊天成功');
}
const idsToDelete = ids as string[];
const results = {
success: [] as string[],
failed: [] as string[],
totalMessagesDeleted: 0,
};
for (const chatId of idsToDelete) {
try {
const chat = await getUserChatById(chatId, userId);
if (!chat) {
results.failed.push(chatId);
continue;
}
const messageCount = chat.messages?.length || 0;
await deleteChat(chatId);
results.success.push(chatId);
results.totalMessagesDeleted += messageCount;
logger.debug(`用户 ${userId} 删除了聊天 ${chatId},级联删除了 ${messageCount} 条消息及其关联数据`);
} catch (error) {
logger.error(`删除聊天 ${chatId} 失败`, error);
results.failed.push(chatId);
}
}
return successResponse(
{
results,
totalSuccess: results.success.length,
totalFailed: results.failed.length,
totalMessagesDeleted: results.totalMessagesDeleted,
},
'删除聊天成功',
);
} catch (error) {
logger.error('删除聊天失败', error);
return errorResponse(500, '删除聊天失败');
}
}