refactor: 提取 validation.ts 和 amap.ts,统一 API 路由校验逻辑

新增 validation.ts(用户名/密码/邮箱/内容/房间名/必填字段校验)
和 amap.ts(AMAP API key 校验),消除 7 个路由中的重复验证代码。
This commit is contained in:
2026-02-26 19:22:17 +08:00
parent 455b9e04d8
commit 1229bb849b
9 changed files with 80 additions and 41 deletions
+9 -16
View File
@@ -2,31 +2,27 @@ import { NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { requireMembership } from "@/lib/blindbox";
import { apiHandler, ApiError, requireUserId } from "@/lib/api";
import { validateIdeaContent, requireString } from "@/lib/validation";
export const POST = apiHandler(async (req) => {
const { roomId, userId, content } = await req.json();
requireUserId(userId);
if (!roomId || typeof roomId !== "string") throw new ApiError("roomId 不能为空");
if (!content || typeof content !== "string" || content.trim().length === 0) {
throw new ApiError("内容不能为空");
}
if (content.trim().length > 200) throw new ApiError("内容不能超过 200 字");
requireString(roomId, "roomId");
const trimmedContent = validateIdeaContent(content);
await requireMembership(roomId, userId);
const idea = await prisma.blindBoxIdea.create({
data: { roomId, userId, content: content.trim() },
data: { roomId, userId, content: trimmedContent },
});
return NextResponse.json({ id: idea.id }, { status: 201 });
});
export const GET = apiHandler(async (req) => {
const roomId = req.nextUrl.searchParams.get("roomId");
const userId = requireUserId(req.nextUrl.searchParams.get("userId"));
if (!roomId) throw new ApiError("缺少 roomId");
const roomId = requireString(req.nextUrl.searchParams.get("roomId"), "roomId");
await requireMembership(roomId, userId);
@@ -56,11 +52,8 @@ export const PUT = apiHandler(async (req) => {
const { ideaId, userId, content } = await req.json();
requireUserId(userId);
if (!ideaId) throw new ApiError("缺少 ideaId");
if (!content || typeof content !== "string" || content.trim().length === 0) {
throw new ApiError("内容不能为空");
}
if (content.trim().length > 200) throw new ApiError("内容不能超过 200 字");
requireString(ideaId, "ideaId");
const trimmedContent = validateIdeaContent(content);
const idea = await prisma.blindBoxIdea.findUnique({ where: { id: ideaId } });
if (!idea) throw new ApiError("想法不存在", 404);
@@ -69,7 +62,7 @@ export const PUT = apiHandler(async (req) => {
const updated = await prisma.blindBoxIdea.update({
where: { id: ideaId },
data: { content: content.trim() },
data: { content: trimmedContent },
});
return NextResponse.json({ id: updated.id, content: updated.content });
@@ -79,7 +72,7 @@ export const DELETE = apiHandler(async (req) => {
const { ideaId, userId } = await req.json();
requireUserId(userId);
if (!ideaId) throw new ApiError("缺少 ideaId");
requireString(ideaId, "ideaId");
const idea = await prisma.blindBoxIdea.findUnique({ where: { id: ideaId } });
if (!idea) throw new ApiError("想法不存在", 404);