import {z} from 'zod' export type GetApiProviderAccountsArgs = {include?: string | undefined, providerIds?: string | undefined}; export type GetApiProviderAccountsOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const providerAccountPreferences = z.object({isDataExtractsEnabled: z.boolean().optional(), linkedProviderAccountId: z.number().int().optional(), isAutoRefreshEnabled: z.boolean().optional()}); export const accountDataset = z.object({lastUpdated: z.string().optional(), updateEligibility: z.enum(["ALLOW_UPDATE", "ALLOW_UPDATE_WITH_CREDENTIALS", "DISALLOW_UPDATE"]).optional(), additionalStatus: z.enum(["LOGIN_IN_PROGRESS", "DATA_RETRIEVAL_IN_PROGRESS", "ACCT_SUMMARY_RECEIVED", "AVAILABLE_DATA_RETRIEVED", "PARTIAL_DATA_RETRIEVED", "DATA_RETRIEVAL_FAILED", "DATA_NOT_AVAILABLE", "ACCOUNT_LOCKED", "ADDL_AUTHENTICATION_REQUIRED", "BETA_SITE_DEV_IN_PROGRESS", "CREDENTIALS_UPDATE_NEEDED", "INCORRECT_CREDENTIALS", "PROPERTY_VALUE_NOT_AVAILABLE", "INVALID_ADDL_INFO_PROVIDED", "REQUEST_TIME_OUT", "SITE_BLOCKING_ERROR", "UNEXPECTED_SITE_ERROR", "SITE_NOT_SUPPORTED", "SITE_UNAVAILABLE", "TECH_ERROR", "USER_ACTION_NEEDED_AT_SITE", "SITE_SESSION_INVALIDATED", "NEW_AUTHENTICATION_REQUIRED", "DATASET_NOT_SUPPORTED", "ENROLLMENT_REQUIRED_FOR_DATASET", "CONSENT_REQUIRED", "CONSENT_EXPIRED", "CONSENT_REVOKED", "INCORRECT_OAUTH_TOKEN", "MIGRATION_IN_PROGRESS"]).optional(), nextUpdateScheduled: z.string().optional(), name: z.enum(["BASIC_AGG_DATA", "ADVANCE_AGG_DATA", "ACCT_PROFILE", "DOCUMENT"]).optional(), lastUpdateAttempt: z.string().optional()}); export const providerAccount = z.object({lastUpdated: z.string().optional(), consentId: z.number().int().optional(), preferences: providerAccountPreferences.optional(), createdDate: z.string().optional(), aggregationSource: z.enum(["SYSTEM", "USER"]).optional(), oauthMigrationStatus: z.enum(["IN_PROGRESS", "TO_BE_MIGRATED", "COMPLETED"]).optional(), providerId: z.number().int().optional(), requestId: z.string().optional(), isManual: z.boolean().optional(), id: z.number().int().optional(), dataset: z.array(accountDataset).optional(), status: z.enum(["LOGIN_IN_PROGRESS", "USER_INPUT_REQUIRED", "IN_PROGRESS", "PARTIAL_SUCCESS", "SUCCESS", "FAILED", "MIGRATION_IN_PROGRESS"]).optional()}); export const providerAccountResponse = z.object({providerAccount: z.array(providerAccount).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 Provider Accounts * * GET /providerAccounts */ export const getApiProviderAccounts = async (args: GetApiProviderAccountsArgs, options: GetApiProviderAccountsOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json;charset=UTF-8") if (args.include != null) query.append("include", String(args.include)) if (args.providerIds != null) query.append("providerIds", String(args.providerIds)) const url = `${baseUrl.replace(/\/+$/, '')}/providerAccounts${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(providerAccountResponse, await res.json()) };