import { NextResponse } from "next/server"; import pg from "pg"; export const dynamic = "force-dynamic"; export const runtime = "nodejs"; const { Pool } = pg; function pool() { if (!process.env.DATABASE_URL) { return null; } globalThis.__robertsearesPageLoadPool ||= new Pool({ connectionString: process.env.DATABASE_URL, max: 2, idleTimeoutMillis: 30_000, connectionTimeoutMillis: 10_000, }); return globalThis.__robertsearesPageLoadPool; } function text(value, maxLength) { if (typeof value !== "string") { return null; } const trimmed = value.trim(); return trimmed ? trimmed.slice(0, maxLength) : null; } function object(value) { return value && typeof value === "object" && !Array.isArray(value) ? value : {}; } export async function POST(request) { const database = pool(); if (!database) { return new NextResponse(null, { status: 202 }); } try { const body = await request.json(); const path = text(body.path, 512) || "/"; const locale = text(body.locale, 16); const referrer = text(body.referrer, 2048); const userAgent = text(request.headers.get("user-agent"), 2048); const viewport = object(body.viewport); const metadata = { ...object(body.metadata), forwardedFor: text(request.headers.get("x-forwarded-for"), 2048), country: text(request.headers.get("cf-ipcountry"), 16) || text(request.headers.get("x-vercel-ip-country"), 16) || text(request.headers.get("x-country-code"), 16), }; await database.query( `INSERT INTO robertseares_page_loads (path, locale, referrer, user_agent, viewport, metadata) VALUES ($1, $2, $3, $4, $5::jsonb, $6::jsonb)`, [path, locale, referrer, userAgent, JSON.stringify(viewport), JSON.stringify(metadata)], ); } catch (error) { console.warn("page load tracking failed", error); } return new NextResponse(null, { status: 204 }); } export function GET() { return NextResponse.json({ ok: true }); }