import type { Metadata } from "next"; import { headers } from "next/headers"; import { eq } from "drizzle-orm"; import { resolveShareToken } from "@/modules/_core/share"; import { getEntityType } from "@/modules/_core/registry"; import { isRateLimited, recordFailure } from "@/lib/rate-limit"; import { db } from "@/lib/db"; import { users } from "@/modules/_core/schema"; import { ShareFrame } from "@/components/share/share-frame"; export const metadata: Metadata = { robots: { index: false, follow: false }, }; const RL_PREFIX_LEN = 8; export default async function SharePage({ params }: { params: Promise<{ token: string }> }) { const { token } = await params; const headersList = await headers(); const ip = headersList.get("x-forwarded-for")?.split(",")[0]?.trim() ?? headersList.get("x-real-ip") ?? "0.0.0.0"; const rlKey = `${ip}:${token.slice(0, RL_PREFIX_LEN)}`; if (isRateLimited(rlKey)) { return ; } const resolved = await resolveShareToken(token); if (!resolved) { recordFailure(rlKey); return ; } const entityReg = getEntityType(resolved.entityType); if (!entityReg?.loadForShare || !entityReg.renderSharedView) { return ; } const data = await entityReg.loadForShare(resolved.entityId); if (!data) { recordFailure(rlKey); return ; } // Best-effort lookup of the creator's display name. Doesn't reveal email. const [creator] = resolved.createdBy ? await db .select({ name: users.name }) .from(users) .where(eq(users.id, resolved.createdBy)) .limit(1) : []; return ( {entityReg.renderSharedView({ data, capabilities: resolved.capabilities, token })} ); } function ShareRateLimitError() { return (

Too many requests

You have made too many requests in a short period. Please wait a minute and try again.

); } function ShareError({ message }: { message?: string }) { return (

Link not found

{message ?? "This share link may have expired or been revoked. Ask the sender for a new link."}

); }