import { errorResponse } from "@/lib/security/http"; import { limitRequest, trustedClientAddress } from "@/lib/security/rate-limit"; import { connection } from "next/server"; import { and, eq, isNull } from "drizzle-orm"; import { getDb } from "@/db"; import { guides } from "@/db/schema"; import { getAdminSession } from "@/lib/auth/server"; import { createRedisEventResponse, } from "@/lib/events/redis-stream"; const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu; export async function GET( request: Request, { params }: { params: Promise<{ id: string }> }, ) { await connection(); const { id } = await params; if (!UUID_PATTERN.test(id)) { return Response.json({ error: "invalid-page-id" }, { status: 400 }); } try { await limitRequest("stream-open", trustedClientAddress(request.headers), 60); const [published] = await getDb().select({ id: guides.id }).from(guides) .where(and(eq(guides.id, id), eq(guides.isPublic, true), isNull(guides.trashedAt))).limit(1); if (!published && !(await getAdminSession())) { return new Response(null, { status: 404, headers: { "Cache-Control": "no-store" } }); } return await createRedisEventResponse(`page:${id}`, request.signal); } catch (cause) { return errorResponse(cause); } }