Files
afrov2/app/api/analytics/route.ts

63 lines
2.3 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
import { isIP } from 'node:net';
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 || typeof type !== 'string' || typeof path !== 'string') {
return NextResponse.json({ error: 'Type et Path requis' }, { status: 400 });
}
// Extract detailed info from headers
const userAgent = (request.headers.get('user-agent') || '').slice(0, 500);
const referrer = (request.headers.get('referer') || '').slice(0, 500);
const rawForwardedIp = request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() || '127.0.0.1';
const ip = isIP(rawForwardedIp) !== 0 ? rawForwardedIp : '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 } = await getGeoInfo(ip, request.headers);
const event = await prisma.analyticsEvent.create({
data: {
type: type.slice(0, 100),
path: path.slice(0, 500),
label: typeof label === 'string' ? label.slice(0, 200) : null,
value: typeof value === 'number' ? value : null,
metadata: metadata && typeof metadata === 'object' ? metadata : {},
ip,
country,
browser,
os,
device,
referrer,
userId: typeof metadata?.userId === 'string' ? 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 });
}
}