99 lines
3.1 KiB
TypeScript
99 lines
3.1 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import prisma from '../../../../../lib/prisma';
|
|
|
|
export async function GET(
|
|
request: NextRequest,
|
|
{ params }: { params: Promise<{ id: string }> }
|
|
) {
|
|
try {
|
|
const { id } = await params;
|
|
|
|
if (!id) {
|
|
return NextResponse.json({ error: 'ID Business requis' }, { status: 400 });
|
|
}
|
|
|
|
// 1. Get total views from AnalyticsEvent
|
|
const totalViews = await prisma.analyticsEvent.count({
|
|
where: {
|
|
type: 'BUSINESS_VIEW',
|
|
metadata: {
|
|
path: ['businessId'],
|
|
equals: id
|
|
}
|
|
}
|
|
});
|
|
|
|
// 2. Get contact clicks from AnalyticsEvent
|
|
const contactClicks = await prisma.analyticsEvent.count({
|
|
where: {
|
|
type: 'BUSINESS_CONTACT_CLICK',
|
|
metadata: {
|
|
path: ['businessId'],
|
|
equals: id
|
|
}
|
|
}
|
|
});
|
|
|
|
// 3. Get monthly stats (views per day for last 30 days)
|
|
const thirtyDaysAgo = new Date();
|
|
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
|
|
thirtyDaysAgo.setHours(0, 0, 0, 0);
|
|
|
|
const recentEvents = await prisma.analyticsEvent.findMany({
|
|
where: {
|
|
createdAt: { gte: thirtyDaysAgo },
|
|
metadata: {
|
|
path: ['businessId'],
|
|
equals: id
|
|
}
|
|
},
|
|
select: {
|
|
type: true,
|
|
createdAt: true
|
|
},
|
|
orderBy: {
|
|
createdAt: 'asc'
|
|
}
|
|
});
|
|
|
|
// 4. Process events into daily stats
|
|
const statsMap = new Map<string, { date: string, views: number, clicks: number }>();
|
|
|
|
// Initialize last 30 days with 0
|
|
for (let i = 0; i <= 30; i++) {
|
|
const date = new Date();
|
|
date.setDate(date.getDate() - i);
|
|
const dateStr = date.toISOString().split('T')[0];
|
|
const displayDate = date.toLocaleDateString('fr-FR', { day: 'numeric', month: 'short' });
|
|
statsMap.set(dateStr, { date: displayDate, views: 0, clicks: 0 });
|
|
}
|
|
|
|
recentEvents.forEach(event => {
|
|
const dateStr = event.createdAt.toISOString().split('T')[0];
|
|
if (statsMap.has(dateStr)) {
|
|
const dayStat = statsMap.get(dateStr)!;
|
|
if (event.type === 'BUSINESS_VIEW') {
|
|
dayStat.views++;
|
|
} else if (event.type === 'BUSINESS_CONTACT_CLICK') {
|
|
dayStat.clicks++;
|
|
}
|
|
}
|
|
});
|
|
|
|
// Convert Map to sorted array
|
|
const dailyStats = Array.from(statsMap.values()).reverse(); // Older to newer
|
|
|
|
return NextResponse.json({
|
|
businessId: id,
|
|
totalViews,
|
|
contactClicks,
|
|
dailyStats,
|
|
updatedAt: new Date().toISOString()
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('Error fetching business analytics:', error);
|
|
return NextResponse.json({ error: 'Erreur serveur' }, { status: 500 });
|
|
}
|
|
}
|