import { NextRequest, NextResponse } from "next/server"; import { db } from "@/lib/db"; import { sql } from "drizzle-orm"; import { requireAdmin } from "@/lib/middleware/admin"; import { ChatSDKError } from "@/lib/errors"; import { parseMediaQuery } from "@/lib/admin/media-records"; export async function GET(request: NextRequest) { try { await requireAdmin(); const q = parseMediaQuery(request.nextUrl.searchParams); const status = request.nextUrl.searchParams.get("status") || "all"; const filters = [sql`true`]; if (q.search) filters.push(sql`(u.name ilike ${`%${q.search}%`} or u.email ilike ${`%${q.search}%`})`); if (["pending", "running", "failed", "succeeded"].includes(status)) filters.push(sql`t.status=${status}`); if (q.startDate) filters.push(sql`t."createdAt">=${q.startDate}::date - interval '8 hours'`); if (q.endDate) filters.push(sql`t."createdAt"<${q.endDate}::date+interval '16 hours'`); const [result] = await db.execute(sql`with filtered as not materialized ( select t.id,u.name as "userName",t.status,t."createdAt"+interval '8 hours' as "createdAt",t.error,coalesce(t.request->>'modelId',t.request->>'model') as model, extract(epoch from (t."completedAt"-t."startedAt"))*1000 as "elapsedMs" from "CanvasImageTask" t left join "User" u on u.id=t."userId" where ${sql.join(filters, sql` and `)} ) select (select count(*)::int from filtered) as total, coalesce((select jsonb_agg(p) from (select * from filtered order by "createdAt" desc,id desc limit ${q.pageSize} offset ${(q.page - 1) * q.pageSize}) p),'[]'::jsonb) as tasks`); return NextResponse.json(result); } catch (error) { if (error instanceof ChatSDKError) return error.toResponse(); return NextResponse.json({ error: "任务记录加载失败,请重试" }, { status: 500 }); } }