MBO-Tech-IT-Webseite/modules/03-analytics/files/app/api/analytics/track-phone-click/route.ts

65 lines
1.7 KiB
TypeScript

import { createServiceClient } from "@/lib/supabase";
import { isBot, anonymizeIp, parseDevice, parseBrowser, parseOs } from "@/lib/analytics";
export async function POST(request: Request) {
try {
const body = await request.json();
const { phone_number, source_page, source_element, session_id } = body;
// Validierung
if (!phone_number || !source_page || !source_element) {
return Response.json(
{ error: "Missing required fields: phone_number, source_page, source_element" },
{ status: 400 }
);
}
// IP + User-Agent extrahieren
const ip =
request.headers.get("x-forwarded-for")?.split(",")[0].trim() ||
request.headers.get("x-real-ip") ||
"0.0.0.0";
const ua = request.headers.get("user-agent") || "";
// Bot-Filter (silent skip)
if (isBot(ua)) {
return Response.json({ ok: true });
}
// Parsing
const device = parseDevice(ua);
const browser = parseBrowser(ua);
const os = parseOs(ua);
const ipAnon = anonymizeIp(ip);
// DB Insert
const supabase = createServiceClient();
const { error } = await supabase.from("phone_clicks").insert({
phone_number,
source_page,
source_element,
session_id: session_id || null,
ip_anonymized: ipAnon,
country: null,
region: null,
city: null,
device_type: device,
browser,
os,
user_agent: ua,
is_bot: false,
});
if (error) {
console.error("Phone click tracking error:", error);
return Response.json({ ok: true }); // Silent fail
}
return Response.json({ ok: true });
} catch (error) {
console.error("Phone click tracking exception:", error);
return Response.json({ ok: true }); // Silent fail
}
}