- 新增 PATCH /api/messages/[messageId] 用于更新消息 - 支持更新消息的图片数据(用于保存 Pyodide 执行结果) - 支持追加模式更新图片数组 - 新增 GET /api/messages/[messageId] 获取单个消息
120 lines
2.8 KiB
TypeScript
120 lines
2.8 KiB
TypeScript
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 }
|
||
);
|
||
}
|
||
}
|