From 5cc4fbb7a0fc261e0660769e58c54dd24c6aa6fa Mon Sep 17 00:00:00 2001 From: gaoziman <2942894660@qq.com> Date: Fri, 19 Dec 2025 20:19:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(API):=20=E6=B7=BB=E5=8A=A0=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E6=9B=B4=E6=96=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 PATCH /api/messages/[messageId] 用于更新消息 - 支持更新消息的图片数据(用于保存 Pyodide 执行结果) - 支持追加模式更新图片数组 - 新增 GET /api/messages/[messageId] 获取单个消息 --- src/app/api/messages/[messageId]/route.ts | 119 ++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/app/api/messages/[messageId]/route.ts 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 } + ); + } +}