feat: Complete analytics system with GTM, GA4, Clarity, Ads tracking, bot detection
This commit is contained in:
61
frontend/src/pages/api/track/event.ts
Normal file
61
frontend/src/pages/api/track/event.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
// @ts-ignore - Astro types available at build time
|
||||
import type { APIRoute } from 'astro';
|
||||
import { getDirectusClient, createItem } from '@/lib/directus/client';
|
||||
|
||||
/**
|
||||
* Event Tracking API
|
||||
*
|
||||
* Records custom events (form submits, button clicks, scroll depth, etc.)
|
||||
*
|
||||
* POST /api/track/event
|
||||
*/
|
||||
export const POST: APIRoute = async ({ request }: { request: Request }) => {
|
||||
try {
|
||||
const data = await request.json();
|
||||
const {
|
||||
site_id,
|
||||
event_name,
|
||||
event_category,
|
||||
event_label,
|
||||
event_value,
|
||||
page_path,
|
||||
session_id,
|
||||
visitor_id,
|
||||
metadata
|
||||
} = data;
|
||||
|
||||
if (!site_id || !event_name) {
|
||||
return new Response(
|
||||
JSON.stringify({ error: 'site_id and event_name are required' }),
|
||||
{ status: 400, headers: { 'Content-Type': 'application/json' } }
|
||||
);
|
||||
}
|
||||
|
||||
const directus = getDirectusClient();
|
||||
|
||||
await directus.request(
|
||||
createItem('events', {
|
||||
site: site_id,
|
||||
event_name,
|
||||
event_category,
|
||||
event_label,
|
||||
event_value,
|
||||
page_path,
|
||||
session_id,
|
||||
visitor_id,
|
||||
metadata
|
||||
})
|
||||
);
|
||||
|
||||
return new Response(
|
||||
JSON.stringify({ success: true }),
|
||||
{ status: 200, headers: { 'Content-Type': 'application/json' } }
|
||||
);
|
||||
} catch (error) {
|
||||
console.error('Error tracking event:', error);
|
||||
return new Response(
|
||||
JSON.stringify({ error: 'Failed to track event' }),
|
||||
{ status: 500, headers: { 'Content-Type': 'application/json' } }
|
||||
);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user