From 5de85c0ea5f93284c955fa326ef60d6516517fae Mon Sep 17 00:00:00 2001 From: Denis Rossati Date: Thu, 16 Jul 2026 16:26:17 -0300 Subject: [PATCH 1/5] Adjust experience query --- src/application/api/workspace.ts | 4 +--- src/application/model/experience.ts | 1 - .../application/api/graphql/queries/organization.ts | 2 +- src/infrastructure/application/api/graphql/workspace.ts | 2 -- .../validation/actions/createResourceOptionsValidator.ts | 5 ++--- 5 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/application/api/workspace.ts b/src/application/api/workspace.ts index a1b332ae..da308bcc 100644 --- a/src/application/api/workspace.ts +++ b/src/application/api/workspace.ts @@ -65,11 +65,9 @@ export type ExperienceCriteria = WorkspacePath & { status?: ExperienceStatus | ExperienceStatus[], }; -export type SegmentedContentDefinition = Omit; - export type PersonalizedContentDefinition = { default?: SlotContentMap, - segmented?: SegmentedContentDefinition[], + segmented?: SegmentedContent[], }; export type SlotDefinition = { diff --git a/src/application/model/experience.ts b/src/application/model/experience.ts index ccda0253..a49933bd 100644 --- a/src/application/model/experience.ts +++ b/src/application/model/experience.ts @@ -18,7 +18,6 @@ export type SlotContentMap = Record; export type LocalizedContentMap = Record>; export type SegmentedContent = { - id: string, audiences: string[], content: SlotContentMap, }; diff --git a/src/infrastructure/application/api/graphql/queries/organization.ts b/src/infrastructure/application/api/graphql/queries/organization.ts index 470da15c..997e7df2 100644 --- a/src/infrastructure/application/api/graphql/queries/organization.ts +++ b/src/infrastructure/application/api/graphql/queries/organization.ts @@ -34,7 +34,7 @@ export const organizationQuery = graphql(` export const organizationsQuery = graphql(` query Organizations { - organizations(first: 300) { + organizations(first: 900) { edges { node { id diff --git a/src/infrastructure/application/api/graphql/workspace.ts b/src/infrastructure/application/api/graphql/workspace.ts index d0d49139..9fd2fbd1 100644 --- a/src/infrastructure/application/api/graphql/workspace.ts +++ b/src/infrastructure/application/api/graphql/workspace.ts @@ -642,7 +642,6 @@ export class GraphqlWorkspaceApi implements WorkspaceApi { ), segmented: (variant.content?.segmented ?? []).map( content => ({ - id: content.groupId, audiences: content.audiences.map(audience => audience.audienceId), content: GraphqlWorkspaceApi.normalizeLocalizedContent( content.contents, @@ -667,7 +666,6 @@ export class GraphqlWorkspaceApi implements WorkspaceApi { ), segmented: (data.settings?.content.segmented ?? data.draft?.content?.segmented ?? []).map( content => ({ - id: content.groupId, audiences: content.audiences.map( ({audienceId}) => audiences.find(({id}) => id === audienceId)?.customId ?? audienceId, ), diff --git a/src/infrastructure/application/validation/actions/createResourceOptionsValidator.ts b/src/infrastructure/application/validation/actions/createResourceOptionsValidator.ts index 0de37d43..85025d9e 100644 --- a/src/infrastructure/application/validation/actions/createResourceOptionsValidator.ts +++ b/src/infrastructure/application/validation/actions/createResourceOptionsValidator.ts @@ -14,11 +14,10 @@ import type { ComponentDefinition, ExperienceDefinition, PersonalizedContentDefinition, - SegmentedContentDefinition, SlotDefinition, VariantDefinition, } from '@/application/api/workspace'; -import type {LocalizedContentMap, SlotContentMap} from '@/application/model/experience'; +import type {LocalizedContentMap, SegmentedContent, SlotContentMap} from '@/application/model/experience'; import {ActionOptionsValidator} from '@/infrastructure/application/validation/actions/actionOptionsValidator'; const audienceDefinitionSchema: ZodType = z.strictObject({ @@ -254,7 +253,7 @@ const slotContentMap: ZodType = z.record( localizedSlotContentSchema, ); -const segmentedContentSchema: ZodType = z.strictObject({ +const segmentedContentSchema: ZodType = z.strictObject({ audiences: z.array(z.string()), content: slotContentMap, }); From 3071bb5786350f1a4f8ffd6f400685e190766dee Mon Sep 17 00:00:00 2001 From: Denis Rossati Date: Thu, 16 Jul 2026 16:27:13 -0300 Subject: [PATCH 2/5] Undo change --- .../application/api/graphql/queries/organization.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/infrastructure/application/api/graphql/queries/organization.ts b/src/infrastructure/application/api/graphql/queries/organization.ts index 997e7df2..470da15c 100644 --- a/src/infrastructure/application/api/graphql/queries/organization.ts +++ b/src/infrastructure/application/api/graphql/queries/organization.ts @@ -34,7 +34,7 @@ export const organizationQuery = graphql(` export const organizationsQuery = graphql(` query Organizations { - organizations(first: 900) { + organizations(first: 300) { edges { node { id From 1e95964556effb2d72607e566ad957059f044bf6 Mon Sep 17 00:00:00 2001 From: Denis Rossati Date: Thu, 16 Jul 2026 17:19:31 -0300 Subject: [PATCH 3/5] Remove group ID from template creation --- src/application/api/workspace.ts | 4 +++- .../cli/command/template/create.ts | 24 +++++++++++++++++-- src/application/model/experience.ts | 1 + .../api/graphql/queries/organization.ts | 2 +- .../application/api/graphql/workspace.ts | 2 ++ .../actions/createResourceOptionsValidator.ts | 5 ++-- 6 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/application/api/workspace.ts b/src/application/api/workspace.ts index da308bcc..a1b332ae 100644 --- a/src/application/api/workspace.ts +++ b/src/application/api/workspace.ts @@ -65,9 +65,11 @@ export type ExperienceCriteria = WorkspacePath & { status?: ExperienceStatus | ExperienceStatus[], }; +export type SegmentedContentDefinition = Omit; + export type PersonalizedContentDefinition = { default?: SlotContentMap, - segmented?: SegmentedContent[], + segmented?: SegmentedContentDefinition[], }; export type SlotDefinition = { diff --git a/src/application/cli/command/template/create.ts b/src/application/cli/command/template/create.ts index 0e8cb426..2480af37 100644 --- a/src/application/cli/command/template/create.ts +++ b/src/application/cli/command/template/create.ts @@ -140,7 +140,17 @@ export class CreateTemplateCommand implements Command { variants: experiment.variants.map( variant => ({ name: variant.name ?? '', - content: variant.content, + content: { + default: variant.content.default, + segmented: variant.content + .segmented + .map( + segment => ({ + audiences: segment.audiences, + content: segment.content, + }), + ), + }, baseline: variant.baseline, allocation: variant.allocation ?? (1000 / experiment.variants.length), }), @@ -153,7 +163,17 @@ export class CreateTemplateCommand implements Command { draft: experience.status === ExperienceStatus.DRAFT, audiences: experience.audiences, slots: experience.slots, - content: experience.content, + content: { + default: experience.content.default, + segmented: experience.content + .segmented + .map( + segment => ({ + audiences: segment.audiences, + content: segment.content, + }), + ), + }, ...(experimentDefinition !== undefined ? {experiment: experimentDefinition} : {}), }; }, diff --git a/src/application/model/experience.ts b/src/application/model/experience.ts index a49933bd..ccda0253 100644 --- a/src/application/model/experience.ts +++ b/src/application/model/experience.ts @@ -18,6 +18,7 @@ export type SlotContentMap = Record; export type LocalizedContentMap = Record>; export type SegmentedContent = { + id: string, audiences: string[], content: SlotContentMap, }; diff --git a/src/infrastructure/application/api/graphql/queries/organization.ts b/src/infrastructure/application/api/graphql/queries/organization.ts index 470da15c..997e7df2 100644 --- a/src/infrastructure/application/api/graphql/queries/organization.ts +++ b/src/infrastructure/application/api/graphql/queries/organization.ts @@ -34,7 +34,7 @@ export const organizationQuery = graphql(` export const organizationsQuery = graphql(` query Organizations { - organizations(first: 300) { + organizations(first: 900) { edges { node { id diff --git a/src/infrastructure/application/api/graphql/workspace.ts b/src/infrastructure/application/api/graphql/workspace.ts index 9fd2fbd1..d0d49139 100644 --- a/src/infrastructure/application/api/graphql/workspace.ts +++ b/src/infrastructure/application/api/graphql/workspace.ts @@ -642,6 +642,7 @@ export class GraphqlWorkspaceApi implements WorkspaceApi { ), segmented: (variant.content?.segmented ?? []).map( content => ({ + id: content.groupId, audiences: content.audiences.map(audience => audience.audienceId), content: GraphqlWorkspaceApi.normalizeLocalizedContent( content.contents, @@ -666,6 +667,7 @@ export class GraphqlWorkspaceApi implements WorkspaceApi { ), segmented: (data.settings?.content.segmented ?? data.draft?.content?.segmented ?? []).map( content => ({ + id: content.groupId, audiences: content.audiences.map( ({audienceId}) => audiences.find(({id}) => id === audienceId)?.customId ?? audienceId, ), diff --git a/src/infrastructure/application/validation/actions/createResourceOptionsValidator.ts b/src/infrastructure/application/validation/actions/createResourceOptionsValidator.ts index 85025d9e..0de37d43 100644 --- a/src/infrastructure/application/validation/actions/createResourceOptionsValidator.ts +++ b/src/infrastructure/application/validation/actions/createResourceOptionsValidator.ts @@ -14,10 +14,11 @@ import type { ComponentDefinition, ExperienceDefinition, PersonalizedContentDefinition, + SegmentedContentDefinition, SlotDefinition, VariantDefinition, } from '@/application/api/workspace'; -import type {LocalizedContentMap, SegmentedContent, SlotContentMap} from '@/application/model/experience'; +import type {LocalizedContentMap, SlotContentMap} from '@/application/model/experience'; import {ActionOptionsValidator} from '@/infrastructure/application/validation/actions/actionOptionsValidator'; const audienceDefinitionSchema: ZodType = z.strictObject({ @@ -253,7 +254,7 @@ const slotContentMap: ZodType = z.record( localizedSlotContentSchema, ); -const segmentedContentSchema: ZodType = z.strictObject({ +const segmentedContentSchema: ZodType = z.strictObject({ audiences: z.array(z.string()), content: slotContentMap, }); From 23eeeb077928f122b3532b5f7f9be169987bc07b Mon Sep 17 00:00:00 2001 From: Denis Rossati Date: Thu, 16 Jul 2026 17:20:02 -0300 Subject: [PATCH 4/5] Undo change --- .../application/api/graphql/queries/organization.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/infrastructure/application/api/graphql/queries/organization.ts b/src/infrastructure/application/api/graphql/queries/organization.ts index 997e7df2..470da15c 100644 --- a/src/infrastructure/application/api/graphql/queries/organization.ts +++ b/src/infrastructure/application/api/graphql/queries/organization.ts @@ -34,7 +34,7 @@ export const organizationQuery = graphql(` export const organizationsQuery = graphql(` query Organizations { - organizations(first: 900) { + organizations(first: 300) { edges { node { id From 5f02e7c1044f7425717ad6d3259dd0bbf289b2f5 Mon Sep 17 00:00:00 2001 From: Denis Rossati Date: Thu, 16 Jul 2026 17:25:30 -0300 Subject: [PATCH 5/5] Apply requested changes --- src/application/cli/command/template/create.ts | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/application/cli/command/template/create.ts b/src/application/cli/command/template/create.ts index 2480af37..6a4fb6d7 100644 --- a/src/application/cli/command/template/create.ts +++ b/src/application/cli/command/template/create.ts @@ -141,15 +141,10 @@ export class CreateTemplateCommand implements Command { variant => ({ name: variant.name ?? '', content: { - default: variant.content.default, + ...variant.content, segmented: variant.content .segmented - .map( - segment => ({ - audiences: segment.audiences, - content: segment.content, - }), - ), + .map(({id: _, ...segment}) => segment), }, baseline: variant.baseline, allocation: variant.allocation ?? (1000 / experiment.variants.length), @@ -164,15 +159,10 @@ export class CreateTemplateCommand implements Command { audiences: experience.audiences, slots: experience.slots, content: { - default: experience.content.default, + ...experience.content, segmented: experience.content .segmented - .map( - segment => ({ - audiences: segment.audiences, - content: segment.content, - }), - ), + .map(({id: _, ...segment}) => segment), }, ...(experimentDefinition !== undefined ? {experiment: experimentDefinition} : {}), };