diff --git a/src/app/api/messages/[messageId]/route.ts b/src/app/api/messages/[messageId]/route.ts new file mode 100644 index 0000000..b9a79cf --- /dev/null +++ b/src/app/api/messages/[messageId]/route.ts @@ -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 } + ); + } +}