import {z} from 'zod' export type CatalogItemUrn = string; export type GetApiDataQualityV1DqMonitorsArgs = {catalogItemUrn?: CatalogItemUrn | undefined, after?: string | undefined, size?: number | undefined, sort?: string | undefined}; export type GetApiDataQualityV1DqMonitorsOptions = {baseUrl?: string | undefined, JWT?: string | undefined, fetch?: typeof fetch | undefined}; export const paginationMetadata = z.object({next: z.string().optional(), total: z.number().int().optional()}); export const ruleUrn = z.string(); export const ruleInstanceUrn = z.string(); export const correlationIdResponse = z.string(); export const dqThresholdUrn = z.string(); export const dqThresholdResponse = z.object({severity: z.string().optional(), value: z.number().int().gte(0).lte(100).optional(), urn: dqThresholdUrn, correlationId: correlationIdResponse.optional()}); export const ruleParameterUrn = z.string(); export const ruleParameterInstanceResponse = z.object({correlationId: correlationIdResponse.optional(), value: z.string().optional(), ruleParameterUrn: ruleParameterUrn.optional(), ruleParameterName: z.string().optional()}); export const catalogAttributeUrn = z.string(); export const ruleAttributeUrn = z.string(); export const ruleMappingResponse = z.object({catalogItemAttributeUrn: catalogAttributeUrn.optional(), ruleAttributeUrn: ruleAttributeUrn.optional(), correlationId: correlationIdResponse.optional()}); export const subEntityKey = z.string(); export const connectedMappingResponse = z.object({connectedCatalogItemAttributeUrn: catalogAttributeUrn, ruleAttributeUrn: ruleAttributeUrn, joinConfigurationKey: subEntityKey, correlationId: correlationIdResponse.optional()}); export const ruleInstanceWithMappingResponse = z.object({ruleUrn: ruleUrn.optional(), ruleInstanceName: z.string().optional(), ruleInstanceUrn: ruleInstanceUrn, correlationId: correlationIdResponse.optional(), ruleName: z.string().optional(), dqThresholds: z.record(z.string(), dqThresholdResponse).optional(), parameterValues: z.record(z.string(), ruleParameterInstanceResponse).optional(), mappings: z.record(z.string(), ruleMappingResponse).optional(), connectedMappings: z.record(z.string(), connectedMappingResponse).optional(), enabled: z.boolean().optional()}); export const invalidSamplesConfiguration = z.object({enabled: z.boolean().optional(), sampleSize: z.number().int().optional()}); export const termUrn = z.string(); export const termInstanceResponse = z.object({termUrn: termUrn, termName: z.string().optional()}); export const termRuleInstanceResponse = z.object({ruleUrn: ruleUrn.optional(), ruleInstanceName: z.string().optional(), ruleInstanceUrn: ruleInstanceUrn, correlationId: correlationIdResponse.optional(), ruleName: z.string().optional(), dqThresholds: z.record(z.string(), dqThresholdResponse).optional(), parameterValues: z.record(z.string(), ruleParameterInstanceResponse).optional(), mappings: z.record(z.string(), ruleMappingResponse).optional(), connectedMappings: z.record(z.string(), connectedMappingResponse).optional(), enabled: z.boolean().optional(), terms: z.array(termInstanceResponse).optional()}); export const scheduleResponse = z.object({cronExpression: z.string().optional(), enabled: z.boolean().optional(), ignoreMisfires: z.boolean().optional(), description: z.string().optional(), timeZone: z.string().optional(), startAt: z.string().optional(), endAt: z.string().optional(), priority: z.number().int().optional(), nextRun: z.string().optional()}); export const anomalyDetectionConfiguration = z.object({enabled: z.boolean().optional()}); export const profilingConfiguration = z.object({enabled: z.boolean().optional(), type: z.string().optional(), sampleLimitCount: z.number().int().optional(), sampleLimitPercentage: z.number().int().optional()}); export const dqMonitorExportDefinitionResponse = z.object({name: z.string().optional(), type: z.string().optional(), format: z.string().optional(), correlationId: correlationIdResponse.optional(), limit: z.number().int().optional(), targetLocation: z.array(z.string()).optional(), attributeUrns: z.array(catalogAttributeUrn).optional(), enabled: z.boolean().optional()}); export const catalogItemUrn = z.string(); export const foreignKeyPairResponse = z.object({localAttributeUrn: catalogAttributeUrn.optional(), connectedAttributeUrn: catalogAttributeUrn.optional(), correlationId: correlationIdResponse.optional(), localAttributeTransformation: z.string().optional(), connectedAttributeTransformation: z.string().optional(), localAttributeTransformationFriendly: z.string().optional(), connectedAttributeTransformationFriendly: z.string().optional()}); export const joinConfigurationResponse = z.object({correlationId: correlationIdResponse.optional(), connectedCatalogItemUrn: catalogItemUrn.optional(), foreignKeyPairs: z.record(z.string(), foreignKeyPairResponse).optional()}); export const dataSlicePredicateResponse = z.object({attributeUrn: catalogAttributeUrn, operator: z.string(), value: z.string().optional(), listValues: z.array(z.string()).optional(), rangeStart: z.string().optional(), rangeEnd: z.string().optional(), attributeName: z.string().optional()}); export const dataSliceResponse = z.object({label: z.string().optional(), predicates: z.array(dataSlicePredicateResponse)}); export const dqMonitorUrn = z.string(); export const dqMonitorResponse = z.object({draftType: z.string(), name: z.string().optional(), manualRuleInstances: z.record(z.string(), ruleInstanceWithMappingResponse).nullable().optional(), invalidSamplesConfiguration: invalidSamplesConfiguration.nullable().optional(), termRuleInstances: z.record(z.string(), termRuleInstanceResponse).optional(), schedule: scheduleResponse.nullable().optional(), anomalyDetectionConfiguration: anomalyDetectionConfiguration.nullable().optional(), profilingConfiguration: profilingConfiguration.nullable().optional(), exportDefinitions: z.record(z.string(), dqMonitorExportDefinitionResponse).nullable().optional(), overallDqThresholds: z.record(z.string(), dqThresholdResponse).nullable().optional(), joinConfigurations: z.record(z.string(), joinConfigurationResponse).nullable().optional(), dataSlice: dataSliceResponse.nullable().optional(), urn: dqMonitorUrn, catalogItemUrn: catalogItemUrn}); export const getApiDataQualityV1DqMonitorsResponse = z.object({meta: paginationMetadata, data: z.array(dqMonitorResponse)}); 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 DQ monitors * * GET /data-quality/v1/dq-monitors */ export const getApiDataQualityV1DqMonitors = async (args: GetApiDataQualityV1DqMonitorsArgs, options?: GetApiDataQualityV1DqMonitorsOptions) => { const {baseUrl = "https://your-environment.ataccama.one/api", fetch: fetchFn = fetch, JWT} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.catalogItemUrn != null) query.append("catalogItemUrn", String(args.catalogItemUrn)) if (args.after != null) query.append("after", String(args.after)) if (args.size != null) query.append("size", String(args.size)) if (args.sort != null) query.append("sort", String(args.sort)) if (JWT !== undefined) headers.set('authorization', `Bearer ${JWT}`) const url = `${baseUrl.replace(/\/+$/, '')}/data-quality/v1/dq-monitors${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(getApiDataQualityV1DqMonitorsResponse, await res.json()) };