61 lines
1.9 KiB
TypeScript
61 lines
1.9 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import prisma from '@/lib/prisma';
|
|
import { getGeoInfo } from '@/lib/geo';
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const body = await request.json();
|
|
const { type, path, label, value, metadata } = body;
|
|
|
|
if (!type || !path) {
|
|
return NextResponse.json({ error: 'Type et Path requis' }, { status: 400 });
|
|
}
|
|
|
|
// Extract detailed info from headers
|
|
const userAgent = request.headers.get('user-agent') || '';
|
|
const referrer = request.headers.get('referer') || '';
|
|
const ip = request.headers.get('x-forwarded-for')?.split(',')[0] || '127.0.0.1';
|
|
|
|
// Basic User-Agent parsing
|
|
const isMobile = /mobile/i.test(userAgent);
|
|
const device = isMobile ? 'Mobile' : 'Desktop';
|
|
|
|
let browser = 'Other';
|
|
if (/chrome|crios/i.test(userAgent)) browser = 'Chrome';
|
|
else if (/firefox|fxios/i.test(userAgent)) browser = 'Firefox';
|
|
else if (/safari/i.test(userAgent)) browser = 'Safari';
|
|
else if (/edge/i.test(userAgent)) browser = 'Edge';
|
|
|
|
let os = 'Other';
|
|
if (/windows/i.test(userAgent)) os = 'Windows';
|
|
else if (/macintosh/i.test(userAgent)) os = 'macOS';
|
|
else if (/android/i.test(userAgent)) os = 'Android';
|
|
else if (/iphone|ipad/i.test(userAgent)) os = 'iOS';
|
|
|
|
// Simple Country detection
|
|
const { country, city } = await getGeoInfo(ip, request.headers);
|
|
|
|
const event = await prisma.analyticsEvent.create({
|
|
data: {
|
|
type,
|
|
path,
|
|
label: label || null,
|
|
value: value || null,
|
|
metadata: metadata || {},
|
|
ip,
|
|
country,
|
|
browser,
|
|
os,
|
|
device,
|
|
referrer,
|
|
userId: metadata?.userId || null,
|
|
},
|
|
});
|
|
|
|
return NextResponse.json({ success: true, id: event.id });
|
|
} catch (error) {
|
|
console.error('Error recording analytics event:', error);
|
|
return NextResponse.json({ error: 'Erreur serveur' }, { status: 500 });
|
|
}
|
|
}
|