import * as z from "zod/mini"; import { appEventCapabilitySchema, appEventFlagSchema, appEventIdentityTypeSchema, } from "./app-event.js"; import { displayAttentionPolicySchema } from "./display-attention-policy.js"; import type { IdentityTypeValue } from "./identity-type.js"; export type FlowAssignmentExternalIdIdentityTypeValue = `externalId.users.none.${string}`; export type FlowAssignmentIdentityTypeValue = | IdentityTypeValue | FlowAssignmentExternalIdIdentityTypeValue; const flowAssignmentExternalIdIdentityTypeSchema = z.string().check( z.trim(), z.minLength(1), z.regex(/^externalId\.users\.none\.[a-z0-9][a-z0-9_.-]*$/, { message: "External ID identity type must use externalId.users.none. with a lowercase Segment external ID type.", }), ) as z.ZodMiniType< FlowAssignmentExternalIdIdentityTypeValue, FlowAssignmentExternalIdIdentityTypeValue >; export const flowAssignmentIdentitySchema = z.object({ type: z.union([ appEventIdentityTypeSchema, flowAssignmentExternalIdIdentityTypeSchema, ]), value: z.string().check(z.trim(), z.minLength(1)), }); export const flowAssignmentStatusSchema = z.enum([ "pending", "held", "presented", "completed", "expired", "superseded", ]); export const flowAssignmentTargetingContextSchema = z.object({ flags: z.optional(z.array(appEventFlagSchema)), capabilities: z.optional(z.array(appEventCapabilitySchema)), page: z.optional( z.object({ path: z.optional(z.string().check(z.trim(), z.minLength(1))), referrer: z.optional(z.string().check(z.trim(), z.minLength(1))), search: z.optional(z.string().check(z.trim(), z.minLength(1))), }), ), }); export const flowAssignmentRecipientRequestSchema = z.object({ identities: z._default(z.array(flowAssignmentIdentitySchema), []), context: z.optional(flowAssignmentTargetingContextSchema), at: z.optional(z.number()), }); export const flowAssignmentRecordSchema = z.object({ flowAssignmentId: z.string().check(z.trim(), z.minLength(1)), flowId: z.string().check(z.trim(), z.minLength(1)), attentionPolicy: z.optional(displayAttentionPolicySchema), holdGroupToken: z.optional(z.string().check(z.trim(), z.minLength(1))), presentedFlowVersionId: z.optional( z.string().check(z.trim(), z.minLength(1)), ), latestFlowVersionId: z.string().check(z.trim(), z.minLength(1)), status: flowAssignmentStatusSchema, assignedAt: z.string(), expiresAt: z.optional(z.string()), heldAt: z.optional(z.string()), holdExpiresAt: z.optional(z.string()), presentedAt: z.optional(z.string()), completedAt: z.optional(z.string()), expiredAt: z.optional(z.string()), supersededAt: z.optional(z.string()), }); export const listPendingFlowAssignmentsResponseSchema = z.object({ fetchedAt: z.string(), flowAssignments: z.array(flowAssignmentRecordSchema), }); export const claimPendingFlowAssignmentsRequestSchema = z.object({ identities: z._default(z.array(flowAssignmentIdentitySchema), []), context: z.optional(flowAssignmentTargetingContextSchema), holdOwnerKey: z.string().check(z.trim(), z.minLength(1)), at: z.optional(z.number()), limit: z.optional(z.number()), }); export const claimPendingFlowAssignmentsResponseSchema = z.object({ fetchedAt: z.string(), flowAssignments: z.array(flowAssignmentRecordSchema), }); export const updateFlowAssignmentLifecycleRequestSchema = z.object({ identities: z._default(z.array(flowAssignmentIdentitySchema), []), context: z.optional(flowAssignmentTargetingContextSchema), flowAssignmentId: z.string().check(z.trim(), z.minLength(1)), flowVersionId: z.optional(z.string().check(z.trim(), z.minLength(1))), holdGroupToken: z.optional(z.string().check(z.trim(), z.minLength(1))), at: z.optional(z.number()), }); export const releaseFlowAssignmentClaimRequestSchema = z.object({ identities: z._default(z.array(flowAssignmentIdentitySchema), []), holdGroupToken: z.string().check(z.trim(), z.minLength(1)), holdOwnerKey: z.optional(z.string().check(z.trim(), z.minLength(1))), at: z.optional(z.number()), }); export const releaseFlowAssignmentClaimResponseSchema = z.object({ releasedCount: z.number(), }); export const markFlowAssignmentDismissedRequestSchema = z.object({ identities: z._default(z.array(flowAssignmentIdentitySchema), []), flowAssignmentId: z.string().check(z.trim(), z.minLength(1)), }); export const markFlowAssignmentDismissedResponseSchema = z.object({ dismissed: z.boolean(), }); export const updateFlowAssignmentLifecycleResponseSchema = flowAssignmentRecordSchema; export const nullableUpdateFlowAssignmentLifecycleResponseSchema = z.nullable( updateFlowAssignmentLifecycleResponseSchema, ); export type FlowAssignmentStatus = z.output; export type FlowAssignmentRecipientRequest = z.output< typeof flowAssignmentRecipientRequestSchema >; export type FlowAssignmentTargetingContext = z.output< typeof flowAssignmentTargetingContextSchema >; export type FlowAssignmentRecord = z.output; export type ClaimPendingFlowAssignmentsRequest = z.output< typeof claimPendingFlowAssignmentsRequestSchema >; export type ClaimPendingFlowAssignmentsResponse = z.output< typeof claimPendingFlowAssignmentsResponseSchema >; export type ListPendingFlowAssignmentsResponse = z.output< typeof listPendingFlowAssignmentsResponseSchema >; export type ReleaseFlowAssignmentClaimRequest = z.output< typeof releaseFlowAssignmentClaimRequestSchema >; export type ReleaseFlowAssignmentClaimResponse = z.output< typeof releaseFlowAssignmentClaimResponseSchema >; export type MarkFlowAssignmentDismissedRequest = z.output< typeof markFlowAssignmentDismissedRequestSchema >; export type MarkFlowAssignmentDismissedResponse = z.output< typeof markFlowAssignmentDismissedResponseSchema >; export type UpdateFlowAssignmentLifecycleRequest = z.output< typeof updateFlowAssignmentLifecycleRequestSchema >; export type UpdateFlowAssignmentLifecycleResponse = z.output< typeof updateFlowAssignmentLifecycleResponseSchema >;