Skip to content

Commit 35ce661

Browse files
committed
fix: landing, timezone in queries, etc
1 parent 0206c76 commit 35ce661

File tree

6 files changed

+20
-14
lines changed

6 files changed

+20
-14
lines changed

apps/api/src/query/builders/summary.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ export const SummaryBuilders: Record<string, SimpleQueryConfig> = {
8787
},
8888

8989
events_by_date: {
90-
customSql: (websiteId: string, startDate: string, endDate: string, filters?: Filter[], granularity?: TimeUnit) => {
90+
customSql: (websiteId: string, startDate: string, endDate: string, filters?: Filter[], granularity?: TimeUnit, limit?: number, offset?: number, timezone?: string) => {
91+
const tz = timezone || 'UTC';
9192
const isHourly = granularity === 'hour' || granularity === 'hourly';
9293

9394
if (isHourly) {
@@ -102,7 +103,7 @@ export const SummaryBuilders: Record<string, SimpleQueryConfig> = {
102103
session_details AS (
103104
SELECT
104105
session_id,
105-
toStartOfHour(MIN(time)) as session_start_hour,
106+
toStartOfHour(toTimeZone(MIN(time), {timezone:String})) as session_start_hour,
106107
countIf(event_name = 'screen_view') as page_count,
107108
dateDiff('second', MIN(time), MAX(time)) as duration
108109
FROM analytics.events
@@ -123,7 +124,7 @@ export const SummaryBuilders: Record<string, SimpleQueryConfig> = {
123124
),
124125
hourly_event_metrics AS (
125126
SELECT
126-
toStartOfHour(time) as event_hour,
127+
toStartOfHour(toTimeZone(time, {timezone:String})) as event_hour,
127128
countIf(event_name = 'screen_view') as pageviews,
128129
count(distinct anonymous_id) as unique_visitors
129130
FROM analytics.events
@@ -158,6 +159,7 @@ export const SummaryBuilders: Record<string, SimpleQueryConfig> = {
158159
websiteId,
159160
startDate,
160161
endDate,
162+
timezone: tz,
161163
}
162164
};
163165
}
@@ -173,7 +175,7 @@ export const SummaryBuilders: Record<string, SimpleQueryConfig> = {
173175
session_details AS (
174176
SELECT
175177
session_id,
176-
toDate(MIN(time)) as session_start_date,
178+
toDate(toTimeZone(MIN(time), {timezone:String})) as session_start_date,
177179
countIf(event_name = 'screen_view') as page_count,
178180
dateDiff('second', MIN(time), MAX(time)) as duration
179181
FROM analytics.events
@@ -194,7 +196,7 @@ export const SummaryBuilders: Record<string, SimpleQueryConfig> = {
194196
),
195197
daily_event_metrics AS (
196198
SELECT
197-
toDate(time) as event_date,
199+
toDate(toTimeZone(time, {timezone:String})) as event_date,
198200
countIf(event_name = 'screen_view') as pageviews,
199201
count(distinct anonymous_id) as unique_visitors
200202
FROM analytics.events
@@ -229,6 +231,7 @@ export const SummaryBuilders: Record<string, SimpleQueryConfig> = {
229231
websiteId,
230232
startDate,
231233
endDate,
234+
timezone: tz,
232235
}
233236
};
234237
},

apps/api/src/query/index.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,27 @@ const QuerySchema = z.object({
2020
offset: z.number().min(0).optional()
2121
});
2222

23-
export const executeQuery = async (request: QueryRequest, websiteDomain?: string | null) => {
23+
export const executeQuery = async (request: QueryRequest, websiteDomain?: string | null, timezone?: string) => {
2424
const validated = QuerySchema.parse(request);
2525

2626
const config = QueryBuilders[validated.type];
2727
if (!config) {
2828
throw new Error(`Unknown query type: ${validated.type}`);
2929
}
3030

31-
const builder = new SimpleQueryBuilder(config, validated, websiteDomain);
31+
const builder = new SimpleQueryBuilder(config, { ...validated, timezone: timezone ?? validated.timezone }, websiteDomain);
3232
return await builder.execute();
3333
};
3434

35-
export const compileQuery = (request: QueryRequest, websiteDomain?: string | null) => {
35+
export const compileQuery = (request: QueryRequest, websiteDomain?: string | null, timezone?: string) => {
3636
const validated = QuerySchema.parse(request);
3737

3838
const config = QueryBuilders[validated.type];
3939
if (!config) {
4040
throw new Error(`Unknown query type: ${validated.type}`);
4141
}
4242

43-
const builder = new SimpleQueryBuilder(config, validated, websiteDomain);
43+
const builder = new SimpleQueryBuilder(config, { ...validated, timezone: timezone ?? validated.timezone }, websiteDomain);
4444
return builder.compile();
4545
};
4646

apps/api/src/query/simple-builder.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ export class SimpleQueryBuilder {
6565
this.request.filters,
6666
this.request.timeUnit,
6767
this.request.limit,
68-
this.request.offset
68+
this.request.offset,
69+
this.request.timezone
6970
);
7071

7172
if (typeof result === 'string') {

apps/api/src/query/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ export interface SimpleQueryConfig {
4949
filters?: Filter[],
5050
granularity?: TimeUnit,
5151
limit?: number,
52-
offset?: number
52+
offset?: number,
53+
timezone?: string
5354
) => string | { sql: string; params: Record<string, unknown> };
5455
appendEndOfDayToTo?: boolean; // If true (default), append ' 23:59:59' to 'to' value. If false, use 'to' as-is.
5556
}
@@ -65,6 +66,7 @@ export interface QueryRequest {
6566
orderBy?: string;
6667
limit?: number;
6768
offset?: number;
69+
timezone?: string;
6870
}
6971

7072
export interface CompiledQuery {

apps/api/src/routes/query.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,10 +243,11 @@ async function executeDynamicQuery(request: any, queryParams: any) {
243243
timeUnit: getTimeUnit(request.granularity),
244244
filters: request.filters || [],
245245
limit: request.limit || 100,
246-
offset: request.page ? (request.page - 1) * (request.limit || 100) : 0
246+
offset: request.page ? (request.page - 1) * (request.limit || 100) : 0,
247+
timezone: queryParams.timezone
247248
};
248249

249-
const data = await executeQuery(queryRequest, websiteDomain);
250+
const data = await executeQuery(queryRequest, websiteDomain, queryParams.timezone);
250251

251252
return {
252253
parameter,

apps/docs/components/landing/hero.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ export default function Hero() {
7777
handleFullscreen();
7878
}
7979
}}
80-
aria-label="View demo dashboard fullscreen"
8180
>
8281
<iframe
8382
ref={iframeRef}

0 commit comments

Comments
 (0)