| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- 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()
- });
- }
|