@solidxai/core 0.1.13-beta.2 → 0.1.13-beta.20
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/CHANGELOG.md +9517 -0
- package/README.md +19 -0
- package/dist/commands/run-tests.command.d.ts +9 -1
- package/dist/commands/run-tests.command.d.ts.map +1 -1
- package/dist/commands/run-tests.command.js +69 -6
- package/dist/commands/run-tests.command.js.map +1 -1
- package/dist/commands/seed.command.d.ts +2 -0
- package/dist/commands/seed.command.d.ts.map +1 -1
- package/dist/commands/seed.command.js +21 -0
- package/dist/commands/seed.command.js.map +1 -1
- package/dist/config/cache.options.d.ts.map +1 -1
- package/dist/config/cache.options.js +2 -2
- package/dist/config/cache.options.js.map +1 -1
- package/dist/constants/chatter-message.constants.d.ts +1 -0
- package/dist/constants/chatter-message.constants.d.ts.map +1 -1
- package/dist/constants/chatter-message.constants.js +3 -1
- package/dist/constants/chatter-message.constants.js.map +1 -1
- package/dist/constants/draft-publish-fields.d.ts +2 -0
- package/dist/constants/draft-publish-fields.d.ts.map +1 -0
- package/dist/constants/draft-publish-fields.js +5 -0
- package/dist/constants/draft-publish-fields.js.map +1 -0
- package/dist/constants/error-messages.d.ts +7 -0
- package/dist/constants/error-messages.d.ts.map +1 -1
- package/dist/constants/error-messages.js +7 -0
- package/dist/constants/error-messages.js.map +1 -1
- package/dist/constants/media-file-types.d.ts +12 -0
- package/dist/constants/media-file-types.d.ts.map +1 -1
- package/dist/constants/media-file-types.js +65 -1
- package/dist/constants/media-file-types.js.map +1 -1
- package/dist/constants/success-messages.d.ts +3 -0
- package/dist/constants/success-messages.d.ts.map +1 -1
- package/dist/constants/success-messages.js +3 -0
- package/dist/constants/success-messages.js.map +1 -1
- package/dist/constants/user.constants.d.ts +2 -0
- package/dist/constants/user.constants.d.ts.map +1 -0
- package/dist/constants/user.constants.js +5 -0
- package/dist/constants/user.constants.js.map +1 -0
- package/dist/controllers/action-metadata.controller.d.ts +1 -1
- package/dist/controllers/action-metadata.controller.js +1 -1
- package/dist/controllers/agent-event.controller.d.ts +1 -1
- package/dist/controllers/agent-event.controller.js +1 -1
- package/dist/controllers/agent-session.controller.d.ts +1 -1
- package/dist/controllers/agent-session.controller.js +1 -1
- package/dist/controllers/authentication.controller.d.ts +1 -1
- package/dist/controllers/authentication.controller.d.ts.map +1 -1
- package/dist/controllers/authentication.controller.js +4 -3
- package/dist/controllers/authentication.controller.js.map +1 -1
- package/dist/controllers/chatter-message.controller.d.ts +5 -0
- package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
- package/dist/controllers/chatter-message.controller.js +14 -0
- package/dist/controllers/chatter-message.controller.js.map +1 -1
- package/dist/controllers/dashboard-user-layout.controller.d.ts +1 -1
- package/dist/controllers/dashboard-user-layout.controller.js +1 -1
- package/dist/controllers/email-template.controller.d.ts +1 -1
- package/dist/controllers/email-template.controller.js +1 -1
- package/dist/controllers/export-template.controller.d.ts +1 -1
- package/dist/controllers/export-template.controller.d.ts.map +1 -1
- package/dist/controllers/export-template.controller.js +6 -4
- package/dist/controllers/export-template.controller.js.map +1 -1
- package/dist/controllers/export-transaction.controller.d.ts +1 -1
- package/dist/controllers/export-transaction.controller.js +1 -1
- package/dist/controllers/field-metadata.controller.d.ts +2 -2
- package/dist/controllers/import-transaction-error-log.controller.d.ts +1 -1
- package/dist/controllers/import-transaction-error-log.controller.js +1 -1
- package/dist/controllers/import-transaction.controller.d.ts +1 -1
- package/dist/controllers/import-transaction.controller.d.ts.map +1 -1
- package/dist/controllers/import-transaction.controller.js +7 -7
- package/dist/controllers/import-transaction.controller.js.map +1 -1
- package/dist/controllers/list-of-values.controller.d.ts +1 -1
- package/dist/controllers/list-of-values.controller.js +1 -1
- package/dist/controllers/locale.controller.d.ts +1 -1
- package/dist/controllers/locale.controller.js +1 -1
- package/dist/controllers/mcp-audit-log.controller.d.ts +1 -1
- package/dist/controllers/mcp-audit-log.controller.js +1 -1
- package/dist/controllers/media.controller.d.ts +2 -2
- package/dist/controllers/media.controller.d.ts.map +1 -1
- package/dist/controllers/media.controller.js +13 -8
- package/dist/controllers/media.controller.js.map +1 -1
- package/dist/controllers/menu-item-metadata.controller.d.ts +1 -1
- package/dist/controllers/menu-item-metadata.controller.js +1 -1
- package/dist/controllers/model-sequence.controller.d.ts +1 -1
- package/dist/controllers/model-sequence.controller.js +1 -1
- package/dist/controllers/module-package.controller.d.ts.map +1 -1
- package/dist/controllers/module-package.controller.js +2 -3
- package/dist/controllers/module-package.controller.js.map +1 -1
- package/dist/controllers/mpin-authentication.controller.d.ts +44 -0
- package/dist/controllers/mpin-authentication.controller.d.ts.map +1 -0
- package/dist/controllers/mpin-authentication.controller.js +102 -0
- package/dist/controllers/mpin-authentication.controller.js.map +1 -0
- package/dist/controllers/mq-message-queue.controller.d.ts +1 -1
- package/dist/controllers/mq-message-queue.controller.js +1 -1
- package/dist/controllers/mq-message.controller.d.ts +1 -1
- package/dist/controllers/mq-message.controller.js +1 -1
- package/dist/controllers/permission-metadata.controller.d.ts +1 -1
- package/dist/controllers/permission-metadata.controller.js +1 -1
- package/dist/controllers/role-metadata.controller.d.ts +1 -1
- package/dist/controllers/role-metadata.controller.js +1 -1
- package/dist/controllers/saved-filters.controller.d.ts +1 -1
- package/dist/controllers/saved-filters.controller.js +1 -1
- package/dist/controllers/scheduled-job.controller.d.ts +1 -1
- package/dist/controllers/scheduled-job.controller.js +1 -1
- package/dist/controllers/security-rule.controller.d.ts +1 -1
- package/dist/controllers/security-rule.controller.js +1 -1
- package/dist/controllers/sms-template.controller.d.ts +1 -1
- package/dist/controllers/sms-template.controller.js +1 -1
- package/dist/controllers/user-activity-history.controller.d.ts +1 -1
- package/dist/controllers/user-activity-history.controller.js +1 -1
- package/dist/controllers/user-view-metadata.controller.d.ts +1 -1
- package/dist/controllers/user-view-metadata.controller.js +1 -1
- package/dist/controllers/user.controller.d.ts +2 -2
- package/dist/controllers/user.controller.js +2 -2
- package/dist/controllers/view-metadata.controller.d.ts +2 -2
- package/dist/controllers/view-metadata.controller.js +1 -1
- package/dist/controllers/workflow-definition.controller.d.ts +1 -1
- package/dist/controllers/workflow-definition.controller.js +1 -1
- package/dist/controllers/workflow-execution-artifact.controller.d.ts +1 -1
- package/dist/controllers/workflow-execution-artifact.controller.js +1 -1
- package/dist/controllers/workflow-execution-log.controller.d.ts +1 -1
- package/dist/controllers/workflow-execution-log.controller.js +1 -1
- package/dist/controllers/workflow-execution.controller.d.ts +1 -1
- package/dist/controllers/workflow-execution.controller.js +1 -1
- package/dist/controllers/workflow-secret.controller.d.ts +1 -1
- package/dist/controllers/workflow-secret.controller.js +1 -1
- package/dist/controllers/workflow-step-execution.controller.d.ts +1 -1
- package/dist/controllers/workflow-step-execution.controller.js +1 -1
- package/dist/controllers/workflow-trigger-execution.controller.d.ts +1 -1
- package/dist/controllers/workflow-trigger-execution.controller.js +1 -1
- package/dist/dtos/basic-filters.dto.d.ts +0 -1
- package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
- package/dist/dtos/basic-filters.dto.js +1 -6
- package/dist/dtos/basic-filters.dto.js.map +1 -1
- package/dist/dtos/change-mpin.dto.d.ts +6 -0
- package/dist/dtos/change-mpin.dto.d.ts.map +1 -0
- package/dist/dtos/change-mpin.dto.js +39 -0
- package/dist/dtos/change-mpin.dto.js.map +1 -0
- package/dist/dtos/create-field-metadata.dto.d.ts +2 -6
- package/dist/dtos/create-field-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-field-metadata.dto.js +4 -10
- package/dist/dtos/create-field-metadata.dto.js.map +1 -1
- package/dist/dtos/create-model-sequence.dto.d.ts +1 -1
- package/dist/dtos/create-model-sequence.dto.d.ts.map +1 -1
- package/dist/dtos/create-model-sequence.dto.js +1 -1
- package/dist/dtos/create-model-sequence.dto.js.map +1 -1
- package/dist/dtos/mpin-login.dto.d.ts +5 -0
- package/dist/dtos/mpin-login.dto.d.ts.map +1 -0
- package/dist/dtos/mpin-login.dto.js +33 -0
- package/dist/dtos/mpin-login.dto.js.map +1 -0
- package/dist/dtos/setup-mpin.dto.d.ts +7 -0
- package/dist/dtos/setup-mpin.dto.d.ts.map +1 -0
- package/dist/dtos/setup-mpin.dto.js +47 -0
- package/dist/dtos/setup-mpin.dto.js.map +1 -0
- package/dist/entities/common.entity.d.ts +4 -0
- package/dist/entities/common.entity.d.ts.map +1 -1
- package/dist/entities/common.entity.js +25 -1
- package/dist/entities/common.entity.js.map +1 -1
- package/dist/entities/dashboard-user-layout.entity.js +2 -2
- package/dist/entities/dashboard-user-layout.entity.js.map +1 -1
- package/dist/entities/saved-filters.entity.js +3 -3
- package/dist/entities/saved-filters.entity.js.map +1 -1
- package/dist/entities/user-device-credential.entity.d.ts +18 -0
- package/dist/entities/user-device-credential.entity.d.ts.map +1 -0
- package/dist/entities/user-device-credential.entity.js +91 -0
- package/dist/entities/user-device-credential.entity.js.map +1 -0
- package/dist/entities/user.entity.d.ts.map +1 -1
- package/dist/entities/user.entity.js +36 -0
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/entities/view-metadata.entity.js.map +1 -1
- package/dist/entities/workflow-execution-artifact.entity.d.ts.map +1 -1
- package/dist/entities/workflow-execution-artifact.entity.js +4 -3
- package/dist/entities/workflow-execution-artifact.entity.js.map +1 -1
- package/dist/entities/workflow-execution-log.entity.d.ts.map +1 -1
- package/dist/entities/workflow-execution-log.entity.js +4 -3
- package/dist/entities/workflow-execution-log.entity.js.map +1 -1
- package/dist/entities/workflow-execution.entity.d.ts.map +1 -1
- package/dist/entities/workflow-execution.entity.js +3 -2
- package/dist/entities/workflow-execution.entity.js.map +1 -1
- package/dist/entities/workflow-secret.entity.d.ts.map +1 -1
- package/dist/entities/workflow-secret.entity.js +3 -2
- package/dist/entities/workflow-secret.entity.js.map +1 -1
- package/dist/entities/workflow-step-execution.entity.d.ts.map +1 -1
- package/dist/entities/workflow-step-execution.entity.js +3 -2
- package/dist/entities/workflow-step-execution.entity.js.map +1 -1
- package/dist/entities/workflow-trigger-execution.entity.d.ts.map +1 -1
- package/dist/entities/workflow-trigger-execution.entity.js +7 -6
- package/dist/entities/workflow-trigger-execution.entity.js.map +1 -1
- package/dist/factories/mail.factory.d.ts.map +1 -1
- package/dist/factories/mail.factory.js +4 -0
- package/dist/factories/mail.factory.js.map +1 -1
- package/dist/filters/http-exception.filter.d.ts.map +1 -1
- package/dist/filters/http-exception.filter.js +5 -1
- package/dist/filters/http-exception.filter.js.map +1 -1
- package/dist/helpers/bootstrap.helper.d.ts +5 -2
- package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
- package/dist/helpers/bootstrap.helper.js +7 -3
- package/dist/helpers/bootstrap.helper.js.map +1 -1
- package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts +1 -0
- package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +18 -11
- package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js.map +1 -1
- package/dist/helpers/file-download.helper.d.ts +9 -0
- package/dist/helpers/file-download.helper.d.ts.map +1 -0
- package/dist/helpers/file-download.helper.js +19 -0
- package/dist/helpers/file-download.helper.js.map +1 -0
- package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
- package/dist/helpers/model-metadata-helper.service.js +30 -1
- package/dist/helpers/model-metadata-helper.service.js.map +1 -1
- package/dist/helpers/security.helper.d.ts +5 -1
- package/dist/helpers/security.helper.d.ts.map +1 -1
- package/dist/helpers/security.helper.js +15 -4
- package/dist/helpers/security.helper.js.map +1 -1
- package/dist/helpers/solid-core-error-codes-provider.service.d.ts.map +1 -1
- package/dist/helpers/solid-core-error-codes-provider.service.js +45 -0
- package/dist/helpers/solid-core-error-codes-provider.service.js.map +1 -1
- package/dist/helpers/solid-microservice-adapter.service.d.ts.map +1 -1
- package/dist/helpers/solid-microservice-adapter.service.js +1 -1
- package/dist/helpers/solid-microservice-adapter.service.js.map +1 -1
- package/dist/helpers/solid-registry.js +1 -1
- package/dist/helpers/solid-registry.js.map +1 -1
- package/dist/helpers/typeorm-db-helper.d.ts.map +1 -1
- package/dist/helpers/typeorm-db-helper.js +9 -0
- package/dist/helpers/typeorm-db-helper.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/active-user-data.interface.d.ts +1 -0
- package/dist/interfaces/active-user-data.interface.d.ts.map +1 -1
- package/dist/interfaces/active-user-data.interface.js.map +1 -1
- package/dist/interfaces.d.ts +1 -0
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/repository/user-device-credential.repository.d.ts +12 -0
- package/dist/repository/user-device-credential.repository.d.ts.map +1 -0
- package/dist/repository/user-device-credential.repository.js +34 -0
- package/dist/repository/user-device-credential.repository.js.map +1 -0
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +51 -30
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/module-test-data.service.d.ts +3 -1
- package/dist/seeders/module-test-data.service.d.ts.map +1 -1
- package/dist/seeders/module-test-data.service.js +8 -2
- package/dist/seeders/module-test-data.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +290 -78
- package/dist/services/api-key.service.d.ts.map +1 -1
- package/dist/services/api-key.service.js +1 -1
- package/dist/services/api-key.service.js.map +1 -1
- package/dist/services/authentication.service.d.ts +9 -5
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +102 -23
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/chatter-message.service.d.ts +15 -1
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +56 -4
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/crud-helper.service.d.ts +6 -4
- package/dist/services/crud-helper.service.d.ts.map +1 -1
- package/dist/services/crud-helper.service.js +32 -48
- package/dist/services/crud-helper.service.js.map +1 -1
- package/dist/services/crud.service.d.ts +13 -1
- package/dist/services/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +93 -68
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/datasource-introspection.service.d.ts.map +1 -1
- package/dist/services/datasource-introspection.service.js.map +1 -1
- package/dist/services/draft-publish-helper.service.d.ts +53 -0
- package/dist/services/draft-publish-helper.service.d.ts.map +1 -0
- package/dist/services/draft-publish-helper.service.js +402 -0
- package/dist/services/draft-publish-helper.service.js.map +1 -0
- package/dist/services/field-metadata.service.d.ts +2 -2
- package/dist/services/field-metadata.service.d.ts.map +1 -1
- package/dist/services/field-metadata.service.js +2 -1
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/internationalisation-helper.service.d.ts +19 -0
- package/dist/services/internationalisation-helper.service.d.ts.map +1 -0
- package/dist/services/internationalisation-helper.service.js +107 -0
- package/dist/services/internationalisation-helper.service.js.map +1 -0
- package/dist/services/locale.service.d.ts +1 -1
- package/dist/services/media-storage.utils.d.ts +1 -0
- package/dist/services/media-storage.utils.d.ts.map +1 -1
- package/dist/services/media-storage.utils.js +12 -1
- package/dist/services/media-storage.utils.js.map +1 -1
- package/dist/services/media.service.d.ts +3 -2
- package/dist/services/media.service.d.ts.map +1 -1
- package/dist/services/media.service.js +44 -29
- package/dist/services/media.service.js.map +1 -1
- package/dist/services/metadata-validation.service.d.ts +7 -0
- package/dist/services/metadata-validation.service.d.ts.map +1 -0
- package/dist/services/metadata-validation.service.js +42 -0
- package/dist/services/metadata-validation.service.js.map +1 -0
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +2 -1
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +2 -1
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/mpin.service.d.ts +67 -0
- package/dist/services/mpin.service.d.ts.map +1 -0
- package/dist/services/mpin.service.js +282 -0
- package/dist/services/mpin.service.js.map +1 -0
- package/dist/services/object.utils.d.ts +2 -0
- package/dist/services/object.utils.d.ts.map +1 -0
- package/dist/services/object.utils.js +11 -0
- package/dist/services/object.utils.js.map +1 -0
- package/dist/services/refresh-token-ids-storage.service.d.ts +25 -6
- package/dist/services/refresh-token-ids-storage.service.d.ts.map +1 -1
- package/dist/services/refresh-token-ids-storage.service.js +80 -42
- package/dist/services/refresh-token-ids-storage.service.js.map +1 -1
- package/dist/services/setting.service.d.ts.map +1 -1
- package/dist/services/setting.service.js +2 -1
- package/dist/services/setting.service.js.map +1 -1
- package/dist/services/settings/default-settings-provider.service.d.ts +228 -12
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
- package/dist/services/settings/default-settings-provider.service.js +129 -6
- package/dist/services/settings/default-settings-provider.service.js.map +1 -1
- package/dist/services/user.service.d.ts +2 -2
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +9 -3
- package/dist/services/user.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts +1 -2
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +3 -55
- package/dist/services/view-metadata.service.js.map +1 -1
- package/dist/services/workflow/nodes/execution-fail.node.d.ts +6 -0
- package/dist/services/workflow/nodes/execution-fail.node.d.ts.map +1 -0
- package/dist/services/workflow/nodes/execution-fail.node.js +81 -0
- package/dist/services/workflow/nodes/execution-fail.node.js.map +1 -0
- package/dist/services/workflow/nodes/for-each.node.d.ts +2 -0
- package/dist/services/workflow/nodes/for-each.node.d.ts.map +1 -1
- package/dist/services/workflow/nodes/for-each.node.js +114 -5
- package/dist/services/workflow/nodes/for-each.node.js.map +1 -1
- package/dist/services/workflow/nodes/if.node.d.ts.map +1 -1
- package/dist/services/workflow/nodes/if.node.js +7 -0
- package/dist/services/workflow/nodes/if.node.js.map +1 -1
- package/dist/services/workflow/nodes/log-write.node.d.ts.map +1 -1
- package/dist/services/workflow/nodes/log-write.node.js +2 -0
- package/dist/services/workflow/nodes/log-write.node.js.map +1 -1
- package/dist/services/workflow/nodes/loop-until.node.d.ts +12 -0
- package/dist/services/workflow/nodes/loop-until.node.d.ts.map +1 -0
- package/dist/services/workflow/nodes/loop-until.node.js +281 -0
- package/dist/services/workflow/nodes/loop-until.node.js.map +1 -0
- package/dist/services/workflow/nodes/parallel.node.d.ts.map +1 -1
- package/dist/services/workflow/nodes/parallel.node.js +7 -0
- package/dist/services/workflow/nodes/parallel.node.js.map +1 -1
- package/dist/services/workflow/nodes/sequential.node.d.ts.map +1 -1
- package/dist/services/workflow/nodes/sequential.node.js +7 -0
- package/dist/services/workflow/nodes/sequential.node.js.map +1 -1
- package/dist/services/workflow/nodes/switch.node.d.ts.map +1 -1
- package/dist/services/workflow/nodes/switch.node.js +7 -0
- package/dist/services/workflow/nodes/switch.node.js.map +1 -1
- package/dist/services/workflow/workflow-definition-validator.service.d.ts.map +1 -1
- package/dist/services/workflow/workflow-definition-validator.service.js +5 -2
- package/dist/services/workflow/workflow-definition-validator.service.js.map +1 -1
- package/dist/services/workflow/workflow-expression.service.d.ts.map +1 -1
- package/dist/services/workflow/workflow-expression.service.js +5 -0
- package/dist/services/workflow/workflow-expression.service.js.map +1 -1
- package/dist/services/workflow/workflow-node-registry.service.d.ts +2 -1
- package/dist/services/workflow/workflow-node-registry.service.d.ts.map +1 -1
- package/dist/services/workflow/workflow-node-registry.service.js +7 -0
- package/dist/services/workflow/workflow-node-registry.service.js.map +1 -1
- package/dist/services/workflow/workflow-runtime.service.d.ts +8 -0
- package/dist/services/workflow/workflow-runtime.service.d.ts.map +1 -1
- package/dist/services/workflow/workflow-runtime.service.js +197 -32
- package/dist/services/workflow/workflow-runtime.service.js.map +1 -1
- package/dist/services/workflow-definition.service.d.ts +1 -1
- package/dist/solid-core.module.d.ts +1 -3
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +22 -40
- package/dist/solid-core.module.js.map +1 -1
- package/dist/testing/adapters/ui/playwright-adapter.d.ts +5 -0
- package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -1
- package/dist/testing/adapters/ui/playwright-adapter.js +17 -1
- package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -1
- package/dist/testing/adapters/ui/ui.types.d.ts +2 -0
- package/dist/testing/adapters/ui/ui.types.d.ts.map +1 -1
- package/dist/testing/adapters/ui/ui.types.js.map +1 -1
- package/dist/testing/reporter/console-reporter.d.ts +3 -0
- package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
- package/dist/testing/reporter/console-reporter.js +2 -0
- package/dist/testing/reporter/console-reporter.js.map +1 -1
- package/dist/testing/reporter/progress-reporter.d.ts +64 -0
- package/dist/testing/reporter/progress-reporter.d.ts.map +1 -0
- package/dist/testing/reporter/progress-reporter.js +224 -0
- package/dist/testing/reporter/progress-reporter.js.map +1 -0
- package/dist/testing/reporter/reporter.types.d.ts +3 -0
- package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
- package/dist/testing/reporter/reporter.types.js.map +1 -1
- package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
- package/dist/testing/runner/run-from-metadata.js +1 -0
- package/dist/testing/runner/run-from-metadata.js.map +1 -1
- package/dist/testing/steps/ui/actions.step.d.ts.map +1 -1
- package/dist/testing/steps/ui/actions.step.js +6 -2
- package/dist/testing/steps/ui/actions.step.js.map +1 -1
- package/dist/testing/steps/ui/assertions.step.d.ts.map +1 -1
- package/dist/testing/steps/ui/assertions.step.js +11 -3
- package/dist/testing/steps/ui/assertions.step.js.map +1 -1
- package/dist/testing/steps/ui/form.step.d.ts.map +1 -1
- package/dist/testing/steps/ui/form.step.js +9 -3
- package/dist/testing/steps/ui/form.step.js.map +1 -1
- package/dist/testing/steps/ui/manual.step.js +1 -1
- package/dist/testing/steps/ui/manual.step.js.map +1 -1
- package/dist/testing/steps/ui/navigation.step.d.ts.map +1 -1
- package/dist/testing/steps/ui/navigation.step.js +3 -1
- package/dist/testing/steps/ui/navigation.step.js.map +1 -1
- package/dist/theme/theme-registry.d.ts +14 -0
- package/dist/theme/theme-registry.d.ts.map +1 -0
- package/dist/theme/theme-registry.js +147 -0
- package/dist/theme/theme-registry.js.map +1 -0
- package/dist/types/workflow-dsl.types.d.ts +14 -0
- package/dist/types/workflow-dsl.types.d.ts.map +1 -1
- package/dist/types/workflow-dsl.types.js.map +1 -1
- package/package.json +2 -2
- package/postman/mpin.postman_collection.json +1045 -0
- package/src/commands/run-tests.command.ts +64 -4
- package/src/commands/seed.command.ts +19 -0
- package/src/config/cache.options.ts +9 -1
- package/src/constants/chatter-message.constants.ts +12 -0
- package/src/constants/draft-publish-fields.ts +5 -0
- package/src/constants/error-messages.ts +14 -0
- package/src/constants/media-file-types.ts +127 -0
- package/src/constants/success-messages.ts +5 -0
- package/src/constants/user.constants.ts +13 -0
- package/src/controllers/authentication.controller.ts +5 -2
- package/src/controllers/chatter-message.controller.ts +8 -0
- package/src/controllers/export-template.controller.ts +5 -3
- package/src/controllers/import-transaction.controller.ts +6 -6
- package/src/controllers/media.controller.ts +17 -6
- package/src/controllers/module-package.controller.ts +2 -3
- package/src/controllers/mpin-authentication.controller.ts +67 -0
- package/src/dtos/basic-filters.dto.ts +0 -4
- package/src/dtos/change-mpin.dto.ts +18 -0
- package/src/dtos/create-field-metadata.dto.ts +4 -9
- package/src/dtos/create-model-sequence.dto.ts +1 -1
- package/src/dtos/mpin-login.dto.ts +24 -0
- package/src/dtos/setup-mpin.dto.ts +51 -0
- package/src/entities/common.entity.ts +24 -0
- package/src/entities/dashboard-user-layout.entity.ts +2 -2
- package/src/entities/saved-filters.entity.ts +3 -3
- package/src/entities/user-device-credential.entity.ts +130 -0
- package/src/entities/user.entity.ts +53 -36
- package/src/entities/view-metadata.entity.ts +2 -2
- package/src/entities/workflow-execution-artifact.entity.ts +4 -3
- package/src/entities/workflow-execution-log.entity.ts +4 -3
- package/src/entities/workflow-execution.entity.ts +3 -2
- package/src/entities/workflow-secret.entity.ts +3 -2
- package/src/entities/workflow-step-execution.entity.ts +3 -2
- package/src/entities/workflow-trigger-execution.entity.ts +7 -6
- package/src/factories/mail.factory.ts +7 -1
- package/src/filters/http-exception.filter.ts +11 -1
- package/src/helpers/bootstrap.helper.ts +43 -6
- package/src/helpers/field-crud-managers/MediaFieldCrudManager.ts +26 -12
- package/src/helpers/file-download.helper.ts +45 -0
- package/src/helpers/model-metadata-helper.service.ts +32 -1
- package/src/helpers/security.helper.ts +35 -8
- package/src/helpers/solid-core-error-codes-provider.service.ts +53 -0
- package/src/helpers/solid-microservice-adapter.service.ts +6 -1
- package/src/helpers/solid-registry.ts +1 -1
- package/src/helpers/typeorm-db-helper.ts +12 -1
- package/src/index.ts +10 -0
- package/src/interfaces/active-user-data.interface.ts +9 -0
- package/src/interfaces.ts +1 -0
- package/src/repository/user-device-credential.repository.ts +17 -0
- package/src/seeders/module-metadata-seeder.service.ts +61 -39
- package/src/seeders/module-test-data.service.ts +6 -0
- package/src/seeders/seed-data/solid-core-metadata.json +290 -78
- package/src/services/api-key.service.ts +13 -1
- package/src/services/authentication.service.ts +203 -41
- package/src/services/chatter-message.service.ts +124 -5
- package/src/services/crud-helper.service.ts +35 -50
- package/src/services/crud.service.ts +131 -105
- package/src/services/datasource-introspection.service.ts +5 -0
- package/src/services/draft-publish-helper.service.ts +581 -0
- package/src/services/field-metadata.service.ts +3 -2
- package/src/services/internationalisation-helper.service.ts +148 -0
- package/src/services/media-storage.utils.ts +26 -1
- package/src/services/media.service.ts +67 -36
- package/src/services/metadata-validation.service.ts +39 -0
- package/src/services/model-metadata.service.ts +4 -1
- package/src/services/module-metadata.service.ts +3 -1
- package/src/services/mpin.service.ts +447 -0
- package/src/services/object.utils.ts +10 -0
- package/src/services/refresh-token-ids-storage.service.ts +229 -90
- package/src/services/setting.service.ts +3 -1
- package/src/services/settings/default-settings-provider.service.ts +140 -6
- package/src/services/user.service.ts +18 -3
- package/src/services/view-metadata.service.ts +5 -145
- package/src/services/workflow/nodes/execution-fail.node.ts +82 -0
- package/src/services/workflow/nodes/for-each.node.ts +140 -6
- package/src/services/workflow/nodes/if.node.ts +7 -0
- package/src/services/workflow/nodes/log-write.node.ts +2 -0
- package/src/services/workflow/nodes/loop-until.node.ts +343 -0
- package/src/services/workflow/nodes/parallel.node.ts +7 -0
- package/src/services/workflow/nodes/sequential.node.ts +7 -0
- package/src/services/workflow/nodes/switch.node.ts +7 -0
- package/src/services/workflow/workflow-definition-validator.service.ts +5 -2
- package/src/services/workflow/workflow-expression.service.ts +5 -0
- package/src/services/workflow/workflow-node-registry.service.ts +11 -0
- package/src/services/workflow/workflow-runtime.service.ts +274 -39
- package/src/solid-core.module.ts +33 -15
- package/src/testing/README.md +75 -3
- package/src/testing/adapters/ui/playwright-adapter.ts +25 -0
- package/src/testing/adapters/ui/ui.types.ts +2 -0
- package/src/testing/reporter/console-reporter.ts +4 -0
- package/src/testing/reporter/progress-reporter.ts +251 -0
- package/src/testing/reporter/reporter.types.ts +3 -0
- package/src/testing/runner/run-from-metadata.ts +1 -0
- package/src/testing/steps/ui/actions.step.ts +8 -4
- package/src/testing/steps/ui/assertions.step.ts +18 -5
- package/src/testing/steps/ui/form.step.ts +16 -6
- package/src/testing/steps/ui/manual.step.ts +1 -1
- package/src/testing/steps/ui/navigation.step.ts +4 -2
- package/src/theme/theme-registry.ts +181 -0
- package/src/types/workflow-dsl.types.ts +43 -0
|
@@ -3,9 +3,12 @@ import { BasicFilterDto } from "../dtos/basic-filters.dto";
|
|
|
3
3
|
import { classify } from '../helpers/string.helper';
|
|
4
4
|
import { ActiveUserData } from "src/interfaces/active-user-data.interface";
|
|
5
5
|
import { SolidRegistry } from "src/helpers/solid-registry";
|
|
6
|
-
import { BadRequestException, Logger } from "@nestjs/common";
|
|
6
|
+
import { BadRequestException, Injectable, Logger } from "@nestjs/common";
|
|
7
7
|
import { ERROR_MESSAGES } from "src/constants/error-messages";
|
|
8
8
|
import { buildCastToText } from "src/helpers/typeorm-db-helper";
|
|
9
|
+
import { DraftPublishHelperService } from "./draft-publish-helper.service";
|
|
10
|
+
import { InternationalisationHelperService } from "./internationalisation-helper.service";
|
|
11
|
+
import { normalizeObjectKeys } from "./object.utils";
|
|
9
12
|
|
|
10
13
|
export enum FilterCombinator {
|
|
11
14
|
AND = '$and',
|
|
@@ -36,10 +39,14 @@ export interface ResolvedFieldPath {
|
|
|
36
39
|
leafIsRelation: boolean;
|
|
37
40
|
}
|
|
38
41
|
|
|
42
|
+
@Injectable()
|
|
39
43
|
export class CrudHelperService {
|
|
44
|
+
private readonly logger = new Logger(CrudHelperService.name);
|
|
45
|
+
|
|
40
46
|
constructor(
|
|
47
|
+
private readonly draftPublishHelperService: DraftPublishHelperService,
|
|
48
|
+
private readonly internationalisationHelperService: InternationalisationHelperService,
|
|
41
49
|
) { }
|
|
42
|
-
private readonly logger = new Logger(CrudHelperService.name);
|
|
43
50
|
|
|
44
51
|
/**
|
|
45
52
|
* Resolve a user-supplied dotted path (e.g. "customer.name") against real TypeORM metadata.
|
|
@@ -163,7 +170,7 @@ export class CrudHelperService {
|
|
|
163
170
|
}
|
|
164
171
|
|
|
165
172
|
applyFilters(qb: WhereExpressionBuilder, filters: any, alias: string = 'entity', selectQb: SelectQueryBuilder<any>) {
|
|
166
|
-
const normalizedFilters =
|
|
173
|
+
const normalizedFilters = normalizeObjectKeys(filters);
|
|
167
174
|
if (normalizedFilters.$and) {
|
|
168
175
|
normalizedFilters.$and.forEach((andFilter: any) => {
|
|
169
176
|
qb.andWhere(
|
|
@@ -182,7 +189,7 @@ export class CrudHelperService {
|
|
|
182
189
|
// For individual conditions
|
|
183
190
|
Object.keys(normalizedFilters).forEach(key => {
|
|
184
191
|
const primaryFilterObj = normalizedFilters[key];
|
|
185
|
-
const normalizedPrimaryFilterObj =
|
|
192
|
+
const normalizedPrimaryFilterObj = normalizeObjectKeys(primaryFilterObj);
|
|
186
193
|
|
|
187
194
|
const [rawField, funcAlias] = key.split(':');
|
|
188
195
|
|
|
@@ -312,17 +319,6 @@ export class CrudHelperService {
|
|
|
312
319
|
}
|
|
313
320
|
}
|
|
314
321
|
|
|
315
|
-
// Normalize the primary operator object by removing the surrounding brackets in the keys e.g [$eq] => $eq
|
|
316
|
-
private normalizeObjectKeys(obj: any): any {
|
|
317
|
-
return Object.keys(obj).reduce((acc, key) => {
|
|
318
|
-
// Transform the key by removing surrounding brackets
|
|
319
|
-
const newKey = key.replace(/^\[(.*)\]$/, '$1');
|
|
320
|
-
// Assign the value to the transformed key in the accumulator object
|
|
321
|
-
acc[newKey] = obj[key];
|
|
322
|
-
return acc;
|
|
323
|
-
}, {});
|
|
324
|
-
}
|
|
325
|
-
|
|
326
322
|
normalize(value: string | string[]): string[] {
|
|
327
323
|
if (!value) return []; // if the value is nullish, then return an empty array
|
|
328
324
|
return Array.isArray(value) ? value : [value]; // if the value is an array, return it as is, otherwise return it as an array
|
|
@@ -359,7 +355,7 @@ export class CrudHelperService {
|
|
|
359
355
|
applySorting: boolean = true
|
|
360
356
|
): SelectQueryBuilder<any> { // TODO : Check how to pass a type to SelectQueryBuilder instead of any
|
|
361
357
|
let { limit, offset, showSoftDeleted, filters } = basicFilterDto;
|
|
362
|
-
const { fields, sort, populate = [], populateMedia = [], locale
|
|
358
|
+
const { fields, sort, populate = [], populateMedia = [], locale } = basicFilterDto;
|
|
363
359
|
|
|
364
360
|
// Normalize the fields, sort, groupBy and populate options i.e (since they can be either a string or an array of strings, when coming from the request)
|
|
365
361
|
const normalizedFields = this.normalize(fields);
|
|
@@ -390,28 +386,14 @@ export class CrudHelperService {
|
|
|
390
386
|
}
|
|
391
387
|
}
|
|
392
388
|
|
|
393
|
-
let finalLocale = locale
|
|
394
389
|
if (internationalisation) {
|
|
395
|
-
// If locale is not provided in the filter dto, then assume it is the default locale to be used.
|
|
396
|
-
|
|
397
|
-
//Get default locale from registry
|
|
398
|
-
const solidRegistry = moduleRef.get(SolidRegistry, { strict: false });
|
|
399
|
-
const defaultLocale = solidRegistry.getDefaultLocale();
|
|
400
|
-
if(defaultLocale){
|
|
401
|
-
finalLocale = defaultLocale.locale;
|
|
402
|
-
}else{
|
|
403
|
-
finalLocale = 'en';
|
|
404
|
-
}
|
|
405
|
-
}
|
|
390
|
+
// If locale is not provided in the filter dto, then assume it is the default locale to be used.
|
|
391
|
+
const finalLocale = locale || this.internationalisationHelperService.resolveDefaultLocaleName(moduleRef.get(SolidRegistry, { strict: false }));
|
|
406
392
|
qb.andWhere(`${entityAlias}.localeName = :locale`, { locale: finalLocale });
|
|
407
393
|
}
|
|
408
394
|
|
|
409
|
-
if (draftPublishWorkflow
|
|
410
|
-
|
|
411
|
-
qb.andWhere(`${entityAlias}.publishedAt IS NOT NULL`);
|
|
412
|
-
} else if (basicFilterDto.status === 'draft') {
|
|
413
|
-
qb.andWhere(`${entityAlias}.publishedAt IS NULL`);
|
|
414
|
-
}
|
|
395
|
+
if (draftPublishWorkflow) {
|
|
396
|
+
this.draftPublishHelperService.applyDraftPublishFilterDefaults(qb, filters, entityAlias);
|
|
415
397
|
}
|
|
416
398
|
// Depending upon the select option, apply the select clause
|
|
417
399
|
if (normalizedFields && normalizedFields.length) {
|
|
@@ -907,25 +889,25 @@ export class CrudHelperService {
|
|
|
907
889
|
};
|
|
908
890
|
}
|
|
909
891
|
|
|
910
|
-
async countGroupedRecords(qb: SelectQueryBuilder<any>, basicFilterDto: BasicFilterDto, entityAlias: string) { //TODO : Check how to pass a type to SelectQueryBuilder instead of any
|
|
911
|
-
|
|
912
|
-
|
|
892
|
+
// async countGroupedRecords(qb: SelectQueryBuilder<any>, basicFilterDto: BasicFilterDto, entityAlias: string, internationalisation?: boolean, draftPublishWorkflow?: boolean, moduleRef?: any) { //TODO : Check how to pass a type to SelectQueryBuilder instead of any
|
|
893
|
+
// const { limit, offset, ...rest } = basicFilterDto;
|
|
894
|
+
// const filteredDto = { ...rest, limit: undefined, offset: undefined };
|
|
913
895
|
|
|
914
|
-
|
|
896
|
+
// const filteredQB = this.buildFilterQuery(qb, filteredDto as BasicFilterDto, entityAlias, internationalisation, draftPublishWorkflow, moduleRef, FilterCombinator.AND, false, false);
|
|
915
897
|
|
|
916
|
-
|
|
898
|
+
// const groupByFields = this.normalize(filteredDto.groupBy);
|
|
917
899
|
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
900
|
+
// if (!groupByFields || groupByFields.length === 0) {
|
|
901
|
+
// throw new Error(ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);
|
|
902
|
+
// }
|
|
921
903
|
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
904
|
+
// this.applyGroupBySelections(filteredQB, groupByFields, entityAlias);
|
|
905
|
+
// this.applyAggregates(filteredQB, ['count'], entityAlias);
|
|
906
|
+
// filteredQB.limit(undefined).offset(undefined).take(undefined).skip(undefined);
|
|
925
907
|
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
}
|
|
908
|
+
// const rawResults = await filteredQB.getRawMany();
|
|
909
|
+
// return rawResults.length;
|
|
910
|
+
// }
|
|
929
911
|
|
|
930
912
|
hasReadPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {
|
|
931
913
|
const permissionNames = [`${classify(modelName)}Controller.findOne`, `${classify(modelName)}Controller.findMany`];
|
|
@@ -998,7 +980,10 @@ export class CrudHelperService {
|
|
|
998
980
|
basicFilterDto: BasicFilterDto,
|
|
999
981
|
alias: string,
|
|
1000
982
|
createQbFn: () => Promise<SelectQueryBuilder<T>>,
|
|
1001
|
-
postProcessEntities?: (entities: T[]) => Promise<void
|
|
983
|
+
postProcessEntities?: (entities: T[]) => Promise<void>,
|
|
984
|
+
internationalisation?: boolean,
|
|
985
|
+
draftPublishWorkflow?: boolean,
|
|
986
|
+
moduleRef?: any
|
|
1002
987
|
): Promise<{ meta: { totalRecords: number }; groupMeta: any[]; groupRecords: any[] }> {
|
|
1003
988
|
const groupByFields = this.normalize(basicFilterDto.groupBy);
|
|
1004
989
|
if (!groupByFields.length) throw new BadRequestException(ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);
|
|
@@ -1033,7 +1018,7 @@ export class CrudHelperService {
|
|
|
1033
1018
|
aggregates: undefined,
|
|
1034
1019
|
sort: basicFilterDto.groupFilter?.sort,
|
|
1035
1020
|
};
|
|
1036
|
-
groupQb = this.buildFilterQuery(groupQb, groupFilterDto, alias);
|
|
1021
|
+
groupQb = this.buildFilterQuery(groupQb, groupFilterDto, alias, internationalisation, draftPublishWorkflow, moduleRef);
|
|
1037
1022
|
groupQb = this.buildGroupByRecordsQuery(groupQb, group, alias, groupAliasMap, aggregateAliasMap, groupExpressionMap);
|
|
1038
1023
|
const [entities, count] = await groupQb.getManyAndCount();
|
|
1039
1024
|
if (postProcessEntities) await postProcessEntities(entities);
|
|
@@ -7,6 +7,7 @@ import { SolidBaseRepository } from "../repository/solid-base.repository";
|
|
|
7
7
|
import { SettingService } from "./setting.service";
|
|
8
8
|
import { ERROR_MESSAGES } from "src/constants/error-messages";
|
|
9
9
|
import { SUCCESS_MESSAGES } from "src/constants/success-messages";
|
|
10
|
+
import { USER_SUMMARY_FIELDS } from "src/constants/user.constants";
|
|
10
11
|
import { EntityManager, FindOptionsWhere, In, IsNull, Not, QueryFailedError, SelectQueryBuilder } from "typeorm";
|
|
11
12
|
import { QueryDeepPartialEntity } from "typeorm/query-builder/QueryPartialEntity";
|
|
12
13
|
import { BasicFilterDto } from "../dtos/basic-filters.dto";
|
|
@@ -36,6 +37,8 @@ import { ShortTextFieldCrudManager } from "../helpers/field-crud-managers/ShortT
|
|
|
36
37
|
import { UUIDFieldCrudManager } from "../helpers/field-crud-managers/UUIDFieldCrudManager";
|
|
37
38
|
import { ModelMetadataHelperService } from "src/helpers/model-metadata-helper.service";
|
|
38
39
|
import { FieldCrudManager, MediaWithFullUrl } from "../interfaces";
|
|
40
|
+
import { DraftPublishHelperService } from "./draft-publish-helper.service";
|
|
41
|
+
import { InternationalisationHelperService } from "./internationalisation-helper.service";
|
|
39
42
|
import { CrudHelperService, FilterCombinator, UserIdFields } from "./crud-helper.service";
|
|
40
43
|
import { HashingService } from "./hashing.service";
|
|
41
44
|
import { SolidRegistry } from "src/helpers/solid-registry";
|
|
@@ -49,6 +52,8 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
49
52
|
|
|
50
53
|
private _modelMetadataService: ModelMetadataService;
|
|
51
54
|
private _crudHelperService: CrudHelperService;
|
|
55
|
+
private _draftPublishHelperService: DraftPublishHelperService;
|
|
56
|
+
private _internationalisationHelperService: InternationalisationHelperService;
|
|
52
57
|
private _discoveryService: DiscoveryService;
|
|
53
58
|
private _settingService: SettingService;
|
|
54
59
|
|
|
@@ -69,6 +74,14 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
69
74
|
return this._crudHelperService ??= this.moduleRef.get(CrudHelperService, { strict: false });
|
|
70
75
|
}
|
|
71
76
|
|
|
77
|
+
protected get draftPublishHelperService(): DraftPublishHelperService {
|
|
78
|
+
return this._draftPublishHelperService ??= this.moduleRef.get(DraftPublishHelperService, { strict: false });
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
protected get internationalisationHelperService(): InternationalisationHelperService {
|
|
82
|
+
return this._internationalisationHelperService ??= this.moduleRef.get(InternationalisationHelperService, { strict: false });
|
|
83
|
+
}
|
|
84
|
+
|
|
72
85
|
protected get discoveryService(): DiscoveryService {
|
|
73
86
|
return this._discoveryService ??= this.moduleRef.get(DiscoveryService, { strict: false });
|
|
74
87
|
}
|
|
@@ -77,6 +90,19 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
77
90
|
return this._settingService ??= this.moduleRef.get(SettingService, { strict: false });
|
|
78
91
|
}
|
|
79
92
|
|
|
93
|
+
private getDraftPublishCrudContext() {
|
|
94
|
+
return {
|
|
95
|
+
repo: this.repo,
|
|
96
|
+
modelName: this.modelName,
|
|
97
|
+
moduleName: this.moduleName,
|
|
98
|
+
validateAndTransformDto: this.validateAndTransformDto.bind(this),
|
|
99
|
+
saveMedia: this.saveMedia.bind(this),
|
|
100
|
+
getDatasourceDefaultEntityManager: this.getDatasourceDefaultEntityManager.bind(this),
|
|
101
|
+
getColumnDatabaseName: this.getColumnDatabaseName.bind(this),
|
|
102
|
+
escapeDatabaseName: this.escapeDatabaseName.bind(this),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
80
106
|
private async tryCreateAsExtensionUser(createDto: any): Promise<T | null> {
|
|
81
107
|
if (this.repo.metadata?.parentEntityMetadata?.target !== User) return null;
|
|
82
108
|
const registry = this.moduleRef.get(SolidRegistry, { strict: false });
|
|
@@ -122,8 +148,11 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
122
148
|
try {
|
|
123
149
|
// 5. Save the entity
|
|
124
150
|
// For media, we need to use a storage provider and save the media, then save the associated uri against the entity or media table
|
|
151
|
+
this.draftPublishHelperService.applyCreateDefaults(model, createDto);
|
|
152
|
+
this.internationalisationHelperService.applyCreateDefaults(model, createDto, this.moduleRef.get(SolidRegistry, { strict: false }));
|
|
125
153
|
const entity = this.repo.create(createDto);
|
|
126
|
-
|
|
154
|
+
let savedEntity = await this.repo.save(entity) as unknown as T;
|
|
155
|
+
savedEntity = await this.draftPublishHelperService.ensureInitialEntityVersionId(model, this.repo, savedEntity);
|
|
127
156
|
|
|
128
157
|
// 6. Save the media
|
|
129
158
|
if (hasMediaFields) {
|
|
@@ -210,9 +239,10 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
210
239
|
throw new Error(`Entity [${this.moduleName}.${this.modelName}] with id ${id} not found`);
|
|
211
240
|
}
|
|
212
241
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
242
|
+
this.draftPublishHelperService.assertUpdateAllowed(model, entity, this.modelName);
|
|
243
|
+
|
|
244
|
+
if (this.draftPublishHelperService.shouldCopyPublishedVersionForUpdate(model, entity)) {
|
|
245
|
+
return this.draftPublishHelperService.copyPublishedVersionAndUpdate(this.getDraftPublishCrudContext(), id, updateDto, files, isPartialUpdate, model);
|
|
216
246
|
}
|
|
217
247
|
|
|
218
248
|
// Capture pre-update many-to-many relation state for audit tracking
|
|
@@ -244,6 +274,18 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
244
274
|
return savedEntity;
|
|
245
275
|
}
|
|
246
276
|
|
|
277
|
+
private getColumnDatabaseName(propertyName: string): string {
|
|
278
|
+
const column = this.repo.metadata.findColumnWithPropertyName(propertyName);
|
|
279
|
+
if (!column) {
|
|
280
|
+
throw new Error(`Column ${propertyName} not found in entity ${this.repo.metadata.name}`);
|
|
281
|
+
}
|
|
282
|
+
return column.databaseName;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
private escapeDatabaseName(databaseName: string): string {
|
|
286
|
+
return this.repo.manager.connection.driver.escape(databaseName);
|
|
287
|
+
}
|
|
288
|
+
|
|
247
289
|
/**
|
|
248
290
|
* Captures the current state of audit-enabled many-to-many relations
|
|
249
291
|
* before the entity is updated. The snapshot is attached to the entity
|
|
@@ -306,32 +348,37 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
306
348
|
throw new Error(`Entity [${this.moduleName}.${this.modelName}] with id ${id} not found`);
|
|
307
349
|
}
|
|
308
350
|
|
|
309
|
-
|
|
310
|
-
|
|
351
|
+
const entitiesToDelete: T[] = [entity];
|
|
352
|
+
if (this.draftPublishHelperService.isDraftPublishEnabled(model)) {
|
|
353
|
+
this.draftPublishHelperService.assertDraftPublishDeleteAllowed(this.modelName, entitiesToDelete);
|
|
311
354
|
}
|
|
312
355
|
|
|
313
|
-
|
|
314
|
-
if (model.internationalisation) {
|
|
315
|
-
// Find all child entities where defaultEntityLocaleId === this entity's id
|
|
316
|
-
const childEntities = await this.repo.find({
|
|
317
|
-
where: { defaultEntityLocaleId: id } as any
|
|
318
|
-
});
|
|
356
|
+
await this.internationalisationHelperService.deleteChildLocaleEntities(this.repo, model, [id]);
|
|
319
357
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
358
|
+
return this.deleteEntitiesAndPromote(model, entitiesToDelete);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
private async deleteEntitiesAndPromote(model: ModelMetadata, entitiesToDelete: T[]): Promise<T[]> {
|
|
362
|
+
const isDraftPublishEnabled = this.draftPublishHelperService.isDraftPublishEnabled(model);
|
|
363
|
+
const deletedLatestChainIds = isDraftPublishEnabled
|
|
364
|
+
? this.draftPublishHelperService.getLatestDraftPublishChainIds(entitiesToDelete)
|
|
365
|
+
: [];
|
|
328
366
|
|
|
367
|
+
let deleteResult: T[];
|
|
329
368
|
if (model.enableSoftDelete === true) {
|
|
330
|
-
|
|
331
|
-
|
|
369
|
+
this.draftPublishHelperService.markDeletedDraftPublishVersionsAsNotLatest(model, entitiesToDelete);
|
|
370
|
+
await this.repo.softRemove(entitiesToDelete);
|
|
371
|
+
deleteResult = await this.repo.save(entitiesToDelete);
|
|
332
372
|
} else {
|
|
333
|
-
|
|
373
|
+
deleteResult = await this.repo.remove(entitiesToDelete);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
if (isDraftPublishEnabled) {
|
|
377
|
+
const deletedEntityIds = this.draftPublishHelperService.getEntityIds(entitiesToDelete);
|
|
378
|
+
await this.draftPublishHelperService.promoteLatestDraftPublishVersionAfterDelete(this.repo, deletedLatestChainIds, deletedEntityIds);
|
|
334
379
|
}
|
|
380
|
+
|
|
381
|
+
return deleteResult;
|
|
335
382
|
}
|
|
336
383
|
|
|
337
384
|
private async fieldCrudManager(fieldMetadata: FieldMetadata, entityManager: EntityManager, isPartialUpdate: boolean = false, isUpdate: boolean = false, entityId?: number) {
|
|
@@ -528,9 +575,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
528
575
|
var qb: SelectQueryBuilder<T> = await this.repo.createSecurityRuleAwareQueryBuilder(alias)
|
|
529
576
|
|
|
530
577
|
if (basicFilterDto.groupBy?.length) {
|
|
531
|
-
const groupFilterQb = (internationalisation
|
|
532
|
-
? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef, FilterCombinator.AND, false, false)
|
|
533
|
-
: this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, undefined, undefined, undefined, FilterCombinator.AND, false, false);
|
|
578
|
+
const groupFilterQb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef, FilterCombinator.AND, false, false);
|
|
534
579
|
|
|
535
580
|
return this.crudHelperService.executeGroupPipeline(
|
|
536
581
|
groupFilterQb, basicFilterDto, alias,
|
|
@@ -538,13 +583,12 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
538
583
|
async (entities) => {
|
|
539
584
|
if (populateUserIdFields?.length) await this.handlePopulateUserIdFields(populateUserIdFields, entities);
|
|
540
585
|
if (populateMedia?.length) await this.handlePopulateMedia(populateMedia, entities);
|
|
541
|
-
}
|
|
586
|
+
},
|
|
587
|
+
internationalisation, draftPublishWorkflow, this.moduleRef
|
|
542
588
|
);
|
|
543
589
|
}
|
|
544
590
|
else {
|
|
545
|
-
qb = (internationalisation
|
|
546
|
-
? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef)
|
|
547
|
-
: this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);
|
|
591
|
+
qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef);
|
|
548
592
|
const { meta, records } = await this.handleNonGroupFind(qb, populateUserIdFields, populateMedia, offset, limit, alias);
|
|
549
593
|
return {
|
|
550
594
|
meta,
|
|
@@ -573,6 +617,29 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
573
617
|
return this.crudHelperService.pagedResponse(offset, limit, count, entities);
|
|
574
618
|
}
|
|
575
619
|
|
|
620
|
+
/**
|
|
621
|
+
* Reduce a user to USER_SUMMARY_FIELDS as a plain object.
|
|
622
|
+
*
|
|
623
|
+
* Returning the hydrated entity is not good enough. A partially selected `User` is still
|
|
624
|
+
* built with `new User()`, so every property that has a TypeScript field initializer
|
|
625
|
+
* (`active`, `forcePasswordChange`, `lastLoginProvider`, `failedLoginAttempts`,
|
|
626
|
+
* `isAllowedToGenerateApiKeys`) is present on the instance holding its *default* rather
|
|
627
|
+
* than the value in the database - `active: true` for a user who may well be inactive.
|
|
628
|
+
* Serialization does not help: those defaults are real own properties. Copying the
|
|
629
|
+
* allowlist into a fresh object is what guarantees the response contains only columns
|
|
630
|
+
* actually read from the database.
|
|
631
|
+
*/
|
|
632
|
+
protected toUserSummary(user: unknown): Partial<User> | null {
|
|
633
|
+
if (!user) {
|
|
634
|
+
return null;
|
|
635
|
+
}
|
|
636
|
+
const summary: Partial<User> = {};
|
|
637
|
+
for (const field of USER_SUMMARY_FIELDS) {
|
|
638
|
+
summary[field] = user[field] as never;
|
|
639
|
+
}
|
|
640
|
+
return summary;
|
|
641
|
+
}
|
|
642
|
+
|
|
576
643
|
// entities is an array of T
|
|
577
644
|
// T can contain createdBy and updatedBy fields
|
|
578
645
|
// We need to populate the createdBy and updatedBy fields with the User entity
|
|
@@ -584,9 +651,15 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
584
651
|
if (userId) {
|
|
585
652
|
const user = await userRepository.findOne({
|
|
586
653
|
where: { id: userId },
|
|
654
|
+
// SECURITY: a populated createdBy/updatedBy is only ever displayed as
|
|
655
|
+
// "who did this", so it must not ship the author's email, mobile, role
|
|
656
|
+
// assignments or API keys - let alone the credential columns, which
|
|
657
|
+
// survive here whenever User is subclassed (class-transformer resolves
|
|
658
|
+
// @Exclude() per class and does not inherit it).
|
|
659
|
+
select: USER_SUMMARY_FIELDS as unknown as (keyof User)[],
|
|
587
660
|
});
|
|
588
661
|
// @ts-ignore
|
|
589
|
-
entity[userFieldPath] = user;
|
|
662
|
+
entity[userFieldPath] = this.toUserSummary(user);
|
|
590
663
|
}
|
|
591
664
|
}
|
|
592
665
|
}
|
|
@@ -765,6 +838,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
765
838
|
module: true,
|
|
766
839
|
});
|
|
767
840
|
|
|
841
|
+
const solidRegistry = this.moduleRef.get(SolidRegistry, { strict: false });
|
|
768
842
|
const entitiesForSave: T[] = [];
|
|
769
843
|
for (const createDto of createDtos) {
|
|
770
844
|
// Validate and transform each createDto sequentially
|
|
@@ -777,6 +851,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
777
851
|
}
|
|
778
852
|
transformedDto = await fieldManager.transformForCreate(createDto);
|
|
779
853
|
}
|
|
854
|
+
this.internationalisationHelperService.applyCreateDefaults(model, transformedDto, solidRegistry);
|
|
780
855
|
const entity = this.repo.create(transformedDto);
|
|
781
856
|
entitiesForSave.push(entity as unknown as T);
|
|
782
857
|
}
|
|
@@ -814,7 +889,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
814
889
|
|
|
815
890
|
|
|
816
891
|
|
|
817
|
-
const removedEntities = [];
|
|
892
|
+
const removedEntities: T[] = [];
|
|
818
893
|
for (let i = 0; i < ids.length; i++) {
|
|
819
894
|
const id = ids[i]
|
|
820
895
|
const entity = await this.repo.findOne({
|
|
@@ -823,36 +898,21 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
823
898
|
} as unknown as FindOptionsWhere<T>,
|
|
824
899
|
});
|
|
825
900
|
|
|
901
|
+
if (!entity) {
|
|
902
|
+
throw new Error(`Entity [${this.moduleName}.${this.modelName}] with id ${id} not found`);
|
|
903
|
+
}
|
|
904
|
+
|
|
826
905
|
removedEntities.push(entity);
|
|
827
906
|
}
|
|
828
907
|
|
|
829
908
|
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
let publishedEntitiesExists: T[] = [];
|
|
834
|
-
|
|
835
|
-
if (isDraftPublishEnabled) {
|
|
836
|
-
publishedEntitiesExists = removedEntities.filter(
|
|
837
|
-
(x) => !!x?.publishedAt
|
|
838
|
-
);
|
|
909
|
+
if (this.draftPublishHelperService.isDraftPublishEnabled(model)) {
|
|
910
|
+
this.draftPublishHelperService.assertDraftPublishDeleteAllowed(this.modelName, removedEntities);
|
|
839
911
|
}
|
|
840
912
|
|
|
841
|
-
|
|
842
|
-
const publishedEntitiesExistsID = publishedEntitiesExists.map(x => x.id);
|
|
913
|
+
await this.internationalisationHelperService.deleteChildLocaleEntities(this.repo, model, ids);
|
|
843
914
|
|
|
844
|
-
|
|
845
|
-
`Cannot delete published record(s) for model ${this.modelName} with Ids ${publishedEntitiesExistsID.join(', ')}. Unpublish them first.`
|
|
846
|
-
);
|
|
847
|
-
}
|
|
848
|
-
|
|
849
|
-
if (model.enableSoftDelete === true) {
|
|
850
|
-
await this.repo.softRemove(removedEntities);
|
|
851
|
-
return this.repo.save(removedEntities);
|
|
852
|
-
} else {
|
|
853
|
-
return this.repo.remove(removedEntities);
|
|
854
|
-
}
|
|
855
|
-
// return removedEntities
|
|
915
|
+
return this.deleteEntitiesAndPromote(model, removedEntities);
|
|
856
916
|
}
|
|
857
917
|
|
|
858
918
|
async recover(id: number, solidRequestContext: any = {}) {
|
|
@@ -882,6 +942,10 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
882
942
|
} as unknown as QueryDeepPartialEntity<T>
|
|
883
943
|
);
|
|
884
944
|
|
|
945
|
+
if (this.draftPublishHelperService.isDraftPublishEnabled(loadedmodel)) {
|
|
946
|
+
await this.draftPublishHelperService.promoteRecoveredDraftPublishVersion(this.repo, softDeletedRows);
|
|
947
|
+
}
|
|
948
|
+
|
|
885
949
|
return { message: SUCCESS_MESSAGES.RECORD_RECOVERED, data: softDeletedRows };
|
|
886
950
|
} catch (error: any) {
|
|
887
951
|
if (error instanceof QueryFailedError && (error as any).code === '23505') {
|
|
@@ -928,6 +992,14 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
928
992
|
{ deletedAt: null, deletedTracker: "not-deleted" } as unknown as QueryDeepPartialEntity<T>
|
|
929
993
|
);
|
|
930
994
|
|
|
995
|
+
if (this.draftPublishHelperService.isDraftPublishEnabled(loadedmodel)) {
|
|
996
|
+
// Sequential: two ids in the same batch could belong to the same version
|
|
997
|
+
// chain, and each promotion clears isLatest across the whole chain first.
|
|
998
|
+
for (const entity of softDeletedRows) {
|
|
999
|
+
await this.draftPublishHelperService.promoteRecoveredDraftPublishVersion(this.repo, entity);
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
|
|
931
1003
|
return { message: SUCCESS_MESSAGES.SELECTED_RECORDS_RECOVERED, recoveredIds: ids };
|
|
932
1004
|
} catch (error: any) {
|
|
933
1005
|
if (error instanceof QueryFailedError && (error as any).code === "23505") {
|
|
@@ -982,18 +1054,11 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
982
1054
|
return model.userKeyField?.name || '';
|
|
983
1055
|
}
|
|
984
1056
|
|
|
985
|
-
/* Publish a record -
|
|
1057
|
+
/* Publish a record - marks the selected version as the active published version. */
|
|
986
1058
|
async publishRecord(id: number, solidRequestContext: any = {}): Promise<T> {
|
|
987
1059
|
|
|
988
1060
|
const model = await this.loadModel();
|
|
989
1061
|
|
|
990
|
-
// Check if publish workflow is enabled for this model
|
|
991
|
-
if (!model.draftPublishWorkflow) {
|
|
992
|
-
throw new BadRequestException(
|
|
993
|
-
`Publish workflow is not enabled for ${this.modelName}`
|
|
994
|
-
);
|
|
995
|
-
}
|
|
996
|
-
|
|
997
1062
|
// Check user permissions
|
|
998
1063
|
if (solidRequestContext.activeUser) {
|
|
999
1064
|
const hasPermission = this.crudHelperService.hasPublishPermissionOnModel(
|
|
@@ -1005,37 +1070,14 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
1005
1070
|
}
|
|
1006
1071
|
}
|
|
1007
1072
|
|
|
1008
|
-
|
|
1009
|
-
const entity = await this.repo.findOne({ where: { id } as any });
|
|
1010
|
-
if (!entity) {
|
|
1011
|
-
throw new NotFoundException(`${this.modelName} with id ${id} not found`);
|
|
1012
|
-
}
|
|
1013
|
-
|
|
1014
|
-
// Check if already published
|
|
1015
|
-
if (entity.publishedAt) {
|
|
1016
|
-
throw new BadRequestException(
|
|
1017
|
-
`${this.modelName} with id ${id} is already published`
|
|
1018
|
-
);
|
|
1019
|
-
}
|
|
1020
|
-
|
|
1021
|
-
// Update publish status
|
|
1022
|
-
const updatedEntity = await this.repo.save({ ...entity, publishedAt: new Date() });
|
|
1023
|
-
|
|
1024
|
-
return updatedEntity
|
|
1073
|
+
return this.draftPublishHelperService.publishRecord(this.repo, model, this.modelName, id, solidRequestContext.activeUser);
|
|
1025
1074
|
}
|
|
1026
1075
|
|
|
1027
|
-
/* Unpublish a record -
|
|
1076
|
+
/* Unpublish a record - marks the selected version as not currently published. */
|
|
1028
1077
|
async unpublishRecord(id: number, solidRequestContext: any = {}): Promise<T> {
|
|
1029
1078
|
|
|
1030
1079
|
const model = await this.loadModel();
|
|
1031
1080
|
|
|
1032
|
-
// Check if publish workflow is enabled for this model
|
|
1033
|
-
if (!model.draftPublishWorkflow) {
|
|
1034
|
-
throw new BadRequestException(
|
|
1035
|
-
`Publish workflow is not enabled for ${this.modelName}`
|
|
1036
|
-
);
|
|
1037
|
-
}
|
|
1038
|
-
|
|
1039
1081
|
// Check user permissions
|
|
1040
1082
|
if (solidRequestContext.activeUser) {
|
|
1041
1083
|
const hasPermission = this.crudHelperService.hasUnpublishPermissionOnModel(
|
|
@@ -1047,23 +1089,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
1047
1089
|
}
|
|
1048
1090
|
}
|
|
1049
1091
|
|
|
1050
|
-
|
|
1051
|
-
const entity = await this.repo.findOne({ where: { id } as any });
|
|
1052
|
-
if (!entity) {
|
|
1053
|
-
throw new NotFoundException(`${this.modelName} with id ${id} not found`);
|
|
1054
|
-
}
|
|
1055
|
-
|
|
1056
|
-
// Check if already unpublished
|
|
1057
|
-
if (!entity.publishedAt) {
|
|
1058
|
-
throw new BadRequestException(
|
|
1059
|
-
`${this.modelName} with id ${id} is already unpublished`
|
|
1060
|
-
);
|
|
1061
|
-
}
|
|
1062
|
-
|
|
1063
|
-
// Update unpublish status
|
|
1064
|
-
const updatedEntity = await this.repo.save({ ...entity, publishedAt: null });
|
|
1065
|
-
|
|
1066
|
-
return updatedEntity
|
|
1092
|
+
return this.draftPublishHelperService.unpublishRecord(this.repo, model, this.modelName, id, solidRequestContext.activeUser);
|
|
1067
1093
|
}
|
|
1068
1094
|
|
|
1069
1095
|
private getDatasourceDefaultEntityManager() {
|
|
@@ -1680,6 +1680,11 @@ export class DatasourceIntrospectionService {
|
|
|
1680
1680
|
|
|
1681
1681
|
private getLegacySuperclassFieldName(columnName: string, legacyTableType: LegacyTableType) {
|
|
1682
1682
|
const normalized = columnName.toLowerCase();
|
|
1683
|
+
// LegacyCommonEntityWithExistingId doesn't declare the draft/publish versioning
|
|
1684
|
+
// columns (see DRAFT_PUBLISH_VERSIONING_FIELD_NAMES), so their ss_-prefixed column
|
|
1685
|
+
// names must not appear here — otherwise a table that still physically has one of
|
|
1686
|
+
// those columns would have it silently treated as superclass-handled and dropped
|
|
1687
|
+
// from introspection instead of being surfaced as a real column.
|
|
1683
1688
|
const legacyFieldMap: Record<string, string> = {
|
|
1684
1689
|
ss_created_at: "createdAt",
|
|
1685
1690
|
ss_updated_at: "updatedAt",
|