94 lines
2.7 KiB
TypeScript
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, '删除聊天失败');
|
|
}
|
|
}
|