@owox/backend 0.35.0 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/common/exceptions/concurrency-limit-exceeded.exception.d.ts +1 -1
- package/dist/src/common/exceptions/concurrency-limit-exceeded.exception.js +2 -2
- package/dist/src/common/markdown/markdown-parser.service.d.ts +2 -0
- package/dist/src/common/markdown/markdown-parser.service.js +15 -8
- package/dist/src/common/validators/max-byte-length.validator.d.ts +2 -0
- package/dist/src/common/validators/max-byte-length.validator.js +29 -0
- package/dist/src/config/env-validation.config.d.ts +12 -0
- package/dist/src/config/env-validation.config.js +7 -0
- package/dist/src/data-marts/ai-insights/agent/types.d.ts +6 -6
- package/dist/src/data-marts/calculated-fields/calculated-field-validator.service.js +22 -30
- package/dist/src/data-marts/calculated-fields/calculated-field.utils.d.ts +1 -0
- package/dist/src/data-marts/calculated-fields/calculated-field.utils.js +21 -0
- package/dist/src/data-marts/calculated-fields/formula-analyzer.d.ts +1 -0
- package/dist/src/data-marts/calculated-fields/formula-analyzer.js +2 -0
- package/dist/src/data-marts/calculated-fields/formula-violations.d.ts +7 -0
- package/dist/src/data-marts/calculated-fields/formula-violations.js +82 -1
- package/dist/src/data-marts/calculated-fields/join-grain.d.ts +32 -0
- package/dist/src/data-marts/calculated-fields/join-grain.js +107 -0
- package/dist/src/data-marts/calculated-fields/set-quantifier.d.ts +8 -0
- package/dist/src/data-marts/calculated-fields/set-quantifier.js +12 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/connector-message.schema.d.ts +66 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/connector-message.schema.js +13 -1
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-credentials-update.schema.d.ts +3 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-credentials-update.schema.js +1 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-error.schema.d.ts +3 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-error.schema.js +1 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-log.schema.d.ts +12 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-log.schema.js +4 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-requested-date.schema.d.ts +3 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-requested-date.schema.js +1 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-state-update.schema.d.ts +16 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-state-update.schema.js +16 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-status.schema.d.ts +3 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-status.schema.js +1 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-warning.schema.d.ts +3 -0
- package/dist/src/data-marts/connector-types/connector-message/schemas/types/message-warning.schema.js +1 -0
- package/dist/src/data-marts/connector-types/connector-message/services/connector-event.translator.d.ts +10 -0
- package/dist/src/data-marts/connector-types/connector-message/services/connector-event.translator.js +138 -0
- package/dist/src/data-marts/connector-types/connector-message/services/connector-message-parser.service.d.ts +1 -3
- package/dist/src/data-marts/connector-types/connector-message/services/connector-message-parser.service.js +30 -34
- package/dist/src/data-marts/connector-types/connector-message/services/connector-output-capture.service.js +10 -12
- package/dist/src/data-marts/connector-types/connector-message/services/connector-state.service.js +3 -1
- package/dist/src/data-marts/connector-types/enums/connector-message-type-enum.d.ts +1 -0
- package/dist/src/data-marts/connector-types/enums/connector-message-type-enum.js +1 -0
- package/dist/src/data-marts/controllers/connector-definition.controller.d.ts +30 -0
- package/dist/src/data-marts/controllers/connector-definition.controller.js +252 -0
- package/dist/src/data-marts/controllers/data-mart-preview.controller.d.ts +10 -0
- package/dist/src/data-marts/controllers/data-mart-preview.controller.js +58 -0
- package/dist/src/data-marts/controllers/data-mart.controller.d.ts +5 -1
- package/dist/src/data-marts/controllers/data-mart.controller.js +25 -4
- package/dist/src/data-marts/controllers/insight-template.controller.js +4 -4
- package/dist/src/data-marts/controllers/insight.controller.js +5 -5
- package/dist/src/data-marts/controllers/project-data-mart-runs.controller.js +1 -1
- package/dist/src/data-marts/controllers/spec/connector-definition.api.d.ts +12 -0
- package/dist/src/data-marts/controllers/spec/connector-definition.api.js +179 -0
- package/dist/src/data-marts/controllers/spec/data-mart.api.d.ts +1 -0
- package/dist/src/data-marts/controllers/spec/data-mart.api.js +5 -0
- package/dist/src/data-marts/controllers/spec/report-openapi.d.ts +18 -0
- package/dist/src/data-marts/controllers/spec/report-openapi.js +3 -0
- package/dist/src/data-marts/data-marts.module.js +20 -2
- package/dist/src/data-marts/data-storage-types/blending/metric-sleeve.planner.js +3 -12
- package/dist/src/data-marts/data-storage-types/data-mart-schema.utils.d.ts +1 -0
- package/dist/src/data-marts/data-storage-types/data-mart-schema.utils.js +16 -0
- package/dist/src/data-marts/dto/domain/blendable-schema.dto.d.ts +10 -0
- package/dist/src/data-marts/dto/domain/blendable-schema.dto.js +71 -1
- package/dist/src/data-marts/dto/domain/create-data-mart.command.d.ts +3 -1
- package/dist/src/data-marts/dto/domain/create-data-mart.command.js +3 -1
- package/dist/src/data-marts/dto/domain/create-report.command.d.ts +3 -1
- package/dist/src/data-marts/dto/domain/create-report.command.js +3 -1
- package/dist/src/data-marts/dto/domain/data-mart-list-item.dto.d.ts +3 -1
- package/dist/src/data-marts/dto/domain/data-mart-list-item.dto.js +3 -1
- package/dist/src/data-marts/dto/domain/data-mart.dto.d.ts +4 -1
- package/dist/src/data-marts/dto/domain/data-mart.dto.js +5 -1
- package/dist/src/data-marts/dto/domain/model-canvas.dto.d.ts +4 -0
- package/dist/src/data-marts/dto/domain/report-like-read-plan.d.ts +2 -0
- package/dist/src/data-marts/dto/domain/report.dto.d.ts +3 -1
- package/dist/src/data-marts/dto/domain/report.dto.js +3 -1
- package/dist/src/data-marts/dto/domain/update-data-mart-icon.command.d.ts +9 -0
- package/dist/src/data-marts/dto/domain/update-data-mart-icon.command.js +19 -0
- package/dist/src/data-marts/dto/domain/update-report.command.d.ts +3 -1
- package/dist/src/data-marts/dto/domain/update-report.command.js +3 -1
- package/dist/src/data-marts/dto/presentation/create-data-mart-request-api.dto.d.ts +2 -0
- package/dist/src/data-marts/dto/presentation/create-data-mart-request-api.dto.js +13 -0
- package/dist/src/data-marts/dto/presentation/create-report-request-api.dto.d.ts +2 -0
- package/dist/src/data-marts/dto/presentation/create-report-request-api.dto.js +10 -0
- package/dist/src/data-marts/dto/presentation/custom-connector-response.dto.d.ts +46 -0
- package/dist/src/data-marts/dto/presentation/custom-connector-response.dto.js +216 -0
- package/dist/src/data-marts/dto/presentation/custom-connector.dto.d.ts +27 -0
- package/dist/src/data-marts/dto/presentation/custom-connector.dto.js +159 -0
- package/dist/src/data-marts/dto/presentation/data-mart-list-item-response-api.dto.d.ts +2 -0
- package/dist/src/data-marts/dto/presentation/data-mart-list-item-response-api.dto.js +10 -0
- package/dist/src/data-marts/dto/presentation/data-mart-response-api.dto.d.ts +2 -0
- package/dist/src/data-marts/dto/presentation/data-mart-response-api.dto.js +10 -0
- package/dist/src/data-marts/dto/presentation/model-canvas-response-api.dto.d.ts +4 -0
- package/dist/src/data-marts/dto/presentation/model-canvas-response-api.dto.js +20 -0
- package/dist/src/data-marts/dto/presentation/preview-data-mart-request-api.dto.d.ts +7 -0
- package/dist/src/data-marts/dto/presentation/preview-data-mart-request-api.dto.js +56 -0
- package/dist/src/data-marts/dto/presentation/preview-data-mart-response-api.dto.d.ts +12 -0
- package/dist/src/data-marts/dto/presentation/preview-data-mart-response-api.dto.js +64 -0
- package/dist/src/data-marts/dto/presentation/report-response-api.dto.d.ts +2 -0
- package/dist/src/data-marts/dto/presentation/report-response-api.dto.js +6 -0
- package/dist/src/data-marts/dto/presentation/run-data-mart-request-api.dto.js +67 -0
- package/dist/src/data-marts/dto/presentation/update-data-mart-description-api.dto.js +3 -0
- package/dist/src/data-marts/dto/presentation/update-data-mart-icon-api.dto.d.ts +4 -0
- package/dist/src/data-marts/dto/presentation/update-data-mart-icon-api.dto.js +30 -0
- package/dist/src/data-marts/dto/presentation/update-report-request-api.dto.d.ts +2 -0
- package/dist/src/data-marts/dto/presentation/update-report-request-api.dto.js +10 -0
- package/dist/src/data-marts/dto/schemas/auto-aggregation-opt-out.schema.d.ts +15 -0
- package/dist/src/data-marts/dto/schemas/auto-aggregation-opt-out.schema.js +29 -0
- package/dist/src/data-marts/dto/schemas/data-mart-run/data-mart-run.schema.d.ts +9 -0
- package/dist/src/data-marts/dto/schemas/data-mart-table-definitions/connector-definition.schema.d.ts +15 -0
- package/dist/src/data-marts/dto/schemas/data-mart-table-definitions/connector-definition.schema.js +1 -0
- package/dist/src/data-marts/dto/schemas/data-mart-table-definitions/data-mart-definition.schema.d.ts +7 -0
- package/dist/src/data-marts/dto/schemas/data-quality/data-quality-run.schema.d.ts +20 -0
- package/dist/src/data-marts/entities/connector-definition-version.entity.d.ts +16 -0
- package/dist/src/data-marts/entities/connector-definition-version.entity.js +78 -0
- package/dist/src/data-marts/entities/connector-definition.entity.d.ts +14 -0
- package/dist/src/data-marts/entities/connector-definition.entity.js +82 -0
- package/dist/src/data-marts/entities/data-mart.entity.d.ts +2 -0
- package/dist/src/data-marts/entities/data-mart.entity.js +5 -0
- package/dist/src/data-marts/entities/report.entity.d.ts +2 -0
- package/dist/src/data-marts/entities/report.entity.js +11 -0
- package/dist/src/data-marts/enums/data-mart-icon.enum.d.ts +75 -0
- package/dist/src/data-marts/enums/data-mart-icon.enum.js +80 -0
- package/dist/src/data-marts/errors/connector-credential-boundary.error.d.ts +3 -0
- package/dist/src/data-marts/errors/connector-credential-boundary.error.js +14 -0
- package/dist/src/data-marts/facades/mcp-data-marts.facade.d.ts +2 -0
- package/dist/src/data-marts/facades/mcp-data-marts.facade.impl.d.ts +7 -1
- package/dist/src/data-marts/facades/mcp-data-marts.facade.impl.js +70 -5
- package/dist/src/data-marts/mappers/connector-definition.mapper.d.ts +14 -0
- package/dist/src/data-marts/mappers/connector-definition.mapper.js +57 -0
- package/dist/src/data-marts/mappers/data-mart.mapper.d.ts +9 -6
- package/dist/src/data-marts/mappers/data-mart.mapper.js +44 -19
- package/dist/src/data-marts/mappers/insight-template.mapper.d.ts +1 -1
- package/dist/src/data-marts/mappers/insight-template.mapper.js +2 -2
- package/dist/src/data-marts/mappers/insight.mapper.d.ts +1 -1
- package/dist/src/data-marts/mappers/insight.mapper.js +2 -2
- package/dist/src/data-marts/mappers/model-canvas.mapper.d.ts +10 -2
- package/dist/src/data-marts/mappers/model-canvas.mapper.js +9 -3
- package/dist/src/data-marts/mappers/report.mapper.js +4 -3
- package/dist/src/data-marts/services/auto-collapse.resolver.d.ts +1 -1
- package/dist/src/data-marts/services/auto-collapse.resolver.js +4 -0
- package/dist/src/data-marts/services/blendable-schema.service.d.ts +2 -0
- package/dist/src/data-marts/services/blendable-schema.service.js +59 -0
- package/dist/src/data-marts/services/connector/connector-credential-injector.service.d.ts +1 -1
- package/dist/src/data-marts/services/connector/connector-credential-injector.service.js +15 -1
- package/dist/src/data-marts/services/connector/connector-definition.service.d.ts +59 -0
- package/dist/src/data-marts/services/connector/connector-definition.service.js +491 -0
- package/dist/src/data-marts/services/connector/connector-executor.service.d.ts +9 -1
- package/dist/src/data-marts/services/connector/connector-executor.service.js +173 -63
- package/dist/src/data-marts/services/connector/connector-fields-preview.service.js +1 -1
- package/dist/src/data-marts/services/connector/connector-message.utils.js +2 -2
- package/dist/src/data-marts/services/connector/connector-preview-credentials.service.js +1 -1
- package/dist/src/data-marts/services/connector/connector-preview-support.d.ts +1 -1
- package/dist/src/data-marts/services/connector/connector-preview-support.js +14 -21
- package/dist/src/data-marts/services/connector/connector-process-spawner.service.d.ts +11 -2
- package/dist/src/data-marts/services/connector/connector-process-spawner.service.js +88 -60
- package/dist/src/data-marts/services/connector/connector-secret.service.d.ts +6 -3
- package/dist/src/data-marts/services/connector/connector-secret.service.js +77 -12
- package/dist/src/data-marts/services/connector/connector-source-config.service.js +1 -1
- package/dist/src/data-marts/services/connector/connector-source-credentials.service.d.ts +6 -2
- package/dist/src/data-marts/services/connector/connector-source-credentials.service.js +18 -16
- package/dist/src/data-marts/services/connector/connector-specification.mapper.d.ts +47 -0
- package/dist/src/data-marts/services/connector/connector-specification.mapper.js +46 -0
- package/dist/src/data-marts/services/connector/connector-test.service.d.ts +43 -0
- package/dist/src/data-marts/services/connector/connector-test.service.js +343 -0
- package/dist/src/data-marts/services/connector/connector.service.d.ts +8 -2
- package/dist/src/data-marts/services/connector/connector.service.js +65 -54
- package/dist/src/data-marts/services/connector/declarative-manifest-schemas.d.ts +4 -0
- package/dist/src/data-marts/services/connector/declarative-manifest-schemas.js +48 -0
- package/dist/src/data-marts/services/connector/run-log-flusher.d.ts +21 -0
- package/dist/src/data-marts/services/connector/run-log-flusher.js +67 -0
- package/dist/src/data-marts/services/data-mart.service.js +2 -0
- package/dist/src/data-marts/services/report-sql-composer.service.js +15 -1
- package/dist/src/data-marts/services/report.service.d.ts +1 -0
- package/dist/src/data-marts/services/report.service.js +13 -0
- package/dist/src/data-marts/services/scheduled-trigger.service.d.ts +1 -0
- package/dist/src/data-marts/services/scheduled-trigger.service.js +13 -0
- package/dist/src/data-marts/use-cases/create-data-mart.service.js +1 -0
- package/dist/src/data-marts/use-cases/create-report.service.js +2 -0
- package/dist/src/data-marts/use-cases/get-model-canvas-data-marts.service.d.ts +5 -1
- package/dist/src/data-marts/use-cases/get-model-canvas-data-marts.service.js +16 -3
- package/dist/src/data-marts/use-cases/list-project-scheduled-triggers.service.js +1 -1
- package/dist/src/data-marts/use-cases/preview-data-mart.service.d.ts +59 -0
- package/dist/src/data-marts/use-cases/preview-data-mart.service.js +293 -0
- package/dist/src/data-marts/use-cases/stream-http-data.service.js +1 -0
- package/dist/src/data-marts/use-cases/update-data-mart-definition.service.d.ts +1 -1
- package/dist/src/data-marts/use-cases/update-data-mart-definition.service.js +8 -6
- package/dist/src/data-marts/use-cases/update-data-mart-icon.service.d.ts +12 -0
- package/dist/src/data-marts/use-cases/update-data-mart-icon.service.js +46 -0
- package/dist/src/data-marts/use-cases/update-data-mart-schema.service.js +14 -1
- package/dist/src/data-marts/use-cases/update-report.service.js +9 -1
- package/dist/src/ee/ee.module.js +5 -8
- package/dist/src/ee/mcp/auth/mcp-auth-context.d.ts +0 -4
- package/dist/src/ee/mcp/auth/mcp-auth.middleware.d.ts +26 -0
- package/dist/src/ee/mcp/auth/mcp-auth.middleware.js +184 -0
- package/dist/src/ee/mcp/http-headers.util.d.ts +2 -0
- package/dist/src/ee/mcp/http-headers.util.js +8 -0
- package/dist/src/ee/mcp/observability/mcp-bus-wiring.js +4 -4
- package/dist/src/ee/mcp/observability/mcp-call-instrumentation.d.ts +2 -4
- package/dist/src/ee/mcp/observability/mcp-call-instrumentation.js +6 -6
- package/dist/src/ee/mcp/sdk/mcp-sdk-server.factory.d.ts +1 -1
- package/dist/src/ee/mcp/sdk/mcp-sdk-server.factory.js +5 -5
- package/dist/src/ee/mcp/tools/add-destination.tool.d.ts +20 -14
- package/dist/src/ee/mcp/tools/add-destination.tool.js +10 -10
- package/dist/src/ee/mcp/tools/add-report.tool.d.ts +88 -228
- package/dist/src/ee/mcp/tools/add-report.tool.js +28 -28
- package/dist/src/ee/mcp/tools/create-report-run-schedule.tool.d.ts +2 -12
- package/dist/src/ee/mcp/tools/create-report-run-schedule.tool.js +13 -13
- package/dist/src/ee/mcp/tools/data-mart-catalog.tool.d.ts +15 -81
- package/dist/src/ee/mcp/tools/data-mart-catalog.tool.js +11 -11
- package/dist/src/ee/mcp/tools/data-mart-details.tool.d.ts +19 -111
- package/dist/src/ee/mcp/tools/data-mart-details.tool.js +64 -48
- package/dist/src/ee/mcp/tools/delete-report-run-schedule.tool.d.ts +2 -6
- package/dist/src/ee/mcp/tools/delete-report-run-schedule.tool.js +7 -7
- package/dist/src/ee/mcp/tools/delete-report.tool.d.ts +2 -6
- package/dist/src/ee/mcp/tools/delete-report.tool.js +4 -4
- package/dist/src/ee/mcp/tools/get-data-mart-reports.tool.d.ts +30 -195
- package/dist/src/ee/mcp/tools/get-data-mart-reports.tool.js +22 -22
- package/dist/src/ee/mcp/tools/get-report-output-schema.tool.d.ts +3 -21
- package/dist/src/ee/mcp/tools/get-report-output-schema.tool.js +10 -10
- package/dist/src/ee/mcp/tools/get-report-run-status.tool.d.ts +15 -11
- package/dist/src/ee/mcp/tools/get-report-run-status.tool.js +14 -14
- package/dist/src/ee/mcp/tools/list-destinations.tool.d.ts +12 -20
- package/dist/src/ee/mcp/tools/list-destinations.tool.js +10 -10
- package/dist/src/ee/mcp/tools/list-report-run-schedules.tool.d.ts +5 -61
- package/dist/src/ee/mcp/tools/list-report-run-schedules.tool.js +14 -14
- package/dist/src/ee/mcp/tools/mcp-getting-started.util.d.ts +4 -52
- package/dist/src/ee/mcp/tools/mcp-getting-started.util.js +13 -13
- package/dist/src/ee/mcp/tools/mcp-tool.definition.d.ts +2 -2
- package/dist/src/ee/mcp/tools/project-context.tool.d.ts +3 -17
- package/dist/src/ee/mcp/tools/project-context.tool.js +10 -10
- package/dist/src/ee/mcp/tools/query-data-mart.input.d.ts +111 -152
- package/dist/src/ee/mcp/tools/query-data-mart.input.js +39 -39
- package/dist/src/ee/mcp/tools/query-data-mart.tool.d.ts +60 -130
- package/dist/src/ee/mcp/tools/query-data-mart.tool.js +35 -35
- package/dist/src/ee/mcp/tools/report-output-controls-output.d.ts +17 -60
- package/dist/src/ee/mcp/tools/report-output-controls-output.js +20 -20
- package/dist/src/ee/mcp/tools/report-run-outcome.d.ts +6 -42
- package/dist/src/ee/mcp/tools/report-run-outcome.js +20 -20
- package/dist/src/ee/mcp/tools/run-report.tool.d.ts +2 -6
- package/dist/src/ee/mcp/tools/run-report.tool.js +5 -5
- package/dist/src/ee/mcp/tools/search-data-marts.tool.d.ts +7 -79
- package/dist/src/ee/mcp/tools/search-data-marts.tool.js +11 -11
- package/dist/src/ee/mcp/tools/search-reports.tool.d.ts +15 -61
- package/dist/src/ee/mcp/tools/search-reports.tool.js +15 -15
- package/dist/src/ee/mcp/tools/summarize-data-catalog.tool.d.ts +7 -79
- package/dist/src/ee/mcp/tools/summarize-data-catalog.tool.js +15 -15
- package/dist/src/ee/mcp/tools/update-report-run-schedule.tool.d.ts +2 -12
- package/dist/src/ee/mcp/tools/update-report-run-schedule.tool.js +13 -13
- package/dist/src/ee/mcp/tools/update-report.tool.d.ts +105 -414
- package/dist/src/ee/mcp/tools/update-report.tool.js +20 -20
- package/dist/src/ee/mcp/transport/mcp-http-entry.service.d.ts +30 -0
- package/dist/src/ee/mcp/transport/mcp-http-entry.service.js +193 -0
- package/dist/src/idp/guards/idp.guard.js +2 -8
- package/dist/src/idp/oauth/controllers/oauth-authorization.controller.d.ts +4 -0
- package/dist/src/idp/oauth/controllers/oauth-authorization.controller.js +77 -1
- package/dist/src/idp/oauth/controllers/oauth-metadata.controller.d.ts +2 -1
- package/dist/src/idp/oauth/controllers/oauth-metadata.controller.js +5 -8
- package/dist/src/idp/oauth/controllers/oauth-token.controller.js +14 -1
- package/dist/src/idp/oauth/oauth-request.validator.d.ts +8 -0
- package/dist/src/idp/oauth/oauth-request.validator.js +27 -0
- package/dist/src/idp/utils/is-authentication-error.d.ts +1 -0
- package/dist/src/idp/utils/is-authentication-error.js +9 -0
- package/dist/src/idp/utils/role-hierarchy.d.ts +3 -0
- package/dist/src/idp/utils/role-hierarchy.js +14 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +3 -1
- package/dist/src/migrations/1788048000000-create-connector-definition-tables.d.ts +6 -0
- package/dist/src/migrations/1788048000000-create-connector-definition-tables.js +116 -0
- package/dist/src/migrations/1790156789783-add-auto-aggregation-opt-out-to-report.d.ts +8 -0
- package/dist/src/migrations/1790156789783-add-auto-aggregation-opt-out-to-report.js +30 -0
- package/dist/src/migrations/1790247861000-add-icon-to-data-mart.d.ts +8 -0
- package/dist/src/migrations/1790247861000-add-icon-to-data-mart.js +31 -0
- package/package.json +10 -6
- package/dist/src/ee/mcp/auth/mcp-auth.exception-filter.d.ts +0 -14
- package/dist/src/ee/mcp/auth/mcp-auth.exception-filter.js +0 -84
- package/dist/src/ee/mcp/auth/mcp-auth.guard.d.ts +0 -14
- package/dist/src/ee/mcp/auth/mcp-auth.guard.js +0 -99
- package/dist/src/ee/mcp/controllers/mcp-transport.controller.d.ts +0 -17
- package/dist/src/ee/mcp/controllers/mcp-transport.controller.js +0 -134
- package/dist/src/ee/mcp/sdk/mcp-streamable-http-transport.handler.d.ts +0 -16
- package/dist/src/ee/mcp/sdk/mcp-streamable-http-transport.handler.js +0 -133
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RunLogFlusher = void 0;
|
|
4
|
+
exports.createRunLogSnapshotReader = createRunLogSnapshotReader;
|
|
5
|
+
function createRunLogSnapshotReader(logs, errors) {
|
|
6
|
+
const serializedLogs = [];
|
|
7
|
+
const serializedErrors = [];
|
|
8
|
+
const extend = (cache, buffer) => {
|
|
9
|
+
for (let i = cache.length; i < buffer.length; i++) {
|
|
10
|
+
cache.push(JSON.stringify(buffer[i]));
|
|
11
|
+
}
|
|
12
|
+
return cache.slice();
|
|
13
|
+
};
|
|
14
|
+
return () => ({
|
|
15
|
+
logs: extend(serializedLogs, logs),
|
|
16
|
+
errors: extend(serializedErrors, errors),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
class RunLogFlusher {
|
|
20
|
+
intervalMs;
|
|
21
|
+
getSnapshot;
|
|
22
|
+
write;
|
|
23
|
+
onError;
|
|
24
|
+
timer = null;
|
|
25
|
+
lastCount = -1;
|
|
26
|
+
inFlight = Promise.resolve();
|
|
27
|
+
persisted = null;
|
|
28
|
+
constructor(intervalMs, getSnapshot, write, onError) {
|
|
29
|
+
this.intervalMs = intervalMs;
|
|
30
|
+
this.getSnapshot = getSnapshot;
|
|
31
|
+
this.write = write;
|
|
32
|
+
this.onError = onError;
|
|
33
|
+
}
|
|
34
|
+
start() {
|
|
35
|
+
if (this.intervalMs <= 0 || this.timer !== null)
|
|
36
|
+
return;
|
|
37
|
+
this.timer = setInterval(() => {
|
|
38
|
+
this.inFlight = this.inFlight.then(() => this.flushIfDirty());
|
|
39
|
+
}, this.intervalMs);
|
|
40
|
+
}
|
|
41
|
+
async flushIfDirty() {
|
|
42
|
+
const snapshot = this.getSnapshot();
|
|
43
|
+
const count = snapshot.logs.length + snapshot.errors.length;
|
|
44
|
+
if (count === 0 || count === this.lastCount)
|
|
45
|
+
return;
|
|
46
|
+
try {
|
|
47
|
+
await this.write(snapshot);
|
|
48
|
+
this.lastCount = count;
|
|
49
|
+
this.persisted = snapshot;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
this.onError?.(error);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
persistedSnapshot() {
|
|
56
|
+
return this.persisted;
|
|
57
|
+
}
|
|
58
|
+
async stop() {
|
|
59
|
+
if (this.timer !== null) {
|
|
60
|
+
clearInterval(this.timer);
|
|
61
|
+
this.timer = null;
|
|
62
|
+
}
|
|
63
|
+
await this.inFlight;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.RunLogFlusher = RunLogFlusher;
|
|
67
|
+
//# sourceMappingURL=run-log-flusher.js.map
|
|
@@ -88,6 +88,7 @@ let DataMartService = DataMartService_1 = class DataMartService {
|
|
|
88
88
|
'dm.title',
|
|
89
89
|
'dm.status',
|
|
90
90
|
'dm.description',
|
|
91
|
+
'dm.icon',
|
|
91
92
|
'dm.definitionType',
|
|
92
93
|
'dm.createdById',
|
|
93
94
|
'dm.createdAt',
|
|
@@ -183,6 +184,7 @@ let DataMartService = DataMartService_1 = class DataMartService {
|
|
|
183
184
|
'dm.title',
|
|
184
185
|
'dm.status',
|
|
185
186
|
'dm.description',
|
|
187
|
+
'dm.icon',
|
|
186
188
|
'dm.schema',
|
|
187
189
|
'dm.dataLastUpdated',
|
|
188
190
|
])
|
|
@@ -36,6 +36,20 @@ const field_aggregation_governance_1 = require("../dto/schemas/field-aggregation
|
|
|
36
36
|
const aggregation_labels_1 = require("../dto/schemas/aggregation-labels");
|
|
37
37
|
const field_type_category_1 = require("../dto/schemas/field-type-category");
|
|
38
38
|
const report_data_header_dto_1 = require("../dto/domain/report-data-header.dto");
|
|
39
|
+
function withMetricsShownForDryRun(dataMart, metricNames) {
|
|
40
|
+
const fields = dataMart.schema?.fields ?? [];
|
|
41
|
+
const isHiddenMetric = (field) => field.isHiddenForReporting === true &&
|
|
42
|
+
(0, calculated_field_utils_1.isCalculatedField)(field) &&
|
|
43
|
+
metricNames.includes(field.name);
|
|
44
|
+
if (!fields.some(isHiddenMetric))
|
|
45
|
+
return dataMart;
|
|
46
|
+
return Object.assign(Object.create(Object.getPrototypeOf(dataMart)), dataMart, {
|
|
47
|
+
schema: {
|
|
48
|
+
...dataMart.schema,
|
|
49
|
+
fields: fields.map(field => isHiddenMetric(field) ? { ...field, isHiddenForReporting: false } : field),
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
}
|
|
39
53
|
let ReportSqlComposerService = class ReportSqlComposerService {
|
|
40
54
|
blendedReportDataService;
|
|
41
55
|
queryBuilderFacade;
|
|
@@ -348,7 +362,7 @@ let ReportSqlComposerService = class ReportSqlComposerService {
|
|
|
348
362
|
}
|
|
349
363
|
async composeMetricsOnly(dataMart, metricNames, accessor, precomputedBlendableSchema, tableReferences) {
|
|
350
364
|
const plan = {
|
|
351
|
-
dataMart,
|
|
365
|
+
dataMart: withMetricsShownForDryRun(dataMart, metricNames),
|
|
352
366
|
columnConfig: metricNames,
|
|
353
367
|
};
|
|
354
368
|
const joinedMetrics = (0, calculated_field_utils_1.calculatedFieldsOf)(dataMart.schema?.fields ?? []).filter(f => metricNames.includes(f.name) && (0, formula_live_reference_1.hasLiveJoinedReference)(f.calculated.formula));
|
|
@@ -28,5 +28,6 @@ export declare class ReportService {
|
|
|
28
28
|
updateReportWithVersionControl(report: Report): Promise<void>;
|
|
29
29
|
deleteReport(report: Report): Promise<void>;
|
|
30
30
|
countByDataMartIdAndProjectId(dataMartId: string, projectId: string): Promise<number>;
|
|
31
|
+
countByDataMartIds(dataMartIds: string[]): Promise<Map<string, number>>;
|
|
31
32
|
deleteAllByDataMartIdAndProjectId(dataMartId: string, projectId: string): Promise<void>;
|
|
32
33
|
}
|
|
@@ -198,6 +198,19 @@ let ReportService = class ReportService {
|
|
|
198
198
|
},
|
|
199
199
|
});
|
|
200
200
|
}
|
|
201
|
+
async countByDataMartIds(dataMartIds) {
|
|
202
|
+
if (dataMartIds.length === 0)
|
|
203
|
+
return new Map();
|
|
204
|
+
const rows = await this.repository
|
|
205
|
+
.createQueryBuilder('r')
|
|
206
|
+
.leftJoin('r.dataMart', 'dm')
|
|
207
|
+
.where('dm.id IN (:...ids)', { ids: dataMartIds })
|
|
208
|
+
.select('dm.id', 'dataMartId')
|
|
209
|
+
.addSelect('COUNT(*)', 'count')
|
|
210
|
+
.groupBy('dm.id')
|
|
211
|
+
.getRawMany();
|
|
212
|
+
return new Map(rows.map(row => [row.dataMartId, Number(row.count)]));
|
|
213
|
+
}
|
|
201
214
|
async deleteAllByDataMartIdAndProjectId(dataMartId, projectId) {
|
|
202
215
|
const reports = await this.repository.find({
|
|
203
216
|
where: {
|
|
@@ -16,6 +16,7 @@ export declare class ScheduledTriggerService {
|
|
|
16
16
|
constructor(triggerRepository: Repository<DataMartScheduledTrigger>);
|
|
17
17
|
getByIdAndDataMartIdAndProjectId(id: string, dataMartId: string, projectId: string): Promise<DataMartScheduledTrigger>;
|
|
18
18
|
getByIdAndProjectId(id: string, projectId: string): Promise<DataMartScheduledTrigger>;
|
|
19
|
+
countByDataMartIds(dataMartIds: string[]): Promise<Map<string, number>>;
|
|
19
20
|
getAllByDataMartIdAndProjectId(dataMartId: string, projectId: string): Promise<DataMartScheduledTrigger[]>;
|
|
20
21
|
listVisibleByProject(options: ListVisibleProjectScheduledTriggersOptions): Promise<DataMartScheduledTrigger[]>;
|
|
21
22
|
deleteAllByDataMartIdAndProjectId(dataMartId: string, projectId: string): Promise<void>;
|
|
@@ -50,6 +50,19 @@ let ScheduledTriggerService = class ScheduledTriggerService {
|
|
|
50
50
|
}
|
|
51
51
|
return trigger;
|
|
52
52
|
}
|
|
53
|
+
async countByDataMartIds(dataMartIds) {
|
|
54
|
+
if (dataMartIds.length === 0)
|
|
55
|
+
return new Map();
|
|
56
|
+
const rows = await this.triggerRepository
|
|
57
|
+
.createQueryBuilder('t')
|
|
58
|
+
.leftJoin('t.dataMart', 'dm')
|
|
59
|
+
.where('dm.id IN (:...ids)', { ids: dataMartIds })
|
|
60
|
+
.select('dm.id', 'dataMartId')
|
|
61
|
+
.addSelect('COUNT(*)', 'count')
|
|
62
|
+
.groupBy('dm.id')
|
|
63
|
+
.getRawMany();
|
|
64
|
+
return new Map(rows.map(row => [row.dataMartId, Number(row.count)]));
|
|
65
|
+
}
|
|
53
66
|
async getAllByDataMartIdAndProjectId(dataMartId, projectId) {
|
|
54
67
|
return this.triggerRepository.find({
|
|
55
68
|
where: {
|
|
@@ -76,6 +76,7 @@ let CreateDataMartService = CreateDataMartService_1 = class CreateDataMartServic
|
|
|
76
76
|
}
|
|
77
77
|
const dataMart = this.dataMartService.create({
|
|
78
78
|
title: command.title,
|
|
79
|
+
icon: command.icon,
|
|
79
80
|
projectId: command.projectId,
|
|
80
81
|
createdById: command.userId,
|
|
81
82
|
storage: dataStorage,
|
|
@@ -37,6 +37,7 @@ const access_decision_1 = require("../services/access-decision");
|
|
|
37
37
|
const output_controls_validator_service_1 = require("../services/output-controls-validator.service");
|
|
38
38
|
const report_access_service_1 = require("../services/report-access.service");
|
|
39
39
|
const unique_count_sources_1 = require("../dto/schemas/unique-count-sources");
|
|
40
|
+
const auto_aggregation_opt_out_schema_1 = require("../dto/schemas/auto-aggregation-opt-out.schema");
|
|
40
41
|
const advanced_search_index_sync_service_1 = require("../services/advanced-search-index-sync.service");
|
|
41
42
|
const search_facade_1 = require("../../common/search/search.facade");
|
|
42
43
|
const looker_studio_report_service_1 = require("../services/looker-studio-report.service");
|
|
@@ -118,6 +119,7 @@ let CreateReportService = class CreateReportService {
|
|
|
118
119
|
aggregationConfig: command.aggregationConfig ?? null,
|
|
119
120
|
dateTruncConfig: command.dateTruncConfig ?? null,
|
|
120
121
|
uniqueCountConfig: (0, unique_count_sources_1.foldEmptyUniqueCountConfig)(command.uniqueCountConfig),
|
|
122
|
+
autoAggregationOptOut: (0, auto_aggregation_opt_out_schema_1.selectedAutoAggregationOptOut)(command.autoAggregationOptOut, command.columnConfig),
|
|
121
123
|
});
|
|
122
124
|
const restoredReport = await this.lookerStudioReportService.restoreIfDeleted(report);
|
|
123
125
|
const newReport = restoredReport ?? (await this.reportRepository.save(report));
|
|
@@ -5,12 +5,16 @@ import { AccessDecisionService } from '../services/access-decision';
|
|
|
5
5
|
import { ContextAccessService } from '../services/context/context-access.service';
|
|
6
6
|
import { DataMartService } from '../services/data-mart.service';
|
|
7
7
|
import { DataStorageService } from '../services/data-storage.service';
|
|
8
|
+
import { ReportService } from '../services/report.service';
|
|
9
|
+
import { ScheduledTriggerService } from '../services/scheduled-trigger.service';
|
|
8
10
|
export declare class GetModelCanvasDataMartsService {
|
|
9
11
|
private readonly dataMartService;
|
|
10
12
|
private readonly dataStorageService;
|
|
11
13
|
private readonly contextAccessService;
|
|
12
14
|
private readonly mapper;
|
|
13
15
|
private readonly accessDecisionService;
|
|
14
|
-
|
|
16
|
+
private readonly scheduledTriggerService;
|
|
17
|
+
private readonly reportService;
|
|
18
|
+
constructor(dataMartService: DataMartService, dataStorageService: DataStorageService, contextAccessService: ContextAccessService, mapper: ModelCanvasMapper, accessDecisionService: AccessDecisionService, scheduledTriggerService: ScheduledTriggerService, reportService: ReportService);
|
|
15
19
|
run(command: GetModelCanvasDataMartsCommand): Promise<ModelCanvasDataMartsDto>;
|
|
16
20
|
}
|
|
@@ -17,6 +17,8 @@ const access_decision_1 = require("../services/access-decision");
|
|
|
17
17
|
const context_access_service_1 = require("../services/context/context-access.service");
|
|
18
18
|
const data_mart_service_1 = require("../services/data-mart.service");
|
|
19
19
|
const data_storage_service_1 = require("../services/data-storage.service");
|
|
20
|
+
const report_service_1 = require("../services/report.service");
|
|
21
|
+
const scheduled_trigger_service_1 = require("../services/scheduled-trigger.service");
|
|
20
22
|
const CANVAS_DATA_MARTS_PAGE_SIZE = 1000;
|
|
21
23
|
let GetModelCanvasDataMartsService = class GetModelCanvasDataMartsService {
|
|
22
24
|
dataMartService;
|
|
@@ -24,12 +26,16 @@ let GetModelCanvasDataMartsService = class GetModelCanvasDataMartsService {
|
|
|
24
26
|
contextAccessService;
|
|
25
27
|
mapper;
|
|
26
28
|
accessDecisionService;
|
|
27
|
-
|
|
29
|
+
scheduledTriggerService;
|
|
30
|
+
reportService;
|
|
31
|
+
constructor(dataMartService, dataStorageService, contextAccessService, mapper, accessDecisionService, scheduledTriggerService, reportService) {
|
|
28
32
|
this.dataMartService = dataMartService;
|
|
29
33
|
this.dataStorageService = dataStorageService;
|
|
30
34
|
this.contextAccessService = contextAccessService;
|
|
31
35
|
this.mapper = mapper;
|
|
32
36
|
this.accessDecisionService = accessDecisionService;
|
|
37
|
+
this.scheduledTriggerService = scheduledTriggerService;
|
|
38
|
+
this.reportService = reportService;
|
|
33
39
|
}
|
|
34
40
|
async run(command) {
|
|
35
41
|
if (!command.userId) {
|
|
@@ -52,7 +58,12 @@ let GetModelCanvasDataMartsService = class GetModelCanvasDataMartsService {
|
|
|
52
58
|
limit: CANVAS_DATA_MARTS_PAGE_SIZE,
|
|
53
59
|
offset,
|
|
54
60
|
});
|
|
55
|
-
|
|
61
|
+
const ids = items.map(dataMart => dataMart.id);
|
|
62
|
+
const [triggerCounts, reportCounts] = await Promise.all([
|
|
63
|
+
this.scheduledTriggerService.countByDataMartIds(ids),
|
|
64
|
+
this.reportService.countByDataMartIds(ids),
|
|
65
|
+
]);
|
|
66
|
+
return this.mapper.toDataMartsDto(items, total, offset, { triggerCounts, reportCounts });
|
|
56
67
|
}
|
|
57
68
|
};
|
|
58
69
|
exports.GetModelCanvasDataMartsService = GetModelCanvasDataMartsService;
|
|
@@ -62,6 +73,8 @@ exports.GetModelCanvasDataMartsService = GetModelCanvasDataMartsService = __deco
|
|
|
62
73
|
data_storage_service_1.DataStorageService,
|
|
63
74
|
context_access_service_1.ContextAccessService,
|
|
64
75
|
model_canvas_mapper_1.ModelCanvasMapper,
|
|
65
|
-
access_decision_1.AccessDecisionService
|
|
76
|
+
access_decision_1.AccessDecisionService,
|
|
77
|
+
scheduled_trigger_service_1.ScheduledTriggerService,
|
|
78
|
+
report_service_1.ReportService])
|
|
66
79
|
], GetModelCanvasDataMartsService);
|
|
67
80
|
//# sourceMappingURL=get-model-canvas-data-marts.service.js.map
|
|
@@ -121,7 +121,7 @@ let ListProjectScheduledTriggersService = class ListProjectScheduledTriggersServ
|
|
|
121
121
|
if (trigger.type === scheduled_trigger_type_enum_1.ScheduledTriggerType.CONNECTOR_RUN &&
|
|
122
122
|
trigger.dataMart.definition &&
|
|
123
123
|
(0, data_mart_definition_guards_1.isConnectorDefinition)(trigger.dataMart.definition)) {
|
|
124
|
-
const maskedDefinition = await this.connectorSecretService.mask(trigger.dataMart.definition);
|
|
124
|
+
const maskedDefinition = await this.connectorSecretService.mask(projectId, trigger.dataMart.definition);
|
|
125
125
|
return this.cloneTriggerWithConfig(trigger, {
|
|
126
126
|
type: ScheduledConnectorRunConfigType,
|
|
127
127
|
connector: maskedDefinition,
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { HttpException } from '@nestjs/common';
|
|
2
|
+
import { TypeResolver } from '../../common/resolver/type-resolver';
|
|
3
|
+
import type { Role as RoleType } from '@owox/idp-protocol';
|
|
4
|
+
import { DataStorageType } from '../data-storage-types/enums/data-storage-type.enum';
|
|
5
|
+
import { DataStorageErrorMapper } from '../data-storage-types/interfaces/data-storage-error-mapper.interface';
|
|
6
|
+
import { DataStorageReportReader } from '../data-storage-types/interfaces/data-storage-report-reader.interface';
|
|
7
|
+
import { AccessDecisionService } from '../services/access-decision';
|
|
8
|
+
import { BlendableSchemaService } from '../services/blendable-schema.service';
|
|
9
|
+
import { DataMartService } from '../services/data-mart.service';
|
|
10
|
+
import { ProjectBillingService } from '../services/project-billing/project-billing.service';
|
|
11
|
+
import { ReportSqlComposerService } from '../services/report-sql-composer.service';
|
|
12
|
+
export declare const PREVIEW_DEFAULT_LIMIT = 10;
|
|
13
|
+
export declare const PREVIEW_MAX_LIMIT = 1000;
|
|
14
|
+
export declare const DEFAULT_PREVIEW_DEADLINE_MS = 150000;
|
|
15
|
+
export declare class PreviewDataMartCommand {
|
|
16
|
+
readonly dataMartId: string;
|
|
17
|
+
readonly projectId: string;
|
|
18
|
+
readonly userId: string;
|
|
19
|
+
readonly roles: RoleType[];
|
|
20
|
+
readonly limit: number | undefined;
|
|
21
|
+
readonly filters: unknown;
|
|
22
|
+
readonly sort: unknown;
|
|
23
|
+
constructor(dataMartId: string, projectId: string, userId: string, roles: RoleType[], limit: number | undefined, filters: unknown, sort?: unknown);
|
|
24
|
+
}
|
|
25
|
+
export interface DataMartPreviewColumn {
|
|
26
|
+
name: string;
|
|
27
|
+
alias?: string;
|
|
28
|
+
type?: string;
|
|
29
|
+
}
|
|
30
|
+
export type PreviewCell = string | number | boolean | null;
|
|
31
|
+
export interface DataMartPreviewResult {
|
|
32
|
+
columns: DataMartPreviewColumn[];
|
|
33
|
+
rows: PreviewCell[][];
|
|
34
|
+
rowCount: number;
|
|
35
|
+
limit: number;
|
|
36
|
+
truncated: boolean;
|
|
37
|
+
}
|
|
38
|
+
export declare const CLIENT_CLOSED_REQUEST_STATUS = 499;
|
|
39
|
+
export declare class PreviewAbortedError extends HttpException {
|
|
40
|
+
constructor();
|
|
41
|
+
}
|
|
42
|
+
export declare class PreviewDataMartService {
|
|
43
|
+
private readonly dataMartService;
|
|
44
|
+
private readonly blendableSchemaService;
|
|
45
|
+
private readonly composer;
|
|
46
|
+
private readonly readerResolver;
|
|
47
|
+
private readonly accessDecisionService;
|
|
48
|
+
private readonly errorMapperResolver;
|
|
49
|
+
private readonly projectBillingService;
|
|
50
|
+
private readonly deadlineMs;
|
|
51
|
+
private readonly logger;
|
|
52
|
+
constructor(dataMartService: DataMartService, blendableSchemaService: BlendableSchemaService, composer: ReportSqlComposerService, readerResolver: TypeResolver<DataStorageType, DataStorageReportReader>, accessDecisionService: AccessDecisionService, errorMapperResolver: TypeResolver<DataStorageType, DataStorageErrorMapper>, projectBillingService: ProjectBillingService, deadlineMs?: number);
|
|
53
|
+
run(command: PreviewDataMartCommand, signal?: AbortSignal): Promise<DataMartPreviewResult>;
|
|
54
|
+
private parseLimit;
|
|
55
|
+
private parseSort;
|
|
56
|
+
private parseFilters;
|
|
57
|
+
private readRows;
|
|
58
|
+
}
|
|
59
|
+
export declare function toPreviewCell(value: unknown): PreviewCell;
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var PreviewDataMartService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.PreviewDataMartService = exports.PreviewAbortedError = exports.CLIENT_CLOSED_REQUEST_STATUS = exports.PreviewDataMartCommand = exports.DEFAULT_PREVIEW_DEADLINE_MS = exports.PREVIEW_MAX_LIMIT = exports.PREVIEW_DEFAULT_LIMIT = void 0;
|
|
17
|
+
exports.toPreviewCell = toPreviewCell;
|
|
18
|
+
const common_1 = require("@nestjs/common");
|
|
19
|
+
const internal_helpers_1 = require("@owox/internal-helpers");
|
|
20
|
+
const business_violation_exception_1 = require("../../common/exceptions/business-violation.exception");
|
|
21
|
+
const type_resolver_1 = require("../../common/resolver/type-resolver");
|
|
22
|
+
const data_storage_providers_1 = require("../data-storage-types/data-storage-providers");
|
|
23
|
+
const data_mart_schema_utils_1 = require("../data-storage-types/data-mart-schema.utils");
|
|
24
|
+
const filter_config_schema_1 = require("../dto/schemas/filter-config.schema");
|
|
25
|
+
const sort_config_schema_1 = require("../dto/schemas/sort-config.schema");
|
|
26
|
+
const access_decision_1 = require("../services/access-decision");
|
|
27
|
+
const blendable_schema_service_1 = require("../services/blendable-schema.service");
|
|
28
|
+
const data_mart_service_1 = require("../services/data-mart.service");
|
|
29
|
+
const calculated_field_utils_1 = require("../calculated-fields/calculated-field.utils");
|
|
30
|
+
const project_billing_service_1 = require("../services/project-billing/project-billing.service");
|
|
31
|
+
const report_sql_composer_service_1 = require("../services/report-sql-composer.service");
|
|
32
|
+
exports.PREVIEW_DEFAULT_LIMIT = 10;
|
|
33
|
+
exports.PREVIEW_MAX_LIMIT = 1000;
|
|
34
|
+
exports.DEFAULT_PREVIEW_DEADLINE_MS = 150_000;
|
|
35
|
+
class PreviewDataMartCommand {
|
|
36
|
+
dataMartId;
|
|
37
|
+
projectId;
|
|
38
|
+
userId;
|
|
39
|
+
roles;
|
|
40
|
+
limit;
|
|
41
|
+
filters;
|
|
42
|
+
sort;
|
|
43
|
+
constructor(dataMartId, projectId, userId, roles, limit, filters, sort = undefined) {
|
|
44
|
+
this.dataMartId = dataMartId;
|
|
45
|
+
this.projectId = projectId;
|
|
46
|
+
this.userId = userId;
|
|
47
|
+
this.roles = roles;
|
|
48
|
+
this.limit = limit;
|
|
49
|
+
this.filters = filters;
|
|
50
|
+
this.sort = sort;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.PreviewDataMartCommand = PreviewDataMartCommand;
|
|
54
|
+
exports.CLIENT_CLOSED_REQUEST_STATUS = 499;
|
|
55
|
+
class PreviewAbortedError extends common_1.HttpException {
|
|
56
|
+
constructor() {
|
|
57
|
+
super('Preview was cancelled', exports.CLIENT_CLOSED_REQUEST_STATUS);
|
|
58
|
+
this.name = 'PreviewAbortedError';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.PreviewAbortedError = PreviewAbortedError;
|
|
62
|
+
let PreviewDataMartService = PreviewDataMartService_1 = class PreviewDataMartService {
|
|
63
|
+
dataMartService;
|
|
64
|
+
blendableSchemaService;
|
|
65
|
+
composer;
|
|
66
|
+
readerResolver;
|
|
67
|
+
accessDecisionService;
|
|
68
|
+
errorMapperResolver;
|
|
69
|
+
projectBillingService;
|
|
70
|
+
deadlineMs;
|
|
71
|
+
logger = new common_1.Logger(PreviewDataMartService_1.name);
|
|
72
|
+
constructor(dataMartService, blendableSchemaService, composer, readerResolver, accessDecisionService, errorMapperResolver, projectBillingService, deadlineMs = exports.DEFAULT_PREVIEW_DEADLINE_MS) {
|
|
73
|
+
this.dataMartService = dataMartService;
|
|
74
|
+
this.blendableSchemaService = blendableSchemaService;
|
|
75
|
+
this.composer = composer;
|
|
76
|
+
this.readerResolver = readerResolver;
|
|
77
|
+
this.accessDecisionService = accessDecisionService;
|
|
78
|
+
this.errorMapperResolver = errorMapperResolver;
|
|
79
|
+
this.projectBillingService = projectBillingService;
|
|
80
|
+
this.deadlineMs = deadlineMs;
|
|
81
|
+
}
|
|
82
|
+
async run(command, signal) {
|
|
83
|
+
const limit = this.parseLimit(command.limit);
|
|
84
|
+
const filters = this.parseFilters(command.filters);
|
|
85
|
+
const sort = this.parseSort(command.sort);
|
|
86
|
+
const dataMart = await this.dataMartService.getByIdAndProjectId(command.dataMartId, command.projectId);
|
|
87
|
+
const canSee = await this.accessDecisionService.canAccess(command.userId, command.roles, access_decision_1.EntityType.DATA_MART, dataMart.id, access_decision_1.Action.SEE, command.projectId);
|
|
88
|
+
if (!canSee) {
|
|
89
|
+
throw new common_1.ForbiddenException('You do not have access to this Data Mart');
|
|
90
|
+
}
|
|
91
|
+
const accessor = { userId: command.userId, roles: command.roles };
|
|
92
|
+
const schema = await this.blendableSchemaService.computeBlendableSchema(dataMart.id, dataMart.projectId, accessor);
|
|
93
|
+
const calculatedNames = new Set((0, calculated_field_utils_1.calculatedFieldsOf)(schema.nativeFields).map(f => f.name));
|
|
94
|
+
const fields = schema.nativeFields
|
|
95
|
+
.filter(data_mart_schema_utils_1.isConnected)
|
|
96
|
+
.map(field => field.name)
|
|
97
|
+
.filter(name => !calculatedNames.has(name));
|
|
98
|
+
if (fields.length === 0) {
|
|
99
|
+
throw new common_1.BadRequestException('This Data Mart has no visible fields in its Output Schema yet. Refresh the schema, then preview again.');
|
|
100
|
+
}
|
|
101
|
+
const readPlan = {
|
|
102
|
+
dataMart,
|
|
103
|
+
columnConfig: fields,
|
|
104
|
+
filterConfig: filters,
|
|
105
|
+
sortConfig: sort,
|
|
106
|
+
limitConfig: limit + 1,
|
|
107
|
+
};
|
|
108
|
+
throwIfAborted(signal);
|
|
109
|
+
await this.projectBillingService.verifyCanPerformOperations(dataMart.projectId, project_billing_service_1.RunKind.HTTP_DATA_RUN);
|
|
110
|
+
throwIfAborted(signal);
|
|
111
|
+
let result;
|
|
112
|
+
try {
|
|
113
|
+
result = await this.readRows(dataMart, readPlan, accessor, schema, limit, signal);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (error instanceof common_1.HttpException || error instanceof business_violation_exception_1.BusinessViolationException) {
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
this.logger.warn(`Preview of Data Mart ${dataMart.id} failed: ${(0, internal_helpers_1.castError)(error).message}`);
|
|
120
|
+
const mapper = await this.errorMapperResolver.resolve(dataMart.storage.type);
|
|
121
|
+
throw mapper.toStorageReadError(error, { force: true });
|
|
122
|
+
}
|
|
123
|
+
const truncated = result.rows.length > limit;
|
|
124
|
+
const rows = (truncated ? result.rows.slice(0, limit) : result.rows).map(row => row.map(toPreviewCell));
|
|
125
|
+
return { columns: result.columns, rows, rowCount: rows.length, limit, truncated };
|
|
126
|
+
}
|
|
127
|
+
parseLimit(limit) {
|
|
128
|
+
if (limit === undefined || limit === null)
|
|
129
|
+
return exports.PREVIEW_DEFAULT_LIMIT;
|
|
130
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > exports.PREVIEW_MAX_LIMIT) {
|
|
131
|
+
throw new common_1.BadRequestException(`limit must be an integer between 1 and ${exports.PREVIEW_MAX_LIMIT}`);
|
|
132
|
+
}
|
|
133
|
+
return limit;
|
|
134
|
+
}
|
|
135
|
+
parseSort(sort) {
|
|
136
|
+
if (sort === undefined || sort === null)
|
|
137
|
+
return null;
|
|
138
|
+
const parsed = sort_config_schema_1.SortConfigSchema.safeParse(sort);
|
|
139
|
+
if (!parsed.success) {
|
|
140
|
+
throw new common_1.BadRequestException({ message: 'Invalid sort', details: parsed.error.issues });
|
|
141
|
+
}
|
|
142
|
+
return parsed.data?.length ? parsed.data : null;
|
|
143
|
+
}
|
|
144
|
+
parseFilters(filters) {
|
|
145
|
+
if (filters === undefined || filters === null)
|
|
146
|
+
return null;
|
|
147
|
+
const parsed = filter_config_schema_1.FilterConfigSchema.safeParse(filters);
|
|
148
|
+
if (!parsed.success) {
|
|
149
|
+
throw new common_1.BadRequestException({
|
|
150
|
+
message: 'Invalid filters',
|
|
151
|
+
details: parsed.error.issues,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return parsed.data?.length ? parsed.data : null;
|
|
155
|
+
}
|
|
156
|
+
async readRows(dataMart, readPlan, accessor, schema, limit, signal) {
|
|
157
|
+
const overReadLimit = limit + 1;
|
|
158
|
+
const workController = new AbortController();
|
|
159
|
+
let deadlineTimer;
|
|
160
|
+
let abortListener;
|
|
161
|
+
const deadline = new Promise((_, reject) => {
|
|
162
|
+
deadlineTimer = setTimeout(() => {
|
|
163
|
+
workController.abort();
|
|
164
|
+
reject(new common_1.GatewayTimeoutException(`The preview query did not finish within ${Math.round(this.deadlineMs / 1000)} seconds. Add a filter or lower the limit, then try again.`));
|
|
165
|
+
}, this.deadlineMs);
|
|
166
|
+
});
|
|
167
|
+
const aborted = new Promise((_, reject) => {
|
|
168
|
+
if (!signal)
|
|
169
|
+
return;
|
|
170
|
+
if (signal.aborted) {
|
|
171
|
+
workController.abort();
|
|
172
|
+
reject(new PreviewAbortedError());
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
abortListener = () => {
|
|
176
|
+
workController.abort();
|
|
177
|
+
reject(new PreviewAbortedError());
|
|
178
|
+
};
|
|
179
|
+
signal.addEventListener('abort', abortListener, { once: true });
|
|
180
|
+
});
|
|
181
|
+
const produce = (async () => {
|
|
182
|
+
let reader;
|
|
183
|
+
try {
|
|
184
|
+
if (workController.signal.aborted)
|
|
185
|
+
throw new PreviewAbortedError();
|
|
186
|
+
const composed = await this.composer.compose(readPlan, accessor, undefined, schema);
|
|
187
|
+
if (workController.signal.aborted)
|
|
188
|
+
throw new PreviewAbortedError();
|
|
189
|
+
reader = await this.readerResolver.resolve(dataMart.storage.type);
|
|
190
|
+
if (!reader.honorsQueryTimeout) {
|
|
191
|
+
this.logger.warn(`Storage ${dataMart.storage.type} does not honor queryTimeoutMs; a preview it runs is not capped warehouse-side.`);
|
|
192
|
+
}
|
|
193
|
+
const description = await reader.prepareReportData(readPlan, {
|
|
194
|
+
sqlOverride: composed.sql,
|
|
195
|
+
sqlOverrideParams: composed.params,
|
|
196
|
+
columnFilter: readPlan.columnConfig ?? undefined,
|
|
197
|
+
blendedDataHeaders: composed.blendedDataHeaders,
|
|
198
|
+
primaryKeyColumns: composed.primaryKeyColumns,
|
|
199
|
+
calculatedFields: composed.calculatedFields,
|
|
200
|
+
queryTimeoutMs: this.deadlineMs,
|
|
201
|
+
signal: workController.signal,
|
|
202
|
+
});
|
|
203
|
+
const columns = description.dataHeaders.map(header => ({
|
|
204
|
+
name: header.name,
|
|
205
|
+
...(header.alias ? { alias: header.alias } : {}),
|
|
206
|
+
...(header.storageFieldType ? { type: String(header.storageFieldType) } : {}),
|
|
207
|
+
}));
|
|
208
|
+
const rows = [];
|
|
209
|
+
let batchId;
|
|
210
|
+
do {
|
|
211
|
+
if (workController.signal.aborted)
|
|
212
|
+
break;
|
|
213
|
+
const batch = await reader.readReportDataBatch(batchId, overReadLimit - rows.length);
|
|
214
|
+
rows.push(...batch.dataRows);
|
|
215
|
+
batchId = batch.nextDataBatchId ?? undefined;
|
|
216
|
+
if (batch.dataRows.length === 0)
|
|
217
|
+
break;
|
|
218
|
+
} while (batchId && rows.length < overReadLimit);
|
|
219
|
+
return { columns, rows };
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
workController.abort();
|
|
223
|
+
try {
|
|
224
|
+
await reader?.finalize();
|
|
225
|
+
}
|
|
226
|
+
catch (finalizeError) {
|
|
227
|
+
this.logger.warn(`reader.finalize() failed; ignoring: ${(0, internal_helpers_1.castError)(finalizeError).message}`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
})();
|
|
231
|
+
try {
|
|
232
|
+
return await Promise.race([produce, deadline, aborted]);
|
|
233
|
+
}
|
|
234
|
+
finally {
|
|
235
|
+
if (deadlineTimer)
|
|
236
|
+
clearTimeout(deadlineTimer);
|
|
237
|
+
if (signal && abortListener)
|
|
238
|
+
signal.removeEventListener('abort', abortListener);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
exports.PreviewDataMartService = PreviewDataMartService;
|
|
243
|
+
exports.PreviewDataMartService = PreviewDataMartService = PreviewDataMartService_1 = __decorate([
|
|
244
|
+
(0, common_1.Injectable)(),
|
|
245
|
+
__param(3, (0, common_1.Inject)(data_storage_providers_1.DATA_STORAGE_REPORT_READER_RESOLVER)),
|
|
246
|
+
__param(5, (0, common_1.Inject)(data_storage_providers_1.DATA_STORAGE_ERROR_MAPPER_RESOLVER)),
|
|
247
|
+
__param(7, (0, common_1.Optional)()),
|
|
248
|
+
__metadata("design:paramtypes", [data_mart_service_1.DataMartService,
|
|
249
|
+
blendable_schema_service_1.BlendableSchemaService,
|
|
250
|
+
report_sql_composer_service_1.ReportSqlComposerService,
|
|
251
|
+
type_resolver_1.TypeResolver,
|
|
252
|
+
access_decision_1.AccessDecisionService,
|
|
253
|
+
type_resolver_1.TypeResolver,
|
|
254
|
+
project_billing_service_1.ProjectBillingService, Number])
|
|
255
|
+
], PreviewDataMartService);
|
|
256
|
+
function throwIfAborted(signal) {
|
|
257
|
+
if (signal?.aborted)
|
|
258
|
+
throw new PreviewAbortedError();
|
|
259
|
+
}
|
|
260
|
+
function toPreviewCell(value) {
|
|
261
|
+
if (value === null || value === undefined)
|
|
262
|
+
return null;
|
|
263
|
+
if (typeof value === 'string' || typeof value === 'boolean')
|
|
264
|
+
return value;
|
|
265
|
+
if (typeof value === 'number')
|
|
266
|
+
return Number.isFinite(value) ? value : String(value);
|
|
267
|
+
if (typeof value === 'bigint')
|
|
268
|
+
return value.toString();
|
|
269
|
+
if (value instanceof Date)
|
|
270
|
+
return value.toISOString();
|
|
271
|
+
if (Buffer.isBuffer(value))
|
|
272
|
+
return value.toString('base64');
|
|
273
|
+
if (typeof value === 'object') {
|
|
274
|
+
const toJSON = value.toJSON;
|
|
275
|
+
if (typeof toJSON === 'function') {
|
|
276
|
+
const json = toJSON.call(value);
|
|
277
|
+
if (json !== value)
|
|
278
|
+
return toPreviewCell(json);
|
|
279
|
+
}
|
|
280
|
+
const keys = Object.keys(value);
|
|
281
|
+
if (keys.length === 1 && keys[0] === 'value') {
|
|
282
|
+
return toPreviewCell(value.value);
|
|
283
|
+
}
|
|
284
|
+
try {
|
|
285
|
+
return JSON.stringify(value, (_key, inner) => typeof inner === 'bigint' ? inner.toString() : inner);
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
return String(value);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return String(value);
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=preview-data-mart.service.js.map
|
|
@@ -238,6 +238,7 @@ let StreamHttpDataService = StreamHttpDataService_1 = class StreamHttpDataServic
|
|
|
238
238
|
aggregationConfig: report.aggregationConfig ?? undefined,
|
|
239
239
|
dateTruncConfig: report.dateTruncConfig ?? undefined,
|
|
240
240
|
uniqueCountConfig: report.uniqueCountConfig ?? undefined,
|
|
241
|
+
autoAggregationOptOut: report.autoAggregationOptOut ?? undefined,
|
|
241
242
|
limitConfig: limit ?? report.limitConfig ?? null,
|
|
242
243
|
};
|
|
243
244
|
const collapsed = excelReportRun ? (0, auto_collapse_resolver_1.applyAutoCollapse)(basePlan) : undefined;
|
|
@@ -21,7 +21,7 @@ export declare class UpdateDataMartDefinitionService {
|
|
|
21
21
|
private readonly advancedSearchIndexSync?;
|
|
22
22
|
constructor(dataMartService: DataMartService, mapper: DataMartMapper, connectorSecretService: ConnectorSecretService, legacyDataMartsService: LegacyDataMartsService, accessDecisionService: AccessDecisionService, definitionValidatorFacade: DataMartDefinitionValidatorFacade, eventDispatcher: OwoxEventDispatcher, connectorService: ConnectorService, advancedSearchIndexSync?: AdvancedSearchIndexSyncService | undefined);
|
|
23
23
|
run(command: UpdateDataMartDefinitionCommand): Promise<DataMartDto>;
|
|
24
|
-
private
|
|
24
|
+
private resolveConnectorCapabilities;
|
|
25
25
|
private validateConnectorConfigurationCount;
|
|
26
26
|
private validateCredentialCopyAccess;
|
|
27
27
|
private validateSecretReferences;
|