diff --git a/db/postgresql/migrations/11_add_segment/migration.sql b/db/postgresql/migrations/11_add_segment/migration.sql index cf4bc244..1ae66ecb 100644 --- a/db/postgresql/migrations/11_add_segment/migration.sql +++ b/db/postgresql/migrations/11_add_segment/migration.sql @@ -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), diff --git a/db/postgresql/schema.prisma b/db/postgresql/schema.prisma index cf824f79..2535f496 100644 --- a/db/postgresql/schema.prisma +++ b/db/postgresql/schema.prisma @@ -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) diff --git a/src/app/api/reports/[reportId]/route.ts b/src/app/api/reports/[reportId]/route.ts index ba90ee08..252aa2ec 100644 --- a/src/app/api/reports/[reportId]/route.ts +++ b/src/app/api/reports/[reportId]/route.ts @@ -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); } diff --git a/src/app/api/reports/route.ts b/src/app/api/reports/route.ts index e50c57bc..ae6254c6 100644 --- a/src/app/api/reports/route.ts +++ b/src/app/api/reports/route.ts @@ -103,7 +103,7 @@ export async function POST(request: Request) { type, name, description, - parameters: JSON.stringify(parameters), + parameters: parameters, } as any); return json(result); diff --git a/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts b/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts index 4d86d7b1..fd2442cb 100644 --- a/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts +++ b/src/app/api/websites/[websiteId]/segments/[segmentId]/route.ts @@ -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); diff --git a/src/app/api/websites/[websiteId]/segments/route.ts b/src/app/api/websites/[websiteId]/segments/route.ts index 058ad833..2cf8388f 100644 --- a/src/app/api/websites/[websiteId]/segments/route.ts +++ b/src/app/api/websites/[websiteId]/segments/route.ts @@ -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); diff --git a/src/components/hooks/useFields.ts b/src/components/hooks/useFields.ts index c83436f0..a80d6ea1 100644 --- a/src/components/hooks/useFields.ts +++ b/src/components/hooks/useFields.ts @@ -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) }, diff --git a/src/components/messages.ts b/src/components/messages.ts index a5963b78..03f0a7dc 100644 --- a/src/components/messages.ts +++ b/src/components/messages.ts @@ -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}' }, diff --git a/src/lib/request.ts b/src/lib/request.ts index e5c529cf..71861e34 100644 --- a/src/lib/request.ts +++ b/src/lib/request.ts @@ -92,9 +92,13 @@ export async function getRequestFilters(query: Record, 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; } diff --git a/src/queries/prisma/segment.ts b/src/queries/prisma/segment.ts index 7b7c9d9f..1f962e8f 100644 --- a/src/queries/prisma/segment.ts +++ b/src/queries/prisma/segment.ts @@ -13,9 +13,13 @@ export async function getSegment(segmentId: string): Promise { }); } -export async function getWebsiteSegment(websiteId: string, name: string): Promise { +export async function getWebsiteSegment( + websiteId: string, + type: string, + name: string, +): Promise { return prisma.client.segment.findFirst({ - where: { websiteId, name }, + where: { websiteId, type, name }, }); }