77 lines
2.3 KiB
TypeScript
77 lines
2.3 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { db } from "@/lib/db";
|
|
import { generatedImage } from "@/lib/db/schema";
|
|
import { eq, desc, sql } from "drizzle-orm";
|
|
import { auth } from "@/app/(auth)/auth";
|
|
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const session = await auth();
|
|
|
|
if (!session?.user?.id) {
|
|
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
}
|
|
|
|
const userId = session.user.id;
|
|
|
|
// 获取分页参数
|
|
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 countResult = await db
|
|
.select({ count: sql<number>`count(*)::int` })
|
|
.from(generatedImage)
|
|
.where(eq(generatedImage.userId, userId));
|
|
|
|
const total = countResult[0]?.count || 0;
|
|
|
|
// 查询当前用户的所有生成图片(分页)
|
|
const images = await db
|
|
.select({
|
|
id: generatedImage.id,
|
|
messageId: generatedImage.messageId,
|
|
url: generatedImage.originalUrl, // 使用原图 URL
|
|
thumbnailUrl: generatedImage.thumbnailUrl,
|
|
alt: generatedImage.prompt, // 使用 prompt 作为 alt
|
|
imageSize: generatedImage.imageSize,
|
|
createdAt: generatedImage.createdAt,
|
|
chatId: generatedImage.chatId,
|
|
})
|
|
.from(generatedImage)
|
|
.where(eq(generatedImage.userId, userId))
|
|
.orderBy(desc(generatedImage.createdAt))
|
|
.limit(pageSize)
|
|
.offset(offset);
|
|
|
|
// 格式化返回数据
|
|
const formattedImages = images.map((img) => ({
|
|
id: img.id,
|
|
messageId: img.messageId,
|
|
url: img.url,
|
|
thumbnailUrl: img.thumbnailUrl,
|
|
alt: img.alt || "AI生成的图片",
|
|
imageSize: img.imageSize,
|
|
createdAt: img.createdAt,
|
|
chatId: img.chatId,
|
|
}));
|
|
|
|
const totalPages = Math.ceil(total / pageSize);
|
|
|
|
return NextResponse.json({
|
|
images: formattedImages,
|
|
pagination: {
|
|
page,
|
|
pageSize,
|
|
total,
|
|
totalPages,
|
|
}
|
|
});
|
|
} catch (error) {
|
|
console.error("[Gallery API] Error:", error);
|
|
return NextResponse.json({ error: "Failed to fetch gallery" }, { status: 500 });
|
|
}
|
|
}
|