From 8904b7b4ed33331223a0c6aae1e7e30cb546a467 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Sat, 29 Jul 2023 22:03:34 -0700 Subject: [PATCH] Refactored queries. --- lib/auth.ts | 25 ++----- lib/cache.ts | 8 +-- lib/{dynamicData.ts => data.ts} | 0 lib/load.ts | 8 +-- lib/middleware.ts | 4 +- pages/api/auth/login.ts | 4 +- pages/api/me/password.ts | 4 +- pages/api/reports/[id].ts | 21 +++--- pages/api/reports/index.ts | 4 +- pages/api/share/[id].ts | 4 +- pages/api/teams/[id]/index.ts | 6 +- pages/api/teams/[id]/users/index.ts | 4 +- pages/api/teams/join.ts | 4 +- pages/api/users/[id]/index.ts | 10 +-- pages/api/users/index.ts | 4 +- pages/api/websites/[id]/index.ts | 4 +- queries/admin/report.ts | 22 ++++-- queries/admin/team.ts | 27 ++++++-- queries/admin/teamUser.ts | 6 +- queries/admin/teamWebsite.ts | 2 +- queries/admin/user.ts | 17 ++++- queries/admin/website.ts | 10 ++- queries/analytics/eventData/saveEventData.ts | 2 +- queries/analytics/events/getEventMetrics.ts | 69 +++++-------------- queries/analytics/sessions/getSession.ts | 7 +- queries/analytics/sessions/saveSessionData.ts | 2 +- queries/index.js | 3 +- 27 files changed, 137 insertions(+), 144 deletions(-) rename lib/{dynamicData.ts => data.ts} (100%) diff --git a/lib/auth.ts b/lib/auth.ts index 04585943..60592bf3 100644 --- a/lib/auth.ts +++ b/lib/auth.ts @@ -10,8 +10,7 @@ import { parseSecureToken, parseToken, } from 'next-basics'; -import { getTeamUser } from 'queries'; -import { getTeamWebsite, getTeamWebsiteByTeamMemberId } from 'queries/admin/teamWebsite'; +import { getTeamUser, getTeamWebsite, findTeamWebsiteByUserId } from 'queries'; import { loadWebsite } from './load'; import { Auth } from './types'; @@ -79,19 +78,13 @@ export async function canViewWebsite({ user, shareToken }: Auth, websiteId: stri return true; } - const teamWebsite = await getTeamWebsiteByTeamMemberId(websiteId, user.id); - - if (teamWebsite) { - return true; - } - const website = await loadWebsite(websiteId); if (website.userId) { return user.id === website.userId; } - return false; + return !!(await findTeamWebsiteByUserId(websiteId, user.id)); } export async function canCreateWebsite({ user }: Auth) { @@ -139,15 +132,11 @@ export async function canViewReport(auth: Auth, report: Report) { return true; } - if ((auth.user.id = report.userId)) { + if (auth.user.id == report.userId) { return true; } - if (await canViewWebsite(auth, report.websiteId)) { - return true; - } - - return false; + return !!(await canViewWebsite(auth, report.websiteId)); } export async function canUpdateReport(auth: Auth, report: Report) { @@ -155,11 +144,7 @@ export async function canUpdateReport(auth: Auth, report: Report) { return true; } - if ((auth.user.id = report.userId)) { - return true; - } - - return false; + return auth.user.id == report.userId; } export async function canCreateTeam({ user }: Auth) { diff --git a/lib/cache.ts b/lib/cache.ts index 7ee7bf28..bc46c23d 100644 --- a/lib/cache.ts +++ b/lib/cache.ts @@ -1,11 +1,11 @@ import { User, Website } from '@prisma/client'; import redis from '@umami/redis-client'; -import { getSession, getUser, getWebsite } from '../queries'; +import { getSession, getUserById, getWebsiteById } from '../queries'; const { fetchObject, storeObject, deleteObject } = redis; async function fetchWebsite(id): Promise { - return fetchObject(`website:${id}`, () => getWebsite({ id })); + return fetchObject(`website:${id}`, () => getWebsiteById(id)); } async function storeWebsite(data) { @@ -20,7 +20,7 @@ async function deleteWebsite(id) { } async function fetchUser(id): Promise { - return fetchObject(`user:${id}`, () => getUser({ id }, { includePassword: true })); + return fetchObject(`user:${id}`, () => getUserById(id, { includePassword: true })); } async function storeUser(data) { @@ -35,7 +35,7 @@ async function deleteUser(id) { } async function fetchSession(id) { - return fetchObject(`session:${id}`, () => getSession({ id })); + return fetchObject(`session:${id}`, () => getSession(id)); } async function storeSession(data) { diff --git a/lib/dynamicData.ts b/lib/data.ts similarity index 100% rename from lib/dynamicData.ts rename to lib/data.ts diff --git a/lib/load.ts b/lib/load.ts index 4ce18b09..d980f8e9 100644 --- a/lib/load.ts +++ b/lib/load.ts @@ -1,5 +1,5 @@ import cache from 'lib/cache'; -import { getWebsite, getSession, getUser } from 'queries'; +import { getSession, getUserById, getWebsiteById } from 'queries'; import { User, Website, Session } from '@prisma/client'; export async function loadWebsite(websiteId: string): Promise { @@ -8,7 +8,7 @@ export async function loadWebsite(websiteId: string): Promise { if (cache.enabled) { website = await cache.fetchWebsite(websiteId); } else { - website = await getWebsite({ id: websiteId }); + website = await getWebsiteById(websiteId); } if (!website || website.deletedAt) { @@ -24,7 +24,7 @@ export async function loadSession(sessionId: string): Promise { if (cache.enabled) { session = await cache.fetchSession(sessionId); } else { - session = await getSession({ id: sessionId }); + session = await getSession(sessionId); } if (!session) { @@ -40,7 +40,7 @@ export async function loadUser(userId: string): Promise { if (cache.enabled) { user = await cache.fetchUser(userId); } else { - user = await getUser({ id: userId }); + user = await getUserById(userId); } if (!user || user.deletedAt) { diff --git a/lib/middleware.ts b/lib/middleware.ts index bcab71ef..414cab23 100644 --- a/lib/middleware.ts +++ b/lib/middleware.ts @@ -12,7 +12,7 @@ import { findSession } from 'lib/session'; import { getAuthToken, parseShareToken } from 'lib/auth'; import { secret, isUuid } from 'lib/crypto'; import { ROLES } from 'lib/constants'; -import { getUser } from '../queries'; +import { getUserById } from '../queries'; import { NextApiRequestCollect } from 'pages/api/send'; const log = debug('umami:middleware'); @@ -53,7 +53,7 @@ export const useAuth = createMiddleware(async (req, res, next) => { const { userId, authKey } = payload || {}; if (isUuid(userId)) { - user = await getUser({ id: userId }); + user = await getUserById(userId); } else if (redis.enabled && authKey) { user = await redis.get(authKey); } diff --git a/pages/api/auth/login.ts b/pages/api/auth/login.ts index 64c2c26d..af206938 100644 --- a/pages/api/auth/login.ts +++ b/pages/api/auth/login.ts @@ -9,7 +9,7 @@ import { methodNotAllowed, } from 'next-basics'; import redis from '@umami/redis-client'; -import { getUser } from 'queries'; +import { getUserByUsername } from 'queries'; import { secret } from 'lib/crypto'; import { NextApiRequestQueryBody, User } from 'lib/types'; import { setAuthKey } from 'lib/auth'; @@ -37,7 +37,7 @@ export default async ( return badRequest(res); } - const user = await getUser({ username }, { includePassword: true }); + const user = await getUserByUsername(username, { includePassword: true }); if (user && checkPassword(password, user.password)) { if (redis.enabled) { diff --git a/pages/api/me/password.ts b/pages/api/me/password.ts index 70d8de5f..f9f60fc5 100644 --- a/pages/api/me/password.ts +++ b/pages/api/me/password.ts @@ -9,7 +9,7 @@ import { forbidden, ok, } from 'next-basics'; -import { getUser, updateUser } from 'queries'; +import { getUserById, updateUser } from 'queries'; export interface UserPasswordRequestQuery { id: string; @@ -34,7 +34,7 @@ export default async ( const { id } = req.auth.user; if (req.method === 'POST') { - const user = await getUser({ id }, { includePassword: true }); + const user = await getUserById(id, { includePassword: true }); if (!checkPassword(currentPassword, user.password)) { return badRequest(res, 'Current password is incorrect'); diff --git a/pages/api/reports/[id].ts b/pages/api/reports/[id].ts index bcd22b4e..20731946 100644 --- a/pages/api/reports/[id].ts +++ b/pages/api/reports/[id].ts @@ -52,19 +52,14 @@ export default async ( return unauthorized(res); } - const result = await updateReport( - { - websiteId, - userId, - type, - name, - description, - parameters: JSON.stringify(parameters), - } as any, - { - id: reportId, - }, - ); + const result = await updateReport(reportId, { + websiteId, + userId, + type, + name, + description, + parameters: JSON.stringify(parameters), + } as any); return ok(res, result); } diff --git a/pages/api/reports/index.ts b/pages/api/reports/index.ts index fcd8fd37..c856b565 100644 --- a/pages/api/reports/index.ts +++ b/pages/api/reports/index.ts @@ -2,7 +2,7 @@ import { useAuth, useCors } from 'lib/middleware'; import { NextApiRequestQueryBody } from 'lib/types'; import { NextApiResponse } from 'next'; import { methodNotAllowed, ok, unauthorized } from 'next-basics'; -import { createReport, getReports } from 'queries'; +import { createReport, getWebsiteReports } from 'queries'; import { canViewWebsite } from 'lib/auth'; import { uuid } from 'lib/crypto'; @@ -35,7 +35,7 @@ export default async ( return unauthorized(res); } - const data = await getReports({ websiteId }); + const data = await getWebsiteReports(websiteId); return ok(res, data); } diff --git a/pages/api/share/[id].ts b/pages/api/share/[id].ts index b5511f2d..0592d216 100644 --- a/pages/api/share/[id].ts +++ b/pages/api/share/[id].ts @@ -2,7 +2,7 @@ import { NextApiRequestQueryBody } from 'lib/types'; import { secret } from 'lib/crypto'; import { NextApiResponse } from 'next'; import { createToken, methodNotAllowed, notFound, ok } from 'next-basics'; -import { getWebsite } from 'queries'; +import { getWebsiteByShareId } from 'queries'; export interface ShareRequestQuery { id: string; @@ -20,7 +20,7 @@ export default async ( const { id: shareId } = req.query; if (req.method === 'GET') { - const website = await getWebsite({ shareId }); + const website = await getWebsiteByShareId(shareId); if (website) { const data = { websiteId: website.id }; diff --git a/pages/api/teams/[id]/index.ts b/pages/api/teams/[id]/index.ts index 1c7dbb66..7fb664a0 100644 --- a/pages/api/teams/[id]/index.ts +++ b/pages/api/teams/[id]/index.ts @@ -4,7 +4,7 @@ import { canDeleteTeam, canUpdateTeam, canViewTeam } from 'lib/auth'; import { useAuth } from 'lib/middleware'; import { NextApiResponse } from 'next'; import { methodNotAllowed, ok, unauthorized } from 'next-basics'; -import { deleteTeam, getTeam, updateTeam } from 'queries'; +import { deleteTeam, getTeamById, updateTeam } from 'queries'; export interface TeamRequestQuery { id: string; @@ -28,7 +28,7 @@ export default async ( return unauthorized(res); } - const user = await getTeam({ id: teamId }); + const user = await getTeamById(teamId, { includeTeamUser: true }); return ok(res, user); } @@ -41,7 +41,7 @@ export default async ( const { name, accessCode } = req.body; const data = { name, accessCode }; - const updated = await updateTeam(data, { id: teamId }); + const updated = await updateTeam(teamId, data); return ok(res, updated); } diff --git a/pages/api/teams/[id]/users/index.ts b/pages/api/teams/[id]/users/index.ts index af01d0ce..c73da683 100644 --- a/pages/api/teams/[id]/users/index.ts +++ b/pages/api/teams/[id]/users/index.ts @@ -3,7 +3,7 @@ import { useAuth } from 'lib/middleware'; import { NextApiRequestQueryBody } from 'lib/types'; import { NextApiResponse } from 'next'; import { badRequest, methodNotAllowed, ok, unauthorized } from 'next-basics'; -import { createTeamUser, getTeamUsers, getUser } from 'queries'; +import { createTeamUser, getTeamUsers, getUserByUsername } from 'queries'; export interface TeamUserRequestQuery { id: string; @@ -40,7 +40,7 @@ export default async ( const { email, roleId: roleId } = req.body; // Check for User - const user = await getUser({ username: email }); + const user = await getUserByUsername(email); if (!user) { return badRequest(res, 'The User does not exists.'); diff --git a/pages/api/teams/join.ts b/pages/api/teams/join.ts index 17c9bf32..ce7367a0 100644 --- a/pages/api/teams/join.ts +++ b/pages/api/teams/join.ts @@ -3,7 +3,7 @@ import { NextApiRequestQueryBody } from 'lib/types'; import { useAuth } from 'lib/middleware'; import { NextApiResponse } from 'next'; import { methodNotAllowed, ok, notFound } from 'next-basics'; -import { createTeamUser, getTeam, getTeamUser } from 'queries'; +import { createTeamUser, getTeamByAccessCode, getTeamUser } from 'queries'; import { ROLES } from 'lib/constants'; export interface TeamsJoinRequestBody { @@ -19,7 +19,7 @@ export default async ( if (req.method === 'POST') { const { accessCode } = req.body; - const team = await getTeam({ accessCode }); + const team = await getTeamByAccessCode(accessCode); if (!team) { return notFound(res, 'message.team-not-found'); diff --git a/pages/api/users/[id]/index.ts b/pages/api/users/[id]/index.ts index a4ab05ff..e09b1b5f 100644 --- a/pages/api/users/[id]/index.ts +++ b/pages/api/users/[id]/index.ts @@ -3,7 +3,7 @@ import { canDeleteUser, canUpdateUser, canViewUser } from 'lib/auth'; import { useAuth } from 'lib/middleware'; import { NextApiResponse } from 'next'; import { badRequest, hashPassword, methodNotAllowed, ok, unauthorized } from 'next-basics'; -import { deleteUser, getUser, updateUser } from 'queries'; +import { deleteUser, getUserById, getUserByUsername, updateUser } from 'queries'; export interface UserRequestQuery { id: string; @@ -31,7 +31,7 @@ export default async ( return unauthorized(res); } - const user = await getUser({ id }); + const user = await getUserById(id); return ok(res, user); } @@ -43,7 +43,7 @@ export default async ( const { username, password, role } = req.body; - const user = await getUser({ id }); + const user = await getUserById(id); const data: any = {}; @@ -62,9 +62,9 @@ export default async ( // Check when username changes if (data.username && user.username !== data.username) { - const userByUsername = await getUser({ username }); + const user = await getUserByUsername(username); - if (userByUsername) { + if (user) { return badRequest(res, 'User already exists'); } } diff --git a/pages/api/users/index.ts b/pages/api/users/index.ts index c6103c35..6f6c205f 100644 --- a/pages/api/users/index.ts +++ b/pages/api/users/index.ts @@ -5,7 +5,7 @@ import { useAuth } from 'lib/middleware'; import { NextApiRequestQueryBody, Role, User } from 'lib/types'; import { NextApiResponse } from 'next'; import { badRequest, hashPassword, methodNotAllowed, ok, unauthorized } from 'next-basics'; -import { createUser, getUser, getUsers } from 'queries'; +import { createUser, getUserByUsername, getUsers } from 'queries'; export interface UsersRequestBody { username: string; @@ -37,7 +37,7 @@ export default async ( const { username, password, role, id } = req.body; - const existingUser = await getUser({ username }, { showDeleted: true }); + const existingUser = await getUserByUsername(username, { showDeleted: true }); if (existingUser) { return badRequest(res, 'User already exists'); diff --git a/pages/api/websites/[id]/index.ts b/pages/api/websites/[id]/index.ts index 1d7e4ac3..3d053d0e 100644 --- a/pages/api/websites/[id]/index.ts +++ b/pages/api/websites/[id]/index.ts @@ -3,7 +3,7 @@ import { methodNotAllowed, ok, serverError, unauthorized } from 'next-basics'; import { Website, NextApiRequestQueryBody } from 'lib/types'; import { canViewWebsite, canUpdateWebsite, canDeleteWebsite } from 'lib/auth'; import { useAuth, useCors } from 'lib/middleware'; -import { deleteWebsite, getWebsite, updateWebsite } from 'queries'; +import { deleteWebsite, getWebsiteById, updateWebsite } from 'queries'; import { SHARE_ID_REGEX } from 'lib/constants'; export interface WebsiteRequestQuery { @@ -30,7 +30,7 @@ export default async ( return unauthorized(res); } - const website = await getWebsite({ id: websiteId }); + const website = await getWebsiteById(websiteId); return ok(res, website); } diff --git a/queries/admin/report.ts b/queries/admin/report.ts index 6b557a7a..ee7a0592 100644 --- a/queries/admin/report.ts +++ b/queries/admin/report.ts @@ -13,19 +13,29 @@ export async function getReportById(reportId: string): Promise { }); } -export async function getReports(where: Prisma.ReportWhereInput): Promise { +export async function getUserReports(userId: string): Promise { return prisma.client.report.findMany({ - where, + where: { + userId, + }, + }); +} + +export async function getWebsiteReports(websiteId: string): Promise { + return prisma.client.report.findMany({ + where: { + websiteId, + }, }); } export async function updateReport( + reportId: string, data: Prisma.ReportUpdateInput, - where: Prisma.ReportWhereUniqueInput, ): Promise { - return prisma.client.report.update({ data, where }); + return prisma.client.report.update({ where: { id: reportId }, data }); } -export async function deleteReport(where: Prisma.ReportWhereUniqueInput): Promise { - return prisma.client.report.delete({ where }); +export async function deleteReport(reportId: string): Promise { + return prisma.client.report.delete({ where: { id: reportId } }); } diff --git a/queries/admin/team.ts b/queries/admin/team.ts index 5c3b372f..a8b3385c 100644 --- a/queries/admin/team.ts +++ b/queries/admin/team.ts @@ -3,15 +3,29 @@ import prisma from 'lib/prisma'; import { ROLES } from 'lib/constants'; import { uuid } from 'lib/crypto'; -export async function getTeam(where: Prisma.TeamWhereInput): Promise { +export interface GetTeamOptions { + includeTeamUser?: boolean; +} + +async function getTeam(where: Prisma.TeamWhereInput, options: GetTeamOptions = {}): Promise { + const { includeTeamUser = false } = options; + return prisma.client.team.findFirst({ where, include: { - teamUser: true, + teamUser: includeTeamUser, }, }); } +export function getTeamById(teamId: string, options: GetTeamOptions = {}) { + return getTeam({ id: teamId }, options); +} + +export function getTeamByAccessCode(accessCode: string, options: GetTeamOptions = {}) { + return getTeam({ accessCode }, options); +} + export async function getTeams(where: Prisma.TeamWhereInput): Promise { return prisma.client.team.findMany({ where, @@ -36,16 +50,15 @@ export async function createTeam(data: Prisma.TeamCreateInput, userId: string): ]); } -export async function updateTeam( - data: Prisma.TeamUpdateInput, - where: Prisma.TeamWhereUniqueInput, -): Promise { +export async function updateTeam(teamId: string, data: Prisma.TeamUpdateInput): Promise { return prisma.client.team.update({ + where: { + id: teamId, + }, data: { ...data, updatedAt: new Date(), }, - where, }); } diff --git a/queries/admin/teamUser.ts b/queries/admin/teamUser.ts index b1c295be..c5b27a02 100644 --- a/queries/admin/teamUser.ts +++ b/queries/admin/teamUser.ts @@ -53,12 +53,14 @@ export async function createTeamUser( } export async function updateTeamUser( + teamUserId: string, data: Prisma.TeamUserUpdateInput, - where: Prisma.TeamUserWhereUniqueInput, ): Promise { return prisma.client.teamUser.update({ + where: { + id: teamUserId, + }, data, - where, }); } diff --git a/queries/admin/teamWebsite.ts b/queries/admin/teamWebsite.ts index 0aedc3c7..169526dd 100644 --- a/queries/admin/teamWebsite.ts +++ b/queries/admin/teamWebsite.ts @@ -22,7 +22,7 @@ export async function getTeamWebsite( }); } -export async function getTeamWebsiteByTeamMemberId( +export async function findTeamWebsiteByUserId( websiteId: string, userId: string, ): Promise { diff --git a/queries/admin/user.ts b/queries/admin/user.ts index cab8a562..f60c4801 100644 --- a/queries/admin/user.ts +++ b/queries/admin/user.ts @@ -5,9 +5,14 @@ import { ROLES } from 'lib/constants'; import prisma from 'lib/prisma'; import { Website, User, Role } from 'lib/types'; -export async function getUser( +export interface GetUserOptions { + includePassword?: boolean; + showDeleted?: boolean; +} + +async function getUser( where: Prisma.UserWhereInput | Prisma.UserWhereUniqueInput, - options: { includePassword?: boolean; showDeleted?: boolean } = {}, + options: GetUserOptions = {}, ): Promise { const { includePassword = false, showDeleted = false } = options; @@ -23,6 +28,14 @@ export async function getUser( }); } +export async function getUserById(userId: string, options: GetUserOptions = {}) { + return getUser({ id: userId }, options); +} + +export async function getUserByUsername(username: string, options: GetUserOptions = {}) { + return getUser({ username }, options); +} + export async function getUsers(): Promise { return prisma.client.user.findMany({ take: 100, diff --git a/queries/admin/website.ts b/queries/admin/website.ts index 8714d8c9..35f32bac 100644 --- a/queries/admin/website.ts +++ b/queries/admin/website.ts @@ -2,12 +2,20 @@ import { Prisma, Website } from '@prisma/client'; import cache from 'lib/cache'; import prisma from 'lib/prisma'; -export async function getWebsite(where: Prisma.WebsiteWhereUniqueInput): Promise { +async function getWebsite(where: Prisma.WebsiteWhereUniqueInput): Promise { return prisma.client.website.findUnique({ where, }); } +export async function getWebsiteById(id: string) { + return getWebsite({ id }); +} + +export async function getWebsiteByShareId(shareId: string) { + return getWebsite({ shareId }); +} + export async function getWebsites(): Promise { return prisma.client.website.findMany({ orderBy: { diff --git a/queries/analytics/eventData/saveEventData.ts b/queries/analytics/eventData/saveEventData.ts index 97b1c882..0f1ddb37 100644 --- a/queries/analytics/eventData/saveEventData.ts +++ b/queries/analytics/eventData/saveEventData.ts @@ -2,7 +2,7 @@ import { Prisma } from '@prisma/client'; import { DATA_TYPE } from 'lib/constants'; import { uuid } from 'lib/crypto'; import { CLICKHOUSE, PRISMA, runQuery } from 'lib/db'; -import { flattenJSON } from 'lib/dynamicData'; +import { flattenJSON } from 'lib/data'; import kafka from 'lib/kafka'; import prisma from 'lib/prisma'; import { DynamicData } from 'lib/types'; diff --git a/queries/analytics/events/getEventMetrics.ts b/queries/analytics/events/getEventMetrics.ts index 37044d1b..11a5c690 100644 --- a/queries/analytics/events/getEventMetrics.ts +++ b/queries/analytics/events/getEventMetrics.ts @@ -2,24 +2,23 @@ import prisma from 'lib/prisma'; import clickhouse from 'lib/clickhouse'; import { runQuery, CLICKHOUSE, PRISMA } from 'lib/db'; import { WebsiteEventMetric } from 'lib/types'; -import { DEFAULT_RESET_DATE, EVENT_TYPE } from 'lib/constants'; +import { EVENT_TYPE } from 'lib/constants'; import { loadWebsite } from 'lib/load'; import { maxDate } from 'lib/date'; +export interface GetEventMetricsCriteria { + startDate: Date; + endDate: Date; + timezone: string; + unit: string; + filters: { + url: string; + eventName: string; + }; +} + export async function getEventMetrics( - ...args: [ - websiteId: string, - data: { - startDate: Date; - endDate: Date; - timezone: string; - unit: string; - filters: { - url: string; - eventName: string; - }; - }, - ] + ...args: [websiteId: string, criteria: GetEventMetricsCriteria] ): Promise { return runQuery({ [PRISMA]: () => relationalQuery(...args), @@ -27,25 +26,8 @@ export async function getEventMetrics( }); } -async function relationalQuery( - websiteId: string, - { - startDate, - endDate, - timezone = 'utc', - unit = 'day', - filters, - }: { - startDate: Date; - endDate: Date; - timezone: string; - unit: string; - filters: { - url: string; - eventName: string; - }; - }, -) { +async function relationalQuery(websiteId: string, criteria: GetEventMetricsCriteria) { + const { startDate, endDate, timezone = 'utc', unit = 'day', filters } = criteria; const { rawQuery, getDateQuery, getFilterQuery } = prisma; const website = await loadWebsite(websiteId); const filterQuery = getFilterQuery(filters); @@ -74,25 +56,8 @@ async function relationalQuery( ); } -async function clickhouseQuery( - websiteId: string, - { - startDate, - endDate, - timezone = 'utc', - unit = 'day', - filters, - }: { - startDate: Date; - endDate: Date; - timezone: string; - unit: string; - filters: { - url: string; - eventName: string; - }; - }, -) { +async function clickhouseQuery(websiteId: string, criteria: GetEventMetricsCriteria) { + const { startDate, endDate, timezone = 'utc', unit = 'day', filters } = criteria; const { rawQuery, getDateQuery, getFilterQuery } = clickhouse; const website = await loadWebsite(websiteId); const filterQuery = getFilterQuery(filters); diff --git a/queries/analytics/sessions/getSession.ts b/queries/analytics/sessions/getSession.ts index 2fd8d18f..256ada4c 100644 --- a/queries/analytics/sessions/getSession.ts +++ b/queries/analytics/sessions/getSession.ts @@ -1,8 +1,9 @@ -import { Prisma } from '@prisma/client'; import prisma from 'lib/prisma'; -export async function getSession(where: Prisma.SessionWhereUniqueInput) { +export async function getSession(id: string) { return prisma.client.session.findUnique({ - where, + where: { + id, + }, }); } diff --git a/queries/analytics/sessions/saveSessionData.ts b/queries/analytics/sessions/saveSessionData.ts index 192053f1..ef32bcfb 100644 --- a/queries/analytics/sessions/saveSessionData.ts +++ b/queries/analytics/sessions/saveSessionData.ts @@ -1,6 +1,6 @@ import { DATA_TYPE } from 'lib/constants'; import { uuid } from 'lib/crypto'; -import { flattenJSON } from 'lib/dynamicData'; +import { flattenJSON } from 'lib/data'; import prisma from 'lib/prisma'; import { DynamicData } from 'lib/types'; diff --git a/queries/index.js b/queries/index.js index f86551c4..f509e039 100644 --- a/queries/index.js +++ b/queries/index.js @@ -1,7 +1,8 @@ +export * from './admin/report'; export * from './admin/team'; export * from './admin/teamUser'; +export * from './admin/teamWebsite'; export * from './admin/user'; -export * from './admin/report'; export * from './admin/website'; export * from './analytics/events/getEventMetrics'; export * from './analytics/events/getEventUsage';