mirror of
https://github.com/umami-software/umami.git
synced 2025-12-06 01:18:00 +01:00
finish segments, update migration from filters to parameters
This commit is contained in:
parent
8408bbd25c
commit
5ffafc71fc
10 changed files with 25 additions and 16 deletions
|
|
@ -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),
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ export async function POST(request: Request) {
|
|||
type,
|
||||
name,
|
||||
description,
|
||||
parameters: JSON.stringify(parameters),
|
||||
parameters: parameters,
|
||||
} as any);
|
||||
|
||||
return json(result);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) },
|
||||
|
|
|
|||
|
|
@ -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}' },
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 },
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue