1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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(),
};
}
|