yiekheng 57255e2624 Add signed R2 URLs, batched page fetching, and 3D chapter badges
- Sign all image URLs server-side with 60s expiry presigned URLs
- Add /api/pages endpoint for batched page fetching (7 per batch)
- PageReader prefetches next batch when user scrolls to 3rd page
- Move chapter count badge outside overflow-hidden for 3D effect
- Fix missing URL signing on search and genre pages
- Extract signCoverUrls helper to reduce duplication
- Clamp API limit param to prevent abuse

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 21:15:01 +08:00

31 lines
897 B
TypeScript

import { prisma } from "@/lib/db";
import { signUrl } from "@/lib/r2";
export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const chapterId = parseInt(searchParams.get("chapterId") ?? "", 10);
const offset = Math.max(parseInt(searchParams.get("offset") ?? "0", 10), 0);
const limit = Math.min(Math.max(parseInt(searchParams.get("limit") ?? "7", 10), 1), 20);
if (isNaN(chapterId)) {
return Response.json({ error: "Missing chapterId" }, { status: 400 });
}
const pages = await prisma.page.findMany({
where: { chapterId },
orderBy: { number: "asc" },
skip: offset,
take: limit,
select: { number: true, imageUrl: true },
});
const signedPages = await Promise.all(
pages.map(async (p) => ({
number: p.number,
imageUrl: await signUrl(p.imageUrl),
}))
);
return Response.json(signedPages);
}