62 lines
1.7 KiB
TypeScript
62 lines
1.7 KiB
TypeScript
// @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' } }
|
|
);
|
|
}
|
|
};
|