import {z} from 'zod' export type GetApiV1PayeesPayeeIdTransactionsArgs = {payeeId: number}; export type GetApiV1PayeesPayeeIdTransactionsOptions = {baseUrl?: string | undefined, bearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const currency = z.object({code: z.string().optional(), description: z.string().optional()}); export const relatedCard = z.object({cardId: z.number().int().optional(), provider: z.string().optional(), alias: z.string().optional(), maskedPan: z.string().optional(), embossCardName: z.string().optional(), embossBusinessName: z.string().optional(), expiryDate: z.string().optional()}); export const fxTrade = z.object({buyCurrency: z.string().optional(), sellCurrency: z.string().optional(), fixedSide: z.string().optional(), buyAmount: z.number().int().optional(), sellAmount: z.number().int().optional(), rate4d: z.number().int().optional(), provider: z.string().optional()}); export const batchItemDetails = z.object({batchPublicUuid: z.string().optional(), batchItemPublicUuid: z.string().optional(), batchName: z.string().optional(), jobNumber: z.string().optional()}); export const directDebitDetails = z.object({directDebitUuid: z.string().optional(), mandateUUid: z.string().optional(), originatorReference: z.string().optional(), originatorName: z.string().optional(), originatorAlias: z.string().optional(), directDebitReference: z.string().optional(), originatorLogoUrlSmall: z.string().optional(), originatorLogoUrlLarge: z.string().optional(), mandateReference: z.string().optional(), mandateUuid: z.string().optional()}); export const proprietarySchemeDetails = z.array(z.object({type: z.string().optional(), data: z.string().optional()})); export const relatedPartyFireAccount = z.object({type: z.literal("FIRE_ACCOUNT").optional(), account: z.object({id: z.number().int().optional(), alias: z.string().optional(), bic: z.string().optional(), iban: z.string().optional(), nsc: z.string().optional(), accountNumber: z.string().optional()}).optional()}); export const relatedPartyExternalAccount = z.object({type: z.literal("EXTERNAL_ACCOUNT").optional(), account: z.object({id: z.number().int().optional(), alias: z.string().optional(), nsc: z.string().optional(), accountNumber: z.string().optional(), bic: z.string().optional(), iban: z.string().optional()}).optional()}); export const relatedPartyPayee = z.object({type: z.literal("WITHDRAWAL_ACCOUNT").optional(), account: z.object({id: z.number().int().optional(), alias: z.string().optional(), nsc: z.string().optional(), accountNumber: z.string().optional(), bic: z.string().optional(), iban: z.string().optional()}).optional()}); export const relatedPartyCardPayment = z.object({type: z.enum(["CARD_MERCHANT", "CARD_ATM"]).optional(), cardMerchant: z.object({acquirerIdDe32: z.string().optional(), additionalAmtDe54: z.string().optional(), authCodeDe38: z.string().optional(), billAmt: z.number().int().optional(), billCcy: z.string().optional(), expiryDate: z.string().optional(), mccCode: z.string().optional(), merchIdDe42: z.string().optional(), merchNameDe43: z.string().optional(), posDataDe61: z.string().optional(), posTermnlDe41: z.string().optional(), posDataDe22: z.string().optional(), procCode: z.string().optional(), respCodeDe39: z.string().optional(), retRefNoDe37: z.string().optional(), statusCode: z.string().optional(), token: z.string().optional(), txnAmt4d: z.number().int().optional(), txnCcy: z.string().optional(), txnCtry: z.string().optional(), txnDesc: z.string().optional(), txnStatCode: z.string().optional(), txnType: z.string().optional(), additionalDataDe48: z.string().optional(), authorisedByGps: z.string().optional(), avsResult: z.string().optional(), mtId: z.string().optional(), recordDataDe120: z.string().optional(), additionalDataDe124: z.string().optional()}).optional()}); export const relatedParty = z.union([relatedPartyFireAccount, relatedPartyExternalAccount, relatedPartyPayee, relatedPartyCardPayment]); export const transaction = z.object({txnId: z.number().int().optional(), refId: z.number().int().optional(), ican: z.number().int().optional(), currency: currency.optional(), amountBeforeCharges: z.number().int().optional(), feeAmount: z.number().int().optional(), taxAmount: z.number().int().optional(), amountAfterCharges: z.number().int().optional(), balance: z.number().int().optional(), myRef: z.string().optional(), yourRef: z.string().optional(), date: z.string().optional(), paymentRequestPublicCode: z.string().optional(), card: relatedCard.optional(), type: z.string().optional(), dateAcknowledged: z.string().optional(), fxTradeDetails: fxTrade.optional(), batchItemDetails: batchItemDetails.optional(), directDebitDetails: directDebitDetails.optional(), proprietarySchemeDetails: proprietarySchemeDetails.optional(), relatedParty: relatedParty.optional(), eventUuid: z.string().optional()}); export const getApiV1PayeesPayeeIdTransactionsResponse = z.object({total: z.number().int().optional(), dateRangeTo: z.number().int().optional(), transactions: z.array(transaction).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 }; /** * List transaction for a payee account * * GET /v1/payees/{payeeId}/transactions */ export const getApiV1PayeesPayeeIdTransactions = async (args: GetApiV1PayeesPayeeIdTransactionsArgs, options?: GetApiV1PayeesPayeeIdTransactionsOptions) => { const {baseUrl = "https://api.fire.com/business", fetch: fetchFn = fetch, bearerAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (bearerAuth !== undefined) headers.set('authorization', `Bearer ${bearerAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/payees/${encodeURIComponent(String(args.payeeId))}/transactions${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(getApiV1PayeesPayeeIdTransactionsResponse, await res.json()) };