import { desc, eq } from "drizzle-orm"; import { NextResponse } from "next/server"; import { requireAdmin } from "@/lib/middleware/admin"; import { db } from "@/lib/db"; import { externalImageApiRequestLog, user } from "@/lib/db/schema"; import { ChatSDKError } from "@/lib/errors"; export const runtime = "nodejs"; export const maxDuration = 60; export async function GET(request: Request) { try { await requireAdmin(); const { searchParams } = new URL(request.url); const limit = Math.min( 100, Math.max(1, Number.parseInt(searchParams.get("limit") || "50", 10)), ); const rows = await db .select({ id: externalImageApiRequestLog.id, apiKeyId: externalImageApiRequestLog.apiKeyId, apiKeyName: externalImageApiRequestLog.apiKeyName, ownerUserId: externalImageApiRequestLog.ownerUserId, ownerUserEmail: user.email, ownerUserName: user.name, modelDbId: externalImageApiRequestLog.modelDbId, modelRuntimeId: externalImageApiRequestLog.modelRuntimeId, modelDisplayName: externalImageApiRequestLog.modelDisplayName, prompt: externalImageApiRequestLog.prompt, negativePrompt: externalImageApiRequestLog.negativePrompt, imageCount: externalImageApiRequestLog.imageCount, aspectRatio: externalImageApiRequestLog.aspectRatio, imageSize: externalImageApiRequestLog.imageSize, status: externalImageApiRequestLog.status, requesterIp: externalImageApiRequestLog.requesterIp, requesterUserAgent: externalImageApiRequestLog.requesterUserAgent, requestPayload: externalImageApiRequestLog.requestPayload, responsePayload: externalImageApiRequestLog.responsePayload, generatedImageIds: externalImageApiRequestLog.generatedImageIds, generatedAssetIds: externalImageApiRequestLog.generatedAssetIds, generatedImageUrls: externalImageApiRequestLog.generatedImageUrls, errorMessage: externalImageApiRequestLog.errorMessage, durationMs: externalImageApiRequestLog.durationMs, createdAt: externalImageApiRequestLog.createdAt, completedAt: externalImageApiRequestLog.completedAt, }) .from(externalImageApiRequestLog) .leftJoin(user, eq(externalImageApiRequestLog.ownerUserId, user.id)) .orderBy(desc(externalImageApiRequestLog.createdAt)) .limit(limit); return NextResponse.json({ success: true, data: { logs: rows, }, }); } catch (error) { if (error instanceof ChatSDKError) { return error.toResponse(); } console.error("[Admin External Image API Logs] GET failed:", error); return NextResponse.json( { success: false, error: error instanceof Error ? error.message : "获取日志失败", }, { status: 500 }, ); } }