From 59a16e719be8663ece8dff55894d40c4cf37cabc Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Tue, 9 Dec 2025 10:35:10 -0800 Subject: [PATCH 1/4] update bug template --- .github/ISSUE_TEMPLATE/1.bug_report.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/1.bug_report.yml b/.github/ISSUE_TEMPLATE/1.bug_report.yml index 2404918b8..d48567e68 100644 --- a/.github/ISSUE_TEMPLATE/1.bug_report.yml +++ b/.github/ISSUE_TEMPLATE/1.bug_report.yml @@ -24,13 +24,13 @@ body: render: shell - type: input attributes: - label: Which Umami version are you using? (if relevant) + label: Which Umami version are you using? description: 'For example: 2.18.0, 2.15.1, 1.39.0, etc' - type: input attributes: - label: Which browser are you using? (if relevant) - description: 'For example: Chrome, Edge, Firefox, etc' + label: How are you deploying your application? + description: 'For example: Vercel, Railway, Docker, etc' - type: input attributes: - label: How are you deploying your application? (if relevant) - description: 'For example: Vercel, Railway, Docker, etc' + label: Which browser are you using? + description: 'For example: Chrome, Edge, Firefox, etc' From 37b6194c5f6dae2f3662cc2f494b07a5ae3a6584 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Wed, 17 Dec 2025 13:28:34 -0800 Subject: [PATCH 2/4] set 6 month retention for hobby users --- src/lib/load.ts | 12 ++++++++++++ src/lib/request.ts | 12 +++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/lib/load.ts b/src/lib/load.ts index d4d6c3c75..d143344a5 100644 --- a/src/lib/load.ts +++ b/src/lib/load.ts @@ -38,3 +38,15 @@ export async function fetchSession(websiteId: string, sessionId: string): Promis return session; } + +export async function fetchAccount(websiteId: string) { + let account = null; + + const cache = await redis.client.get(`cache:website:${websiteId}`); + + if (cache) { + account = await redis.client.get(`account:${cache.account_id}`); + } + + return account; +} diff --git a/src/lib/request.ts b/src/lib/request.ts index 42c449048..f5b984810 100644 --- a/src/lib/request.ts +++ b/src/lib/request.ts @@ -1,8 +1,9 @@ +import { startOfMonth, subMonths } from 'date-fns'; import { z } from 'zod'; import { checkAuth } from '@/lib/auth'; import { DEFAULT_PAGE_SIZE, FILTER_COLUMNS } from '@/lib/constants'; import { getAllowedUnits, getMinimumUnit, maxDate, parseDateRange } from '@/lib/date'; -import { fetchWebsite } from '@/lib/load'; +import { fetchAccount, fetchWebsite } from '@/lib/load'; import { filtersArrayToObject } from '@/lib/params'; import { badRequest, unauthorized } from '@/lib/response'; import type { QueryFilters } from '@/lib/types'; @@ -82,6 +83,15 @@ export function getRequestFilters(query: Record) { export async function setWebsiteDate(websiteId: string, data: Record) { const website = await fetchWebsite(websiteId); + const cloudMode = !!process.env.CLOUD_MODE; + + if (cloudMode) { + const account = await fetchAccount(websiteId); + + if (!account?.hasSubscription) { + data.startDate = maxDate(data.startDate, startOfMonth(subMonths(new Date(), 6))); + } + } if (website?.resetAt) { data.startDate = maxDate(data.startDate, new Date(website?.resetAt)); From 741c6039e60020e62dd81c20f3f01e365d7d2b73 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Thu, 18 Dec 2025 10:35:52 -0800 Subject: [PATCH 3/4] refactor 6 month retention. use auth instead of cache:website --- src/app/api/reports/attribution/route.ts | 4 ++-- src/app/api/reports/breakdown/route.ts | 4 ++-- src/app/api/reports/funnel/route.ts | 4 ++-- src/app/api/reports/goal/route.ts | 4 ++-- src/app/api/reports/retention/route.ts | 4 ++-- src/app/api/reports/revenue/route.ts | 4 ++-- src/app/api/reports/utm/route.ts | 4 ++-- .../websites/[websiteId]/event-data/events/route.ts | 2 +- .../websites/[websiteId]/event-data/fields/route.ts | 2 +- .../[websiteId]/event-data/properties/route.ts | 2 +- .../websites/[websiteId]/event-data/stats/route.ts | 2 +- .../websites/[websiteId]/event-data/values/route.ts | 2 +- src/app/api/websites/[websiteId]/events/route.ts | 2 +- .../api/websites/[websiteId]/events/series/route.ts | 2 +- src/app/api/websites/[websiteId]/export/route.ts | 2 +- .../websites/[websiteId]/metrics/expanded/route.ts | 2 +- src/app/api/websites/[websiteId]/metrics/route.ts | 2 +- src/app/api/websites/[websiteId]/pageviews/route.ts | 2 +- .../[websiteId]/session-data/properties/route.ts | 2 +- .../websites/[websiteId]/session-data/values/route.ts | 2 +- .../sessions/[sessionId]/activity/route.ts | 2 +- src/app/api/websites/[websiteId]/sessions/route.ts | 2 +- .../api/websites/[websiteId]/sessions/stats/route.ts | 2 +- .../api/websites/[websiteId]/sessions/weekly/route.ts | 2 +- src/app/api/websites/[websiteId]/stats/route.ts | 2 +- src/app/api/websites/[websiteId]/values/route.ts | 2 +- src/app/api/websites/route.ts | 4 ++-- src/lib/load.ts | 10 ++-------- src/lib/request.ts | 11 ++++++----- 29 files changed, 43 insertions(+), 48 deletions(-) diff --git a/src/app/api/reports/attribution/route.ts b/src/app/api/reports/attribution/route.ts index bd7d86dc7..c487120f1 100644 --- a/src/app/api/reports/attribution/route.ts +++ b/src/app/api/reports/attribution/route.ts @@ -17,8 +17,8 @@ export async function POST(request: Request) { return unauthorized(); } - const parameters = await setWebsiteDate(websiteId, body.parameters); - const filters = await getQueryFilters(body.filters, websiteId); + const parameters = await setWebsiteDate(websiteId, auth.user.id, body.parameters); + const filters = await getQueryFilters(body.filters, websiteId, auth.user.id); const data = await getAttribution(websiteId, parameters as AttributionParameters, filters); diff --git a/src/app/api/reports/breakdown/route.ts b/src/app/api/reports/breakdown/route.ts index 3c5931458..4464afaaa 100644 --- a/src/app/api/reports/breakdown/route.ts +++ b/src/app/api/reports/breakdown/route.ts @@ -17,8 +17,8 @@ export async function POST(request: Request) { return unauthorized(); } - const parameters = await setWebsiteDate(websiteId, body.parameters); - const filters = await getQueryFilters(body.filters, websiteId); + const parameters = await setWebsiteDate(websiteId, auth.user.id, body.parameters); + const filters = await getQueryFilters(body.filters, websiteId, auth.user.id); const data = await getBreakdown(websiteId, parameters as BreakdownParameters, filters); diff --git a/src/app/api/reports/funnel/route.ts b/src/app/api/reports/funnel/route.ts index c13f6f1c8..0d1fbf593 100644 --- a/src/app/api/reports/funnel/route.ts +++ b/src/app/api/reports/funnel/route.ts @@ -17,8 +17,8 @@ export async function POST(request: Request) { return unauthorized(); } - const parameters = await setWebsiteDate(websiteId, body.parameters); - const filters = await getQueryFilters(body.filters, websiteId); + const parameters = await setWebsiteDate(websiteId, auth.user.id, body.parameters); + const filters = await getQueryFilters(body.filters, websiteId, auth.user.id); const data = await getFunnel(websiteId, parameters as FunnelParameters, filters); diff --git a/src/app/api/reports/goal/route.ts b/src/app/api/reports/goal/route.ts index 3bd0415d6..4f376bd1d 100644 --- a/src/app/api/reports/goal/route.ts +++ b/src/app/api/reports/goal/route.ts @@ -17,8 +17,8 @@ export async function POST(request: Request) { return unauthorized(); } - const parameters = await setWebsiteDate(websiteId, body.parameters); - const filters = await getQueryFilters(body.filters, websiteId); + const parameters = await setWebsiteDate(websiteId, auth.user.id, body.parameters); + const filters = await getQueryFilters(body.filters, websiteId, auth.user.id); const data = await getGoal(websiteId, parameters as GoalParameters, filters); diff --git a/src/app/api/reports/retention/route.ts b/src/app/api/reports/retention/route.ts index d1a7d698b..33e226619 100644 --- a/src/app/api/reports/retention/route.ts +++ b/src/app/api/reports/retention/route.ts @@ -17,8 +17,8 @@ export async function POST(request: Request) { return unauthorized(); } - const filters = await getQueryFilters(body.filters, websiteId); - const parameters = await setWebsiteDate(websiteId, body.parameters); + const filters = await getQueryFilters(body.filters, websiteId, auth.user.id); + const parameters = await setWebsiteDate(websiteId, auth.user.id, body.parameters); const data = await getRetention(websiteId, parameters as RetentionParameters, filters); diff --git a/src/app/api/reports/revenue/route.ts b/src/app/api/reports/revenue/route.ts index 6a556612b..1d3d54bf6 100644 --- a/src/app/api/reports/revenue/route.ts +++ b/src/app/api/reports/revenue/route.ts @@ -17,8 +17,8 @@ export async function POST(request: Request) { return unauthorized(); } - const parameters = await setWebsiteDate(websiteId, body.parameters); - const filters = await getQueryFilters(body.filters, websiteId); + const parameters = await setWebsiteDate(websiteId, auth.user.id, body.parameters); + const filters = await getQueryFilters(body.filters, websiteId, auth.user.id); const data = await getRevenue(websiteId, parameters as RevenuParameters, filters); diff --git a/src/app/api/reports/utm/route.ts b/src/app/api/reports/utm/route.ts index 577fdab79..6c6ff9065 100644 --- a/src/app/api/reports/utm/route.ts +++ b/src/app/api/reports/utm/route.ts @@ -18,8 +18,8 @@ export async function POST(request: Request) { return unauthorized(); } - const filters = await getQueryFilters(body.filters, websiteId); - const parameters = await setWebsiteDate(websiteId, body.parameters); + const filters = await getQueryFilters(body.filters, websiteId, auth.user.id); + const parameters = await setWebsiteDate(websiteId, auth.user.id, body.parameters); const data = { utm_source: [], diff --git a/src/app/api/websites/[websiteId]/event-data/events/route.ts b/src/app/api/websites/[websiteId]/event-data/events/route.ts index eb6ee6ed8..dec689967 100644 --- a/src/app/api/websites/[websiteId]/event-data/events/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/events/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const data = await getEventDataEvents(websiteId, { ...filters, diff --git a/src/app/api/websites/[websiteId]/event-data/fields/route.ts b/src/app/api/websites/[websiteId]/event-data/fields/route.ts index bce6a977c..b6b3bd787 100644 --- a/src/app/api/websites/[websiteId]/event-data/fields/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/fields/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const data = await getEventDataFields(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/event-data/properties/route.ts b/src/app/api/websites/[websiteId]/event-data/properties/route.ts index 52d15cfbd..ad4be6612 100644 --- a/src/app/api/websites/[websiteId]/event-data/properties/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/properties/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const data = await getEventDataProperties(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/event-data/stats/route.ts b/src/app/api/websites/[websiteId]/event-data/stats/route.ts index 042e989a4..141f0531b 100644 --- a/src/app/api/websites/[websiteId]/event-data/stats/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/stats/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const data = await getEventDataStats(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/event-data/values/route.ts b/src/app/api/websites/[websiteId]/event-data/values/route.ts index 12e8f2dc0..10f8847b0 100644 --- a/src/app/api/websites/[websiteId]/event-data/values/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/values/route.ts @@ -30,7 +30,7 @@ export async function GET( } const { propertyName } = query; - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const data = await getEventDataValues(websiteId, { ...filters, diff --git a/src/app/api/websites/[websiteId]/events/route.ts b/src/app/api/websites/[websiteId]/events/route.ts index 74ec3ece4..69dcaf057 100644 --- a/src/app/api/websites/[websiteId]/events/route.ts +++ b/src/app/api/websites/[websiteId]/events/route.ts @@ -29,7 +29,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const data = await getWebsiteEvents(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/events/series/route.ts b/src/app/api/websites/[websiteId]/events/series/route.ts index 977e9c813..8df3d36c1 100644 --- a/src/app/api/websites/[websiteId]/events/series/route.ts +++ b/src/app/api/websites/[websiteId]/events/series/route.ts @@ -29,7 +29,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const data = await getEventStats(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/export/route.ts b/src/app/api/websites/[websiteId]/export/route.ts index eec81c6d4..9e20cd009 100644 --- a/src/app/api/websites/[websiteId]/export/route.ts +++ b/src/app/api/websites/[websiteId]/export/route.ts @@ -28,7 +28,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const [events, pages, referrers, browsers, os, devices, countries] = await Promise.all([ getEventMetrics(websiteId, { type: 'event' }, filters), diff --git a/src/app/api/websites/[websiteId]/metrics/expanded/route.ts b/src/app/api/websites/[websiteId]/metrics/expanded/route.ts index d52c17736..bb84bf139 100644 --- a/src/app/api/websites/[websiteId]/metrics/expanded/route.ts +++ b/src/app/api/websites/[websiteId]/metrics/expanded/route.ts @@ -37,7 +37,7 @@ export async function GET( } const { type, limit, offset, search } = query; - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); if (search) { filters[type] = `c.${search}`; diff --git a/src/app/api/websites/[websiteId]/metrics/route.ts b/src/app/api/websites/[websiteId]/metrics/route.ts index 12784adbe..2b1487f21 100644 --- a/src/app/api/websites/[websiteId]/metrics/route.ts +++ b/src/app/api/websites/[websiteId]/metrics/route.ts @@ -37,7 +37,7 @@ export async function GET( } const { type, limit, offset, search } = query; - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); if (search) { filters[type] = `c.${search}`; diff --git a/src/app/api/websites/[websiteId]/pageviews/route.ts b/src/app/api/websites/[websiteId]/pageviews/route.ts index af59bce46..628d53358 100644 --- a/src/app/api/websites/[websiteId]/pageviews/route.ts +++ b/src/app/api/websites/[websiteId]/pageviews/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const [pageviews, sessions] = await Promise.all([ getPageviewStats(websiteId, filters), diff --git a/src/app/api/websites/[websiteId]/session-data/properties/route.ts b/src/app/api/websites/[websiteId]/session-data/properties/route.ts index 2d8db1535..227700d23 100644 --- a/src/app/api/websites/[websiteId]/session-data/properties/route.ts +++ b/src/app/api/websites/[websiteId]/session-data/properties/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const data = await getSessionDataProperties(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/session-data/values/route.ts b/src/app/api/websites/[websiteId]/session-data/values/route.ts index 7d06870ac..4c1f3f251 100644 --- a/src/app/api/websites/[websiteId]/session-data/values/route.ts +++ b/src/app/api/websites/[websiteId]/session-data/values/route.ts @@ -29,7 +29,7 @@ export async function GET( } const { propertyName } = query; - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const data = await getSessionDataValues(websiteId, { ...filters, diff --git a/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts b/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts index 41b766d03..40ad362cb 100644 --- a/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts +++ b/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts @@ -25,7 +25,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const data = await getSessionActivity(websiteId, sessionId, filters); diff --git a/src/app/api/websites/[websiteId]/sessions/route.ts b/src/app/api/websites/[websiteId]/sessions/route.ts index ed4757a1c..e0d00cf59 100644 --- a/src/app/api/websites/[websiteId]/sessions/route.ts +++ b/src/app/api/websites/[websiteId]/sessions/route.ts @@ -28,7 +28,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const data = await getWebsiteSessions(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/sessions/stats/route.ts b/src/app/api/websites/[websiteId]/sessions/stats/route.ts index 459830edf..7393b5804 100644 --- a/src/app/api/websites/[websiteId]/sessions/stats/route.ts +++ b/src/app/api/websites/[websiteId]/sessions/stats/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const metrics = await getWebsiteSessionStats(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/sessions/weekly/route.ts b/src/app/api/websites/[websiteId]/sessions/weekly/route.ts index b9ccf3ef0..075ddea59 100644 --- a/src/app/api/websites/[websiteId]/sessions/weekly/route.ts +++ b/src/app/api/websites/[websiteId]/sessions/weekly/route.ts @@ -28,7 +28,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const data = await getWeeklyTraffic(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/stats/route.ts b/src/app/api/websites/[websiteId]/stats/route.ts index 07c8b9699..f307325a6 100644 --- a/src/app/api/websites/[websiteId]/stats/route.ts +++ b/src/app/api/websites/[websiteId]/stats/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); const data = await getWebsiteStats(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/values/route.ts b/src/app/api/websites/[websiteId]/values/route.ts index 172325e3f..7b8bd58e3 100644 --- a/src/app/api/websites/[websiteId]/values/route.ts +++ b/src/app/api/websites/[websiteId]/values/route.ts @@ -42,7 +42,7 @@ export async function GET( value: segment.name, })); } else { - const filters = await getQueryFilters(query, websiteId); + const filters = await getQueryFilters(query, websiteId, auth.user.id); values = await getValues(websiteId, FILTER_COLUMNS[type], filters); } diff --git a/src/app/api/websites/route.ts b/src/app/api/websites/route.ts index e2b26c108..dd8e0ffdd 100644 --- a/src/app/api/websites/route.ts +++ b/src/app/api/websites/route.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; import { uuid } from '@/lib/crypto'; -import redis from '@/lib/redis'; +import { fetchAccount } from '@/lib/load'; import { getQueryFilters, parseRequest } from '@/lib/request'; import { json, unauthorized } from '@/lib/response'; import { pagingParams, searchParams } from '@/lib/schema'; @@ -52,7 +52,7 @@ export async function POST(request: Request) { const { id, name, domain, shareId, teamId } = body; if (process.env.CLOUD_MODE && !teamId) { - const account = await redis.client.get(`account:${auth.user.id}`); + const account = await fetchAccount(auth.user.id); if (!account?.hasSubscription) { const count = await getWebsiteCount(auth.user.id); diff --git a/src/lib/load.ts b/src/lib/load.ts index d143344a5..bf527975f 100644 --- a/src/lib/load.ts +++ b/src/lib/load.ts @@ -39,14 +39,8 @@ export async function fetchSession(websiteId: string, sessionId: string): Promis return session; } -export async function fetchAccount(websiteId: string) { - let account = null; - - const cache = await redis.client.get(`cache:website:${websiteId}`); - - if (cache) { - account = await redis.client.get(`account:${cache.account_id}`); - } +export async function fetchAccount(userId: string) { + const account = await redis.client.get(`account:${userId}`); return account; } diff --git a/src/lib/request.ts b/src/lib/request.ts index f5b984810..e6450bf31 100644 --- a/src/lib/request.ts +++ b/src/lib/request.ts @@ -17,7 +17,7 @@ export async function parseRequest( const url = new URL(request.url); let query = Object.fromEntries(url.searchParams); let body = await getJsonBody(request); - let error: () => undefined | undefined; + let error: () => undefined | undefined | Response; let auth = null; if (schema) { @@ -81,12 +81,12 @@ export function getRequestFilters(query: Record) { return result; } -export async function setWebsiteDate(websiteId: string, data: Record) { +export async function setWebsiteDate(websiteId: string, userId: string, data: Record) { const website = await fetchWebsite(websiteId); const cloudMode = !!process.env.CLOUD_MODE; - if (cloudMode) { - const account = await fetchAccount(websiteId); + if (cloudMode && !website.teamId) { + const account = await fetchAccount(userId); if (!account?.hasSubscription) { data.startDate = maxDate(data.startDate, startOfMonth(subMonths(new Date(), 6))); @@ -103,12 +103,13 @@ export async function setWebsiteDate(websiteId: string, data: Record, websiteId?: string, + userId?: string, ): Promise { const dateRange = getRequestDateRange(params); const filters = getRequestFilters(params); if (websiteId) { - await setWebsiteDate(websiteId, dateRange); + await setWebsiteDate(websiteId, userId, dateRange); if (params.segment) { const segmentParams = (await getWebsiteSegment(websiteId, params.segment)) From 86d2672c47fe74f38ff71a62e8540c1bc5ffb7d1 Mon Sep 17 00:00:00 2001 From: Francis Cao Date: Thu, 18 Dec 2025 11:33:29 -0800 Subject: [PATCH 4/4] fix shareId error --- src/app/api/reports/attribution/route.ts | 2 +- src/app/api/reports/breakdown/route.ts | 2 +- src/app/api/reports/funnel/route.ts | 2 +- src/app/api/reports/goal/route.ts | 2 +- src/app/api/reports/retention/route.ts | 2 +- src/app/api/reports/revenue/route.ts | 2 +- src/app/api/reports/utm/route.ts | 2 +- src/app/api/websites/[websiteId]/event-data/events/route.ts | 2 +- src/app/api/websites/[websiteId]/event-data/fields/route.ts | 2 +- src/app/api/websites/[websiteId]/event-data/properties/route.ts | 2 +- src/app/api/websites/[websiteId]/event-data/stats/route.ts | 2 +- src/app/api/websites/[websiteId]/event-data/values/route.ts | 2 +- src/app/api/websites/[websiteId]/events/route.ts | 2 +- src/app/api/websites/[websiteId]/events/series/route.ts | 2 +- src/app/api/websites/[websiteId]/export/route.ts | 2 +- src/app/api/websites/[websiteId]/metrics/expanded/route.ts | 2 +- src/app/api/websites/[websiteId]/metrics/route.ts | 2 +- src/app/api/websites/[websiteId]/pageviews/route.ts | 2 +- .../api/websites/[websiteId]/session-data/properties/route.ts | 2 +- src/app/api/websites/[websiteId]/session-data/values/route.ts | 2 +- .../websites/[websiteId]/sessions/[sessionId]/activity/route.ts | 2 +- src/app/api/websites/[websiteId]/sessions/route.ts | 2 +- src/app/api/websites/[websiteId]/sessions/stats/route.ts | 2 +- src/app/api/websites/[websiteId]/sessions/weekly/route.ts | 2 +- src/app/api/websites/[websiteId]/stats/route.ts | 2 +- src/app/api/websites/[websiteId]/values/route.ts | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/app/api/reports/attribution/route.ts b/src/app/api/reports/attribution/route.ts index c487120f1..ab9b1ddbc 100644 --- a/src/app/api/reports/attribution/route.ts +++ b/src/app/api/reports/attribution/route.ts @@ -18,7 +18,7 @@ export async function POST(request: Request) { } const parameters = await setWebsiteDate(websiteId, auth.user.id, body.parameters); - const filters = await getQueryFilters(body.filters, websiteId, auth.user.id); + const filters = await getQueryFilters(body.filters, websiteId, auth.user?.id); const data = await getAttribution(websiteId, parameters as AttributionParameters, filters); diff --git a/src/app/api/reports/breakdown/route.ts b/src/app/api/reports/breakdown/route.ts index 4464afaaa..a06636c74 100644 --- a/src/app/api/reports/breakdown/route.ts +++ b/src/app/api/reports/breakdown/route.ts @@ -18,7 +18,7 @@ export async function POST(request: Request) { } const parameters = await setWebsiteDate(websiteId, auth.user.id, body.parameters); - const filters = await getQueryFilters(body.filters, websiteId, auth.user.id); + const filters = await getQueryFilters(body.filters, websiteId, auth.user?.id); const data = await getBreakdown(websiteId, parameters as BreakdownParameters, filters); diff --git a/src/app/api/reports/funnel/route.ts b/src/app/api/reports/funnel/route.ts index 0d1fbf593..f6e210293 100644 --- a/src/app/api/reports/funnel/route.ts +++ b/src/app/api/reports/funnel/route.ts @@ -18,7 +18,7 @@ export async function POST(request: Request) { } const parameters = await setWebsiteDate(websiteId, auth.user.id, body.parameters); - const filters = await getQueryFilters(body.filters, websiteId, auth.user.id); + const filters = await getQueryFilters(body.filters, websiteId, auth.user?.id); const data = await getFunnel(websiteId, parameters as FunnelParameters, filters); diff --git a/src/app/api/reports/goal/route.ts b/src/app/api/reports/goal/route.ts index 4f376bd1d..db2aabcef 100644 --- a/src/app/api/reports/goal/route.ts +++ b/src/app/api/reports/goal/route.ts @@ -18,7 +18,7 @@ export async function POST(request: Request) { } const parameters = await setWebsiteDate(websiteId, auth.user.id, body.parameters); - const filters = await getQueryFilters(body.filters, websiteId, auth.user.id); + const filters = await getQueryFilters(body.filters, websiteId, auth.user?.id); const data = await getGoal(websiteId, parameters as GoalParameters, filters); diff --git a/src/app/api/reports/retention/route.ts b/src/app/api/reports/retention/route.ts index 33e226619..5adf7bb85 100644 --- a/src/app/api/reports/retention/route.ts +++ b/src/app/api/reports/retention/route.ts @@ -17,7 +17,7 @@ export async function POST(request: Request) { return unauthorized(); } - const filters = await getQueryFilters(body.filters, websiteId, auth.user.id); + const filters = await getQueryFilters(body.filters, websiteId, auth.user?.id); const parameters = await setWebsiteDate(websiteId, auth.user.id, body.parameters); const data = await getRetention(websiteId, parameters as RetentionParameters, filters); diff --git a/src/app/api/reports/revenue/route.ts b/src/app/api/reports/revenue/route.ts index 1d3d54bf6..f4146b966 100644 --- a/src/app/api/reports/revenue/route.ts +++ b/src/app/api/reports/revenue/route.ts @@ -18,7 +18,7 @@ export async function POST(request: Request) { } const parameters = await setWebsiteDate(websiteId, auth.user.id, body.parameters); - const filters = await getQueryFilters(body.filters, websiteId, auth.user.id); + const filters = await getQueryFilters(body.filters, websiteId, auth.user?.id); const data = await getRevenue(websiteId, parameters as RevenuParameters, filters); diff --git a/src/app/api/reports/utm/route.ts b/src/app/api/reports/utm/route.ts index 6c6ff9065..d4af4da06 100644 --- a/src/app/api/reports/utm/route.ts +++ b/src/app/api/reports/utm/route.ts @@ -18,7 +18,7 @@ export async function POST(request: Request) { return unauthorized(); } - const filters = await getQueryFilters(body.filters, websiteId, auth.user.id); + const filters = await getQueryFilters(body.filters, websiteId, auth.user?.id); const parameters = await setWebsiteDate(websiteId, auth.user.id, body.parameters); const data = { diff --git a/src/app/api/websites/[websiteId]/event-data/events/route.ts b/src/app/api/websites/[websiteId]/event-data/events/route.ts index dec689967..444afa273 100644 --- a/src/app/api/websites/[websiteId]/event-data/events/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/events/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const data = await getEventDataEvents(websiteId, { ...filters, diff --git a/src/app/api/websites/[websiteId]/event-data/fields/route.ts b/src/app/api/websites/[websiteId]/event-data/fields/route.ts index b6b3bd787..e034d9375 100644 --- a/src/app/api/websites/[websiteId]/event-data/fields/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/fields/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const data = await getEventDataFields(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/event-data/properties/route.ts b/src/app/api/websites/[websiteId]/event-data/properties/route.ts index ad4be6612..29719fb22 100644 --- a/src/app/api/websites/[websiteId]/event-data/properties/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/properties/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const data = await getEventDataProperties(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/event-data/stats/route.ts b/src/app/api/websites/[websiteId]/event-data/stats/route.ts index 141f0531b..1d1e76dff 100644 --- a/src/app/api/websites/[websiteId]/event-data/stats/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/stats/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const data = await getEventDataStats(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/event-data/values/route.ts b/src/app/api/websites/[websiteId]/event-data/values/route.ts index 10f8847b0..ed01fb2b6 100644 --- a/src/app/api/websites/[websiteId]/event-data/values/route.ts +++ b/src/app/api/websites/[websiteId]/event-data/values/route.ts @@ -30,7 +30,7 @@ export async function GET( } const { propertyName } = query; - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const data = await getEventDataValues(websiteId, { ...filters, diff --git a/src/app/api/websites/[websiteId]/events/route.ts b/src/app/api/websites/[websiteId]/events/route.ts index 69dcaf057..dfabb87fb 100644 --- a/src/app/api/websites/[websiteId]/events/route.ts +++ b/src/app/api/websites/[websiteId]/events/route.ts @@ -29,7 +29,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const data = await getWebsiteEvents(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/events/series/route.ts b/src/app/api/websites/[websiteId]/events/series/route.ts index 8df3d36c1..d5b925590 100644 --- a/src/app/api/websites/[websiteId]/events/series/route.ts +++ b/src/app/api/websites/[websiteId]/events/series/route.ts @@ -29,7 +29,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const data = await getEventStats(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/export/route.ts b/src/app/api/websites/[websiteId]/export/route.ts index 9e20cd009..f9749f34e 100644 --- a/src/app/api/websites/[websiteId]/export/route.ts +++ b/src/app/api/websites/[websiteId]/export/route.ts @@ -28,7 +28,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const [events, pages, referrers, browsers, os, devices, countries] = await Promise.all([ getEventMetrics(websiteId, { type: 'event' }, filters), diff --git a/src/app/api/websites/[websiteId]/metrics/expanded/route.ts b/src/app/api/websites/[websiteId]/metrics/expanded/route.ts index bb84bf139..7e6fbbfdf 100644 --- a/src/app/api/websites/[websiteId]/metrics/expanded/route.ts +++ b/src/app/api/websites/[websiteId]/metrics/expanded/route.ts @@ -37,7 +37,7 @@ export async function GET( } const { type, limit, offset, search } = query; - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); if (search) { filters[type] = `c.${search}`; diff --git a/src/app/api/websites/[websiteId]/metrics/route.ts b/src/app/api/websites/[websiteId]/metrics/route.ts index 2b1487f21..2d0e6a600 100644 --- a/src/app/api/websites/[websiteId]/metrics/route.ts +++ b/src/app/api/websites/[websiteId]/metrics/route.ts @@ -37,7 +37,7 @@ export async function GET( } const { type, limit, offset, search } = query; - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); if (search) { filters[type] = `c.${search}`; diff --git a/src/app/api/websites/[websiteId]/pageviews/route.ts b/src/app/api/websites/[websiteId]/pageviews/route.ts index 628d53358..dc921bc0c 100644 --- a/src/app/api/websites/[websiteId]/pageviews/route.ts +++ b/src/app/api/websites/[websiteId]/pageviews/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const [pageviews, sessions] = await Promise.all([ getPageviewStats(websiteId, filters), diff --git a/src/app/api/websites/[websiteId]/session-data/properties/route.ts b/src/app/api/websites/[websiteId]/session-data/properties/route.ts index 227700d23..a0aed73ce 100644 --- a/src/app/api/websites/[websiteId]/session-data/properties/route.ts +++ b/src/app/api/websites/[websiteId]/session-data/properties/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const data = await getSessionDataProperties(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/session-data/values/route.ts b/src/app/api/websites/[websiteId]/session-data/values/route.ts index 4c1f3f251..db7106548 100644 --- a/src/app/api/websites/[websiteId]/session-data/values/route.ts +++ b/src/app/api/websites/[websiteId]/session-data/values/route.ts @@ -29,7 +29,7 @@ export async function GET( } const { propertyName } = query; - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const data = await getSessionDataValues(websiteId, { ...filters, diff --git a/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts b/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts index 40ad362cb..3e70bea0a 100644 --- a/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts +++ b/src/app/api/websites/[websiteId]/sessions/[sessionId]/activity/route.ts @@ -25,7 +25,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const data = await getSessionActivity(websiteId, sessionId, filters); diff --git a/src/app/api/websites/[websiteId]/sessions/route.ts b/src/app/api/websites/[websiteId]/sessions/route.ts index e0d00cf59..f344476c3 100644 --- a/src/app/api/websites/[websiteId]/sessions/route.ts +++ b/src/app/api/websites/[websiteId]/sessions/route.ts @@ -28,7 +28,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const data = await getWebsiteSessions(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/sessions/stats/route.ts b/src/app/api/websites/[websiteId]/sessions/stats/route.ts index 7393b5804..74b4e5e80 100644 --- a/src/app/api/websites/[websiteId]/sessions/stats/route.ts +++ b/src/app/api/websites/[websiteId]/sessions/stats/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const metrics = await getWebsiteSessionStats(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/sessions/weekly/route.ts b/src/app/api/websites/[websiteId]/sessions/weekly/route.ts index 075ddea59..f6dfd206b 100644 --- a/src/app/api/websites/[websiteId]/sessions/weekly/route.ts +++ b/src/app/api/websites/[websiteId]/sessions/weekly/route.ts @@ -28,7 +28,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const data = await getWeeklyTraffic(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/stats/route.ts b/src/app/api/websites/[websiteId]/stats/route.ts index f307325a6..2bf862cdc 100644 --- a/src/app/api/websites/[websiteId]/stats/route.ts +++ b/src/app/api/websites/[websiteId]/stats/route.ts @@ -27,7 +27,7 @@ export async function GET( return unauthorized(); } - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); const data = await getWebsiteStats(websiteId, filters); diff --git a/src/app/api/websites/[websiteId]/values/route.ts b/src/app/api/websites/[websiteId]/values/route.ts index 7b8bd58e3..c2c95b375 100644 --- a/src/app/api/websites/[websiteId]/values/route.ts +++ b/src/app/api/websites/[websiteId]/values/route.ts @@ -42,7 +42,7 @@ export async function GET( value: segment.name, })); } else { - const filters = await getQueryFilters(query, websiteId, auth.user.id); + const filters = await getQueryFilters(query, websiteId, auth.user?.id); values = await getValues(websiteId, FILTER_COLUMNS[type], filters); }