feat(API): 添加消息更新接口

- 新增 PATCH /api/messages/[messageId] 用于更新消息
- 支持更新消息的图片数据(用于保存 Pyodide 执行结果)
- 支持追加模式更新图片数组
- 新增 GET /api/messages/[messageId] 获取单个消息
This commit is contained in:
gaoziman 2025-12-19 20:19:26 +08:00
parent 68ba9b3204
commit 5cc4fbb7a0

View File

@ -0,0 +1,119 @@
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 }
);
}
}