deploy
This commit is contained in:
71
frontend/app/track/page-load/route.js
Normal file
71
frontend/app/track/page-load/route.js
Normal file
@@ -0,0 +1,71 @@
|
||||
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 });
|
||||
}
|
||||
Reference in New Issue
Block a user