import {z} from 'zod' export type RelationshipsFolderJsonApiResource = {data?: {id: string, type: 'folder-segment'} | undefined}; export type PartialRealtimeJourneyYamlRealtimeJourneyDuplicateJsonApiResource = {id: string, type: 'journey', attributes: {name: string}, relationships: {parentFolder?: RelationshipsFolderJsonApiResource | undefined}}; export type CreateApiEntitiesRealtimeJourneysDuplicateArgs = {body: PartialRealtimeJourneyYamlRealtimeJourneyDuplicateJsonApiResource}; export type CreateApiEntitiesRealtimeJourneysDuplicateOptions = {baseUrl?: string | undefined, TdApikeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const partialRealtimeJourneyYamlRealtimeJourneyKeyEventCriteria = z.object({keyEventId: z.string().optional(), keyEventFilters: z.object({todo: z.string().optional()}).optional()}); export const partialRealtimeJourneyYamlRealtimeAndBatchIon = z.object({}); export const partialRealtimeJourneyYamlRealtimeJourneyJumpTarget = z.object({realtimeJourneyId: z.string(), realtimeJourneyStageId: z.string(), confirmed: z.boolean()}).nullable(); export const partialRealtimeJourneyYamlRealtimeJourneyCriteriaWithTarget = z.object({name: z.string(), description: z.string().optional(), keyEventCriteria: partialRealtimeJourneyYamlRealtimeJourneyKeyEventCriteria.optional(), profileCriteria: partialRealtimeJourneyYamlRealtimeAndBatchIon.optional(), acceptUnknownProfiles: z.boolean().nullable().optional(), target: partialRealtimeJourneyYamlRealtimeJourneyJumpTarget.optional()}).nullable(); export const partialRealtimeJourneyYamlRealtimeJourneyWaitStep = z.object({type: z.literal("WaitStep"), waitStep: z.number().int(), waitStepUnit: z.enum(["minute", "hour", "day"]), next: z.string().optional()}); export const partialRealtimeJourneyYamlRealtimeJourneyActivationStep = z.object({type: z.literal("TriggeredActivation"), journeyActivationStepId: z.string(), next: z.string().optional()}); export const partialRealtimeJourneyYamlRealtimeDecisionPointBranch = z.object({id: z.string(), name: z.string().nullable(), description: z.string().nullable().optional(), profileCriteria: z.union([partialRealtimeJourneyYamlRealtimeAndBatchIon, z.object({}).nullable()]), excludedPath: z.boolean(), next: z.string().nullable()}); export const partialRealtimeJourneyYamlRealtimeDecisionPointStep = z.object({type: z.literal("DecisionPoint"), branches: z.array(partialRealtimeJourneyYamlRealtimeDecisionPointBranch)}); export const partialRealtimeJourneyYamlMergeStep = z.object({type: z.literal("Merge"), next: z.string().nullable()}); export const partialRealtimeJourneyYamlJumpStep = z.object({type: z.literal("Jump"), name: z.string().optional(), description: z.string().nullable().optional(), target: partialRealtimeJourneyYamlRealtimeJourneyJumpTarget.optional()}); export const partialRealtimeJourneyYamlEndStep = z.object({type: z.literal("End")}); export const partialRealtimeJourneyYamlRealtimeABTestVariant = z.object({id: z.string(), name: z.string().nullable(), percentage: z.number().nullable(), isControlGroup: z.boolean().nullable(), next: z.string().nullable()}); export const partialRealtimeJourneyYamlRealtimeABTest = z.object({type: z.literal("Variant"), branches: z.array(partialRealtimeJourneyYamlRealtimeABTestVariant).optional(), controlVariant: z.boolean().nullable(), customizedSplit: z.boolean().nullable()}); export const partialRealtimeJourneyYamlRealtimeJourneyCriteria = z.object({name: z.string(), description: z.string().optional(), keyEventCriteria: partialRealtimeJourneyYamlRealtimeJourneyKeyEventCriteria.optional(), profileCriteria: partialRealtimeJourneyYamlRealtimeAndBatchIon.optional(), acceptUnknownProfiles: z.boolean().nullable().optional()}).nullable(); export const partialRealtimeJourneyYamlRealtimeJourneyStaleCriteria = z.object({name: z.string().nullable().optional(), unit: z.enum(["minute", "hour", "day"]).optional(), exitAfter: z.number().int().gte(1).optional()}); export const partialRealtimeJourneyYamlRealtimeJourneyCustomExitCriteria = z.object({name: z.string().nullable(), keyEventCriteria: partialRealtimeJourneyYamlRealtimeJourneyKeyEventCriteria, profileCriteria: partialRealtimeJourneyYamlRealtimeAndBatchIon, target: partialRealtimeJourneyYamlRealtimeJourneyJumpTarget}); export const partialRealtimeJourneyYamlRealtimeJourneyStageAttributes = z.object({id: z.string().optional(), name: z.string(), description: z.string().optional(), steps: z.record(z.string(), z.union([partialRealtimeJourneyYamlRealtimeJourneyWaitStep, partialRealtimeJourneyYamlRealtimeJourneyActivationStep, partialRealtimeJourneyYamlRealtimeDecisionPointStep, partialRealtimeJourneyYamlMergeStep, partialRealtimeJourneyYamlJumpStep, partialRealtimeJourneyYamlEndStep, partialRealtimeJourneyYamlRealtimeABTest])).optional(), rootStep: z.string().nullable().optional(), entryCriteria: partialRealtimeJourneyYamlRealtimeJourneyCriteria.optional(), milestone: partialRealtimeJourneyYamlRealtimeJourneyCriteria.optional(), exitCriterias: z.array(z.union([partialRealtimeJourneyYamlRealtimeJourneyStaleCriteria, partialRealtimeJourneyYamlRealtimeJourneyCustomExitCriteria])).optional(), orderIndex: z.number().int().optional()}); export const partialRealtimeJourneyYamlRealtimeJourneyReentryMode = z.enum(["no_reentry", "reentry_unless_goal_achieved", "reentry_always"]); export const partialRealtimeJourneyYamlRealtimeJourneyState = z.enum(["draft", "launched"]); export const user = z.object({id: z.string().optional(), td_user_id: z.string().optional(), name: z.string().optional()}); export const relationshipsFolderJsonApiResource = z.object({data: z.object({id: z.string(), type: z.literal("folder-segment")}).optional()}); export const partialRealtimeJourneyYamlRealtimeActivationParameters = z.object({exportJson: z.string().nullable().optional(), exportAdvancedJson: z.string().nullable().optional()}); export const partialRealtimeJourneyYamlRealtimeJourneyActivationStepResource = z.object({id: z.string().optional(), type: z.literal("realtime-journey-activation-step").optional(), attributes: z.object({name: z.string().optional(), description: z.string().nullable().optional(), stepUuid: z.string().optional(), connectionId: z.string(), connectorType: z.string(), connector: partialRealtimeJourneyYamlRealtimeActivationParameters, realtimeJourneyId: z.string().optional(), realtimeJourneyStageId: z.string().nullable().optional()}).optional()}); export const partialRealtimeJourneyYamlRelationshipsRealtimeJourneyJumpLinkResource = z.object({id: z.string().optional(), type: z.literal("realtime-journey-jump-link").optional()}); export const partialRealtimeJourneyYamlRelationshipsRealtimeJourneyJumpLinksMeta = z.object({targetStageInfo: z.record(z.string(), z.object({destinationRealtimeJourneyName: z.string().nullable(), destinationRealtimeJourneyStageName: z.string().nullable(), destinationSegmentFolderName: z.string().nullable(), deleted: z.boolean(), deletedByTdUserId: z.string().nullable(), deletedByTdUserName: z.string().nullable()})).optional()}); export const partialRealtimeJourneyYamlRelationshipsRealtimeJourneyJumpFromsMeta = z.array(z.object({sourceJourneyId: z.string().optional(), sourceJourneyName: z.string().optional(), sourceJourneyState: partialRealtimeJourneyYamlRealtimeJourneyState.optional(), sourceJourneyStageId: z.string().nullable().optional(), sourceJourneyStageName: z.string().nullable().optional(), sourceJourneyFolderId: z.string().optional(), sourceJourneyFolderName: z.string().optional(), targetJourneyStageId: z.string().optional(), jumpFrom: z.enum(["exit_criteria", "jump_step", "goal"]).optional(), jumpName: z.string().optional()})); export const partialRealtimeJourneyYamlRealtimeJourneyResource = z.object({id: z.string().optional(), type: z.literal("realtime-journey").optional(), attributes: z.object({audienceId: z.string(), segmentFolderId: z.string(), name: z.string(), description: z.string().nullable(), goal: z.union([partialRealtimeJourneyYamlRealtimeJourneyCriteriaWithTarget, z.object({}).nullable()]), realtimeJourneyStages: z.array(partialRealtimeJourneyYamlRealtimeJourneyStageAttributes), reentryMode: partialRealtimeJourneyYamlRealtimeJourneyReentryMode, state: partialRealtimeJourneyYamlRealtimeJourneyState, createdAt: z.string(), updatedAt: z.string(), paused: z.boolean(), pausedAt: z.string().nullable(), launchedAt: z.string().nullable()}).optional(), relationships: z.object({createdBy: user.optional(), updatedBy: user.optional(), parentFolder: relationshipsFolderJsonApiResource.optional(), realtimeJourneyActivationSteps: z.object({data: z.array(partialRealtimeJourneyYamlRealtimeJourneyActivationStepResource), meta: z.object({names: z.unknown()})}).optional(), jumpLinks: z.object({data: z.array(partialRealtimeJourneyYamlRelationshipsRealtimeJourneyJumpLinkResource), meta: partialRealtimeJourneyYamlRelationshipsRealtimeJourneyJumpLinksMeta}).optional(), jumpFroms: z.object({data: z.array(partialRealtimeJourneyYamlRelationshipsRealtimeJourneyJumpLinkResource), meta: partialRealtimeJourneyYamlRelationshipsRealtimeJourneyJumpFromsMeta}).optional()}).optional()}); export const createApiEntitiesRealtimeJourneysDuplicateResponse = z.object({data: partialRealtimeJourneyYamlRealtimeJourneyResource.optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Create a duplicate of the specified realtime journey * * POST /entities/realtime_journeys/duplicate */ export const createApiEntitiesRealtimeJourneysDuplicate = async (args: CreateApiEntitiesRealtimeJourneysDuplicateArgs, options?: CreateApiEntitiesRealtimeJourneysDuplicateOptions) => { const {baseUrl = "https://api-cdp.treasuredata.com", fetch: fetchFn = fetch, TdApikeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/vnd.treasuredata.v1+json") headers.set('accept', "application/json") if (TdApikeyAuth !== undefined) headers.set("Authorization", TdApikeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/entities/realtime_journeys/duplicate${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(createApiEntitiesRealtimeJourneysDuplicateResponse, await res.json()) };