import {z} from 'zod' export type CatalogItemUrn = string; export type RuleUrn = string; export type CorrelationIdRequest = string; export type DqThresholdRequest = {severity?: string | undefined, value?: number | undefined, correlationId?: CorrelationIdRequest | undefined}; export type RuleParameterUrn = string; export type RuleParameterInstanceRequest = {correlationId?: CorrelationIdRequest | undefined, value?: string | undefined, ruleParameterUrn?: RuleParameterUrn | undefined}; export type CatalogAttributeUrn = string; export type RuleAttributeUrn = string; export type RuleMappingRequest = {catalogItemAttributeUrn?: CatalogAttributeUrn | undefined, ruleAttributeUrn?: RuleAttributeUrn | undefined, correlationId?: CorrelationIdRequest | undefined}; export type SubEntityKey = string; export type ConnectedMappingRequest = {connectedCatalogItemAttributeUrn: CatalogAttributeUrn, ruleAttributeUrn: RuleAttributeUrn, joinConfigurationKey: SubEntityKey, correlationId?: CorrelationIdRequest | undefined}; export type RuleInstanceWithMappingRequest = {ruleUrn?: RuleUrn | undefined, ruleInstanceName?: string | undefined, correlationId?: CorrelationIdRequest | undefined, dqThresholds?: {[key: string]: DqThresholdRequest} | undefined, parameterValues?: {[key: string]: RuleParameterInstanceRequest} | undefined, mappings?: {[key: string]: RuleMappingRequest} | undefined, connectedMappings?: {[key: string]: ConnectedMappingRequest} | undefined, enabled?: boolean | undefined}; export type InvalidSamplesConfiguration = {enabled?: boolean | undefined, sampleSize?: number | undefined}; export type ScheduleRequest = {cronExpression?: string | undefined, enabled?: boolean | undefined, ignoreMisfires?: boolean | undefined, description?: string | undefined, timeZone?: string | undefined, startAt?: string | undefined, endAt?: string | undefined, priority?: number | undefined}; export type AnomalyDetectionConfiguration = {enabled?: boolean | undefined}; export type ProfilingConfiguration = {enabled?: boolean | undefined, type?: string | undefined, sampleLimitCount?: number | undefined, sampleLimitPercentage?: number | undefined}; export type DqMonitorExportDefinitionRequest = {name?: string | undefined, type?: string | undefined, format?: string | undefined, correlationId?: CorrelationIdRequest | undefined, limit?: number | undefined, targetLocation?: Array | undefined, attributeUrns?: Array | undefined, enabled?: boolean | undefined}; export type ForeignKeyPairRequest = {localAttributeUrn?: CatalogAttributeUrn | undefined, connectedAttributeUrn?: CatalogAttributeUrn | undefined, correlationId?: CorrelationIdRequest | undefined, localAttributeTransformation?: string | undefined, connectedAttributeTransformation?: string | undefined, localAttributeTransformationFriendly?: string | undefined, connectedAttributeTransformationFriendly?: string | undefined}; export type JoinConfigurationRequest = {correlationId?: CorrelationIdRequest | undefined, connectedCatalogItemUrn?: CatalogItemUrn | undefined, foreignKeyPairs?: {[key: string]: ForeignKeyPairRequest} | undefined}; export type DataSlicePredicateRequest = {attributeUrn: CatalogAttributeUrn, operator: string, value?: string | undefined, listValues?: Array | undefined, rangeStart?: string | undefined, rangeEnd?: string | undefined}; export type DataSliceRequest = {label?: string | undefined, predicates: Array}; export type DqMonitorRequest = {name?: string | undefined, manualRuleInstances?: ({[key: string]: RuleInstanceWithMappingRequest} | null) | undefined, invalidSamplesConfiguration?: (InvalidSamplesConfiguration | null) | undefined, schedule?: (ScheduleRequest | null) | undefined, anomalyDetectionConfiguration?: (AnomalyDetectionConfiguration | null) | undefined, profilingConfiguration?: (ProfilingConfiguration | null) | undefined, exportDefinitions?: ({[key: string]: DqMonitorExportDefinitionRequest} | null) | undefined, overallDqThresholds?: ({[key: string]: DqThresholdRequest} | null) | undefined, joinConfigurations?: ({[key: string]: JoinConfigurationRequest} | null) | undefined, dataSlice?: (DataSliceRequest | null) | undefined}; export type CreateApiDataQualityV1CatalogItemsCatalogItemUrnDqMonitorsArgs = {catalogItemUrn: CatalogItemUrn, body: DqMonitorRequest}; export type CreateApiDataQualityV1CatalogItemsCatalogItemUrnDqMonitorsOptions = {baseUrl?: string | undefined, JWT?: string | undefined, fetch?: typeof fetch | undefined}; 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 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 }; /** * Create DQ monitor * * POST /data-quality/v1/catalog-items/{catalogItemUrn}/dq-monitors */ export const createApiDataQualityV1CatalogItemsCatalogItemUrnDqMonitors = async (args: CreateApiDataQualityV1CatalogItemsCatalogItemUrnDqMonitorsArgs, options?: CreateApiDataQualityV1CatalogItemsCatalogItemUrnDqMonitorsOptions) => { const {baseUrl = "https://your-environment.ataccama.one/api", fetch: fetchFn = fetch, JWT} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (JWT !== undefined) headers.set('authorization', `Bearer ${JWT}`) const url = `${baseUrl.replace(/\/+$/, '')}/data-quality/v1/catalog-items/${encodeURIComponent(String(args.catalogItemUrn))}/dq-monitors${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(dqMonitorResponse, await res.json()) };