import {z} from 'zod' export type GetApiV1OrganizationsOrganizationUuidConfigArgs = {organizationUuid: string}; export type GetApiV1OrganizationsOrganizationUuidConfigOptions = {baseUrl: string, apiKey?: string | undefined, fetch?: typeof fetch | undefined}; export const colorsText = z.object({primary: z.string().optional(), secondary: z.string().optional()}); export const colorsBackground = z.object({primary: z.string().optional(), secondary: z.string().optional()}); export const v1Colors = z.object({text: colorsText.optional(), background: colorsBackground.optional()}); export const v1Copies = z.object({disputesBlockerText: z.string().optional(), unauthBlockerText: z.string().optional(), introductoryText: z.string().optional(), unauthClaimText: z.string().optional(), extraSections: z.array(z.string()).optional()}); export const v1Branding = z.object({phoneNumber: z.string().optional(), colors: v1Colors.optional(), copies: v1Copies.optional()}); export const v1Flags = z.object({disputesEnabled: z.boolean().optional(), unauthDisputesEnabled: z.boolean().optional(), fileUploadsEnabled: z.boolean().optional(), iframeEnabled: z.boolean().optional(), fullAccountMatchersEnabled: z.boolean().optional(), nameMatcherEnabled: z.boolean().optional()}); export const v1TransactionNamesMatch = z.object({type: z.string().optional(), names: z.string().optional(), exactMatch: z.boolean().optional(), exceptionWords: z.string().optional()}); export const v1TransactionTypeMatch = z.object({type: z.string().optional(), text: z.string().optional()}); export const v1TransactionMerchant = z.object({type: z.string().optional(), trimStart: z.string().optional(), trimEnd: z.string().optional()}); export const v1DisputesConfig = z.object({hiddenTypes: z.string().optional(), hiddenNames: z.string().optional(), hiddenNamesByAccount: z.array(v1TransactionNamesMatch).optional(), disabledTypes: z.string().optional(), disabledNames: z.string().optional(), disabledNamesByAccount: z.array(v1TransactionNamesMatch).optional(), exactNameMatch: z.boolean().optional(), maxDaysSinceTxn: z.string().optional(), minDaysSinceTxn: z.string().optional(), transactionTypeMatches: z.array(v1TransactionTypeMatch).optional(), hideInflowTxns: z.boolean().optional(), transactionMerchants: z.array(v1TransactionMerchant).optional(), abuserDisputeCountThreshold: z.string().optional(), abuserDisputedAmountThreshold: z.string().optional(), abuserLookbackDays: z.number().int().optional(), maxTxnsToDispute: z.number().int().optional(), transactionMenuContexts: z.array(z.string()).optional()}); export const v1AccountsConfig = z.object({allowedProducts: z.string().optional(), allowedProductTypes: z.string().optional(), allowedNames: z.string().optional(), allowedAccesses: z.string().optional(), hiddenProducts: z.string().optional(), hiddenProductTypes: z.string().optional(), hiddenNames: z.string().optional(), hiddenAccesses: z.string().optional()}); export const v1MobileConfig = z.object({breakpoint: z.string().optional()}); export const v1CurrencyConfig = z.object({defaultCurrency: z.string().optional(), supportedCurrencies: z.array(z.string()).optional()}); export const v1GetOrganizationConfigResponse = z.object({branding: v1Branding.optional(), flags: v1Flags.optional(), disputes: v1DisputesConfig.optional(), accounts: v1AccountsConfig.optional(), mobile: v1MobileConfig.optional(), currency: v1CurrencyConfig.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 }; /** * buf:lint:ignore RPC_REQUEST_STANDARD_NAME * buf:lint:ignore RPC_RESPONSE_STANDARD_NAME * * GET /v1/organizations/{organizationUuid}/config */ export const getApiV1OrganizationsOrganizationUuidConfig = async (args: GetApiV1OrganizationsOrganizationUuidConfigArgs, options: GetApiV1OrganizationsOrganizationUuidConfigOptions) => { const {baseUrl, fetch: fetchFn = fetch, apiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (apiKey !== undefined) headers.set("Authorization", apiKey) const url = `${baseUrl.replace(/\/+$/, '')}/v1/organizations/${encodeURIComponent(String(args.organizationUuid))}/config${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(v1GetOrganizationConfigResponse, await res.json()) };