aboutsummaryrefslogtreecommitdiff
path: root/src/queries/sql/getRealtimeData.ts
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-01-24 13:09:50 +0000
committerFuwn <[email protected]>2026-01-24 13:09:50 +0000
commit396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b (patch)
treeb9df4ca6a70db45cfffbae6fdd7252e20fb8e93c /src/queries/sql/getRealtimeData.ts
downloadumami-396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b.tar.xz
umami-396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b.zip
Initial commitHEADmain
Created from https://vercel.com/new
Diffstat (limited to 'src/queries/sql/getRealtimeData.ts')
-rw-r--r--src/queries/sql/getRealtimeData.ts78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/queries/sql/getRealtimeData.ts b/src/queries/sql/getRealtimeData.ts
new file mode 100644
index 0000000..4b97cb0
--- /dev/null
+++ b/src/queries/sql/getRealtimeData.ts
@@ -0,0 +1,78 @@
+import type { QueryFilters } from '@/lib/types';
+import { getRealtimeActivity } from '@/queries/sql/getRealtimeActivity';
+import { getPageviewStats } from '@/queries/sql/pageviews/getPageviewStats';
+import { getSessionStats } from '@/queries/sql/sessions/getSessionStats';
+
+function increment(data: object, key: string) {
+ if (key) {
+ if (!data[key]) {
+ data[key] = 1;
+ } else {
+ data[key] += 1;
+ }
+ }
+}
+
+export async function getRealtimeData(websiteId: string, filters: QueryFilters) {
+ const [activity, pageviews, sessions] = await Promise.all([
+ getRealtimeActivity(websiteId, filters),
+ getPageviewStats(websiteId, filters),
+ getSessionStats(websiteId, filters),
+ ]);
+
+ const uniques = new Set();
+
+ const { countries, urls, referrers, events } = activity.reverse().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(sessionId)) {
+ uniques.add(sessionId);
+ increment(countries, country);
+
+ events.push({ __type: 'session', ...event });
+ }
+
+ increment(urls, urlPath);
+ increment(referrers, referrerDomain);
+
+ events.push({ __type: eventName ? 'event' : 'pageview', ...event });
+
+ return obj;
+ },
+ {
+ countries: {},
+ urls: {},
+ referrers: {},
+ events: [],
+ },
+ );
+
+ return {
+ countries,
+ urls,
+ referrers,
+ events: events.reverse(),
+ series: {
+ views: pageviews,
+ visitors: sessions,
+ },
+ totals: {
+ 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),
+ events: activity.filter(e => e.eventName).length,
+ countries: Object.keys(countries).length,
+ },
+ timestamp: Date.now(),
+ };
+}