import {z} from 'zod' export type GetApiV2ActivitiesOptions = {baseUrl?: string | undefined, bearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const activity = z.object({id: z.number().int().optional(), userId: z.number().int().optional(), type: z.enum(["PAYMENT_MADE", "PAYMENT_RECEIVED", "MANUAL_WITHDRAWAL", "EDIT_CARAPIN", "EDIT_PASSWORD", "USER_CREATED", "FUNDING_SOURCE_ADDED", "FUNDING_SOURCE_VALIDATED", "LODGEMENT_RECEIVED", "RESET_PASSWORD", "RESET_CARAPIN", "LOGIN_FAILED", "LOGIN_SUCCESS", "ACCOUNT_CREATED", "INTERNAL_TRANSFER_MADE", "PAYMENT_REQUEST_SENT", "PAYMENT_REQUEST_RECEIVED", "EDIT_ACCOUNT_NAME", "SETTING_ENABLED", "SETTING_DISABLED", "PASSWORD_LOCKED", "CARAPIN_LOCKED", "NATIVE_APPLICATION_REGISTRATION_LOCKED", "NATIVE_APPLICATION_USER_STATUS_CHANGED", "PAYMENT_ACKNOWLEDGED", "WITHDRAWAL_RETURNED", "LODGEMENT_REVERSED", "LODGEMENT_SUSPENDED_INCF_MAX_CPL", "VERIFICATION_EVIDENCE_SUBMITTED", "ANONYMOUS_PAYMENT_RECEIVED", "INCREASE_CVL", "PENDING_PAYMENT_RETURNED", "PAYMENT_FAILED_BASIC_USER_CP_LIMIT_EXCEEDED", "ANONYMOUS_PAYMENT_FAILED_BASIC_USER_CP_LIMIT_EXCEEDED", "UPLOAD_PROFILE_PICTURE", "EDIT_USER_EMAIL_ADDRESS", "TOTP_AUTHENTICATOR_TOKEN_LOCKED", "FX_INTERNAL_TRANSFER_MADE", "PAYMENT_REQUEST_SAVED", "CARD_TOP_UP", "ACCOUNT_CREATED_BY_PAYMENT", "PAYMENT_REQUEST_PAYMENT_RECEIVED", "LODGEMENT_SUSPENDED_BASIC_EXPIRY_REACHED", "LODGEMENT_SUSPENDED_USER_SANCTIONED", "PERSONAL_EMAIL_VERIFIED", "ACCOUNT_CREATED_BY_CARD", "CARD_PAYMENT_POS_CONTACT_DEBIT", "CARD_PAYMENT_POS_CONTACTLESS_DEBIT", "CARD_PAYMENT_ECOMMERCE_DEBIT", "CARD_PAYMENT_ATM_DEBIT", "CARD_PAYMENT_DECLINED", "CARD_PAYMENT_CARD_BLOCKED", "CARD_PAYMENT_CARD_NOT_ACTIVATED", "CARD_PAYMENT_REFUND", "CARD_PAYMENT_AUTH_REVERSAL", "CARD_PAYMENT_FINANCIAL_REVERSAL", "CARD_PAYMENT_FINANCIAL_DIFFERENT_AMOUNT", "CARD_MESSAGE_CHANGE_PIN", "CARD_CREATED", "CARD_ACTIVATED", "CARD_BLOCKED", "CARD_UNBLOCKED", "ARCHIVE_FUNDING_SOURCE", "INTERACTION_MESSAGE_RECEIVED", "BUSINESS_API_APPLICATION_CREATED", "BUSINESS_API_APPLICATION_DELETED", "BUSINESS_MOBILE_APPLICATION_CREATED", "BUSINESS_USER_DISABLED", "BUSINESS_MOBILE_APPLICATION_DELETED", "ANONYMOUS_PAYMENT_REQUEST_PAYMENT_RECEIVED", "SCAAA_PING", "BUSINESS_ADDITIONAL_USER_CREATED", "BUSINESS_BATCH_REQUEST_CANCELLED", "BUSINESS_BATCH_REQUEST_SUBMITTED", "BUSINESS_BATCH_REQUEST_COMPLETED", "BUSINESS_BATCH_REQUEST_SCAAA_SENT", "BUSINESS_BATCH_REQUEST_APPROVED", "BUSINESS_BATCH_REQUEST_REJECTED", "CARD_LINKED_ACCOUNTS_UPDATED", "DIRECT_DEBIT_MANDATE_CREATED", "DIRECT_DEBIT_MANDATE_COMPLETE", "DIRECT_DEBIT_MANDATE_DISALLOWED_BY_ACCOUNT", "DIRECT_DEBIT_CREATED", "DIRECT_DEBIT_CREATED_INSUFFICIENT_FUNDS_AT_PRESENT", "DIRECT_DEBIT_COLLECTED", "DIRECT_DEBIT_UNPAID_INSUFFICIENT_FUNDS", "STAFF_DIRECT_DEBIT_MANDATE_CANCELLED", "STAFF_DIRECT_DEBIT_MANDATE_REJECTED", "STAFF_DIRECT_DEBIT_REJECTED", "BUSINESS_CREATED", "ACCOUNT_DIRECT_DEBITS_ENABLED", "ACCOUNT_DIRECT_DEBITS_DISABLED", "DIRECT_DEBIT_MANDATE_CANCELLED", "DIRECT_DEBIT_MANDATE_UPDATED", "DIRECT_DEBIT_REJECTED", "DIRECT_DEBIT_REFUND", "LOGIN_APPROVAL_REQUESTED", "NEW_PAYEE_APPROVAL_REQUESTED", "APPROVAL_REQUEST_REJECTED", "NEW_USER_APPROVAL_REQUESTED", "PAYMENT_REQUEST_PAYMENT_AUTHORISED", "PAYMENT_REQUEST_PAYMENT_PAID", "BUSINESS_API_APPLICATION_UPDATED", "CARD_PAYMENT_OOB_3DS2_AUTHORISATION_REQUEST", "CARD_PAYMENT_OOB_3DS2_DECLINED", "EDIT_USER_ROLE_APPROVAL_REQUESTED", "BUSINESS_USER_ROLE_CHANGED", "EXCHANGE_RATE_MONTHLY_REPORT_AVAILABLE", "DIRECT_DEBIT_CANCELLED", "DIRECT_DEBIT_REVERSED", "DIRECT_DEBIT_DISALLOWED_BY_ACCOUNT", "CARD_REISSUED", "FX_INTERNATIONAL_WITHDRAWAL_CREATED", "FX_INTERNATIONAL_WITHDRAWAL_FAILED", "FUNDING_SOURCE_FAILED", "STAFF_FUNDING_SOURCE_REJECTED", "STAFF_BUSINESS_USER_LIVE", "NEW_BANK_TRANSFER_APPROVAL_REQUESTED", "EDIT_AUTHORISATION_RULE_APPROVAL_REQUESTED", "CREATE_AUTHORISATION_RULE_APPROVAL_REQUESTED", "BUSINESS_SERVICE_FEE", "BUSINESS_UNCOLLECTED_SERVICE_FEE"]).optional(), description: z.string().optional(), relatedIp: z.string().optional(), dateCreated: z.string().optional()}); export const getApiV2ActivitiesResponse = z.object({activities: z.array(activity).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 }; /** * Get activity * * GET /v2/activities */ export const getApiV2Activities = async (options?: GetApiV2ActivitiesOptions) => { 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(/\/+$/, '')}/v2/activities${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(getApiV2ActivitiesResponse, await res.json()) };