umami/src/queries/analytics/getRealtimeData.ts

81 lines
2.1 KiB
TypeScript
Raw Normal View History

2024-08-24 02:23:04 +00:00
import { getPageviewStats, getRealtimeActivity, getSessionStats } from 'queries/index';
2024-06-20 04:47:27 +00:00
function increment(data: object, key: string) {
if (key) {
if (!data[key]) {
data[key] = 1;
} else {
data[key] += 1;
}
}
}
2024-08-24 02:23:04 +00:00
export async function getRealtimeData(
websiteId: string,
criteria: { startDate: Date; timezone: string },
) {
const { startDate, timezone } = criteria;
const filters = { startDate, endDate: new Date(), unit: 'minute', timezone };
2024-08-21 06:58:20 +00:00
const [activity, pageviews, sessions] = await Promise.all([
getRealtimeActivity(websiteId, filters),
2024-06-20 04:47:27 +00:00
getPageviewStats(websiteId, filters),
getSessionStats(websiteId, filters),
2022-07-12 21:14:36 +00:00
]);
2024-06-20 04:47:27 +00:00
const uniques = new Set();
2024-08-21 06:58:20 +00:00
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;
2024-06-20 04:47:27 +00:00
2024-08-21 06:58:20 +00:00
if (!uniques.has(sessionId)) {
uniques.add(sessionId);
2024-06-20 04:47:27 +00:00
increment(countries, country);
2023-02-18 05:42:42 +00:00
2024-08-21 06:58:20 +00:00
events.push({ __type: 'session', ...event });
2023-12-10 04:55:50 +00:00
}
2024-06-20 04:47:27 +00:00
increment(urls, urlPath);
increment(referrers, referrerDomain);
2024-08-21 06:58:20 +00:00
events.push({ __type: eventName ? 'event' : 'pageview', ...event });
2024-06-20 04:47:27 +00:00
return obj;
},
{
2024-08-21 06:58:20 +00:00
countries: {},
2024-06-20 04:47:27 +00:00
urls: {},
referrers: {},
events: [],
},
);
2023-12-10 04:55:50 +00:00
2023-02-18 05:42:42 +00:00
return {
2024-08-21 06:58:20 +00:00
countries,
urls,
referrers,
events: events.reverse(),
2024-06-20 04:47:27 +00:00
series: {
views: pageviews,
2024-08-21 06:58:20 +00:00
visitors: sessions,
2024-06-20 04:47:27 +00:00
},
totals: {
2024-08-21 22:08:22 +00:00
views: pageviews.reduce((sum: number, { y }: { y: number }) => Number(sum) + Number(y), 0),
visitors: sessions.reduce((sum: number, { y }: { y: number }) => Number(sum) + Number(y), 0),
2024-08-21 06:58:20 +00:00
events: activity.filter(e => e.eventName).length,
countries: Object.keys(countries).length,
2024-06-20 04:47:27 +00:00
},
2022-07-12 21:14:36 +00:00
timestamp: Date.now(),
};
}