import {z} from 'zod' export type GetApiApiV1ChecksArgs = {checkIds?: string | undefined, dataStandardId?: string | undefined, datasetId?: string | undefined, page?: number | undefined, size?: number | undefined}; export type GetApiApiV1ChecksOptions = {baseUrl?: string | undefined, basicAuthApiKey?: {username: string, password: string} | undefined, fetch?: typeof fetch | undefined}; export const agreementSlimDTO = z.object({cloudUrl: z.string().optional(), name: z.string().optional()}); export const mapOfStringToString = z.record(z.string(), z.unknown()); export const datasetSlimDTO = z.object({cloudUrl: z.string().optional(), id: z.string().optional(), name: z.string().optional(), qualifiedName: z.string().optional()}); export const evaluationStatusDTO = z.enum(["pass", "warn", "fail", "notEvaluated", "excluded"]); export const checksContentDTOGroup = z.object({groupType: z.string().optional(), identity: z.string().optional(), name: z.string().optional()}); export const incidentStatusDTO = z.enum(["reported", "investigating", "fixing", "resolved"]); export const incidentSlimDTO = z.object({cloudUrl: z.string(), id: z.string(), name: z.string(), number: z.number().int(), status: incidentStatusDTO}); export const checkResultAnomalyDetectionDetailsDTO = z.object({predictedValue: z.number().optional()}); export const aggregateDiagnosticsV4 = z.object({checkRowsTested: z.number().int().optional(), datasetRowsTested: z.number().int().optional()}); export const aggregateDiffDiagnosticsV4 = z.object({diff: z.number().optional(), diffPercent: z.number().optional(), function: z.string().optional(), sourceCheckRowsTested: z.number().int().optional(), sourceDatasetRowsTested: z.number().int().optional(), sourceValue: z.number().optional(), targetCheckRowsTested: z.number().int().optional(), targetDatasetRowsTested: z.number().int().optional(), targetValue: z.number().optional()}); export const duplicateDiagnosticsV4 = z.object({checkRowsTested: z.number().int().optional(), datasetRowsTested: z.number().int().optional(), failedRowsCount: z.number().int().optional(), failedRowsDataQuery: z.string().optional(), failedRowsKeysQuery: z.string().optional(), failedRowsPercent: z.number().optional(), failedRowsSourceQuery: z.string().optional(), missingCount: z.number().int().optional()}); export const duplicateDiffDiagnosticsV4 = z.object({duplicateCountDiff: z.number().int().optional(), duplicateDiffPercent: z.number().optional(), sourceCheckRowsTested: z.number().int().optional(), sourceDatasetRowsTested: z.number().int().optional(), sourceDuplicateCount: z.number().int().optional(), targetCheckRowsTested: z.number().int().optional(), targetDatasetRowsTested: z.number().int().optional(), targetDuplicateCount: z.number().int().optional()}); export const failedRowsDiagnosticsV4 = z.object({checkRowsTested: z.number().int().optional(), datasetRowsTested: z.number().int().optional(), failedRowsCount: z.number().int().optional(), failedRowsDataQuery: z.string().optional(), failedRowsKeysQuery: z.string().optional(), failedRowsPercent: z.number().optional(), failedRowsSourceQuery: z.string().optional()}); export const freshnessDiagnosticsV4 = z.object({actualTimestamp: z.string().optional(), actualTimestampUtc: z.string().optional(), datasetRowsTested: z.number().int().optional(), expectedTimestamp: z.string().optional(), expectedTimestampUtc: z.string().optional()}); export const freshnessDiffDiagnosticsV4UnitOfTimeDTO = z.enum(["minutes", "hours", "days"]); export const freshnessDiffDiagnosticsV4 = z.object({freshnessDiff: z.number().int().optional(), freshnessDiffUnit: freshnessDiffDiagnosticsV4UnitOfTimeDTO.optional(), sourceCheckRowsTested: z.number().int().optional(), sourceDatasetRowsTested: z.number().int().optional(), sourceMaxTimestamp: z.string().optional(), sourceMaxTimestampUtc: z.string().optional(), targetCheckRowsTested: z.number().int().optional(), targetDatasetRowsTested: z.number().int().optional(), targetMaxTimestamp: z.string().optional(), targetMaxTimestampUtc: z.string().optional()}); export const fuzzyDuplicateDiagnosticsV4 = z.object({candidateRowsScored: z.number().int().optional(), checkRowsTested: z.number().int().optional(), clusterCount: z.number().int().optional(), datasetRowsTested: z.number().int().optional(), failedRowsCount: z.number().int().optional(), failedRowsDataQuery: z.string().optional(), failedRowsKeysQuery: z.string().optional(), failedRowsSourceQuery: z.string().optional(), fuzzyDuplicateCount: z.number().int().optional(), fuzzyDuplicatePercent: z.number().optional(), meanConfidence: z.number().optional()}); export const groupByDiagnosticsV4GroupByOutcomeDTO = z.enum(["pass", "warn", "fail"]); export const groupByDiagnosticsV4Group = z.object({group: z.string().optional(), rowsTested: z.number().optional(), status: groupByDiagnosticsV4GroupByOutcomeDTO.optional(), value: z.number().optional()}); export const groupByDiagnosticsV4 = z.object({diagnosticsCount: z.number().int().optional(), failedRowsDataQuery: z.string().optional(), failedRowsKeysQuery: z.string().optional(), failedRowsSourceQuery: z.string().optional(), groups: z.array(groupByDiagnosticsV4Group).optional()}); export const hierarchyDiagnosticsV4 = z.object({brokenPathCount: z.number().int().optional(), checkRowsTested: z.number().int().optional(), datasetRowsTested: z.number().int().optional(), failedRowsCount: z.number().int().optional(), failedRowsDataQuery: z.string().optional(), failedRowsKeysQuery: z.string().optional(), failedRowsSourceQuery: z.string().optional(), invalidValueCount: z.number().int().optional(), missingValueCount: z.number().int().optional()}); export const invalidDiagnosticsV4 = z.object({checkRowsTested: z.number().int().optional(), datasetRowsTested: z.number().int().optional(), failedRowsCount: z.number().int().optional(), failedRowsDataQuery: z.string().optional(), failedRowsKeysQuery: z.string().optional(), failedRowsPercent: z.number().optional(), failedRowsSourceQuery: z.string().optional(), missingCount: z.number().int().optional()}); export const llmDiagnosticsV4 = z.object({completionTokens: z.number().optional(), failedRowsCount: z.number().int().optional(), failedRowsDataQuery: z.string().optional(), failedRowsKeysQuery: z.string().optional(), failedRowsSourceQuery: z.string().optional(), model: z.string().optional(), promptTokens: z.number().optional(), rowsChecked: z.number().int().optional(), rowsFailed: z.number().int().optional(), rowsFailedPercent: z.number().optional(), tokensSpent: z.number().int().optional()}); export const metricDiagnosticsV4 = z.object({datasetRowsTested: z.number().int().optional()}); export const metricDiffDiagnosticsV4 = z.object({metricDiff: z.number().optional(), metricDiffPercent: z.number().optional(), sourceCheckRowsTested: z.number().int().optional(), sourceDatasetRowsTested: z.number().int().optional(), sourceMetric: z.number().optional(), targetCheckRowsTested: z.number().int().optional(), targetDatasetRowsTested: z.number().int().optional(), targetMetric: z.number().optional()}); export const missingDiagnosticsV4 = z.object({checkRowsTested: z.number().int().optional(), datasetRowsTested: z.number().int().optional(), failedRowsCount: z.number().int().optional(), failedRowsDataQuery: z.string().optional(), failedRowsKeysQuery: z.string().optional(), failedRowsPercent: z.number().optional(), failedRowsSourceQuery: z.string().optional()}); export const referenceDiffDiagnosticsV4 = z.object({diffCount: z.number().int().optional(), diffPercent: z.number().optional(), exclusiveInSource: z.number().int().optional(), exclusiveInTarget: z.number().int().optional(), sourceCheckRowsTested: z.number().int().optional(), sourceDatasetRowsTested: z.number().int().optional(), targetCheckRowsTested: z.number().int().optional(), targetDatasetRowsTested: z.number().int().optional()}); export const rowCountDiagnosticsV4 = z.object({checkRowsTested: z.number().int().optional(), datasetRowsTested: z.number().int().optional()}); export const rowCountDiffDiagnosticsV4 = z.object({rowCountDiff: z.number().int().optional(), rowCountDiffPercent: z.number().optional(), sourceCheckRowsTested: z.number().int().optional(), sourceDatasetRowsTested: z.number().int().optional(), targetCheckRowsTested: z.number().int().optional(), targetDatasetRowsTested: z.number().int().optional()}); export const rowsDiffDiagnosticsV4 = z.object({changed: z.number().int().optional(), diffCount: z.number().int().optional(), diffPercent: z.number().optional(), exclusiveInSource: z.number().int().optional(), exclusiveInTarget: z.number().int().optional(), sourceCheckRowsTested: z.number().int().optional(), sourceDatasetRowsTested: z.number().int().optional(), targetCheckRowsTested: z.number().int().optional(), targetDatasetRowsTested: z.number().int().optional()}); export const schemaDiagnosticsV4Column = z.object({name: z.string().optional(), type: z.string().optional()}); export const schemaDiagnosticsV4 = z.object({actual: z.array(schemaDiagnosticsV4Column).optional(), expected: z.array(schemaDiagnosticsV4Column).optional()}); export const checkResultDiagnosticsV4 = z.object({aggregate: aggregateDiagnosticsV4.optional(), aggregate_diff: aggregateDiffDiagnosticsV4.optional(), duplicate: duplicateDiagnosticsV4.optional(), duplicate_diff: duplicateDiffDiagnosticsV4.optional(), failed_rows: failedRowsDiagnosticsV4.optional(), freshness: freshnessDiagnosticsV4.optional(), freshness_diff: freshnessDiffDiagnosticsV4.optional(), fuzzy_duplicate: fuzzyDuplicateDiagnosticsV4.optional(), group_by: groupByDiagnosticsV4.optional(), hierarchy: hierarchyDiagnosticsV4.optional(), invalid: invalidDiagnosticsV4.optional(), llm: llmDiagnosticsV4.optional(), metric: metricDiagnosticsV4.optional(), metric_diff: metricDiffDiagnosticsV4.optional(), missing: missingDiagnosticsV4.optional(), reference_diff: referenceDiffDiagnosticsV4.optional(), row_count: rowCountDiagnosticsV4.optional(), row_count_diff: rowCountDiffDiagnosticsV4.optional(), rows_diff: rowsDiffDiagnosticsV4.optional(), schema: schemaDiagnosticsV4.optional()}); export const measureDTO = z.literal("time"); export const checkResultValueSeriesDTOValueSeriesValue = z.object({label: z.string().optional(), level: evaluationStatusDTO.optional(), value: z.number().optional()}); export const checkResultValueSeriesDTO = z.object({values: z.array(checkResultValueSeriesDTOValueSeriesValue).optional()}); export const checkResultValueDTO = z.object({anomalyDetectionDetails: checkResultAnomalyDetectionDetailsDTO.optional(), dataTimestamp: z.string().optional(), diagnostics: checkResultDiagnosticsV4.optional(), id: z.string(), measure: measureDTO.optional(), value: z.number().optional(), valueLabel: z.string().optional(), valueSeries: checkResultValueSeriesDTO.optional()}); export const ownerDTO = z.object({email: z.string().optional(), firstName: z.string().optional(), fullName: z.string().optional(), lastName: z.string().optional()}); export const checksContentDTO = z.object({agreements: z.array(agreementSlimDTO).optional(), attributes: mapOfStringToString.optional(), checkType: z.string().optional(), cloudUrl: z.string().optional(), column: z.string().optional(), createdAt: z.string(), datasets: z.array(datasetSlimDTO), definition: z.string().optional(), description: z.string().optional(), evaluationStatus: evaluationStatusDTO, group: checksContentDTOGroup.optional(), id: z.string(), incidents: z.array(incidentSlimDTO), lastCheckResultValue: checkResultValueDTO.optional(), lastCheckRunTime: z.string().optional(), lastUpdated: z.string().optional(), metricType: z.string().optional(), name: z.string(), owner: ownerDTO.optional()}); export const publicApiChecksResponse = z.object({content: z.array(checksContentDTO), first: z.boolean(), last: z.boolean(), number: z.number().int(), size: z.number().int(), totalElements: z.number().int(), totalPages: z.number().int()}); 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 }; /** * Check information * * GET /api/v1/checks * * Also accepts auth: cookieToken */ export const getApiApiV1Checks = async (args: GetApiApiV1ChecksArgs, options?: GetApiApiV1ChecksOptions) => { const {baseUrl = "https://cloud.soda.io", fetch: fetchFn = fetch, basicAuthApiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.checkIds != null) query.append("checkIds", String(args.checkIds)) if (args.dataStandardId != null) query.append("dataStandardId", String(args.dataStandardId)) if (args.datasetId != null) query.append("datasetId", String(args.datasetId)) if (args.page != null) query.append("page", String(args.page)) if (args.size != null) query.append("size", String(args.size)) if (basicAuthApiKey !== undefined) headers.set('authorization', `Basic ${btoa(`${basicAuthApiKey.username}:${basicAuthApiKey.password}`)}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/checks${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(publicApiChecksResponse, await res.json()) };