import {z} from 'zod' export type GetApiTerminalSessionsTerminalSessionIdArgs = {terminalSessionId: string, version: string, 'software-house-id': string, 'reseller-id'?: string | undefined}; export type GetApiTerminalSessionsTerminalSessionIdOptions = {baseUrl?: string | undefined, ApiKeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const terminalSessionStatus = z.enum(["InitiateRequested", "Initiated", "Authorized", "Captured", "CancelRequested", "Canceled", "SignatureVerificationAccepted", "SignatureVerificationRejected", "SignatureVerificationRequired", "Expired", "Declined"]); export const terminalSessionNotificationType = z.string(); export const terminalSessionNotificationEvent = z.object({notificationType: terminalSessionNotificationType, createdAt: z.string()}); export const terminalSessionStatusEvent = z.object({status: terminalSessionStatus, createdAt: z.string(), debugMessage: z.string()}); export const terminalSessionReceiptLineType = z.enum(["Text", "LogoImage", "NewLine", "SingleLineSeperator", "DoubleLineSeperator"]); export const terminalSessionReceiptTextSize = z.enum(["SizeHeader1", "SizeHeader2", "SizeBody"]); export const terminalSessionReceiptAlign = z.enum(["AlignLeft", "AlignCenter", "AlignRight"]); export const terminalSessionReceiptText = z.object({value: z.string(), size: terminalSessionReceiptTextSize, align: terminalSessionReceiptAlign, emphasisBold: z.boolean()}); export const terminalSessionReceiptImageLogo = z.object({value: z.string(), align: terminalSessionReceiptAlign}); export const terminalSessionReceiptLine = z.object({lineType: terminalSessionReceiptLineType, text: terminalSessionReceiptText.optional(), imageLogo: terminalSessionReceiptImageLogo.optional()}); export const terminalSessionReceipt = z.object({lines: z.array(terminalSessionReceiptLine)}); export const money = z.object({value: z.number().int(), currencyCode: z.string().min(1).max(10)}); export const terminalSessionUnlinkedRefundDetails = z.object({amount: money, cardholderNotPresent: z.boolean().optional()}); export const terminalSessionMatchedRefundDetails = z.object({paymentIntentId: z.string(), amount: money.optional()}); export const terminalSessionSaleDetails = z.object({paymentIntentId: z.string()}); export const terminalSessionType = z.enum(["Sale", "MatchedRefund", "UnlinkedRefund"]); export const terminalSessionDetails = z.union([z.object({unlinkedRefund: terminalSessionUnlinkedRefundDetails.optional(), matchedRefund: terminalSessionMatchedRefundDetails.optional(), sale: terminalSessionSaleDetails, sessionType: terminalSessionType}), z.object({unlinkedRefund: terminalSessionUnlinkedRefundDetails, matchedRefund: terminalSessionMatchedRefundDetails.optional(), sale: terminalSessionSaleDetails.optional(), sessionType: terminalSessionType}), z.object({unlinkedRefund: terminalSessionUnlinkedRefundDetails.optional(), matchedRefund: terminalSessionMatchedRefundDetails, sale: terminalSessionSaleDetails.optional(), sessionType: terminalSessionType})]); export const cardFundingType = z.string(); export const terminalSessionPaymentEntryMode = z.string(); export const terminalSessionPaymentVerificationMode = z.string(); export const card = z.object({cardNumber: z.string().nullable().optional(), cardName: z.string().nullable().optional(), expiryDate: z.string().nullable().optional(), cardType: z.string().nullable().optional(), cardFundingType: cardFundingType.optional(), last4PAN: z.string().nullable().optional(), entryMode: terminalSessionPaymentEntryMode.optional(), verificationMethod: terminalSessionPaymentVerificationMode.optional()}); export const paymentDetails = z.object({transactionId: z.string().nullable().optional(), transactionDateTime: z.string().nullable().optional(), message: z.string().nullable().optional(), paymentMethodId: z.string().nullable().optional(), authCode: z.string().nullable().optional(), card: card.nullable().optional(), avsResult: z.string().nullable().optional()}); export const terminalSession = z.object({terminalId: z.string(), createdAt: z.string(), updatedAt: z.string(), id: z.string(), status: terminalSessionStatus, expireAt: z.string(), notificationEvents: z.array(terminalSessionNotificationEvent), statusEvents: z.array(terminalSessionStatusEvent), receipt: terminalSessionReceipt.optional(), details: terminalSessionDetails.optional(), paymentDetails: paymentDetails.nullable().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 }; /** * Retrieve a terminal session * * GET /terminal-sessions/{terminalSessionId} */ export const getApiTerminalSessionsTerminalSessionId = async (args: GetApiTerminalSessionsTerminalSessionIdArgs, options?: GetApiTerminalSessionsTerminalSessionIdOptions) => { const {baseUrl = "https://api.dojo.tech", fetch: fetchFn = fetch, ApiKeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.version != null) headers.set("version", String(args.version)) if (args['software-house-id'] != null) headers.set("software-house-id", String(args['software-house-id'])) if (args['reseller-id'] != null) headers.set("reseller-id", String(args['reseller-id'])) if (ApiKeyAuth !== undefined) headers.set("Authorization", ApiKeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/terminal-sessions/${encodeURIComponent(String(args.terminalSessionId))}${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(terminalSession, await res.json()) };