68 lines
1.8 KiB
TypeScript
68 lines
1.8 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { trackEvent, EventType, ConversionType } from '@/lib/analytics';
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
// 解析请求体
|
|
const body = await request.json();
|
|
|
|
// 验证必要字段
|
|
if (!body.linkId) {
|
|
return NextResponse.json(
|
|
{ error: 'Missing required field: linkId' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
if (!body.eventType || !Object.values(EventType).includes(body.eventType)) {
|
|
return NextResponse.json(
|
|
{
|
|
error: 'Invalid or missing eventType',
|
|
validValues: Object.values(EventType)
|
|
},
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
// 验证转化类型(如果提供)
|
|
if (
|
|
body.conversionType &&
|
|
!Object.values(ConversionType).includes(body.conversionType)
|
|
) {
|
|
return NextResponse.json(
|
|
{
|
|
error: 'Invalid conversionType',
|
|
validValues: Object.values(ConversionType)
|
|
},
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
// 添加客户端IP
|
|
const clientIp = request.headers.get('x-forwarded-for') ||
|
|
request.headers.get('x-real-ip') ||
|
|
'0.0.0.0';
|
|
|
|
// 添加用户代理
|
|
const userAgent = request.headers.get('user-agent') || '';
|
|
|
|
// 合并数据
|
|
const eventData = {
|
|
...body,
|
|
ipAddress: body.ipAddress || clientIp,
|
|
userAgent: body.userAgent || userAgent,
|
|
};
|
|
|
|
// 追踪事件
|
|
const result = await trackEvent(eventData);
|
|
|
|
// 返回结果
|
|
return NextResponse.json(result);
|
|
} catch (error) {
|
|
console.error('Error in track API:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Failed to track event' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|