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,
"type" VARCHAR(200) NOT NULL,
"name" VARCHAR(200) NOT NULL,
"filters" JSONB NOT NULL,
"parameters" JSONB NOT NULL,
"created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMPTZ(6),

View file

@ -240,7 +240,7 @@ model Segment {
websiteId String @map("website_id") @db.Uuid
type String @db.VarChar(200)
name String @db.VarChar(200)
filters Json
parameters Json
createdAt DateTime? @default(now()) @map("created_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();
}
report.parameters = JSON.parse(report.parameters);
return json(report);
}

View file

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

View file

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

View file

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

View file

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

View file

@ -100,6 +100,7 @@ export const labels = defineMessages({
languages: { id: 'label.languages', defaultMessage: 'Languages' },
tags: { id: 'label.tags', defaultMessage: 'Tags' },
segments: { id: 'label.segments', defaultMessage: 'Segments' },
cohorts: { id: 'label.cohorts', defaultMessage: 'Cohorts' },
count: { id: 'label.count', defaultMessage: 'Count' },
average: { id: 'label.average', defaultMessage: 'Average' },
sum: { id: 'label.sum', defaultMessage: 'Sum' },
@ -231,6 +232,7 @@ export const labels = defineMessages({
pageTitle: { id: 'label.pageTitle', defaultMessage: 'Page title' },
tag: { id: 'label.tag', defaultMessage: 'Tag' },
segment: { id: 'label.segment', defaultMessage: 'Segment' },
cohort: { id: 'label.cohort', defaultMessage: 'Cohort' },
day: { id: 'label.day', defaultMessage: 'Day' },
date: { id: 'label.date', defaultMessage: 'Date' },
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];
if (value !== undefined) {
if (FILTER_GROUPS.includes(key)) {
const segment = await getWebsiteSegment(websiteId, value);
// merge filters into result
Object.assign(result, segment.filters);
const segment = await getWebsiteSegment(websiteId, key, value);
if (key === 'segment') {
// merge filters into result
Object.assign(result, segment.parameters);
} else {
result[key] = segment.parameters;
}
} else {
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({
where: { websiteId, name },
where: { websiteId, type, name },
});
}