65 lines
1.7 KiB
TypeScript
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
|
|
}
|
|
}
|