import { z } from 'zod'; import { getCompareDate } from '@/lib/date'; import { getQueryFilters, parseRequest } from '@/lib/request'; import { json, unauthorized } from '@/lib/response'; import { dateRangeParams, filterParams } from '@/lib/schema'; import { canViewWebsite } from '@/permissions'; import { getPageviewStats, getSessionStats } from '@/queries/sql'; export async function GET( request: Request, { params }: { params: Promise<{ websiteId: string }> }, ) { const schema = z.object({ ...dateRangeParams, ...filterParams, }); const { auth, query, error } = await parseRequest(request, schema); if (error) { return error(); } const { websiteId } = await params; if (!(await canViewWebsite(auth, websiteId))) { return unauthorized(); } const filters = await getQueryFilters(query, websiteId); const [pageviews, sessions] = await Promise.all([ getPageviewStats(websiteId, filters), getSessionStats(websiteId, filters), ]); if (filters.compare) { const { startDate: compareStartDate, endDate: compareEndDate } = getCompareDate( filters.compare, filters.startDate, filters.endDate, ); const [comparePageviews, compareSessions] = await Promise.all([ getPageviewStats(websiteId, { ...filters, startDate: compareStartDate, endDate: compareEndDate, }), getSessionStats(websiteId, { ...filters, startDate: compareStartDate, endDate: compareEndDate, }), ]); return json({ pageviews, sessions, startDate: filters.startDate, endDate: filters.endDate, compare: { pageviews: comparePageviews, sessions: compareSessions, startDate: compareStartDate, endDate: compareEndDate, }, }); } return json({ pageviews, sessions }); }