import {z} from 'zod' export type CreateApiJourneyInteractionFetchArgs = {body: {instanceId: string}}; export type CreateApiJourneyInteractionFetchOptions = {baseUrl?: string | undefined, InteractionAccess?: string | undefined, fetch?: typeof fetch | undefined}; export const createApiJourneyInteractionFetchResponse = z.union([z.object({instanceId: z.string(), interactionId: z.string(), journey: z.object({status: z.enum(["Completed", "InProgress", "Failed", "Paused"])}), interaction: z.object({resource: z.object({id: z.string(), name: z.string(), hash: z.string().optional(), version: z.string().optional(), type: z.enum(["brand", "delivery", "flow", "form", "i18n", "journey", "license", "model", "organization", "template", "interaction"]).optional(), data: z.object({pages: z.array(z.object({id: z.string(), label: z.string().optional(), cards: z.array(z.object({id: z.string(), version: z.string().optional(), config: z.unknown()}))}))}).optional()}).optional(), collects: z.array(z.union([z.object({ref: z.string(), spec: z.enum(["required", "optional", "conditional"]), recommended: z.boolean().optional()}), z.object({ref: z.string(), spec: z.enum(["required", "optional", "conditional"]), recommended: z.boolean().optional(), combinator: z.enum(["oneOf", "allOf"]), inputs: z.array(z.object({ref: z.string(), spec: z.enum(["required", "optional", "conditional"]), recommended: z.boolean().optional()}))})])), consumes: z.array(z.union([z.object({ref: z.string(), spec: z.enum(["required", "optional", "conditional"]), recommended: z.boolean().optional()}), z.object({ref: z.string(), spec: z.enum(["required", "optional", "conditional"]), recommended: z.boolean().optional(), combinator: z.enum(["oneOf", "allOf"]), inputs: z.array(z.object({ref: z.string(), spec: z.enum(["required", "optional", "conditional"]), recommended: z.boolean().optional()}))})])), grId: z.string()}), context: z.object({subject: z.object({identity: z.object({title: z.string().optional(), firstName: z.string().optional(), middleNames: z.array(z.string()).optional(), lastNames: z.array(z.string()).optional(), lastNamesAtBirth: z.array(z.string()).optional(), aliases: z.array(z.object({title: z.string().optional(), firstName: z.string().optional(), middleNames: z.array(z.string()).optional(), lastNames: z.array(z.string()).optional(), lastNamesAtBirth: z.array(z.string()).optional()})).optional(), relatedPersons: z.array(z.object({title: z.string().optional(), firstName: z.string().optional(), middleNames: z.array(z.string()).optional(), lastNames: z.array(z.string()).optional(), lastNamesAtBirth: z.array(z.string()).optional(), relationship: z.enum(["mother", "father", "maternalGrandFather", "maternalGrandMother", "paternalGrandFather", "paternalGrandMother"])})).optional(), dateOfBirth: z.string().optional(), gender: z.string().optional(), currentAddress: z.object({lines: z.array(z.string()).optional(), addressString: z.string().optional(), premise: z.string().optional(), building: z.string().optional(), subBuilding: z.string().optional(), thoroughfare: z.string().optional(), dependentThoroughfare: z.string().optional(), locality: z.string().optional(), dependentLocality: z.string().optional(), doubleDependentLocality: z.string().optional(), postalCode: z.string().optional(), postBox: z.string().optional(), country: z.string().optional(), superAdministrativeArea: z.string().optional(), administrativeArea: z.string().optional(), subAdministrativeArea: z.string().optional(), organization: z.string().optional(), location: z.object({latitude: z.string().optional(), longitude: z.string().optional(), geoAccuracy: z.string().optional(), what3words: z.string().optional()}).optional()}).optional(), previousAddresses: z.array(z.object({lines: z.array(z.string()).optional(), addressString: z.string().optional(), premise: z.string().optional(), building: z.string().optional(), subBuilding: z.string().optional(), thoroughfare: z.string().optional(), dependentThoroughfare: z.string().optional(), locality: z.string().optional(), dependentLocality: z.string().optional(), doubleDependentLocality: z.string().optional(), postalCode: z.string().optional(), postBox: z.string().optional(), country: z.string().optional(), superAdministrativeArea: z.string().optional(), administrativeArea: z.string().optional(), subAdministrativeArea: z.string().optional(), organization: z.string().optional(), location: z.object({latitude: z.string().optional(), longitude: z.string().optional(), geoAccuracy: z.string().optional(), what3words: z.string().optional()}).optional(), fromDate: z.string(), toDate: z.string()})).optional(), placeOfBirth: z.object({lines: z.array(z.string()).optional(), addressString: z.string().optional(), premise: z.string().optional(), building: z.string().optional(), subBuilding: z.string().optional(), thoroughfare: z.string().optional(), dependentThoroughfare: z.string().optional(), locality: z.string().optional(), dependentLocality: z.string().optional(), doubleDependentLocality: z.string().optional(), postalCode: z.string().optional(), postBox: z.string().optional(), country: z.string().optional(), superAdministrativeArea: z.string().optional(), administrativeArea: z.string().optional(), subAdministrativeArea: z.string().optional(), organization: z.string().optional(), location: z.object({latitude: z.string().optional(), longitude: z.string().optional(), geoAccuracy: z.string().optional(), what3words: z.string().optional()}).optional()}).optional(), idNumbers: z.array(z.object({type: z.string(), idNumber: z.string(), country: z.string().optional()})).optional(), phones: z.array(z.object({type: z.string(), number: z.string()})).optional(), emails: z.array(z.object({type: z.string(), email: z.string()})).optional(), socials: z.array(z.object({type: z.string(), identity: z.string()})).optional(), mothersMaidenName: z.string().optional()}).optional(), documents: z.array(z.object({oneDBarcode: z.string().optional(), address: z.object({addressString: z.string().optional(), extractedAddressString: z.string().optional(), addressLine1: z.string().optional(), addressLine2: z.string().optional(), locality: z.string().optional(), administrativeArea: z.string().optional(), postalCode: z.string().optional()}).optional(), applicationDate: z.string().optional(), applicationNumber: z.string().optional(), dateOfBirth: z.string().optional(), placeOfBirth: z.string().optional(), placeOfBirthNative: z.string().optional(), bloodType: z.string().optional(), controlNumber: z.string().optional(), countryCode: z.string().optional(), countryName: z.string().optional(), documentClassCode: z.string().optional(), documentClassName: z.string().optional(), documentNumber: z.string().optional(), documentSignerCertificate: z.string().optional(), employer: z.string().optional(), employerAddress: z.string().optional(), entries: z.string().optional(), expirationDate: z.string().optional(), eyeColor: z.string().optional(), fathersName: z.string().optional(), fathersNameNative: z.string().optional(), fathersSurname: z.string().optional(), firstName: z.string().optional(), fullName: z.string().optional(), fullNameNative: z.string().optional(), givenName: z.string().optional(), givenNameNative: z.string().optional(), hairColor: z.string().optional(), height: z.string().optional(), issueDate: z.string().optional(), issuingAuthority: z.string().optional(), issuingAuthorityNative: z.string().optional(), issuingStateCode: z.string().optional(), issuingStateName: z.string().optional(), licenseClass: z.string().optional(), licenseEndorsements: z.string().optional(), licenseRestrictions: z.string().optional(), mrz: z.string().optional(), mrz1: z.string().optional(), mrz2: z.string().optional(), mrz3: z.string().optional(), middleName: z.string().optional(), mothersName: z.string().optional(), mothersNameNative: z.string().optional(), mothersSurname: z.string().optional(), nameSuffix: z.string().optional(), nationalityCode: z.string().optional(), nationalityName: z.string().optional(), nationalityNameNative: z.string().optional(), occupation: z.string().optional(), organDonor: z.boolean().optional(), passportNumber: z.string().optional(), permitNumber: z.string().optional(), personalNumber: z.string().optional(), photo: z.string().optional(), photoCompressed: z.string().optional(), photoEncoding: z.string().optional(), sex: z.string().optional(), sexNative: z.string().optional(), signature: z.string().optional(), signatureCompressed: z.string().optional(), signatureEncoding: z.string().optional(), socialSecurityNumber: z.string().optional(), startDate: z.string().optional(), surname: z.string().optional(), surnameNative: z.string().optional(), visaClass: z.string().optional(), visaNumber: z.string().optional(), weight: z.string().optional(), cardNumber: z.string().optional(), issuerCountryCode: z.string().optional(), id: z.string().optional(), type: z.string().optional(), category: z.string().optional(), subtype: z.string().optional(), format: z.string().optional(), device: z.object({type: z.string().optional(), model: z.string().optional(), hasContactlessReader: z.boolean().optional(), hasMagneticStripeReader: z.boolean().optional(), hasCamera: z.boolean().optional(), serialNumber: z.string().optional(), manufacturer: z.string().optional()}).optional(), side1Image: z.string().optional(), side2Image: z.string().optional(), chip: z.object({lds: z.array(z.object({name: z.enum(["COM", "SOD", "DG1", "DG2", "DG3", "DG4", "DG5", "DG6", "DG7", "DG8", "DG9", "DG10", "DG11", "DG12", "DG13", "DG14", "DG15"]), data: z.string()}).and(z.record(z.string(), z.unknown()))), auth: z.array(z.object({type: z.enum(["ActiveAuthentication", "BasicAccessControl", "ChipAuthentication", "PassiveAuthentication", "SupplementalAccessControl", "ExtendedAccessControl", "TerminalAuthentication"]), result: z.enum(["Success", "Failure", "Skipped"])}).and(z.record(z.string(), z.unknown())))}).and(z.record(z.string(), z.unknown())).optional(), classification: z.object({ids: z.array(z.string()).optional(), category: z.string().optional(), type: z.string().optional(), subtype: z.string().optional(), isDoubleSided: z.boolean().optional(), hasNFC: z.boolean().optional(), year: z.string().optional(), countryCode: z.string().optional(), countryName: z.string().optional(), stateCode: z.string().optional(), stateName: z.string().optional(), sides: z.array(z.object({side: z.string(), id: z.string(), documentQuality: z.string(), documentQualityScore: z.number()})).optional()}).optional(), extraction: z.object({aggregatedFields: z.array(z.object({label: z.string(), value: z.string(), source: z.string(), isNonLatin: z.boolean(), regionOfInterest: z.object({boundingBox: z.object({x: z.number(), y: z.number(), width: z.number(), height: z.number()}).optional(), side: z.string(), spectrum: z.string().optional(), imageId: z.string().optional()}).optional()})).optional(), extractedFields: z.array(z.object({label: z.string(), details: z.array(z.object({label: z.string(), value: z.string(), source: z.string(), isNonLatin: z.boolean(), regionOfInterest: z.object({boundingBox: z.object({x: z.number(), y: z.number(), width: z.number(), height: z.number()}).optional(), side: z.string(), spectrum: z.string().optional(), imageId: z.string().optional()}).optional()}))})).optional(), extractedImages: z.array(z.object({label: z.string(), side: z.string(), imageID: z.string()})).optional()}).optional(), validation: z.object({validationChecks: z.array(z.object({name: z.string(), title: z.string(), info: z.string(), validationResult: z.string(), resultInfo: z.string(), weight: z.string(), regionOfInterests: z.array(z.object({boundingBox: z.object({x: z.number(), y: z.number(), width: z.number(), height: z.number()}).optional(), side: z.string(), spectrum: z.string().optional(), imageId: z.string().optional()})).optional(), type: z.string()})).optional(), aggregatedValidationChecks: z.array(z.object({name: z.string(), title: z.string(), info: z.string(), validationResult: z.string(), resultInfo: z.string(), weight: z.string(), regionOfInterests: z.array(z.object({boundingBox: z.object({x: z.number(), y: z.number(), width: z.number(), height: z.number()}).optional(), side: z.string(), spectrum: z.string().optional(), imageId: z.string().optional()})).optional(), type: z.string()})).optional()}).optional(), subType: z.string().optional(), number: z.string().optional(), expiryDate: z.string().optional(), subject: z.object({title: z.string().optional(), firstName: z.string().optional(), middleNames: z.array(z.string()).optional(), lastNames: z.array(z.string()).optional(), lastNamesAtBirth: z.array(z.string()).optional(), aliases: z.array(z.object({title: z.string().optional(), firstName: z.string().optional(), middleNames: z.array(z.string()).optional(), lastNames: z.array(z.string()).optional(), lastNamesAtBirth: z.array(z.string()).optional()})).optional(), relatedPersons: z.array(z.object({title: z.string().optional(), firstName: z.string().optional(), middleNames: z.array(z.string()).optional(), lastNames: z.array(z.string()).optional(), lastNamesAtBirth: z.array(z.string()).optional(), relationship: z.enum(["mother", "father", "maternalGrandFather", "maternalGrandMother", "paternalGrandFather", "paternalGrandMother"])})).optional(), dateOfBirth: z.string().optional(), gender: z.string().optional(), currentAddress: z.object({lines: z.array(z.string()).optional(), addressString: z.string().optional(), premise: z.string().optional(), building: z.string().optional(), subBuilding: z.string().optional(), thoroughfare: z.string().optional(), dependentThoroughfare: z.string().optional(), locality: z.string().optional(), dependentLocality: z.string().optional(), doubleDependentLocality: z.string().optional(), postalCode: z.string().optional(), postBox: z.string().optional(), country: z.string().optional(), superAdministrativeArea: z.string().optional(), administrativeArea: z.string().optional(), subAdministrativeArea: z.string().optional(), organization: z.string().optional(), location: z.object({latitude: z.string().optional(), longitude: z.string().optional(), geoAccuracy: z.string().optional(), what3words: z.string().optional()}).optional()}).optional(), previousAddresses: z.array(z.object({lines: z.array(z.string()).optional(), addressString: z.string().optional(), premise: z.string().optional(), building: z.string().optional(), subBuilding: z.string().optional(), thoroughfare: z.string().optional(), dependentThoroughfare: z.string().optional(), locality: z.string().optional(), dependentLocality: z.string().optional(), doubleDependentLocality: z.string().optional(), postalCode: z.string().optional(), postBox: z.string().optional(), country: z.string().optional(), superAdministrativeArea: z.string().optional(), administrativeArea: z.string().optional(), subAdministrativeArea: z.string().optional(), organization: z.string().optional(), location: z.object({latitude: z.string().optional(), longitude: z.string().optional(), geoAccuracy: z.string().optional(), what3words: z.string().optional()}).optional(), fromDate: z.string(), toDate: z.string()})).optional(), placeOfBirth: z.object({lines: z.array(z.string()).optional(), addressString: z.string().optional(), premise: z.string().optional(), building: z.string().optional(), subBuilding: z.string().optional(), thoroughfare: z.string().optional(), dependentThoroughfare: z.string().optional(), locality: z.string().optional(), dependentLocality: z.string().optional(), doubleDependentLocality: z.string().optional(), postalCode: z.string().optional(), postBox: z.string().optional(), country: z.string().optional(), superAdministrativeArea: z.string().optional(), administrativeArea: z.string().optional(), subAdministrativeArea: z.string().optional(), organization: z.string().optional(), location: z.object({latitude: z.string().optional(), longitude: z.string().optional(), geoAccuracy: z.string().optional(), what3words: z.string().optional()}).optional()}).optional(), idNumbers: z.array(z.object({type: z.string(), idNumber: z.string(), country: z.string().optional()})).optional(), phones: z.array(z.object({type: z.string(), number: z.string()})).optional(), emails: z.array(z.object({type: z.string(), email: z.string()})).optional(), socials: z.array(z.object({type: z.string(), identity: z.string()})).optional(), mothersMaidenName: z.string().optional()}).optional(), country: z.string().optional()})).optional(), biometrics: z.array(z.union([z.object({id: z.string().optional(), type: z.string().optional(), face1Image: z.string(), face2Image: z.string()}), z.object({id: z.string().optional(), type: z.string().optional(), selfieImage: z.string(), anchorImage: z.string()}), z.object({id: z.string().optional(), type: z.string().optional(), faceImage: z.string()}), z.object({id: z.string().optional(), type: z.string().optional(), selfieImage: z.string(), selfieImageEncryption: z.boolean().optional()})])).optional(), sessions: z.array(z.object({user: z.object({id: z.string(), email: z.string(), domain: z.string()}).optional(), client: z.object({id: z.string(), ip: z.string(), address: z.string()}).optional(), device: z.object({id: z.string(), manufacturer: z.string(), model: z.object({identifier: z.string(), name: z.string()})}).optional(), trace: z.object({id: z.string()}).optional(), span: z.object({id: z.string()}).optional(), transaction: z.object({id: z.string()}).optional(), auth: z.array(z.object({id: z.string(), scope: z.string().optional(), codeVerifier: z.string().optional(), code: z.string().optional(), state: z.string().optional(), redirectUri: z.string().optional(), responseType: z.string().optional(), clientId: z.string().optional(), clientSecret: z.string().optional()})).optional()})).optional(), consent: z.array(z.object({type: z.enum(["rollup", "explicit", "implicit"]).optional(), id: z.string().optional(), version: z.string().optional(), url: z.string(), effectiveDate: z.string().optional(), expiryDate: z.string().optional(), terms: z.string().optional(), purpose: z.string().optional(), legalBasis: z.string().optional(), jurisdiction: z.string().optional(), subject: z.string().optional(), signatory: z.string().optional()})).optional(), accounts: z.array(z.object({type: z.string(), accountNumber: z.string(), sortCode: z.string().optional(), routingNumber: z.string().optional(), iban: z.string().optional(), bic: z.string().optional(), accountHolderName: z.string().optional(), bankName: z.string().optional(), country: z.string().optional(), accountType: z.string().optional()})).optional(), uid: z.string().optional()}).optional()}).optional(), instructions: z.array(z.string()).optional(), outstanding: z.array(z.string()).optional()}), z.object({status: z.literal("error"), code: z.number(), message: z.string()}), z.object({instanceId: z.string(), journey: z.object({status: z.enum(["Completed", "InProgress", "Failed", "Paused"])}), processing: z.boolean().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 }; /** * Fetch Interaction * * POST /journey/interaction/fetch */ export const createApiJourneyInteractionFetch = async (args: CreateApiJourneyInteractionFetchArgs, options?: CreateApiJourneyInteractionFetchOptions) => { const {baseUrl = "https://eu.platform.go.gbgplc.com/v2/captain", fetch: fetchFn = fetch, InteractionAccess} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (InteractionAccess !== undefined) headers.set('authorization', `Bearer ${InteractionAccess}`) const url = `${baseUrl.replace(/\/+$/, '')}/journey/interaction/fetch${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(createApiJourneyInteractionFetchResponse, await res.json()) };