import { NextResponse } from "next/server"; import { ZodError } from "zod"; import { checkAuth } from "./auth"; /** 统一的未授权响应。 */ export function unauthorized() { return NextResponse.json({ error: "未授权" }, { status: 401 }); } /** 解析并校验请求体,失败时返回 422 响应(由调用方 return)。 */ export async function parseBody( request: Request, schema: { parse: (d: unknown) => T } ): Promise<{ ok: true; data: T } | { ok: false; response: NextResponse }> { try { const json = await request.json(); const data = schema.parse(json); return { ok: true, data }; } catch (err) { if (err instanceof ZodError) { return { ok: false, response: NextResponse.json( { error: "输入校验失败", issues: err.issues.map((i) => i.message) }, { status: 422 } ), }; } return { ok: false, response: NextResponse.json({ error: "请求格式错误" }, { status: 400 }), }; } } /** 在受保护路由开头做鉴权,未通过则返回 401 响应。 */ export async function requireAuth(): Promise { if (!(await checkAuth())) return unauthorized(); return null; }