mirror of
https://github.com/umami-software/umami.git
synced 2026-02-11 08:07:12 +01:00
move queries
This commit is contained in:
parent
910f165103
commit
8aec6d7406
53 changed files with 920 additions and 485 deletions
28
queries/analytics/event/getEventMetrics.js
Normal file
28
queries/analytics/event/getEventMetrics.js
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
import { getDateQuery, getFilterQuery, rawQuery } from 'queries';
|
||||
|
||||
export function getEventMetrics(
|
||||
website_id,
|
||||
start_at,
|
||||
end_at,
|
||||
timezone = 'utc',
|
||||
unit = 'day',
|
||||
filters = {},
|
||||
) {
|
||||
const params = [website_id, start_at, end_at];
|
||||
|
||||
return rawQuery(
|
||||
`
|
||||
select
|
||||
event_value x,
|
||||
${getDateQuery('created_at', unit, timezone)} t,
|
||||
count(*) y
|
||||
from event
|
||||
where website_id=$1
|
||||
and created_at between $2 and $3
|
||||
${getFilterQuery('event', filters, params)}
|
||||
group by 1, 2
|
||||
order by 2
|
||||
`,
|
||||
params,
|
||||
);
|
||||
}
|
||||
19
queries/analytics/event/getEvents.js
Normal file
19
queries/analytics/event/getEvents.js
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
import { runQuery } from 'queries';
|
||||
import prisma from 'lib/db';
|
||||
|
||||
export async function getEvents(websites, start_at) {
|
||||
return runQuery(
|
||||
prisma.event.findMany({
|
||||
where: {
|
||||
website: {
|
||||
website_id: {
|
||||
in: websites,
|
||||
},
|
||||
},
|
||||
created_at: {
|
||||
gte: start_at,
|
||||
},
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
17
queries/analytics/event/saveEvent.js
Normal file
17
queries/analytics/event/saveEvent.js
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
import { runQuery } from 'queries';
|
||||
import prisma from 'lib/db';
|
||||
import { URL_LENGTH } from 'lib/constants';
|
||||
|
||||
export async function saveEvent(website_id, session_id, url, event_type, event_value) {
|
||||
return runQuery(
|
||||
prisma.event.create({
|
||||
data: {
|
||||
website_id,
|
||||
session_id,
|
||||
url: url?.substr(0, URL_LENGTH),
|
||||
event_type: event_type?.substr(0, 50),
|
||||
event_value: event_value?.substr(0, 50),
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
31
queries/analytics/index.js
Normal file
31
queries/analytics/index.js
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
import { getEventMetrics } from './event/getEventMetrics';
|
||||
import { getEvents } from './event/getEvents';
|
||||
import { saveEvent } from './event/saveEvent';
|
||||
import { getPageviewMetrics } from './pageview/getPageviewMetrics';
|
||||
import { getPageviews } from './pageview/getPageviews';
|
||||
import { getPageviewStats } from './pageview/getPageviewStats';
|
||||
import { savePageView } from './pageview/savePageView';
|
||||
import { createSession } from './session/createSession';
|
||||
import { getSessionByUuid } from './session/getSessionByUuid';
|
||||
import { getSessionMetrics } from './session/getSessionMetrics';
|
||||
import { getSessions } from './session/getSessions';
|
||||
import { getActiveVisitors } from './stats/getActiveVisitors';
|
||||
import { getRealtimeData } from './stats/getRealtimeData';
|
||||
import { getWebsiteStats } from './stats/getWebsiteStats';
|
||||
|
||||
export default {
|
||||
getEventMetrics,
|
||||
getEvents,
|
||||
saveEvent,
|
||||
getPageviewMetrics,
|
||||
getPageviews,
|
||||
getPageviewStats,
|
||||
savePageView,
|
||||
createSession,
|
||||
getSessionByUuid,
|
||||
getSessionMetrics,
|
||||
getSessions,
|
||||
getActiveVisitors,
|
||||
getRealtimeData,
|
||||
getWebsiteStats,
|
||||
};
|
||||
26
queries/analytics/pageview/getPageviewMetrics.js
Normal file
26
queries/analytics/pageview/getPageviewMetrics.js
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
import { parseFilters, rawQuery } from 'queries';
|
||||
|
||||
export function getPageviewMetrics(website_id, start_at, end_at, field, table, filters = {}) {
|
||||
const params = [website_id, start_at, end_at];
|
||||
const { pageviewQuery, sessionQuery, eventQuery, joinSession } = parseFilters(
|
||||
table,
|
||||
filters,
|
||||
params,
|
||||
);
|
||||
|
||||
return rawQuery(
|
||||
`
|
||||
select ${field} x, count(*) y
|
||||
from ${table}
|
||||
${joinSession}
|
||||
where ${table}.website_id=$1
|
||||
and ${table}.created_at between $2 and $3
|
||||
${pageviewQuery}
|
||||
${joinSession && sessionQuery}
|
||||
${eventQuery}
|
||||
group by 1
|
||||
order by 2 desc
|
||||
`,
|
||||
params,
|
||||
);
|
||||
}
|
||||
30
queries/analytics/pageview/getPageviewStats.js
Normal file
30
queries/analytics/pageview/getPageviewStats.js
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
import { parseFilters, rawQuery, getDateQuery } from 'queries';
|
||||
|
||||
export function getPageviewStats(
|
||||
website_id,
|
||||
start_at,
|
||||
end_at,
|
||||
timezone = 'utc',
|
||||
unit = 'day',
|
||||
count = '*',
|
||||
filters = {},
|
||||
) {
|
||||
const params = [website_id, start_at, end_at];
|
||||
const { pageviewQuery, sessionQuery, joinSession } = parseFilters('pageview', filters, params);
|
||||
|
||||
return rawQuery(
|
||||
`
|
||||
select ${getDateQuery('pageview.created_at', unit, timezone)} t,
|
||||
count(${count}) y
|
||||
from pageview
|
||||
${joinSession}
|
||||
where pageview.website_id=$1
|
||||
and pageview.created_at between $2 and $3
|
||||
${pageviewQuery}
|
||||
${sessionQuery}
|
||||
group by 1
|
||||
order by 1
|
||||
`,
|
||||
params,
|
||||
);
|
||||
}
|
||||
19
queries/analytics/pageview/getPageviews.js
Normal file
19
queries/analytics/pageview/getPageviews.js
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
import { runQuery } from 'queries';
|
||||
import prisma from 'lib/db';
|
||||
|
||||
export async function getPageviews(websites, start_at) {
|
||||
return runQuery(
|
||||
prisma.pageview.findMany({
|
||||
where: {
|
||||
website: {
|
||||
website_id: {
|
||||
in: websites,
|
||||
},
|
||||
},
|
||||
created_at: {
|
||||
gte: start_at,
|
||||
},
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
16
queries/analytics/pageview/savePageView.js
Normal file
16
queries/analytics/pageview/savePageView.js
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
import { runQuery } from 'queries';
|
||||
import prisma from 'lib/db';
|
||||
import { URL_LENGTH } from 'lib/constants';
|
||||
|
||||
export async function savePageView(website_id, session_id, url, referrer) {
|
||||
return runQuery(
|
||||
prisma.pageview.create({
|
||||
data: {
|
||||
website_id,
|
||||
session_id,
|
||||
url: url?.substr(0, URL_LENGTH),
|
||||
referrer: referrer?.substr(0, URL_LENGTH),
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
16
queries/analytics/session/createSession.js
Normal file
16
queries/analytics/session/createSession.js
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
import { runQuery } from 'queries';
|
||||
import prisma from 'lib/db';
|
||||
|
||||
export async function createSession(website_id, data) {
|
||||
return runQuery(
|
||||
prisma.session.create({
|
||||
data: {
|
||||
website_id,
|
||||
...data,
|
||||
},
|
||||
select: {
|
||||
session_id: true,
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
12
queries/analytics/session/getSessionByUuid.js
Normal file
12
queries/analytics/session/getSessionByUuid.js
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
import { runQuery } from 'queries';
|
||||
import prisma from 'lib/db';
|
||||
|
||||
export async function getSessionByUuid(session_uuid) {
|
||||
return runQuery(
|
||||
prisma.session.findUnique({
|
||||
where: {
|
||||
session_uuid,
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
25
queries/analytics/session/getSessionMetrics.js
Normal file
25
queries/analytics/session/getSessionMetrics.js
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import { parseFilters, rawQuery } from 'queries';
|
||||
|
||||
export function getSessionMetrics(website_id, start_at, end_at, field, filters = {}) {
|
||||
const params = [website_id, start_at, end_at];
|
||||
const { pageviewQuery, sessionQuery, joinSession } = parseFilters('pageview', filters, params);
|
||||
|
||||
return rawQuery(
|
||||
`
|
||||
select ${field} x, count(*) y
|
||||
from session as x
|
||||
where x.session_id in (
|
||||
select pageview.session_id
|
||||
from pageview
|
||||
${joinSession}
|
||||
where pageview.website_id=$1
|
||||
and pageview.created_at between $2 and $3
|
||||
${pageviewQuery}
|
||||
${sessionQuery}
|
||||
)
|
||||
group by 1
|
||||
order by 2 desc
|
||||
`,
|
||||
params,
|
||||
);
|
||||
}
|
||||
19
queries/analytics/session/getSessions.js
Normal file
19
queries/analytics/session/getSessions.js
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
import { runQuery } from 'queries';
|
||||
import prisma from 'lib/db';
|
||||
|
||||
export async function getSessions(websites, start_at) {
|
||||
return runQuery(
|
||||
prisma.session.findMany({
|
||||
where: {
|
||||
website: {
|
||||
website_id: {
|
||||
in: websites,
|
||||
},
|
||||
},
|
||||
created_at: {
|
||||
gte: start_at,
|
||||
},
|
||||
},
|
||||
}),
|
||||
);
|
||||
}
|
||||
17
queries/analytics/stats/getActiveVisitors.js
Normal file
17
queries/analytics/stats/getActiveVisitors.js
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
import { rawQuery } from 'queries';
|
||||
import { subMinutes } from 'date-fns';
|
||||
|
||||
export function getActiveVisitors(website_id) {
|
||||
const date = subMinutes(new Date(), 5);
|
||||
const params = [website_id, date];
|
||||
|
||||
return rawQuery(
|
||||
`
|
||||
select count(distinct session_id) x
|
||||
from pageview
|
||||
where website_id=$1
|
||||
and created_at >= $2
|
||||
`,
|
||||
params,
|
||||
);
|
||||
}
|
||||
30
queries/analytics/stats/getRealtimeData.js
Normal file
30
queries/analytics/stats/getRealtimeData.js
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
import { getPageviews } from '../pageview/getPageviews';
|
||||
import { getSessions } from '../session/getSessions';
|
||||
import { getEvents } from '../event/getEvents';
|
||||
|
||||
export async function getRealtimeData(websites, time) {
|
||||
const [pageviews, sessions, events] = await Promise.all([
|
||||
getPageviews(websites, time),
|
||||
getSessions(websites, time),
|
||||
getEvents(websites, time),
|
||||
]);
|
||||
|
||||
return {
|
||||
pageviews: pageviews.map(({ view_id, ...props }) => ({
|
||||
__id: `p${view_id}`,
|
||||
view_id,
|
||||
...props,
|
||||
})),
|
||||
sessions: sessions.map(({ session_id, ...props }) => ({
|
||||
__id: `s${session_id}`,
|
||||
session_id,
|
||||
...props,
|
||||
})),
|
||||
events: events.map(({ event_id, ...props }) => ({
|
||||
__id: `e${event_id}`,
|
||||
event_id,
|
||||
...props,
|
||||
})),
|
||||
timestamp: Date.now(),
|
||||
};
|
||||
}
|
||||
29
queries/analytics/stats/getWebsiteStats.js
Normal file
29
queries/analytics/stats/getWebsiteStats.js
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
import { parseFilters, rawQuery, getDateQuery, getTimestampInterval } from 'queries';
|
||||
|
||||
export function getWebsiteStats(website_id, start_at, end_at, filters = {}) {
|
||||
const params = [website_id, start_at, end_at];
|
||||
const { pageviewQuery, sessionQuery, joinSession } = parseFilters('pageview', filters, params);
|
||||
|
||||
return rawQuery(
|
||||
`
|
||||
select sum(t.c) as "pageviews",
|
||||
count(distinct t.session_id) as "uniques",
|
||||
sum(case when t.c = 1 then 1 else 0 end) as "bounces",
|
||||
sum(t.time) as "totaltime"
|
||||
from (
|
||||
select pageview.session_id,
|
||||
${getDateQuery('pageview.created_at', 'hour')},
|
||||
count(*) c,
|
||||
${getTimestampInterval('pageview.created_at')} as "time"
|
||||
from pageview
|
||||
${joinSession}
|
||||
where pageview.website_id=$1
|
||||
and pageview.created_at between $2 and $3
|
||||
${pageviewQuery}
|
||||
${sessionQuery}
|
||||
group by 1, 2
|
||||
) t
|
||||
`,
|
||||
params,
|
||||
);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue