import { NextResponse } from "next/server"; import { z } from "zod"; import { auth } from "@/app/(auth)/auth"; import { createUserAccessKey, listUserAccessKeys, } from "@/lib/access-keys/service"; const createAccessKeySchema = z.object({ name: z.string().trim().min(1).max(100).optional(), scopes: z .array(z.enum(["canvas:read", "canvas:write"])) .min(1) .optional(), expiresInDays: z.number().int().min(1).max(365).optional(), }); export async function GET() { const session = await auth(); if (!session?.user?.id || session.user.type === "guest") { return NextResponse.json( { success: false, error: "请先登录正式账号" }, { status: 401 } ); } const keys = await listUserAccessKeys(session.user.id); return NextResponse.json( { success: true, data: keys }, { headers: { "Cache-Control": "no-store" } } ); } export async function POST(request: Request) { const session = await auth(); if (!session?.user?.id || session.user.type === "guest") { return NextResponse.json( { success: false, error: "请先登录正式账号" }, { status: 401 } ); } const existingKeys = await listUserAccessKeys(session.user.id); const activeKeyCount = existingKeys.filter( (item) => !item.revokedAt && (!item.expiresAt || new Date(item.expiresAt).getTime() > Date.now()) ).length; if (activeKeyCount >= 10) { return NextResponse.json( { success: false, error: "最多保留 10 个有效 Access Key" }, { status: 409 } ); } try { const body = createAccessKeySchema.parse( await request.json().catch(() => ({})) ); const created = await createUserAccessKey({ userId: session.user.id, name: body?.name, scopes: body?.scopes, expiresInDays: body?.expiresInDays, }); return NextResponse.json({ success: true, data: created }, { status: 201 }); } catch (error) { return NextResponse.json( { success: false, error: error instanceof Error ? error.message : "创建 Access Key 失败", }, { status: 400 } ); } }