Merge branch 'dev' into boards
Some checks failed
Node.js CI / build (push) Has been cancelled

# Conflicts:
#	pnpm-lock.yaml
This commit is contained in:
Mike Cao 2026-01-07 01:01:39 -08:00
commit aefc36b476
64 changed files with 699 additions and 319 deletions

View file

@ -132,42 +132,46 @@ export async function updateWebsite(
}
export async function resetWebsite(websiteId: string) {
const { client, transaction } = prisma;
const { transaction } = prisma;
const cloudMode = !!process.env.CLOUD_MODE;
return transaction(
[
client.revenue.deleteMany({
async tx => {
await tx.revenue.deleteMany({
where: { websiteId },
}),
client.eventData.deleteMany({
});
await tx.eventData.deleteMany({
where: { websiteId },
}),
client.sessionData.deleteMany({
});
await tx.sessionData.deleteMany({
where: { websiteId },
}),
client.websiteEvent.deleteMany({
});
await tx.websiteEvent.deleteMany({
where: { websiteId },
}),
client.session.deleteMany({
});
await tx.session.deleteMany({
where: { websiteId },
}),
client.website.update({
});
const website = await tx.website.update({
where: { id: websiteId },
data: {
resetAt: new Date(),
},
}),
],
});
return website;
},
{
timeout: 30000,
},
).then(async data => {
if (cloudMode) {
await redis.client.set(
`website:${websiteId}`,
data.find(website => website.id),
);
await redis.client.set(`website:${websiteId}`, data);
}
return data;
@ -175,43 +179,52 @@ export async function resetWebsite(websiteId: string) {
}
export async function deleteWebsite(websiteId: string) {
const { client, transaction } = prisma;
const { transaction } = prisma;
const cloudMode = !!process.env.CLOUD_MODE;
return transaction(
[
client.revenue.deleteMany({
async tx => {
await tx.revenue.deleteMany({
where: { websiteId },
}),
client.eventData.deleteMany({
});
await tx.eventData.deleteMany({
where: { websiteId },
}),
client.sessionData.deleteMany({
});
await tx.sessionData.deleteMany({
where: { websiteId },
}),
client.websiteEvent.deleteMany({
});
await tx.websiteEvent.deleteMany({
where: { websiteId },
}),
client.session.deleteMany({
});
await tx.session.deleteMany({
where: { websiteId },
}),
client.report.deleteMany({
});
await tx.report.deleteMany({
where: { websiteId },
}),
client.segment.deleteMany({
});
await tx.segment.deleteMany({
where: { websiteId },
}),
cloudMode
? client.website.update({
});
const website = cloudMode
? await tx.website.update({
data: {
deletedAt: new Date(),
},
where: { id: websiteId },
})
: client.website.delete({
: await tx.website.delete({
where: { id: websiteId },
}),
],
});
return website;
},
{
timeout: 30000,
},

View file

@ -119,7 +119,7 @@ async function relationalQuery(
select distinct
website_event.visit_id,
website_event.referrer_path,
coalesce(nullIf(website_event.event_name, ''), website_event.url_path) event,
coalesce(nullIf(website_event.event_name, ''), website_event.url_path) "event",
row_number() OVER (PARTITION BY visit_id ORDER BY website_event.created_at) AS event_number
from website_event
${cohortQuery}

View file

@ -41,14 +41,15 @@ async function relationalQuery(
currency,
});
const joinQuery = filterQuery
? `join website_event
const joinQuery =
filterQuery || cohortQuery
? `join website_event
on website_event.website_id = revenue.website_id
and website_event.session_id = revenue.session_id
and website_event.event_id = revenue.event_id
and website_event.website_id = {{websiteId::uuid}}
and website_event.created_at between {{startDate}} and {{endDate}}`
: '';
: '';
const chart = await rawQuery(
`
@ -62,7 +63,7 @@ async function relationalQuery(
${joinSessionQuery}
where revenue.website_id = {{websiteId::uuid}}
and revenue.created_at between {{startDate}} and {{endDate}}
and revenue.currency = upper({{currency}})
and upper(revenue.currency) = {{currency}}
${filterQuery}
group by x, t
order by t
@ -83,7 +84,7 @@ async function relationalQuery(
${cohortQuery}
where revenue.website_id = {{websiteId::uuid}}
and revenue.created_at between {{startDate}} and {{endDate}}
and revenue.currency = upper({{currency}})
and upper(revenue.currency) = {{currency}}
${filterQuery}
group by session.country
`,
@ -102,7 +103,7 @@ async function relationalQuery(
${joinSessionQuery}
where revenue.website_id = {{websiteId::uuid}}
and revenue.created_at between {{startDate}} and {{endDate}}
and revenue.currency = upper({{currency}})
and upper(revenue.currency) = {{currency}}
${filterQuery}
`,
queryParams,
@ -154,7 +155,7 @@ async function clickhouseQuery(
${cohortQuery}
where website_revenue.website_id = {websiteId:UUID}
and website_revenue.created_at between {startDate:DateTime64} and {endDate:DateTime64}
and website_revenue.currency = upper({currency:String})
and upper(website_revenue.currency) = {currency:String}
${filterQuery}
group by x, t
order by t
@ -182,7 +183,7 @@ async function clickhouseQuery(
${cohortQuery}
where website_revenue.website_id = {websiteId:UUID}
and website_revenue.created_at between {startDate:DateTime64} and {endDate:DateTime64}
and website_revenue.currency = upper({currency:String})
and upper(website_revenue.currency) = {currency:String}
${filterQuery}
group by website_event.country
order by value desc
@ -205,7 +206,7 @@ async function clickhouseQuery(
${cohortQuery}
where website_revenue.website_id = {websiteId:UUID}
and website_revenue.created_at between {startDate:DateTime64} and {endDate:DateTime64}
and website_revenue.currency = upper({currency:String})
and upper(website_revenue.currency) = {currency:String}
${filterQuery}
`,
queryParams,

View file

@ -46,31 +46,23 @@ export async function relationalQuery({
createdAt,
}));
const existing = await client.sessionData.findMany({
where: {
sessionId,
},
select: {
id: true,
sessionId: true,
dataKey: true,
},
});
for (const data of flattenedData) {
const { sessionId, dataKey, ...props } = data;
const record = existing.find(e => e.sessionId === sessionId && e.dataKey === dataKey);
if (record) {
await client.sessionData.update({
where: {
id: record.id,
},
data: {
...props,
},
});
} else {
// Try to update existing record using compound where clause
// This is safer than using id from a previous query due to race conditions
const updateResult = await client.sessionData.updateMany({
where: {
sessionId,
dataKey,
},
data: {
...props,
},
});
// If no record was updated, create a new one
if (updateResult.count === 0) {
await client.sessionData.create({
data,
});