import { z } from 'zod'; import { canViewWebsite } from 'lib/auth'; import { getRequestFilters, getRequestDateRange, parseRequest } from 'lib/request'; import { unitParam, timezoneParam, filterParams } from 'lib/schema'; import { getCompareDate } from 'lib/date'; import { unauthorized, json } from 'lib/response'; import { getPageviewStats, getSessionStats } from 'queries'; export async function GET( request: Request, { params }: { params: Promise<{ websiteId: string }> }, ) { const schema = z.object({ startAt: z.coerce.number().int(), endAt: z.coerce.number().int(), unit: unitParam, timezone: timezoneParam, compare: z.string().optional(), ...filterParams, }); const { auth, query, error } = await parseRequest(request, schema); if (error) { return error(); } const { websiteId } = await params; const { timezone, compare } = query; if (!(await canViewWebsite(auth, websiteId))) { return unauthorized(); } const { startDate, endDate, unit } = await getRequestDateRange(query); const filters = { ...getRequestFilters(query), startDate, endDate, timezone, unit, }; const [pageviews, sessions] = await Promise.all([ getPageviewStats(websiteId, filters), getSessionStats(websiteId, filters), ]); if (compare) { const { startDate: compareStartDate, endDate: compareEndDate } = getCompareDate( compare, startDate, 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, endDate, compare: { pageviews: comparePageviews, sessions: compareSessions, startDate: compareStartDate, endDate: compareEndDate, }, }); } return json({ pageviews, sessions }); }