Updated realtime data fetch.

This commit is contained in:
Mike Cao 2024-08-20 23:58:20 -07:00
parent 04e0b33622
commit e35c11c3d6
9 changed files with 126 additions and 87 deletions

View file

@ -1,11 +1,4 @@
import {
getWebsiteSessions,
getWebsiteEvents,
getPageviewStats,
getSessionStats,
} from 'queries/index';
const MAX_SIZE = 50;
import { getRealtimeActivity, getPageviewStats, getSessionStats } from 'queries/index';
function increment(data: object, key: string) {
if (key) {
@ -17,61 +10,47 @@ function increment(data: object, key: string) {
}
}
export async function getRealtimeData(
websiteId: string,
criteria: { startDate: Date; timezone: string },
) {
const { startDate, timezone } = criteria;
const filters = { startDate, endDate: new Date(), unit: 'minute', timezone };
const [events, sessions, pageviews, sessionviews] = await Promise.all([
getWebsiteEvents(websiteId, { startDate, timezone }, { pageSize: 10000 }),
getWebsiteSessions(websiteId, { startDate, timezone }, { pageSize: 10000 }),
export async function getRealtimeData(websiteId: string, criteria: { startDate: Date }) {
const { startDate } = criteria;
const filters = { startDate, endDate: new Date(), unit: 'minute' };
const [activity, pageviews, sessions] = await Promise.all([
getRealtimeActivity(websiteId, filters),
getPageviewStats(websiteId, filters),
getSessionStats(websiteId, filters),
]);
const uniques = new Set();
const sessionStats = sessions.data.reduce(
(obj: { visitors: any; countries: any }, session: { id: any; country: any }) => {
const { countries, visitors } = obj;
const { id, country } = session;
const { countries, urls, referrers, events } = activity.reduce(
(
obj: { countries: any; urls: any; referrers: any; events: any },
event: {
sessionId: string;
urlPath: string;
referrerDomain: string;
country: string;
eventName: string;
},
) => {
const { countries, urls, referrers, events } = obj;
const { sessionId, urlPath, referrerDomain, country, eventName } = event;
if (!uniques.has(id)) {
uniques.add(id);
if (!uniques.has(sessionId)) {
uniques.add(sessionId);
increment(countries, country);
if (visitors.length < MAX_SIZE) {
visitors.push(session);
}
events.push({ __type: 'session', ...event });
}
increment(urls, urlPath);
increment(referrers, referrerDomain);
events.push({ __type: eventName ? 'event' : 'pageview', ...event });
return obj;
},
{
countries: {},
visitors: [],
},
);
const eventStats = events.data.reduce(
(
obj: { urls: any; referrers: any; events: any },
event: { urlPath: any; referrerDomain: any },
) => {
const { urls, referrers, events } = obj;
const { urlPath, referrerDomain } = event;
increment(urls, urlPath);
increment(referrers, referrerDomain);
if (events.length < MAX_SIZE) {
events.push(event);
}
return obj;
},
{
urls: {},
referrers: {},
events: [],
@ -79,17 +58,19 @@ export async function getRealtimeData(
);
return {
...sessionStats,
...eventStats,
countries,
urls,
referrers,
events: events.reverse(),
series: {
views: pageviews,
visitors: sessionviews,
visitors: sessions,
},
totals: {
views: events.data.filter(e => !e.eventName).length,
visitors: uniques.size,
events: events.data.filter(e => e.eventName).length,
countries: Object.keys(sessionStats.countries).length,
views: pageviews.reduce((sum: number, { y }: { y: number }) => sum + y, 0),
visitors: sessions.reduce((sum: number, { y }: { y: number }) => sum + y, 0),
events: activity.filter(e => e.eventName).length,
countries: Object.keys(countries).length,
},
timestamp: Date.now(),
};