diff --git a/lib/prisma.js b/lib/prisma.js index ab1e6ebf..d9eb10fb 100644 --- a/lib/prisma.js +++ b/lib/prisma.js @@ -36,6 +36,18 @@ function logQuery(e) { log(chalk.yellow(e.params), '->', e.query, chalk.greenBright(`${e.duration}ms`)); } +function toUuid() { + const db = getDatabaseType(process.env.DATABASE_URL); + + if (db === POSTGRESQL) { + return '::uuid'; + } + + if (db === MYSQL) { + return ''; + } +} + function getClient(options) { const prisma = new PrismaClient(options); @@ -248,6 +260,7 @@ const prisma = global[PRISMA] || getClient(PRISMA_OPTIONS); export default { client: prisma, log, + toUuid, getDateQuery, getTimestampInterval, getFilterQuery, diff --git a/queries/analytics/event/getEventData.js b/queries/analytics/event/getEventData.js index 91302d30..cef3b4c2 100644 --- a/queries/analytics/event/getEventData.js +++ b/queries/analytics/event/getEventData.js @@ -10,8 +10,8 @@ export async function getEventData(...args) { } async function relationalQuery(websiteId, { startDate, endDate, event_name, columns, filters }) { - const { rawQuery, getEventDataColumnsQuery, getEventDataFilterQuery } = prisma; - const params = [startDate, endDate]; + const { rawQuery, getEventDataColumnsQuery, getEventDataFilterQuery, toUuid } = prisma; + const params = [websiteId, startDate, endDate]; return rawQuery( `select @@ -21,8 +21,8 @@ async function relationalQuery(websiteId, { startDate, endDate, event_name, colu on event.website_id = website.website_id join event_data on event.event_id = event_data.event_id - where website_uuid='${websiteId}' - and event.created_at between $1 and $2 + where website_uuid = $1${toUuid()} + and event.created_at between $2 and $3 ${event_name ? `and event_name = ${event_name}` : ''} ${ Object.keys(filters).length > 0 diff --git a/queries/analytics/event/getEventMetrics.js b/queries/analytics/event/getEventMetrics.js index 605bb688..d40703d7 100644 --- a/queries/analytics/event/getEventMetrics.js +++ b/queries/analytics/event/getEventMetrics.js @@ -17,8 +17,8 @@ async function relationalQuery( unit = 'day', filters = {}, ) { - const { rawQuery, getDateQuery, getFilterQuery } = prisma; - const params = [start_at, end_at]; + const { rawQuery, getDateQuery, getFilterQuery, toUuid } = prisma; + const params = [websiteId, start_at, end_at]; return rawQuery( `select @@ -28,8 +28,8 @@ async function relationalQuery( from event join website on event.website_id = website.website_id - where website_uuid='${websiteId}' - and event.created_at between $1 and $2 + where website_uuid = $1${toUuid()} + and event.created_at between $2 and $3 ${getFilterQuery('event', filters, params)} group by 1, 2 order by 2`, diff --git a/queries/analytics/pageview/getPageviewMetrics.js b/queries/analytics/pageview/getPageviewMetrics.js index 69607d00..58c1e1b0 100644 --- a/queries/analytics/pageview/getPageviewMetrics.js +++ b/queries/analytics/pageview/getPageviewMetrics.js @@ -10,8 +10,8 @@ export async function getPageviewMetrics(...args) { } async function relationalQuery(websiteId, { startDate, endDate, column, table, filters = {} }) { - const { rawQuery, parseFilters } = prisma; - const params = [startDate, endDate]; + const { rawQuery, parseFilters, toUuid } = prisma; + const params = [websiteId, startDate, endDate]; const { pageviewQuery, sessionQuery, eventQuery, joinSession } = parseFilters( table, column, @@ -24,8 +24,8 @@ async function relationalQuery(websiteId, { startDate, endDate, column, table, f from ${table} ${` join website on ${table}.website_id = website.website_id`} ${joinSession} - where website.website_uuid='${websiteId}' - and ${table}.created_at between $1 and $2 + where website.website_uuid = $1${toUuid()} + and ${table}.created_at between $2 and $3 ${pageviewQuery} ${joinSession && sessionQuery} ${eventQuery} diff --git a/queries/analytics/pageview/getPageviewParams.js b/queries/analytics/pageview/getPageviewParams.js index 5cdabfa3..2ccabe23 100644 --- a/queries/analytics/pageview/getPageviewParams.js +++ b/queries/analytics/pageview/getPageviewParams.js @@ -9,8 +9,8 @@ export async function getPageviewParams(...args) { } async function relationalQuery(websiteId, start_at, end_at, column, table, filters = {}) { - const { parseFilters, rawQuery } = prisma; - const params = [start_at, end_at]; + const { parseFilters, rawQuery, toUuid } = prisma; + const params = [websiteId, start_at, end_at]; const { pageviewQuery, sessionQuery, eventQuery, joinSession } = parseFilters( table, column, @@ -24,8 +24,8 @@ async function relationalQuery(websiteId, start_at, end_at, column, table, filte from ${table} ${` join website on ${table}.website_id = website.website_id`} ${joinSession} - where website.website_uuid='${websiteId}' - and ${table}.created_at between $1 and $2 + where website.website_uuid = $1${toUuid()} + and ${table}.created_at between $2 and $3 and ${table}.url like '%?%' ${pageviewQuery} ${joinSession && sessionQuery} diff --git a/queries/analytics/pageview/getPageviewStats.js b/queries/analytics/pageview/getPageviewStats.js index 5ec8339f..1f31d31b 100644 --- a/queries/analytics/pageview/getPageviewStats.js +++ b/queries/analytics/pageview/getPageviewStats.js @@ -21,8 +21,8 @@ async function relationalQuery( sessionKey = 'session_id', }, ) { - const { getDateQuery, parseFilters, rawQuery } = prisma; - const params = [start_at, end_at]; + const { getDateQuery, parseFilters, rawQuery, toUuid } = prisma; + const params = [websiteId, start_at, end_at]; const { pageviewQuery, sessionQuery, joinSession } = parseFilters( 'pageview', null, @@ -37,8 +37,8 @@ async function relationalQuery( join website on pageview.website_id = website.website_id ${joinSession} - where website.website_uuid='${websiteId}' - and pageview.created_at between $1 and $2 + where website.website_uuid = $1${toUuid()} + and pageview.created_at between $2 and $3 ${pageviewQuery} ${sessionQuery} group by 1`, diff --git a/queries/analytics/session/getSessionMetrics.js b/queries/analytics/session/getSessionMetrics.js index 020bddfb..bf9c8079 100644 --- a/queries/analytics/session/getSessionMetrics.js +++ b/queries/analytics/session/getSessionMetrics.js @@ -10,8 +10,8 @@ export async function getSessionMetrics(...args) { } async function relationalQuery(websiteId, { startDate, endDate, field, filters = {} }) { - const { parseFilters, rawQuery } = prisma; - const params = [startDate, endDate]; + const { parseFilters, rawQuery, toUuid } = prisma; + const params = [websiteId, startDate, endDate]; const { pageviewQuery, sessionQuery, joinSession } = parseFilters(null, filters, params); return rawQuery( @@ -23,8 +23,8 @@ async function relationalQuery(websiteId, { startDate, endDate, field, filters = join website on pageview.website_id = website.website_id ${joinSession} - where website.website_uuid='${websiteId}' - and pageview.created_at between $1 and $2 + where website.website_uuid = $1${toUuid()} + and pageview.created_at between $2 and $3 ${pageviewQuery} ${sessionQuery} ) diff --git a/queries/analytics/stats/getActiveVisitors.js b/queries/analytics/stats/getActiveVisitors.js index 3a898d94..3cb525d2 100644 --- a/queries/analytics/stats/getActiveVisitors.js +++ b/queries/analytics/stats/getActiveVisitors.js @@ -11,16 +11,17 @@ export async function getActiveVisitors(...args) { } async function relationalQuery(websiteId) { + const { rawQuery, toUuid } = prisma; const date = subMinutes(new Date(), 5); - const params = [date]; + const params = [websiteId, date]; - return prisma.rawQuery( + return rawQuery( `select count(distinct session_id) x from pageview join website on pageview.website_id = website.website_id - where website.website_uuid = '${websiteId}' - and pageview.created_at >= $1`, + where website.website_uuid = $1${toUuid()} + and pageview.created_at >= $2`, params, ); } diff --git a/queries/analytics/stats/getWebsiteStats.js b/queries/analytics/stats/getWebsiteStats.js index 134e1c3e..9a2452a9 100644 --- a/queries/analytics/stats/getWebsiteStats.js +++ b/queries/analytics/stats/getWebsiteStats.js @@ -10,8 +10,8 @@ export async function getWebsiteStats(...args) { } async function relationalQuery(websiteId, { start_at, end_at, filters = {} }) { - const { getDateQuery, getTimestampInterval, parseFilters, rawQuery } = prisma; - const params = [start_at, end_at]; + const { getDateQuery, getTimestampInterval, parseFilters, rawQuery, toUuid } = prisma; + const params = [websiteId, start_at, end_at]; const { pageviewQuery, sessionQuery, joinSession } = parseFilters( 'pageview', null, @@ -33,8 +33,8 @@ async function relationalQuery(websiteId, { start_at, end_at, filters = {} }) { join website on pageview.website_id = website.website_id ${joinSession} - where website.website_uuid='${websiteId}' - and pageview.created_at between $1 and $2 + where website.website_uuid = $1${toUuid()} + and pageview.created_at between $2 and $3 ${pageviewQuery} ${sessionQuery} group by 1, 2