import {z} from 'zod' export type GetApiAttributeUserTokenArgs = {user_token: string, show_translated_labels?: boolean | undefined, 'Idempotency-Key'?: string | undefined, Language?: string | undefined}; export type GetApiAttributeUserTokenOptions = {baseUrl?: string | undefined, AUTHORIZERNAME?: string | undefined, fetch?: typeof fetch | undefined}; export const attrSetRequirement = z.object({attr_set_token: z.string(), last_attr_value_used: z.boolean(), label: z.string().optional(), destination_currency: z.string().optional(), attributes: z.array(z.object({token: z.string(), label: z.string(), validation: z.string(), is_optional: z.boolean(), value: z.string(), expected_value: z.string(), type: z.enum(["CardNumber", "BankAccountType", "BankAccountNumber", "BankAccountBranchNumber", "BankName", "PhoneNumber", "Gender", "IdentificationNumber", "BillReferenceNumber", "BankRoutingNumber", "BankAccountName", "MaidenName", "SocialSecurity", "EmploymentName", "EmploymentAddress", "EmploymentPhone", "EmploymentOccupation", "EmploymentSupervisor", "RemittanceReason", "Relationship", "SecondLastName", "SWIFT", "BirthCountry", "SourceOfFunds", "DateOfBirth", "CardExpiration", "CardZip", "IdentificationType", "BankCity", "BankState", "IDSelfieCollection", "City", "Country", "IdentificationExpiration", "Address1", "IFramePaymentCollection", "PostalCode", "GuardianFullName", "GuardianGovIDType", "GuardianGovIDNumber", "GuardianConsent", "EIN", "WalletAddress", "OAuthGrant", "SecurityAnswer"]), input_type: z.enum(["text", "options", "date"])})).optional()}); export const allAttributesSetResp = z.object({destination_token: z.string().optional(), payer_logo: z.string().optional(), payer_name: z.string().optional(), exchange_rate: z.array(z.object({currency_symbol: z.string(), exchange_rate: z.number()})).optional(), max_limit: z.number().optional(), min_limit: z.number().optional(), number_of_locations: z.number().int().gte(0).optional(), estimated_availability: z.string().optional(), additional_description: z.string().optional(), is_dynamic_token: z.boolean().optional(), attributes: z.array(attrSetRequirement).optional()}); export const getApiAttributeUserTokenResponse = z.array(allAttributesSetResp); 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 }; /** * Get all stored user attributes * * GET /attribute/{user_token} * * Also accepts auth: api_key */ export const getApiAttributeUserToken = async (args: GetApiAttributeUserTokenArgs, options?: GetApiAttributeUserTokenOptions) => { const {baseUrl = "https://api.masspay.io/v1.0.0", fetch: fetchFn = fetch, AUTHORIZERNAME} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.show_translated_labels != null) query.append("show_translated_labels", String(args.show_translated_labels)) if (args['Idempotency-Key'] != null) headers.set("Idempotency-Key", String(args['Idempotency-Key'])) if (args.Language != null) headers.set("Language", String(args.Language)) if (AUTHORIZERNAME !== undefined) headers.set("Authorization", AUTHORIZERNAME) const url = `${baseUrl.replace(/\/+$/, '')}/attribute/${encodeURIComponent(String(args.user_token))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiAttributeUserTokenResponse, await res.json()) };