import { z } from "zod"; import { requireAdmin } from "@/lib/middleware/admin"; import { getAllStorageConfigs, getStorageConfigById, createStorageConfig, updateStorageConfig, deleteStorageConfig, } from "@/lib/db/queries"; import { ChatSDKError } from "@/lib/errors"; const createStorageSchema = z.object({ name: z.string().min(1).max(128), type: z.enum(["s3", "local"]), endpoint: z.string().optional(), region: z.string().max(64).optional(), bucket: z.string().max(128).optional(), accessKeyId: z.string().optional(), secretAccessKey: z.string().optional(), publicUrl: z.string().optional(), isDefault: z.boolean().optional(), isEnabled: z.boolean().optional(), }); const updateStorageSchema = z.object({ id: z.string().uuid(), name: z.string().min(1).max(128).optional(), type: z.enum(["s3", "local"]).optional(), endpoint: z.string().optional(), region: z.string().max(64).optional(), bucket: z.string().max(128).optional(), accessKeyId: z.string().optional(), secretAccessKey: z.string().optional(), publicUrl: z.string().optional(), isDefault: z.boolean().optional(), isEnabled: z.boolean().optional(), }); export async function GET(request: Request) { try { await requireAdmin(); const { searchParams } = new URL(request.url); const id = searchParams.get("id"); if (id) { const config = await getStorageConfigById({ id }); if (!config) { return new ChatSDKError("bad_request:api", "Storage config not found").toResponse(); } // 隐藏敏感信息 return Response.json({ config: { ...config, accessKeyId: config.accessKeyId ? config.accessKeyId.slice(0, 4) + "****" : null, secretAccessKey: config.secretAccessKey ? "****" : null, }, }); } const configs = await getAllStorageConfigs(); // 隐藏敏感信息 return Response.json({ configs: configs.map((c) => ({ ...c, accessKeyId: c.accessKeyId ? c.accessKeyId.slice(0, 4) + "****" : null, secretAccessKey: c.secretAccessKey ? "****" : null, })), }); } catch (error) { if (error instanceof ChatSDKError) { return error.toResponse(); } return new ChatSDKError("offline:admin").toResponse(); } } export async function POST(request: Request) { try { const session = await requireAdmin(); const body = await request.json(); const data = createStorageSchema.parse(body); const config = await createStorageConfig({ ...data, updatedBy: session.user.id, }); return Response.json({ config: config[0] }); } catch (error) { if (error instanceof ChatSDKError) { return error.toResponse(); } if (error instanceof z.ZodError) { return new ChatSDKError("bad_request:api", error.message).toResponse(); } return new ChatSDKError("offline:admin").toResponse(); } } export async function PUT(request: Request) { try { const session = await requireAdmin(); const body = await request.json(); const data = updateStorageSchema.parse(body); const config = await updateStorageConfig({ ...data, updatedBy: session.user.id, }); if (config.length === 0) { return new ChatSDKError("bad_request:api", "Storage config not found").toResponse(); } return Response.json({ config: config[0] }); } catch (error) { if (error instanceof ChatSDKError) { return error.toResponse(); } if (error instanceof z.ZodError) { return new ChatSDKError("bad_request:api", error.message).toResponse(); } return new ChatSDKError("offline:admin").toResponse(); } } export async function DELETE(request: Request) { try { await requireAdmin(); const { searchParams } = new URL(request.url); const id = searchParams.get("id"); if (!id) { return new ChatSDKError("bad_request:api", "Storage config ID is required").toResponse(); } await deleteStorageConfig({ id }); return Response.json({ success: true }); } catch (error) { if (error instanceof ChatSDKError) { return error.toResponse(); } return new ChatSDKError("offline:admin").toResponse(); } }