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/getRealtimeActivity.ts | |
| download | umami-main.tar.xz umami-main.zip | |
Created from https://vercel.com/new
Diffstat (limited to 'src/queries/sql/getRealtimeActivity.ts')
| -rw-r--r-- | src/queries/sql/getRealtimeActivity.ts | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/queries/sql/getRealtimeActivity.ts b/src/queries/sql/getRealtimeActivity.ts new file mode 100644 index 0000000..075b65e --- /dev/null +++ b/src/queries/sql/getRealtimeActivity.ts @@ -0,0 +1,80 @@ +import clickhouse from '@/lib/clickhouse'; +import { CLICKHOUSE, PRISMA, runQuery } from '@/lib/db'; +import prisma from '@/lib/prisma'; +import type { QueryFilters } from '@/lib/types'; + +const FUNCTION_NAME = 'getRealtimeActivity'; + +export async function getRealtimeActivity(...args: [websiteId: string, filters: QueryFilters]) { + return runQuery({ + [PRISMA]: () => relationalQuery(...args), + [CLICKHOUSE]: () => clickhouseQuery(...args), + }); +} + +async function relationalQuery(websiteId: string, filters: QueryFilters) { + const { rawQuery, parseFilters } = prisma; + const { queryParams, filterQuery, cohortQuery, dateQuery } = parseFilters({ + ...filters, + websiteId, + }); + + return rawQuery( + ` + select + website_event.session_id as "sessionId", + website_event.event_name as "eventName", + website_event.created_at as "createdAt", + session.browser, + session.os, + session.device, + session.country, + website_event.url_path as "urlPath", + website_event.referrer_domain as "referrerDomain" + from website_event + ${cohortQuery} + inner join session + on session.session_id = website_event.session_id + and session.website_id = website_event.website_id + where website_event.website_id = {{websiteId::uuid}} + ${filterQuery} + ${dateQuery} + order by website_event.created_at desc + limit 100 + `, + queryParams, + FUNCTION_NAME, + ); +} + +async function clickhouseQuery(websiteId: string, filters: QueryFilters): Promise<{ x: number }> { + const { rawQuery, parseFilters } = clickhouse; + const { queryParams, filterQuery, cohortQuery, dateQuery } = parseFilters({ + ...filters, + websiteId, + }); + + return rawQuery( + ` + select + session_id as sessionId, + event_name as eventName, + created_at as createdAt, + browser, + os, + device, + country, + url_path as urlPath, + referrer_domain as referrerDomain + from website_event + ${cohortQuery} + where website_id = {websiteId:UUID} + ${filterQuery} + ${dateQuery} + order by createdAt desc + limit 100 + `, + queryParams, + FUNCTION_NAME, + ); +} |