Refactor database queries.

This commit is contained in:
Mike Cao 2020-08-11 22:24:41 -07:00
parent a248f35db2
commit f4ca353b5c
24 changed files with 371 additions and 329 deletions

View file

@ -111,7 +111,5 @@ export function getDateArray(data, startDate, endDate, unit) {
arr.push({ t, y });
}
console.log({ unit, arr });
return arr;
}

218
lib/db.js
View file

@ -1,6 +1,5 @@
import { PrismaClient } from '@prisma/client';
import chalk from 'chalk';
import { getMetricsQuery, getPageviewsQuery, getRankingsQuery } from 'lib/queries';
const options = {
log: [
@ -39,220 +38,3 @@ export async function runQuery(query) {
throw e;
});
}
export async function getWebsite({ website_id, website_uuid }) {
return runQuery(
prisma.website.findOne({
where: {
...(website_id && { website_id }),
...(website_uuid && { website_uuid }),
},
}),
);
}
export async function getWebsites(user_id) {
return runQuery(
prisma.website.findMany({
where: {
user_id,
},
orderBy: {
name: 'asc',
},
}),
);
}
export async function createWebsite(user_id, data) {
return runQuery(
prisma.website.create({
data: {
account: {
connect: {
user_id,
},
},
...data,
},
}),
);
}
export async function updateWebsite(website_id, data) {
return runQuery(
prisma.website.update({
where: {
website_id,
},
data,
}),
);
}
export async function deleteWebsite(website_id) {
return runQuery(
/* Prisma bug, does not cascade on non-nullable foreign keys
prisma.website.delete({
where: {
website_id,
},
}),
*/
prisma.queryRaw(`delete from website where website_id=$1`, website_id),
);
}
export async function createSession(website_id, data) {
return runQuery(
prisma.session.create({
data: {
website: {
connect: {
website_id,
},
},
...data,
},
select: {
session_id: true,
},
}),
);
}
export async function getSession({ session_id, session_uuid }) {
return runQuery(
prisma.session.findOne({
where: {
session_id,
session_uuid,
},
}),
);
}
export async function savePageView(website_id, session_id, url, referrer) {
return runQuery(
prisma.pageview.create({
data: {
website: {
connect: {
website_id,
},
},
session: {
connect: {
session_id,
},
},
url,
referrer,
},
}),
);
}
export async function saveEvent(website_id, session_id, url, event_type, event_value) {
return runQuery(
prisma.event.create({
data: {
website: {
connect: {
website_id,
},
},
session: {
connect: {
session_id,
},
},
url,
event_type,
event_value,
},
}),
);
}
export async function getAccounts() {
return runQuery(prisma.account.findMany());
}
export async function getAccount({ user_id, username }) {
return runQuery(
prisma.account.findOne({
where: {
username,
user_id,
},
}),
);
}
export async function updateAccount(user_id, data) {
return runQuery(
prisma.account.update({
where: {
user_id,
},
data,
}),
);
}
export async function deleteAccount(user_id) {
return runQuery(
/* Prisma bug, does not cascade on non-nullable foreign keys
prisma.account.delete({
where: {
user_id,
},
}),
*/
prisma.queryRaw(`delete from account where user_id=$1`, user_id),
);
}
export async function createAccount(data) {
return runQuery(
prisma.account.create({
data,
}),
);
}
export async function getPageviews(website_id, start_at, end_at) {
return runQuery(
prisma.pageview.findMany({
where: {
website_id,
created_at: {
gte: start_at,
lte: end_at,
},
},
}),
);
}
export async function getRankings(website_id, start_at, end_at, type, table) {
return getRankingsQuery(prisma, { website_id, start_at, end_at, type, table });
}
export async function getPageviewData(
website_id,
start_at,
end_at,
timezone = 'utc',
unit = 'day',
count = '*',
) {
return runQuery(
getPageviewsQuery(prisma, { website_id, start_at, end_at, timezone, unit, count }),
);
}
export async function getMetrics(website_id, start_at, end_at) {
return getMetricsQuery(prisma, { website_id, start_at, end_at });
}

View file

@ -1,4 +1,5 @@
import moment from 'moment-timezone';
import prisma, { runQuery } from 'lib/db';
const POSTGRESQL = 'postgresql';
const MYSQL = 'mysql';
@ -7,7 +8,216 @@ export function getDatabase() {
return process.env.DATABASE_URL.split(':')[0];
}
export function getMetricsQuery(prisma, { website_id, start_at, end_at }) {
export async function getWebsiteById(website_id) {
return runQuery(
prisma.website.findOne({
where: {
website_id,
},
}),
);
}
export async function getWebsiteByUuid(website_uuid) {
return runQuery(
prisma.website.findOne({
where: {
website_uuid,
},
}),
);
}
export async function getUserWebsites(user_id) {
return runQuery(
prisma.website.findMany({
where: {
user_id,
},
orderBy: {
name: 'asc',
},
}),
);
}
export async function createWebsite(user_id, data) {
return runQuery(
prisma.website.create({
data: {
account: {
connect: {
user_id,
},
},
...data,
},
}),
);
}
export async function updateWebsite(website_id, data) {
return runQuery(
prisma.website.update({
where: {
website_id,
},
data,
}),
);
}
export async function deleteWebsite(website_id) {
return runQuery(
/* Prisma bug, does not cascade on non-nullable foreign keys
prisma.website.delete({
where: {
website_id,
},
}),
*/
prisma.$queryRaw`delete from website where website_id=${website_id}`,
);
}
export async function createSession(website_id, data) {
return runQuery(
prisma.session.create({
data: {
website: {
connect: {
website_id,
},
},
...data,
},
select: {
session_id: true,
},
}),
);
}
export async function getSessionById(session_id) {
return runQuery(
prisma.session.findOne({
where: {
session_id,
},
}),
);
}
export async function getSessionByUuid(session_uuid) {
return runQuery(
prisma.session.findOne({
where: {
session_uuid,
},
}),
);
}
export async function savePageView(website_id, session_id, url, referrer) {
return runQuery(
prisma.pageview.create({
data: {
website: {
connect: {
website_id,
},
},
session: {
connect: {
session_id,
},
},
url,
referrer,
},
}),
);
}
export async function saveEvent(website_id, session_id, url, event_type, event_value) {
return runQuery(
prisma.event.create({
data: {
website: {
connect: {
website_id,
},
},
session: {
connect: {
session_id,
},
},
url,
event_type,
event_value,
},
}),
);
}
export async function getAccounts() {
return runQuery(prisma.account.findMany());
}
export async function getAccountById(user_id) {
return runQuery(
prisma.account.findOne({
where: {
user_id,
},
}),
);
}
export async function getAccountByUsername(username) {
return runQuery(
prisma.account.findOne({
where: {
username,
},
}),
);
}
export async function updateAccount(user_id, data) {
return runQuery(
prisma.account.update({
where: {
user_id,
},
data,
}),
);
}
export async function deleteAccount(user_id) {
return runQuery(
/* Prisma bug, does not cascade on non-nullable foreign keys
prisma.account.delete({
where: {
user_id,
},
}),
*/
prisma.$queryRaw`delete from account where user_id=${user_id}`,
);
}
export async function createAccount(data) {
return runQuery(
prisma.account.create({
data,
}),
);
}
export function getMetrics(website_id, start_at, end_at) {
const db = getDatabase();
if (db === POSTGRESQL) {
@ -61,7 +271,14 @@ export function getMetricsQuery(prisma, { website_id, start_at, end_at }) {
return Promise.resolve({});
}
export function getPageviewsQuery(prisma, { website_id, start_at, end_at, unit, timezone, count }) {
export function getPageviews(
website_id,
start_at,
end_at,
timezone = 'utc',
unit = 'day',
count = '*',
) {
const db = getDatabase();
if (db === POSTGRESQL) {
@ -102,7 +319,7 @@ export function getPageviewsQuery(prisma, { website_id, start_at, end_at, unit,
return Promise.resolve([]);
}
export function getRankingsQuery(prisma, { website_id, start_at, end_at, type, table }) {
export function getRankings(website_id, start_at, end_at, type, table) {
const db = getDatabase();
if (db === POSTGRESQL) {

View file

@ -1,4 +1,4 @@
import { getWebsite, getSession, createSession } from 'lib/db';
import { getWebsiteByUuid, getSessionByUuid, createSession } from 'lib/queries';
import { getClientInfo } from 'lib/request';
import { uuid, isValidId, parseToken } from 'lib/crypto';
@ -19,7 +19,7 @@ export async function verifySession(req) {
if (!token || token.website_uuid !== website_uuid) {
const { userAgent, browser, os, ip, country, device } = await getClientInfo(req, payload);
const website = await getWebsite({ website_uuid });
const website = await getWebsiteByUuid(website_uuid);
if (!website) {
throw new Error(`Website not found: ${website_uuid}`);
@ -28,7 +28,7 @@ export async function verifySession(req) {
const { website_id } = website;
const session_uuid = uuid(website_id, hostname, ip, userAgent, os);
let session = await getSession({ session_uuid });
let session = await getSessionByUuid(session_uuid);
if (!session) {
session = await createSession(website_id, {