diff options
| author | Fuwn <[email protected]> | 2026-01-24 13:09:50 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-01-24 13:09:50 +0000 |
| commit | 396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b (patch) | |
| tree | b9df4ca6a70db45cfffbae6fdd7252e20fb8e93c /src/queries/sql/getRealtimeData.ts | |
| download | umami-396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b.tar.xz umami-396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b.zip | |
Created from https://vercel.com/new
Diffstat (limited to 'src/queries/sql/getRealtimeData.ts')
| -rw-r--r-- | src/queries/sql/getRealtimeData.ts | 78 |
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(), + }; +} |