import {z} from 'zod' export type PersonNotification = {channels?: (Array<'EMAIL' | 'PUSH_NOTIFICATION' | 'SMS'>) | undefined, emailFooter?: string | undefined, emailSubject?: string | undefined, note?: string | undefined, params?: {[key: string]: string} | undefined, secureContent?: string | undefined, sourceId?: string | undefined, sourceName?: string | undefined, type?: string | undefined}; export type CancelOperation = {credentialExtId?: string | undefined, notification?: PersonNotification | undefined}; export type Timestamp = {date?: number | undefined, day?: number | undefined, hours?: number | undefined, minutes?: number | undefined, month?: number | undefined, nanos?: number | undefined, seconds?: number | undefined, time?: number | undefined, timezoneOffset?: number | undefined, year?: number | undefined}; export type ServiceCredential = {acts?: string | undefined, additionalPresentations?: number | undefined, claims?: Record | undefined, correlationId?: string | undefined, credentialTypeHref?: string | undefined, detUTCOffsetMinutes?: number | undefined, displayEndTime?: Timestamp | undefined, displayStartTime?: Timestamp | undefined, dstUTCOffsetMinutes?: number | undefined, expiringDtm?: Timestamp | undefined, extId?: string | undefined, notBeforeDtm?: Timestamp | undefined, note?: string | undefined, notifyOfExpiryDtm?: Timestamp | undefined, optionalInfo?: {[key: string]: string} | undefined, personInfo?: Record | undefined, sensitiveInfo?: {[key: string]: string} | undefined, status?: string | undefined, subject?: string | undefined, types?: Array | undefined}; export type IssueOperation = {credential?: ServiceCredential | undefined, notification?: PersonNotification | undefined}; export type ModifyOperation = {credential?: ServiceCredential | undefined, credentialExtId?: string | undefined, notification?: PersonNotification | undefined}; export type PushCredentialOperation = {cancelOperation?: CancelOperation | undefined, issueOperation?: IssueOperation | undefined, modifyOperation?: ModifyOperation | undefined}; export type PushCredentialOperations = {correlationId?: string | undefined, operations?: Array | undefined}; export type CreateApiApiCredentialProvidersCredentialProviderIdPersonsPersonIdCredentialOperationsArgs = {Authorization: string, credentialProviderId: string, personId: string, body: PushCredentialOperations}; export type CreateApiApiCredentialProvidersCredentialProviderIdPersonsPersonIdCredentialOperationsOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const timestampRes = z.object({date: z.number().int().optional(), day: z.number().int().optional(), hours: z.number().int().optional(), minutes: z.number().int().optional(), month: z.number().int().optional(), nanos: z.number().int().optional(), seconds: z.number().int().optional(), time: z.number().int().optional(), timezoneOffset: z.number().int().optional(), year: z.number().int().optional()}); export const usageRecord = z.object({checkpointPresentations: z.record(z.string(), z.number().int()).optional(), checkpointTypePresentations: z.record(z.string(), z.number().int()).optional(), presentations: z.number().int().optional()}); export const credentialUsePolicy = z.object({checkpointPolicy: z.enum(["TIME_BASED", "VALIDATION_COUNT_BASED"]).optional(), checkpointTypePolicy: z.enum(["TIME_BASED", "VALIDATION_COUNT_BASED"]).optional(), numberOfCheckpointTypeValidations: z.number().int().optional(), numberOfCheckpointValidations: z.number().int().optional(), numberOfValidations: z.number().int().optional(), policy: z.enum(["TIME_BASED", "VALIDATION_COUNT_BASED"]).optional()}); export const credentialDto = z.object({cancelledDtm: timestampRes.optional(), correlationId: z.string().optional(), createdDtm: timestampRes.optional(), credentialProviderId: z.string().optional(), credentialProviderName: z.string().optional(), credentialTypeId: z.string().optional(), credentialTypeName: z.string().optional(), extId: z.string().optional(), href: z.string().optional(), id: z.string().optional(), issueStatus: z.string().optional(), jwt: z.string().optional(), revokedDtm: timestampRes.optional(), statusCheckCount: z.number().int().optional(), usageRecord: usageRecord.optional(), usePolicy: credentialUsePolicy.optional()}); export const cancelResult = z.object({credential: credentialDto.optional()}); export const issueResult = z.object({credential: credentialDto.optional()}); export const credentialOperationResult = z.object({cancel: cancelResult.optional(), issue: issueResult.optional()}); export const performCredentialOperationsResponse = z.object({operationResults: z.array(credentialOperationResult).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 }; /** * Perform credential operations * * POST /api/credentialProviders/{credentialProviderId}/persons/{personId}/credentialOperations */ export const createApiApiCredentialProvidersCredentialProviderIdPersonsPersonIdCredentialOperations = async (args: CreateApiApiCredentialProvidersCredentialProviderIdPersonsPersonIdCredentialOperationsArgs, options: CreateApiApiCredentialProvidersCredentialProviderIdPersonsPersonIdCredentialOperationsOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args.Authorization != null) headers.set("Authorization", String(args.Authorization)) const url = `${baseUrl.replace(/\/+$/, '')}/api/credentialProviders/${encodeURIComponent(String(args.credentialProviderId))}/persons/${encodeURIComponent(String(args.personId))}/credentialOperations${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(performCredentialOperationsResponse, await res.json()) };