finish segments, update migration from filters to parameters

This commit is contained in:
Francis Cao 2025-06-20 10:27:57 -07:00
parent 8408bbd25c
commit 5ffafc71fc
10 changed files with 25 additions and 16 deletions

View file

@ -4,7 +4,7 @@ CREATE TABLE "segment" (
"website_id" UUID NOT NULL, "website_id" UUID NOT NULL,
"type" VARCHAR(200) NOT NULL, "type" VARCHAR(200) NOT NULL,
"name" VARCHAR(200) NOT NULL, "name" VARCHAR(200) NOT NULL,
"filters" JSONB NOT NULL, "parameters" JSONB NOT NULL,
"created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP, "created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMPTZ(6), "updated_at" TIMESTAMPTZ(6),

View file

@ -240,7 +240,7 @@ model Segment {
websiteId String @map("website_id") @db.Uuid websiteId String @map("website_id") @db.Uuid
type String @db.VarChar(200) type String @db.VarChar(200)
name String @db.VarChar(200) name String @db.VarChar(200)
filters Json parameters Json
createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6) createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6) updatedAt DateTime? @updatedAt @map("updated_at") @db.Timestamptz(6)

View file

@ -20,8 +20,6 @@ export async function GET(request: Request, { params }: { params: Promise<{ repo
return unauthorized(); return unauthorized();
} }
report.parameters = JSON.parse(report.parameters);
return json(report); return json(report);
} }

View file

@ -103,7 +103,7 @@ export async function POST(request: Request) {
type, type,
name, name,
description, description,
parameters: JSON.stringify(parameters), parameters: parameters,
} as any); } as any);
return json(result); return json(result);

View file

@ -33,7 +33,7 @@ export async function POST(
const schema = z.object({ const schema = z.object({
type: segmentTypeParam, type: segmentTypeParam,
name: z.string().max(200), name: z.string().max(200),
filters: z.object({}).passthrough(), parameters: z.object({}).passthrough(),
}); });
const { auth, body, error } = await parseRequest(request, schema); const { auth, body, error } = await parseRequest(request, schema);
@ -43,7 +43,7 @@ export async function POST(
} }
const { websiteId, segmentId } = await params; const { websiteId, segmentId } = await params;
const { type, name, filters } = body; const { type, name, parameters } = body;
const segment = await getSegment(segmentId); const segment = await getSegment(segmentId);
@ -58,7 +58,7 @@ export async function POST(
const result = await updateSegment(segmentId, { const result = await updateSegment(segmentId, {
type, type,
name, name,
filters, parameters,
} as any); } as any);
return json(result); return json(result);

View file

@ -39,7 +39,7 @@ export async function POST(
const schema = z.object({ const schema = z.object({
type: segmentTypeParam, type: segmentTypeParam,
name: z.string().max(200), name: z.string().max(200),
filters: z.object({}).passthrough(), parameters: z.object({}).passthrough(),
}); });
const { auth, body, error } = await parseRequest(request, schema); const { auth, body, error } = await parseRequest(request, schema);
@ -49,7 +49,7 @@ export async function POST(
} }
const { websiteId } = await params; const { websiteId } = await params;
const { type, name, filters } = body; const { type, name, parameters } = body;
if (!(await canUpdateWebsite(auth, websiteId))) { if (!(await canUpdateWebsite(auth, websiteId))) {
return unauthorized(); return unauthorized();
@ -60,7 +60,7 @@ export async function POST(
websiteId, websiteId,
type, type,
name, name,
filters, parameters,
} as any); } as any);
return json(result); return json(result);

View file

@ -4,6 +4,7 @@ export function useFields() {
const { formatMessage, labels } = useMessages(); const { formatMessage, labels } = useMessages();
const fields = [ const fields = [
{ name: 'cohort', type: 'string', label: formatMessage(labels.cohort) },
{ name: 'segment', type: 'string', label: formatMessage(labels.segment) }, { name: 'segment', type: 'string', label: formatMessage(labels.segment) },
{ name: 'url', type: 'string', label: formatMessage(labels.url) }, { name: 'url', type: 'string', label: formatMessage(labels.url) },
{ name: 'title', type: 'string', label: formatMessage(labels.pageTitle) }, { name: 'title', type: 'string', label: formatMessage(labels.pageTitle) },

View file

@ -100,6 +100,7 @@ export const labels = defineMessages({
languages: { id: 'label.languages', defaultMessage: 'Languages' }, languages: { id: 'label.languages', defaultMessage: 'Languages' },
tags: { id: 'label.tags', defaultMessage: 'Tags' }, tags: { id: 'label.tags', defaultMessage: 'Tags' },
segments: { id: 'label.segments', defaultMessage: 'Segments' }, segments: { id: 'label.segments', defaultMessage: 'Segments' },
cohorts: { id: 'label.cohorts', defaultMessage: 'Cohorts' },
count: { id: 'label.count', defaultMessage: 'Count' }, count: { id: 'label.count', defaultMessage: 'Count' },
average: { id: 'label.average', defaultMessage: 'Average' }, average: { id: 'label.average', defaultMessage: 'Average' },
sum: { id: 'label.sum', defaultMessage: 'Sum' }, sum: { id: 'label.sum', defaultMessage: 'Sum' },
@ -231,6 +232,7 @@ export const labels = defineMessages({
pageTitle: { id: 'label.pageTitle', defaultMessage: 'Page title' }, pageTitle: { id: 'label.pageTitle', defaultMessage: 'Page title' },
tag: { id: 'label.tag', defaultMessage: 'Tag' }, tag: { id: 'label.tag', defaultMessage: 'Tag' },
segment: { id: 'label.segment', defaultMessage: 'Segment' }, segment: { id: 'label.segment', defaultMessage: 'Segment' },
cohort: { id: 'label.cohort', defaultMessage: 'Cohort' },
day: { id: 'label.day', defaultMessage: 'Day' }, day: { id: 'label.day', defaultMessage: 'Day' },
date: { id: 'label.date', defaultMessage: 'Date' }, date: { id: 'label.date', defaultMessage: 'Date' },
pageOf: { id: 'label.page-of', defaultMessage: 'Page {current} of {total}' }, pageOf: { id: 'label.page-of', defaultMessage: 'Page {current} of {total}' },

View file

@ -92,9 +92,13 @@ export async function getRequestFilters(query: Record<string, any>, websiteId?:
const value = query[key]; const value = query[key];
if (value !== undefined) { if (value !== undefined) {
if (FILTER_GROUPS.includes(key)) { if (FILTER_GROUPS.includes(key)) {
const segment = await getWebsiteSegment(websiteId, value); const segment = await getWebsiteSegment(websiteId, key, value);
if (key === 'segment') {
// merge filters into result // merge filters into result
Object.assign(result, segment.filters); Object.assign(result, segment.parameters);
} else {
result[key] = segment.parameters;
}
} else { } else {
result[key] = value; result[key] = value;
} }

View file

@ -13,9 +13,13 @@ export async function getSegment(segmentId: string): Promise<Segment> {
}); });
} }
export async function getWebsiteSegment(websiteId: string, name: string): Promise<Segment> { export async function getWebsiteSegment(
websiteId: string,
type: string,
name: string,
): Promise<Segment> {
return prisma.client.segment.findFirst({ return prisma.client.segment.findFirst({
where: { websiteId, name }, where: { websiteId, type, name },
}); });
} }