umami/lib/db.js

212 lines
3.9 KiB
JavaScript
Raw Normal View History

2020-07-17 10:03:38 +02:00
import { PrismaClient } from '@prisma/client';
import chalk from 'chalk';
2020-07-17 10:03:38 +02:00
const options = {
2020-07-25 02:00:56 +02:00
log: [
{
emit: 'event',
level: 'query',
},
],
};
function logQuery(e) {
if (process.env.LOG_QUERY) {
console.log(chalk.yellow(e.params), '->', e.query, chalk.greenBright(`${e.duration}ms`));
}
}
let prisma;
if (process.env.NODE_ENV === 'production') {
prisma = new PrismaClient(options);
prisma.on('query', logQuery);
} else {
if (!global.prisma) {
global.prisma = new PrismaClient(options);
global.prisma.on('query', logQuery);
}
prisma = global.prisma;
}
export default prisma;
2020-07-25 02:00:56 +02:00
2020-07-17 10:03:38 +02:00
export async function runQuery(query) {
2020-07-24 19:56:45 +02:00
return query.catch(e => {
console.error(e);
throw e;
});
2020-07-17 10:03:38 +02:00
}
export async function getWebsite(website_uuid) {
2020-07-17 10:03:38 +02:00
return runQuery(
prisma.website.findOne({
where: {
website_uuid,
2020-07-17 10:03:38 +02:00
},
}),
);
}
2020-07-28 08:52:14 +02:00
export async function getWebsites(user_id) {
return runQuery(
prisma.website.findMany({
where: {
user_id,
},
}),
);
}
export async function createSession(website_id, data) {
return runQuery(
2020-07-17 10:03:38 +02:00
prisma.session.create({
data: {
website: {
connect: {
website_id,
2020-07-17 10:03:38 +02:00
},
},
...data,
},
select: {
session_id: true,
},
2020-07-17 10:03:38 +02:00
}),
);
}
export async function getSession(session_uuid) {
2020-07-17 10:03:38 +02:00
return runQuery(
prisma.session.findOne({
where: {
session_uuid,
2020-07-17 10:03:38 +02:00
},
}),
);
}
2020-07-19 08:54:25 +02:00
export async function savePageView(website_id, session_id, url, referrer) {
2020-07-17 10:03:38 +02:00
return runQuery(
prisma.pageview.create({
data: {
2020-07-19 08:54:25 +02:00
website: {
connect: {
website_id,
2020-07-19 08:54:25 +02:00
},
},
2020-07-17 10:03:38 +02:00
session: {
connect: {
session_id,
2020-07-17 10:03:38 +02:00
},
},
url,
referrer,
},
}),
);
}
2020-07-19 10:57:01 +02:00
2020-07-19 11:23:15 +02:00
export async function saveEvent(website_id, session_id, url, event_type, event_value) {
2020-07-19 10:57:01 +02:00
return runQuery(
2020-07-19 11:23:15 +02:00
prisma.event.create({
2020-07-19 10:57:01 +02:00
data: {
website: {
connect: {
website_id,
2020-07-19 10:57:01 +02:00
},
},
session: {
connect: {
session_id,
2020-07-19 10:57:01 +02:00
},
},
url,
2020-07-19 11:23:15 +02:00
event_type,
event_value,
2020-07-19 10:57:01 +02:00
},
}),
);
}
2020-07-23 05:45:09 +02:00
export async function getAccount(username = '') {
return runQuery(
prisma.account.findOne({
where: {
username,
},
}),
);
}
2020-07-26 01:31:07 +02:00
2020-07-26 09:12:42 +02:00
export async function getPageviews(website_id, start_at, end_at) {
2020-07-26 01:31:07 +02:00
return runQuery(
prisma.pageview.findMany({
where: {
website_id,
2020-07-26 09:12:42 +02:00
created_at: {
gte: start_at,
lte: end_at,
},
2020-07-26 01:31:07 +02:00
},
}),
);
}
2020-07-28 08:52:14 +02:00
export async function getPageviewData(
website_id,
start_at,
end_at,
timezone = 'utc',
unit = 'day',
count = '*',
) {
return runQuery(
prisma.queryRaw(
`
select date_trunc('${unit}', created_at at time zone '${timezone}') t,
count(${count}) y
from pageview
where website_id=$1
and created_at between $2 and $3
group by 1
order by 1
`,
website_id,
start_at,
end_at,
),
);
}
2020-07-29 09:16:02 +02:00
export async function getSummary(website_id, start_at, end_at) {
return runQuery(
prisma.queryRaw(
`
select
(select count(*)
from pageview
where website_id=${website_id}
and created_at between '${start_at}' and '${end_at}'
) as "pageviews",
(select
count(distinct session_id)
from pageview
where website_id=${website_id}
and created_at between '${start_at}' and '${end_at}'
) as "uniques",
(select sum(t.c) from
(select count(*) c
from pageview
where website_id=${website_id}
and created_at between '${start_at}' and '${end_at}'
group by session_id
having count(*) = 1
) t
) as "bounces"
`,
),
);
}