@owox/backend 0.35.0 → 0.37.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 +10 -5
- 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 +16 -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 +11 -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 +11 -0
- package/dist/src/data-marts/dto/presentation/list-data-marts-query-api.dto.js +1 -1
- 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 +21 -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 +33 -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 +81 -0
- package/dist/src/data-marts/enums/data-mart-icon.enum.js +85 -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 +493 -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 +44 -0
- package/dist/src/data-marts/services/connector/connector-test.service.js +348 -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/context/context-access.service.js +2 -2
- package/dist/src/data-marts/services/data-mart.service.js +2 -0
- package/dist/src/data-marts/services/member-ownership-warnings.service.js +1 -1
- package/dist/src/data-marts/services/report-access.service.js +1 -1
- 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 +295 -0
- package/dist/src/data-marts/use-cases/stream-http-data.service.js +1 -0
- package/dist/src/data-marts/use-cases/update-availability.service.js +2 -2
- 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 +9 -7
- 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-owners.service.js +1 -1
- package/dist/src/data-marts/use-cases/update-data-mart-schema.service.js +14 -1
- package/dist/src/data-marts/use-cases/update-data-storage.service.js +2 -2
- 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/instructions/mcp-system-instructions.d.ts +1 -1
- package/dist/src/ee/mcp/instructions/mcp-system-instructions.js +3 -3
- 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 +89 -229
- package/dist/src/ee/mcp/tools/add-report.tool.js +30 -30
- 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 +14 -14
- 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 +16 -16
- 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 +15 -15
- 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 +36 -36
- 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 +6 -6
- 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 +3 -13
- package/dist/src/ee/mcp/tools/update-report-run-schedule.tool.js +16 -16
- package/dist/src/ee/mcp/tools/update-report.tool.d.ts +105 -414
- package/dist/src/ee/mcp/tools/update-report.tool.js +21 -21
- 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/decorators/auth.decorator.js +1 -1
- package/dist/src/idp/guards/idp.guard.js +3 -9
- 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-project-selection.service.js +1 -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,295 @@
|
|
|
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
|
+
const INVALID_DATE_CELL = '[Invalid Date]';
|
|
55
|
+
exports.CLIENT_CLOSED_REQUEST_STATUS = 499;
|
|
56
|
+
class PreviewAbortedError extends common_1.HttpException {
|
|
57
|
+
constructor() {
|
|
58
|
+
super('Preview was cancelled', exports.CLIENT_CLOSED_REQUEST_STATUS);
|
|
59
|
+
this.name = 'PreviewAbortedError';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.PreviewAbortedError = PreviewAbortedError;
|
|
63
|
+
let PreviewDataMartService = PreviewDataMartService_1 = class PreviewDataMartService {
|
|
64
|
+
dataMartService;
|
|
65
|
+
blendableSchemaService;
|
|
66
|
+
composer;
|
|
67
|
+
readerResolver;
|
|
68
|
+
accessDecisionService;
|
|
69
|
+
errorMapperResolver;
|
|
70
|
+
projectBillingService;
|
|
71
|
+
deadlineMs;
|
|
72
|
+
logger = new common_1.Logger(PreviewDataMartService_1.name);
|
|
73
|
+
constructor(dataMartService, blendableSchemaService, composer, readerResolver, accessDecisionService, errorMapperResolver, projectBillingService, deadlineMs = exports.DEFAULT_PREVIEW_DEADLINE_MS) {
|
|
74
|
+
this.dataMartService = dataMartService;
|
|
75
|
+
this.blendableSchemaService = blendableSchemaService;
|
|
76
|
+
this.composer = composer;
|
|
77
|
+
this.readerResolver = readerResolver;
|
|
78
|
+
this.accessDecisionService = accessDecisionService;
|
|
79
|
+
this.errorMapperResolver = errorMapperResolver;
|
|
80
|
+
this.projectBillingService = projectBillingService;
|
|
81
|
+
this.deadlineMs = deadlineMs;
|
|
82
|
+
}
|
|
83
|
+
async run(command, signal) {
|
|
84
|
+
const limit = this.parseLimit(command.limit);
|
|
85
|
+
const filters = this.parseFilters(command.filters);
|
|
86
|
+
const sort = this.parseSort(command.sort);
|
|
87
|
+
const dataMart = await this.dataMartService.getByIdAndProjectId(command.dataMartId, command.projectId);
|
|
88
|
+
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);
|
|
89
|
+
if (!canSee) {
|
|
90
|
+
throw new common_1.ForbiddenException('You do not have access to this Data Mart');
|
|
91
|
+
}
|
|
92
|
+
const accessor = { userId: command.userId, roles: command.roles };
|
|
93
|
+
const schema = await this.blendableSchemaService.computeBlendableSchema(dataMart.id, dataMart.projectId, accessor);
|
|
94
|
+
const calculatedNames = new Set((0, calculated_field_utils_1.calculatedFieldsOf)(schema.nativeFields).map(f => f.name));
|
|
95
|
+
const fields = schema.nativeFields
|
|
96
|
+
.filter(data_mart_schema_utils_1.isConnected)
|
|
97
|
+
.map(field => field.name)
|
|
98
|
+
.filter(name => !calculatedNames.has(name));
|
|
99
|
+
if (fields.length === 0) {
|
|
100
|
+
throw new common_1.BadRequestException('This Data Mart has no visible fields in its Output Schema yet. Refresh the schema, then preview again.');
|
|
101
|
+
}
|
|
102
|
+
const readPlan = {
|
|
103
|
+
dataMart,
|
|
104
|
+
columnConfig: fields,
|
|
105
|
+
filterConfig: filters,
|
|
106
|
+
sortConfig: sort,
|
|
107
|
+
limitConfig: limit + 1,
|
|
108
|
+
};
|
|
109
|
+
throwIfAborted(signal);
|
|
110
|
+
await this.projectBillingService.verifyCanPerformOperations(dataMart.projectId, project_billing_service_1.RunKind.HTTP_DATA_RUN);
|
|
111
|
+
throwIfAborted(signal);
|
|
112
|
+
let result;
|
|
113
|
+
try {
|
|
114
|
+
result = await this.readRows(dataMart, readPlan, accessor, schema, limit, signal);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
if (error instanceof common_1.HttpException || error instanceof business_violation_exception_1.BusinessViolationException) {
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
this.logger.warn(`Preview of Data Mart ${dataMart.id} failed: ${(0, internal_helpers_1.castError)(error).message}`);
|
|
121
|
+
const mapper = await this.errorMapperResolver.resolve(dataMart.storage.type);
|
|
122
|
+
throw mapper.toStorageReadError(error, { force: true });
|
|
123
|
+
}
|
|
124
|
+
const truncated = result.rows.length > limit;
|
|
125
|
+
const rows = (truncated ? result.rows.slice(0, limit) : result.rows).map(row => row.map(toPreviewCell));
|
|
126
|
+
return { columns: result.columns, rows, rowCount: rows.length, limit, truncated };
|
|
127
|
+
}
|
|
128
|
+
parseLimit(limit) {
|
|
129
|
+
if (limit === undefined || limit === null)
|
|
130
|
+
return exports.PREVIEW_DEFAULT_LIMIT;
|
|
131
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > exports.PREVIEW_MAX_LIMIT) {
|
|
132
|
+
throw new common_1.BadRequestException(`limit must be an integer between 1 and ${exports.PREVIEW_MAX_LIMIT}`);
|
|
133
|
+
}
|
|
134
|
+
return limit;
|
|
135
|
+
}
|
|
136
|
+
parseSort(sort) {
|
|
137
|
+
if (sort === undefined || sort === null)
|
|
138
|
+
return null;
|
|
139
|
+
const parsed = sort_config_schema_1.SortConfigSchema.safeParse(sort);
|
|
140
|
+
if (!parsed.success) {
|
|
141
|
+
throw new common_1.BadRequestException({ message: 'Invalid sort', details: parsed.error.issues });
|
|
142
|
+
}
|
|
143
|
+
return parsed.data?.length ? parsed.data : null;
|
|
144
|
+
}
|
|
145
|
+
parseFilters(filters) {
|
|
146
|
+
if (filters === undefined || filters === null)
|
|
147
|
+
return null;
|
|
148
|
+
const parsed = filter_config_schema_1.FilterConfigSchema.safeParse(filters);
|
|
149
|
+
if (!parsed.success) {
|
|
150
|
+
throw new common_1.BadRequestException({
|
|
151
|
+
message: 'Invalid filters',
|
|
152
|
+
details: parsed.error.issues,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return parsed.data?.length ? parsed.data : null;
|
|
156
|
+
}
|
|
157
|
+
async readRows(dataMart, readPlan, accessor, schema, limit, signal) {
|
|
158
|
+
const overReadLimit = limit + 1;
|
|
159
|
+
const workController = new AbortController();
|
|
160
|
+
let deadlineTimer;
|
|
161
|
+
let abortListener;
|
|
162
|
+
const deadline = new Promise((_, reject) => {
|
|
163
|
+
deadlineTimer = setTimeout(() => {
|
|
164
|
+
workController.abort();
|
|
165
|
+
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.`));
|
|
166
|
+
}, this.deadlineMs);
|
|
167
|
+
});
|
|
168
|
+
const aborted = new Promise((_, reject) => {
|
|
169
|
+
if (!signal)
|
|
170
|
+
return;
|
|
171
|
+
if (signal.aborted) {
|
|
172
|
+
workController.abort();
|
|
173
|
+
reject(new PreviewAbortedError());
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
abortListener = () => {
|
|
177
|
+
workController.abort();
|
|
178
|
+
reject(new PreviewAbortedError());
|
|
179
|
+
};
|
|
180
|
+
signal.addEventListener('abort', abortListener, { once: true });
|
|
181
|
+
});
|
|
182
|
+
const produce = (async () => {
|
|
183
|
+
let reader;
|
|
184
|
+
try {
|
|
185
|
+
if (workController.signal.aborted)
|
|
186
|
+
throw new PreviewAbortedError();
|
|
187
|
+
const composed = await this.composer.compose(readPlan, accessor, undefined, schema);
|
|
188
|
+
if (workController.signal.aborted)
|
|
189
|
+
throw new PreviewAbortedError();
|
|
190
|
+
reader = await this.readerResolver.resolve(dataMart.storage.type);
|
|
191
|
+
if (!reader.honorsQueryTimeout) {
|
|
192
|
+
this.logger.warn(`Storage ${dataMart.storage.type} does not honor queryTimeoutMs; a preview it runs is not capped warehouse-side.`);
|
|
193
|
+
}
|
|
194
|
+
const description = await reader.prepareReportData(readPlan, {
|
|
195
|
+
sqlOverride: composed.sql,
|
|
196
|
+
sqlOverrideParams: composed.params,
|
|
197
|
+
columnFilter: readPlan.columnConfig ?? undefined,
|
|
198
|
+
blendedDataHeaders: composed.blendedDataHeaders,
|
|
199
|
+
primaryKeyColumns: composed.primaryKeyColumns,
|
|
200
|
+
calculatedFields: composed.calculatedFields,
|
|
201
|
+
queryTimeoutMs: this.deadlineMs,
|
|
202
|
+
signal: workController.signal,
|
|
203
|
+
});
|
|
204
|
+
const columns = description.dataHeaders.map(header => ({
|
|
205
|
+
name: header.name,
|
|
206
|
+
...(header.alias ? { alias: header.alias } : {}),
|
|
207
|
+
...(header.storageFieldType ? { type: String(header.storageFieldType) } : {}),
|
|
208
|
+
}));
|
|
209
|
+
const rows = [];
|
|
210
|
+
let batchId;
|
|
211
|
+
do {
|
|
212
|
+
if (workController.signal.aborted)
|
|
213
|
+
break;
|
|
214
|
+
const batch = await reader.readReportDataBatch(batchId, overReadLimit - rows.length);
|
|
215
|
+
rows.push(...batch.dataRows);
|
|
216
|
+
batchId = batch.nextDataBatchId ?? undefined;
|
|
217
|
+
if (batch.dataRows.length === 0)
|
|
218
|
+
break;
|
|
219
|
+
} while (batchId && rows.length < overReadLimit);
|
|
220
|
+
return { columns, rows };
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
workController.abort();
|
|
224
|
+
try {
|
|
225
|
+
await reader?.finalize();
|
|
226
|
+
}
|
|
227
|
+
catch (finalizeError) {
|
|
228
|
+
this.logger.warn(`reader.finalize() failed; ignoring: ${(0, internal_helpers_1.castError)(finalizeError).message}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
})();
|
|
232
|
+
try {
|
|
233
|
+
return await Promise.race([produce, deadline, aborted]);
|
|
234
|
+
}
|
|
235
|
+
finally {
|
|
236
|
+
if (deadlineTimer)
|
|
237
|
+
clearTimeout(deadlineTimer);
|
|
238
|
+
if (signal && abortListener)
|
|
239
|
+
signal.removeEventListener('abort', abortListener);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
exports.PreviewDataMartService = PreviewDataMartService;
|
|
244
|
+
exports.PreviewDataMartService = PreviewDataMartService = PreviewDataMartService_1 = __decorate([
|
|
245
|
+
(0, common_1.Injectable)(),
|
|
246
|
+
__param(3, (0, common_1.Inject)(data_storage_providers_1.DATA_STORAGE_REPORT_READER_RESOLVER)),
|
|
247
|
+
__param(5, (0, common_1.Inject)(data_storage_providers_1.DATA_STORAGE_ERROR_MAPPER_RESOLVER)),
|
|
248
|
+
__param(7, (0, common_1.Optional)()),
|
|
249
|
+
__metadata("design:paramtypes", [data_mart_service_1.DataMartService,
|
|
250
|
+
blendable_schema_service_1.BlendableSchemaService,
|
|
251
|
+
report_sql_composer_service_1.ReportSqlComposerService,
|
|
252
|
+
type_resolver_1.TypeResolver,
|
|
253
|
+
access_decision_1.AccessDecisionService,
|
|
254
|
+
type_resolver_1.TypeResolver,
|
|
255
|
+
project_billing_service_1.ProjectBillingService, Number])
|
|
256
|
+
], PreviewDataMartService);
|
|
257
|
+
function throwIfAborted(signal) {
|
|
258
|
+
if (signal?.aborted)
|
|
259
|
+
throw new PreviewAbortedError();
|
|
260
|
+
}
|
|
261
|
+
function toPreviewCell(value) {
|
|
262
|
+
if (value === null || value === undefined)
|
|
263
|
+
return null;
|
|
264
|
+
if (typeof value === 'string' || typeof value === 'boolean')
|
|
265
|
+
return value;
|
|
266
|
+
if (typeof value === 'number')
|
|
267
|
+
return Number.isFinite(value) ? value : String(value);
|
|
268
|
+
if (typeof value === 'bigint')
|
|
269
|
+
return value.toString();
|
|
270
|
+
if (value instanceof Date) {
|
|
271
|
+
return Number.isNaN(value.getTime()) ? INVALID_DATE_CELL : value.toISOString();
|
|
272
|
+
}
|
|
273
|
+
if (Buffer.isBuffer(value))
|
|
274
|
+
return value.toString('base64');
|
|
275
|
+
if (typeof value === 'object') {
|
|
276
|
+
const toJSON = value.toJSON;
|
|
277
|
+
if (typeof toJSON === 'function') {
|
|
278
|
+
const json = toJSON.call(value);
|
|
279
|
+
if (json !== value)
|
|
280
|
+
return toPreviewCell(json);
|
|
281
|
+
}
|
|
282
|
+
const keys = Object.keys(value);
|
|
283
|
+
if (keys.length === 1 && keys[0] === 'value') {
|
|
284
|
+
return toPreviewCell(value.value);
|
|
285
|
+
}
|
|
286
|
+
try {
|
|
287
|
+
return JSON.stringify(value, (_key, inner) => typeof inner === 'bigint' ? inner.toString() : inner);
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
return String(value);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return String(value);
|
|
294
|
+
}
|
|
295
|
+
//# 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;
|
|
@@ -41,7 +41,7 @@ let UpdateAvailabilityService = UpdateAvailabilityService_1 = class UpdateAvaila
|
|
|
41
41
|
throw new common_1.NotFoundException('DataMart not found');
|
|
42
42
|
const canConfigure = await this.accessDecisionService.canAccess(userId, roles, access_decision_1.EntityType.DATA_MART, dataMartId, access_decision_1.Action.CONFIGURE_SHARING, projectId);
|
|
43
43
|
if (!canConfigure)
|
|
44
|
-
throw new common_1.ForbiddenException('You do not have permission to configure sharing for this Data Mart. You must be
|
|
44
|
+
throw new common_1.ForbiddenException('You do not have permission to configure sharing for this Data Mart. You must be a Data Owner of this Data Mart with the Data Owner role, or a Project Admin.');
|
|
45
45
|
dm.availableForReporting = availableForReporting;
|
|
46
46
|
dm.availableForMaintenance = availableForMaintenance;
|
|
47
47
|
await this.dataMartRepository.save(dm);
|
|
@@ -54,7 +54,7 @@ let UpdateAvailabilityService = UpdateAvailabilityService_1 = class UpdateAvaila
|
|
|
54
54
|
throw new common_1.NotFoundException('Storage not found');
|
|
55
55
|
const canConfigure = await this.accessDecisionService.canAccess(userId, roles, access_decision_1.EntityType.STORAGE, storageId, access_decision_1.Action.CONFIGURE_SHARING, projectId);
|
|
56
56
|
if (!canConfigure)
|
|
57
|
-
throw new common_1.ForbiddenException('You do not have permission to configure sharing for this Storage. You must be an owner with the
|
|
57
|
+
throw new common_1.ForbiddenException('You do not have permission to configure sharing for this Storage. You must be an owner with the Data Owner role, or a Project Admin.');
|
|
58
58
|
storage.availableForUse = availableForUse;
|
|
59
59
|
storage.availableForMaintenance = availableForMaintenance;
|
|
60
60
|
await this.dataStorageRepository.save(storage);
|
|
@@ -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;
|
|
@@ -66,7 +66,7 @@ let UpdateDataMartDefinitionService = class UpdateDataMartDefinitionService {
|
|
|
66
66
|
this.assertDefinitionTypeChangeAllowed(previousDefinitionType, command.definitionType);
|
|
67
67
|
definitionTypeChanged = true;
|
|
68
68
|
}
|
|
69
|
-
const connectorCapabilities = this.
|
|
69
|
+
const connectorCapabilities = await this.resolveConnectorCapabilities(command);
|
|
70
70
|
this.validateConnectorConfigurationCount(command, connectorCapabilities);
|
|
71
71
|
if (dataMart.storage.type === data_storage_type_enum_1.DataStorageType.LEGACY_GOOGLE_BIGQUERY) {
|
|
72
72
|
if (command.definitionType !== data_mart_definition_type_enum_1.DataMartDefinitionType.SQL) {
|
|
@@ -91,11 +91,11 @@ let UpdateDataMartDefinitionService = class UpdateDataMartDefinitionService {
|
|
|
91
91
|
}
|
|
92
92
|
this.validateSecretReferences(connectorDefinition, previousDefinition, sourceDefinition);
|
|
93
93
|
if (sourceDefinition) {
|
|
94
|
-
mergedDefinition = await this.connectorSecretService.mergeDefinitionSecretsFromSource(connectorDefinition, sourceDefinition);
|
|
95
|
-
mergedDefinition = await this.connectorSecretService.mergeDefinitionSecrets(mergedDefinition, previousDefinition);
|
|
94
|
+
mergedDefinition = await this.connectorSecretService.mergeDefinitionSecretsFromSource(command.projectId, connectorDefinition, sourceDefinition);
|
|
95
|
+
mergedDefinition = await this.connectorSecretService.mergeDefinitionSecrets(command.projectId, mergedDefinition, previousDefinition);
|
|
96
96
|
}
|
|
97
97
|
else {
|
|
98
|
-
mergedDefinition = await this.connectorSecretService.mergeDefinitionSecrets(connectorDefinition, previousDefinition);
|
|
98
|
+
mergedDefinition = await this.connectorSecretService.mergeDefinitionSecrets(command.projectId, connectorDefinition, previousDefinition);
|
|
99
99
|
}
|
|
100
100
|
dataMart.definition = await this.connectorSecretService.extractAndSaveSecrets(dataMart.id, command.projectId, connectorDefinition.connector.source.name, mergedDefinition);
|
|
101
101
|
await this.connectorSecretService.deleteOrphanedSecrets(dataMart.id, dataMart.definition, previousDefinition);
|
|
@@ -119,13 +119,15 @@ let UpdateDataMartDefinitionService = class UpdateDataMartDefinitionService {
|
|
|
119
119
|
await this.advancedSearchIndexSync?.scheduleReindex(search_facade_1.SearchableEntityType.DATA_MART, dataMart.id, command.projectId);
|
|
120
120
|
return this.mapper.toDomainDto(dataMart);
|
|
121
121
|
}
|
|
122
|
-
|
|
122
|
+
async resolveConnectorCapabilities(command) {
|
|
123
123
|
if (command.definitionType !== data_mart_definition_type_enum_1.DataMartDefinitionType.CONNECTOR) {
|
|
124
124
|
return undefined;
|
|
125
125
|
}
|
|
126
126
|
const definition = command.definition;
|
|
127
127
|
const source = definition?.connector?.source;
|
|
128
|
-
return source?.name
|
|
128
|
+
return source?.name
|
|
129
|
+
? this.connectorService.resolveConnectorCapabilities(command.projectId, source.name, source.version)
|
|
130
|
+
: undefined;
|
|
129
131
|
}
|
|
130
132
|
validateConnectorConfigurationCount(command, capabilities) {
|
|
131
133
|
if (!capabilities?.singleConfiguration) {
|
|
@@ -144,7 +146,7 @@ let UpdateDataMartDefinitionService = class UpdateDataMartDefinitionService {
|
|
|
144
146
|
const canCopyCredentials = await this.accessDecisionService.canAccess(command.userId, command.roles, access_decision_1.EntityType.DATA_MART, command.sourceDataMartId, access_decision_1.Action.EDIT, command.projectId);
|
|
145
147
|
if (!canCopyCredentials) {
|
|
146
148
|
throw new common_1.ForbiddenException('You do not have permission to copy connector credentials from the source Data Mart. ' +
|
|
147
|
-
'Ask its owner to add you as a
|
|
149
|
+
'Ask its owner to add you as a Data Owner or to turn on "Shared for maintenance", ' +
|
|
148
150
|
'or enter the credentials manually.');
|
|
149
151
|
}
|
|
150
152
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DataMartMapper } from '../mappers/data-mart.mapper';
|
|
2
|
+
import { DataMartDto } from '../dto/domain/data-mart.dto';
|
|
3
|
+
import { DataMartService } from '../services/data-mart.service';
|
|
4
|
+
import { UpdateDataMartIconCommand } from '../dto/domain/update-data-mart-icon.command';
|
|
5
|
+
import { AccessDecisionService } from '../services/access-decision';
|
|
6
|
+
export declare class UpdateDataMartIconService {
|
|
7
|
+
private readonly dataMartService;
|
|
8
|
+
private readonly mapper;
|
|
9
|
+
private readonly accessDecisionService;
|
|
10
|
+
constructor(dataMartService: DataMartService, mapper: DataMartMapper, accessDecisionService: AccessDecisionService);
|
|
11
|
+
run(command: UpdateDataMartIconCommand): Promise<DataMartDto>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.UpdateDataMartIconService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const data_mart_mapper_1 = require("../mappers/data-mart.mapper");
|
|
15
|
+
const data_mart_service_1 = require("../services/data-mart.service");
|
|
16
|
+
const access_decision_1 = require("../services/access-decision");
|
|
17
|
+
let UpdateDataMartIconService = class UpdateDataMartIconService {
|
|
18
|
+
dataMartService;
|
|
19
|
+
mapper;
|
|
20
|
+
accessDecisionService;
|
|
21
|
+
constructor(dataMartService, mapper, accessDecisionService) {
|
|
22
|
+
this.dataMartService = dataMartService;
|
|
23
|
+
this.mapper = mapper;
|
|
24
|
+
this.accessDecisionService = accessDecisionService;
|
|
25
|
+
}
|
|
26
|
+
async run(command) {
|
|
27
|
+
const dataMart = await this.dataMartService.getByIdAndProjectId(command.id, command.projectId);
|
|
28
|
+
if (command.userId) {
|
|
29
|
+
const canEdit = await this.accessDecisionService.canAccess(command.userId, command.roles, access_decision_1.EntityType.DATA_MART, command.id, access_decision_1.Action.EDIT, command.projectId);
|
|
30
|
+
if (!canEdit) {
|
|
31
|
+
throw new common_1.ForbiddenException('You do not have permission to edit this DataMart');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
dataMart.icon = command.icon;
|
|
35
|
+
await this.dataMartService.save(dataMart);
|
|
36
|
+
return this.mapper.toDomainDto(dataMart);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
exports.UpdateDataMartIconService = UpdateDataMartIconService;
|
|
40
|
+
exports.UpdateDataMartIconService = UpdateDataMartIconService = __decorate([
|
|
41
|
+
(0, common_1.Injectable)(),
|
|
42
|
+
__metadata("design:paramtypes", [data_mart_service_1.DataMartService,
|
|
43
|
+
data_mart_mapper_1.DataMartMapper,
|
|
44
|
+
access_decision_1.AccessDecisionService])
|
|
45
|
+
], UpdateDataMartIconService);
|
|
46
|
+
//# sourceMappingURL=update-data-mart-icon.service.js.map
|
|
@@ -51,7 +51,7 @@ let UpdateDataMartOwnersService = UpdateDataMartOwnersService_1 = class UpdateDa
|
|
|
51
51
|
if (command.userId) {
|
|
52
52
|
const canManage = await this.accessDecisionService.canAccess(command.userId, command.roles, access_decision_1.EntityType.DATA_MART, command.id, access_decision_1.Action.MANAGE_OWNERS, command.projectId);
|
|
53
53
|
if (!canManage) {
|
|
54
|
-
throw new common_1.ForbiddenException('You do not have permission to manage owners of this Data Mart. You must be
|
|
54
|
+
throw new common_1.ForbiddenException('You do not have permission to manage owners of this Data Mart. You must be a Data Owner of this Data Mart with the Data Owner role, or a Project Admin.');
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
await Promise.all([
|
|
@@ -18,7 +18,9 @@ const data_mart_entity_1 = require("../entities/data-mart.entity");
|
|
|
18
18
|
const calculated_field_utils_1 = require("../calculated-fields/calculated-field.utils");
|
|
19
19
|
const calculated_field_validator_service_1 = require("../calculated-fields/calculated-field-validator.service");
|
|
20
20
|
const formula_violations_1 = require("../calculated-fields/formula-violations");
|
|
21
|
+
const join_grain_1 = require("../calculated-fields/join-grain");
|
|
21
22
|
const data_storage_credentials_resolver_service_1 = require("../data-storage-types/data-storage-credentials-resolver.service");
|
|
23
|
+
const data_mart_schema_utils_1 = require("../data-storage-types/data-mart-schema.utils");
|
|
22
24
|
const data_mart_schema_field_status_enum_1 = require("../data-storage-types/enums/data-mart-schema-field-status.enum");
|
|
23
25
|
const data_mart_schema_parser_facade_service_1 = require("../data-storage-types/facades/data-mart-schema-parser-facade.service");
|
|
24
26
|
const data_mart_mapper_1 = require("../mappers/data-mart.mapper");
|
|
@@ -57,6 +59,7 @@ let UpdateDataMartSchemaService = UpdateDataMartSchemaService_1 = class UpdateDa
|
|
|
57
59
|
}
|
|
58
60
|
const parsed = await this.schemaParserFacade.validateAndParse(command.schema, dataMart.storage.type);
|
|
59
61
|
const introducesNativeField = applyServerOwnedFieldStatuses(parsed, dataMart.schema);
|
|
62
|
+
const previousFields = dataMart.schema?.fields ?? [];
|
|
60
63
|
dataMart.schema = parsed;
|
|
61
64
|
if (introducesNativeField) {
|
|
62
65
|
dataMart.schemaActualizedAt = null;
|
|
@@ -102,7 +105,11 @@ let UpdateDataMartSchemaService = UpdateDataMartSchemaService_1 = class UpdateDa
|
|
|
102
105
|
await this.saveAndInvalidate(dataMart);
|
|
103
106
|
await this.searchIndexInvalidation?.scheduleDataMartSchemaChanged(dataMart.id, command.projectId);
|
|
104
107
|
this.logger.debug(`Data mart ${command.id} schema updated`);
|
|
105
|
-
return {
|
|
108
|
+
return {
|
|
109
|
+
...this.mapper.toDomainDto(dataMart),
|
|
110
|
+
warnings: (0, join_grain_1.withoutUntouchedJoinAdvisories)(warnings, editedCalculatedFields(previousFields, calculatedFields), (0, data_mart_schema_utils_1.declaredPrimaryKeyFields)(previousFields).sort().join('\n') !==
|
|
111
|
+
(0, data_mart_schema_utils_1.declaredPrimaryKeyFields)(parsed.fields).sort().join('\n')),
|
|
112
|
+
};
|
|
106
113
|
}
|
|
107
114
|
async saveAndInvalidate(dataMart) {
|
|
108
115
|
await this.dataMartService.save(dataMart);
|
|
@@ -158,4 +165,10 @@ function applyFieldStatuses(fields, persistedFields) {
|
|
|
158
165
|
function nestedFieldsOf(field) {
|
|
159
166
|
return 'fields' in field && Array.isArray(field.fields) ? field.fields : undefined;
|
|
160
167
|
}
|
|
168
|
+
function editedCalculatedFields(previousFields, calculatedFields) {
|
|
169
|
+
const previous = new Map((0, calculated_field_utils_1.calculatedFieldsOf)(previousFields).map(field => [field.name, field.calculated.formula]));
|
|
170
|
+
return new Set(calculatedFields
|
|
171
|
+
.filter(field => previous.get(field.name) !== field.calculated.formula)
|
|
172
|
+
.map(field => field.name));
|
|
173
|
+
}
|
|
161
174
|
//# sourceMappingURL=update-data-mart-schema.service.js.map
|
|
@@ -72,14 +72,14 @@ let UpdateDataStorageService = class UpdateDataStorageService {
|
|
|
72
72
|
if (command.ownerIds !== undefined && command.userId) {
|
|
73
73
|
const canManage = await this.accessDecisionService.canAccess(command.userId, command.roles, access_decision_1.EntityType.STORAGE, command.id, access_decision_1.Action.MANAGE_OWNERS, command.projectId);
|
|
74
74
|
if (!canManage) {
|
|
75
|
-
throw new common_1.ForbiddenException('You do not have permission to manage owners of this Storage. You must be an owner with the
|
|
75
|
+
throw new common_1.ForbiddenException('You do not have permission to manage owners of this Storage. You must be an owner with the Data Owner role, or a Project Admin.');
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
if ((command.availableForUse !== undefined || command.availableForMaintenance !== undefined) &&
|
|
79
79
|
command.userId) {
|
|
80
80
|
const canConfigure = await this.accessDecisionService.canAccess(command.userId, command.roles, access_decision_1.EntityType.STORAGE, command.id, access_decision_1.Action.CONFIGURE_SHARING, command.projectId);
|
|
81
81
|
if (!canConfigure) {
|
|
82
|
-
throw new common_1.ForbiddenException('You do not have permission to configure sharing for this Storage. You must be an owner with the
|
|
82
|
+
throw new common_1.ForbiddenException('You do not have permission to configure sharing for this Storage. You must be an owner with the Data Owner role, or a Project Admin.');
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
const dataStorageEntity = await this.dataStorageService.getByProjectIdAndId(command.projectId, command.id);
|
|
@@ -32,6 +32,7 @@ const report_access_service_1 = require("../services/report-access.service");
|
|
|
32
32
|
const report_data_cache_service_1 = require("../services/report-data-cache.service");
|
|
33
33
|
const output_controls_validator_service_1 = require("../services/output-controls-validator.service");
|
|
34
34
|
const unique_count_sources_1 = require("../dto/schemas/unique-count-sources");
|
|
35
|
+
const auto_aggregation_opt_out_schema_1 = require("../dto/schemas/auto-aggregation-opt-out.schema");
|
|
35
36
|
const advanced_search_index_sync_service_1 = require("../services/advanced-search-index-sync.service");
|
|
36
37
|
const search_facade_1 = require("../../common/search/search.facade");
|
|
37
38
|
let UpdateReportService = class UpdateReportService {
|
|
@@ -132,6 +133,11 @@ let UpdateReportService = class UpdateReportService {
|
|
|
132
133
|
const previousDateTruncConfig = report.dateTruncConfig ?? null;
|
|
133
134
|
const nextDateTruncConfig = command.dateTruncConfig ?? null;
|
|
134
135
|
const dateTruncChanged = JSON.stringify(previousDateTruncConfig) !== JSON.stringify(nextDateTruncConfig);
|
|
136
|
+
const previousAutoAggregationOptOut = (0, auto_aggregation_opt_out_schema_1.foldEmptyAutoAggregationOptOut)(report.autoAggregationOptOut);
|
|
137
|
+
const nextAutoAggregationOptOut = (0, auto_aggregation_opt_out_schema_1.selectedAutoAggregationOptOut)(command.autoAggregationOptOut === undefined
|
|
138
|
+
? previousAutoAggregationOptOut
|
|
139
|
+
: command.autoAggregationOptOut, nextColumnConfig);
|
|
140
|
+
const autoAggregationOptOutChanged = JSON.stringify(previousAutoAggregationOptOut) !== JSON.stringify(nextAutoAggregationOptOut);
|
|
135
141
|
report.title = command.title;
|
|
136
142
|
report.dataDestination = dataDestination;
|
|
137
143
|
report.destinationConfig = command.destinationConfig;
|
|
@@ -142,6 +148,7 @@ let UpdateReportService = class UpdateReportService {
|
|
|
142
148
|
report.aggregationConfig = nextAggregationConfig;
|
|
143
149
|
report.dateTruncConfig = nextDateTruncConfig;
|
|
144
150
|
report.uniqueCountConfig = nextUniqueCountConfig;
|
|
151
|
+
report.autoAggregationOptOut = nextAutoAggregationOptOut;
|
|
145
152
|
const updatedReport = await this.reportRepository.save(report);
|
|
146
153
|
await this.advancedSearchIndexSync?.scheduleReindex(search_facade_1.SearchableEntityType.REPORT, updatedReport.id, command.projectId);
|
|
147
154
|
if (command.ownerIds !== undefined) {
|
|
@@ -158,7 +165,8 @@ let UpdateReportService = class UpdateReportService {
|
|
|
158
165
|
limitChanged ||
|
|
159
166
|
aggregationChanged ||
|
|
160
167
|
dateTruncChanged ||
|
|
161
|
-
uniqueCountChanged
|
|
168
|
+
uniqueCountChanged ||
|
|
169
|
+
autoAggregationOptOutChanged) {
|
|
162
170
|
await this.reportDataCacheService.invalidateByReportId(updatedReport.id);
|
|
163
171
|
}
|
|
164
172
|
const fresh = await this.reportRepository.findOne({
|
package/dist/src/ee/ee.module.js
CHANGED
|
@@ -15,15 +15,13 @@ const mcp_resource_module_1 = require("../mcp-resource/mcp-resource.module");
|
|
|
15
15
|
const project_settings_module_1 = require("../project-settings/project-settings.module");
|
|
16
16
|
const idp_mcp_auth_adapter_1 = require("./mcp/auth/idp-mcp-auth.adapter");
|
|
17
17
|
const mcp_auth_port_1 = require("./mcp/auth/mcp-auth.port");
|
|
18
|
-
const
|
|
19
|
-
const mcp_auth_guard_1 = require("./mcp/auth/mcp-auth.guard");
|
|
18
|
+
const mcp_auth_middleware_1 = require("./mcp/auth/mcp-auth.middleware");
|
|
20
19
|
const mcp_config_1 = require("./mcp/config/mcp.config");
|
|
21
20
|
const mcp_metadata_controller_1 = require("./mcp/controllers/mcp-metadata.controller");
|
|
22
|
-
const mcp_transport_controller_1 = require("./mcp/controllers/mcp-transport.controller");
|
|
23
21
|
const mcp_bus_extras_module_1 = require("./mcp/observability/mcp-bus-extras.module");
|
|
24
22
|
const mcp_call_instrumentation_1 = require("./mcp/observability/mcp-call-instrumentation");
|
|
25
23
|
const mcp_sdk_server_factory_1 = require("./mcp/sdk/mcp-sdk-server.factory");
|
|
26
|
-
const
|
|
24
|
+
const mcp_http_entry_service_1 = require("./mcp/transport/mcp-http-entry.service");
|
|
27
25
|
const mcp_instructions_service_1 = require("./mcp/instructions/mcp-instructions.service");
|
|
28
26
|
const mcp_tool_providers_1 = require("./mcp/tools/mcp-tool.providers");
|
|
29
27
|
const mcp_tool_registry_1 = require("./mcp/tools/mcp-tool.registry");
|
|
@@ -40,7 +38,7 @@ exports.EeModule = EeModule = __decorate([
|
|
|
40
38
|
project_settings_module_1.ProjectSettingsModule,
|
|
41
39
|
mcp_bus_extras_module_1.McpBusExtrasModule,
|
|
42
40
|
],
|
|
43
|
-
controllers: [mcp_metadata_controller_1.McpMetadataController
|
|
41
|
+
controllers: [mcp_metadata_controller_1.McpMetadataController],
|
|
44
42
|
providers: [
|
|
45
43
|
mcp_config_1.McpConfigService,
|
|
46
44
|
idp_mcp_auth_adapter_1.IdpMcpAuthAdapter,
|
|
@@ -48,15 +46,14 @@ exports.EeModule = EeModule = __decorate([
|
|
|
48
46
|
provide: mcp_auth_port_1.MCP_AUTH_PORT,
|
|
49
47
|
useExisting: idp_mcp_auth_adapter_1.IdpMcpAuthAdapter,
|
|
50
48
|
},
|
|
51
|
-
|
|
52
|
-
mcp_auth_exception_filter_1.McpAuthExceptionFilter,
|
|
49
|
+
mcp_auth_middleware_1.McpAuthMiddleware,
|
|
53
50
|
...mcp_tool_providers_1.MCP_TOOL_PROVIDER_CLASSES,
|
|
54
51
|
mcp_tool_providers_1.MCP_TOOL_DEFINITIONS_PROVIDER,
|
|
55
52
|
mcp_tool_registry_1.McpToolRegistry,
|
|
56
53
|
mcp_call_instrumentation_1.McpCallInstrumentation,
|
|
57
54
|
mcp_sdk_server_factory_1.McpSdkServerFactory,
|
|
58
55
|
mcp_instructions_service_1.McpInstructionsService,
|
|
59
|
-
|
|
56
|
+
mcp_http_entry_service_1.McpHttpEntryService,
|
|
60
57
|
],
|
|
61
58
|
exports: [mcp_config_1.McpConfigService],
|
|
62
59
|
})
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Request, RequestHandler } from 'express';
|
|
2
|
+
import type { AuthInfo } from '@modelcontextprotocol/server';
|
|
3
|
+
import type { McpTokenPayload } from '@owox/idp-protocol';
|
|
4
|
+
import { McpResourceResolverService } from '../../../mcp-resource/mcp-resource-resolver.service';
|
|
5
|
+
import { McpConfigService } from '../config/mcp.config';
|
|
6
|
+
import { type McpAuthPort } from './mcp-auth.port';
|
|
7
|
+
export interface McpAuthenticatedRequest extends Request {
|
|
8
|
+
auth?: AuthInfo;
|
|
9
|
+
}
|
|
10
|
+
export declare class McpAuthMiddleware {
|
|
11
|
+
private readonly auth;
|
|
12
|
+
private readonly resourceResolver;
|
|
13
|
+
private readonly config;
|
|
14
|
+
private readonly logger;
|
|
15
|
+
constructor(auth: McpAuthPort, resourceResolver: McpResourceResolverService, config: McpConfigService);
|
|
16
|
+
handle: RequestHandler;
|
|
17
|
+
private verify;
|
|
18
|
+
private reject;
|
|
19
|
+
private rejectUnexpected;
|
|
20
|
+
private extractBearerToken;
|
|
21
|
+
private getRequestedSessionId;
|
|
22
|
+
private assertPayload;
|
|
23
|
+
private getChallengeHeader;
|
|
24
|
+
private isExpectedAnonymousProbe;
|
|
25
|
+
}
|
|
26
|
+
export declare function toMcpAuthContext(authInfo: AuthInfo | undefined): McpTokenPayload;
|