85 lines
2.8 KiB
TypeScript
85 lines
2.8 KiB
TypeScript
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<number>`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 });
|
|
}
|
|
}
|
|
|