import { NextRequest, NextResponse } from "next/server"; import { writeFile } from "node:fs/promises"; import { addMessage, clearMessages, createStorageKey, formatUploadedFileMeta, getOnlineUsers, listMessages, resolveUploadPath, touchPresence } from "@/lib/chat-store"; export async function GET(request: NextRequest) { const user = request.nextUrl.searchParams.get("user") || undefined; touchPresence(user); return NextResponse.json({ messages: listMessages(), onlineUsers: getOnlineUsers() }); } export async function POST(request: NextRequest) { const contentType = request.headers.get("content-type") || ""; let user = "局域网设备"; let content = ""; let fileRecord: | { name: string; meta: string; kind: "image" | "file"; storageKey: string; } | undefined; if (contentType.includes("multipart/form-data")) { const formData = await request.formData(); user = String(formData.get("user") || "局域网设备").trim() || "局域网设备"; content = String(formData.get("content") || "").trim(); const file = formData.get("file"); if (file instanceof File && file.size > 0) { const storageKey = createStorageKey(file.name); const buffer = Buffer.from(await file.arrayBuffer()); await writeFile(resolveUploadPath(storageKey), buffer); fileRecord = { name: file.name, meta: formatUploadedFileMeta(file.name, file.type, file.size), kind: file.type.startsWith("image/") ? "image" : "file", storageKey }; } } else { const payload = (await request.json()) as { user?: string; content?: string; }; user = payload.user?.trim() || "局域网设备"; content = payload.content?.trim() || ""; } if (!content && !fileRecord) { return NextResponse.json({ error: "消息不能为空" }, { status: 400 }); } touchPresence(user); const message = addMessage({ user, content, file: fileRecord }); return NextResponse.json({ message, onlineUsers: getOnlineUsers() }); } export async function DELETE(request: NextRequest) { const payload = (await request.json().catch(() => ({}))) as { user?: string; }; const user = payload.user?.trim() || "局域网设备"; touchPresence(user); await clearMessages(user); return NextResponse.json({ messages: listMessages(), onlineUsers: getOnlineUsers() }); }