Skip to content

Commit 6879741

Browse files
committed
cleanup overview tab, moveed shared stuff out, added support for date ranges within parameters with filters, IDs to seperate queries
1 parent ee3cac0 commit 6879741

File tree

10 files changed

+435
-306
lines changed

10 files changed

+435
-306
lines changed

apps/api/src/routes/query.ts

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,13 @@ export const query = new Elysia({ prefix: '/v1/query' })
9999
try {
100100
if (Array.isArray(body)) {
101101
const uniqueWebsiteIds = [
102-
...new Set(body.flatMap((req) => req.parameters)),
102+
...new Set(
103+
body.flatMap((req) =>
104+
req.parameters.map((param) =>
105+
typeof param === 'string' ? param : param.name
106+
)
107+
)
108+
),
103109
];
104110
const domainCache = await getCachedWebsiteDomain(uniqueWebsiteIds);
105111

@@ -201,18 +207,48 @@ async function executeDynamicQuery(
201207
}
202208

203209
async function processParameter(
204-
parameter: string,
210+
parameterInput:
211+
| string
212+
| {
213+
name: string;
214+
start_date?: string;
215+
end_date?: string;
216+
granularity?: string;
217+
id?: string;
218+
},
205219
dynamicRequest: DynamicQueryRequestType,
206220
params: QueryParams,
207221
siteId: string | undefined,
208-
start: string | undefined,
209-
end: string | undefined,
222+
defaultStart: string | undefined,
223+
defaultEnd: string | undefined,
210224
domain: string | null
211225
) {
212-
const validation = validateParameterRequest(parameter, siteId, start, end);
226+
const isObject = typeof parameterInput === 'object';
227+
const parameterName = isObject ? parameterInput.name : parameterInput;
228+
const customId =
229+
isObject && parameterInput.id ? parameterInput.id : parameterName;
230+
const paramStart =
231+
isObject && parameterInput.start_date
232+
? parameterInput.start_date
233+
: defaultStart;
234+
const paramEnd =
235+
isObject && parameterInput.end_date
236+
? parameterInput.end_date
237+
: defaultEnd;
238+
const paramGranularity =
239+
isObject && parameterInput.granularity
240+
? parameterInput.granularity
241+
: dynamicRequest.granularity;
242+
243+
const validation = validateParameterRequest(
244+
parameterName,
245+
siteId,
246+
paramStart,
247+
paramEnd
248+
);
213249
if (!validation.success) {
214250
return {
215-
parameter,
251+
parameter: customId,
216252
success: false,
217253
error: validation.error,
218254
data: [],
@@ -222,10 +258,10 @@ async function executeDynamicQuery(
222258
try {
223259
const queryRequest = {
224260
projectId: validation.siteId,
225-
type: parameter,
261+
type: parameterName,
226262
from: validation.start,
227263
to: validation.end,
228-
timeUnit: getTimeUnit(dynamicRequest.granularity),
264+
timeUnit: getTimeUnit(paramGranularity),
229265
filters: dynamicRequest.filters || [],
230266
limit: dynamicRequest.limit || 100,
231267
offset: dynamicRequest.page
@@ -237,13 +273,13 @@ async function executeDynamicQuery(
237273
const data = await executeQuery(queryRequest, domain, params.timezone);
238274

239275
return {
240-
parameter,
276+
parameter: customId,
241277
success: true,
242278
data: data || [],
243279
};
244280
} catch (error) {
245281
return {
246-
parameter,
282+
parameter: customId,
247283
success: false,
248284
error: error instanceof Error ? error.message : 'Query failed',
249285
data: [],
@@ -252,7 +288,7 @@ async function executeDynamicQuery(
252288
}
253289

254290
const parameterResults = await Promise.all(
255-
request.parameters.map((param: string) => {
291+
request.parameters.map((param) => {
256292
return processParameter(
257293
param,
258294
request,

apps/api/src/schemas/query-schemas.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,24 @@ export const FilterSchema = t.Object({
2323
]),
2424
});
2525

26+
export const ParameterWithDatesSchema = t.Object({
27+
name: t.String(),
28+
start_date: t.Optional(t.String()),
29+
end_date: t.Optional(t.String()),
30+
granularity: t.Optional(
31+
t.Union([
32+
t.Literal('hourly'),
33+
t.Literal('daily'),
34+
t.Literal('hour'),
35+
t.Literal('day'),
36+
])
37+
),
38+
id: t.Optional(t.String()),
39+
});
40+
2641
export const DynamicQueryRequestSchema = t.Object({
2742
id: t.Optional(t.String()),
28-
parameters: t.Array(t.String()),
43+
parameters: t.Array(t.Union([t.String(), ParameterWithDatesSchema])),
2944
limit: t.Optional(t.Number()),
3045
page: t.Optional(t.Number()),
3146
filters: t.Optional(t.Array(FilterSchema)),
@@ -70,9 +85,17 @@ export type FilterType = {
7085
value: string | number | Array<string | number>;
7186
};
7287

88+
export type ParameterWithDatesType = {
89+
name: string;
90+
start_date?: string;
91+
end_date?: string;
92+
granularity?: 'hourly' | 'daily' | 'hour' | 'day';
93+
id?: string;
94+
};
95+
7396
export type DynamicQueryRequestType = {
7497
id?: string;
75-
parameters: string[];
98+
parameters: (string | ParameterWithDatesType)[];
7699
limit?: number;
77100
page?: number;
78101
filters?: FilterType[];

0 commit comments

Comments
 (0)