mirror of
https://github.com/umami-software/umami.git
synced 2026-02-04 04:37:11 +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,
|
"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),
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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) },
|
||||||
|
|
|
||||||
|
|
@ -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}' },
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue