refactor Property components to be resused for both session/event data. Implement session-data screens + filtering. Remove all event-data specific compoenents/queries

This commit is contained in:
Francis Cao committed 2026-04-29 13:11:03 -07:00
1 parent 9da332c489
commit 680a1ca1a2
71 files changed
+2814 -958

No files matched your search

@@ -0,0 +1,39 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, pagingParams } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getSessionDataPivot } from '@/queries/sql/sessions/getSessionDataPivot';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string(),
...filterParams,
...pagingParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const result = await getSessionDataPivot(websiteId, propertyName, filters, propertyFilters);
return json(result);
}
@@ -0,0 +1,40 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam, unitParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getSessionDataArraySeries } from '@/queries/sql';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string(),
timezone: timezoneParam.optional(),
unit: unitParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const data = await getSessionDataArraySeries(websiteId, propertyName, filters, propertyFilters);
return json(data);
}
@@ -0,0 +1,39 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getSessionDataDateSeries } from '@/queries/sql';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string(),
timezone: timezoneParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const data = await getSessionDataDateSeries(websiteId, propertyName, filters, propertyFilters);
return json(data);
}
@@ -0,0 +1,41 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam, unitParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getSessionDataNumericSeries } from '@/queries/sql';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string(),
metric: z.enum(['sum', 'avg', 'count']).default('sum'),
timezone: timezoneParam.optional(),
unit: unitParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { propertyName, metric, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const data = await getSessionDataNumericSeries(websiteId, propertyName, metric, filters, propertyFilters);
return json(data);
}
@@ -0,0 +1,39 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getSessionDataNumericStats } from '@/queries/sql';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string(),
timezone: timezoneParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const data = await getSessionDataNumericStats(websiteId, propertyName, filters, propertyFilters);
return json(data);
}
@@ -1,4 +1,5 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams } from '@/lib/schema';
@@ -12,6 +13,7 @@ export async function GET(
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
selectedPropertyName: z.string().optional(),
...filterParams,
});
@@ -27,9 +29,16 @@ export async function GET(
return unauthorized();
}
const filters = await getQueryFilters(query, websiteId);
const { selectedPropertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const data = await getSessionDataProperties(websiteId, filters);
const data = await getSessionDataProperties(
websiteId,
filters,
propertyFilters,
selectedPropertyName,
);
return json(data);
}
@@ -0,0 +1,40 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam, unitParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getSessionDataPropertySeries } from '@/queries/sql';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string(),
timezone: timezoneParam.optional(),
unit: unitParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const data = await getSessionDataPropertySeries(websiteId, propertyName, filters, propertyFilters);
return json(data);
}
@@ -0,0 +1,40 @@
import { z } from 'zod';
import { parsePropertyFilters } from '@/lib/params';
import { getQueryFilters, parseRequest } from '@/lib/request';
import { json, unauthorized } from '@/lib/response';
import { filterParams, timezoneParam, unitParam } from '@/lib/schema';
import { canViewWebsite } from '@/permissions';
import { getSessionDataStats } from '@/queries/sql/sessions/getSessionDataStats';
export async function GET(
request: Request,
{ params }: { params: Promise<{ websiteId: string }> },
) {
const schema = z.object({
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string(),
timezone: timezoneParam.optional(),
unit: unitParam.optional(),
...filterParams,
});
const { auth, query, error } = await parseRequest(request, schema);
if (error) {
return error();
}
const { websiteId } = await params;
if (!(await canViewWebsite(auth, websiteId))) {
return unauthorized();
}
const { propertyName, ...rest } = query;
const filters = await getQueryFilters(rest, websiteId);
const propertyFilters = parsePropertyFilters(query);
const result = await getSessionDataStats(websiteId, propertyName, filters, propertyFilters);
return json(result);
}
@@ -13,6 +13,7 @@ export async function GET(
startAt: z.coerce.number().int(),
endAt: z.coerce.number().int(),
propertyName: z.string().optional(),
dataType: z.coerce.number().int().optional(),
...filterParams,
});
@@ -28,12 +29,13 @@ export async function GET(
return unauthorized();
}
const { propertyName } = query;
const { propertyName, dataType } = query;
const filters = await getQueryFilters(query, websiteId);
const data = await getSessionDataValues(websiteId, {
...filters,
propertyName,
dataType,
});
return json(data);