claude-code-cchui/src/app/api/messages/[messageId]/route.ts
gaoziman 5cc4fbb7a0 feat(API): 添加消息更新接口
- 新增 PATCH /api/messages/[messageId] 用于更新消息
- 支持更新消息的图片数据(用于保存 Pyodide 执行结果)
- 支持追加模式更新图片数组
- 新增 GET /api/messages/[messageId] 获取单个消息
2025-12-19 20:19:26 +08:00

120 lines
2.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { NextResponse } from 'next/server';
import { db } from '@/drizzle/db';
import { messages } from '@/drizzle/schema';
import { eq } from 'drizzle-orm';
interface RouteParams {
params: Promise<{ messageId: string }>;
}
/**
* PATCH /api/messages/[messageId] - 更新消息
* 主要用于更新消息的图片数据Pyodide 执行后保存图片)
*/
export async function PATCH(request: Request, { params }: RouteParams) {
try {
const { messageId } = await params;
const body = await request.json();
// 验证 messageId
if (!messageId) {
return NextResponse.json(
{ error: 'Message ID is required' },
{ status: 400 }
);
}
// 查找消息
const existingMessage = await db.query.messages.findFirst({
where: eq(messages.messageId, messageId),
});
if (!existingMessage) {
return NextResponse.json(
{ error: 'Message not found' },
{ status: 404 }
);
}
// 构建更新数据
const updateData: {
images?: string[];
content?: string;
updatedAt: Date;
} = {
updatedAt: new Date(),
};
// 更新图片(追加模式)
if (body.images && Array.isArray(body.images)) {
const existingImages = (existingMessage.images as string[]) || [];
updateData.images = [...existingImages, ...body.images];
}
// 更新内容(如果提供)
if (body.content !== undefined) {
updateData.content = body.content;
}
// 执行更新
await db
.update(messages)
.set(updateData)
.where(eq(messages.messageId, messageId));
// 返回更新后的消息
const updatedMessage = await db.query.messages.findFirst({
where: eq(messages.messageId, messageId),
});
return NextResponse.json({
success: true,
message: updatedMessage,
});
} catch (error) {
console.error('Update message error:', error);
return NextResponse.json(
{ error: 'Failed to update message' },
{ status: 500 }
);
}
}
/**
* GET /api/messages/[messageId] - 获取单个消息
*/
export async function GET(request: Request, { params }: RouteParams) {
try {
const { messageId } = await params;
if (!messageId) {
return NextResponse.json(
{ error: 'Message ID is required' },
{ status: 400 }
);
}
const message = await db.query.messages.findFirst({
where: eq(messages.messageId, messageId),
});
if (!message) {
return NextResponse.json(
{ error: 'Message not found' },
{ status: 404 }
);
}
return NextResponse.json({
success: true,
message,
});
} catch (error) {
console.error('Get message error:', error);
return NextResponse.json(
{ error: 'Failed to get message' },
{ status: 500 }
);
}
}