72 lines
2.0 KiB
JavaScript
72 lines
2.0 KiB
JavaScript
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 });
|
|
}
|