import { NextRequest, NextResponse } from "next/server"; import { db } from "@/lib/db"; import { generatedImage, user, aiModel } from "@/lib/db/schema"; import { eq, desc, sql } from "drizzle-orm"; import { auth } from "@/app/(auth)/auth"; // GET: 获取精选图片列表 export async function GET(request: NextRequest) { try { const session = await auth(); if (!session?.user?.id) { return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); } const searchParams = request.nextUrl.searchParams; const page = Number.parseInt(searchParams.get("page") || "1"); const pageSize = Number.parseInt(searchParams.get("pageSize") || "24"); const offset = (page - 1) * pageSize; // 查询精选图片,关联用户和模型信息 const featuredImages = await db .select({ id: generatedImage.id, thumbnailUrl: generatedImage.thumbnailUrl, originalUrl: generatedImage.originalUrl, imageSize: generatedImage.imageSize, prompt: generatedImage.prompt, modelId: generatedImage.modelId, createdAt: generatedImage.createdAt, featuredAt: generatedImage.featuredAt, userId: generatedImage.userId, userName: user.name, userEmail: user.email, userDepartment: user.department, modelName: aiModel.displayName, }) .from(generatedImage) .leftJoin(user, eq(generatedImage.userId, user.id)) .leftJoin(aiModel, eq(generatedImage.modelId, aiModel.modelId)) .where(eq(generatedImage.isFeatured, true)) .orderBy(desc(generatedImage.featuredAt)) .limit(pageSize) .offset(offset); // 获取总数 const totalResult = await db .select({ count: sql`count(*)::int` }) .from(generatedImage) .where(eq(generatedImage.isFeatured, true)); const total = totalResult[0]?.count || 0; const totalPages = Math.ceil(total / pageSize); return NextResponse.json({ images: featuredImages.map(img => ({ id: img.id, thumbnailUrl: img.thumbnailUrl, originalUrl: img.originalUrl, imageSize: img.imageSize, prompt: img.prompt, modelId: img.modelId, modelName: img.modelName || img.modelId || "未知模型", createdAt: img.createdAt, featuredAt: img.featuredAt, user: { id: img.userId, name: img.userName || img.userEmail?.split("@")[0] || "未知用户", department: img.userDepartment || "未设置部门", }, })), pagination: { page, pageSize, total, totalPages, }, }); } catch (error) { console.error("[Featured API] Error:", error); return NextResponse.json({ error: "Failed to fetch featured images" }, { status: 500 }); } }