Your Name 349a362f27
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled
feat: 在相册中为变清晰后的图片添加右上角图标标识
2025-12-29 08:09:42 +08:00

79 lines
2.4 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,
modelId: generatedImage.modelId, // 添加 modelId 字段
})
.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,
modelId: img.modelId, // 添加 modelId 字段
}));
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 });
}
}