@solidxai/core 0.1.13-beta.2 → 0.1.13-beta.21
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 +10107 -0
- package/CLAUDE.md +5 -6
- 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 +66 -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 +3 -6
- package/dist/dtos/create-field-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-field-metadata.dto.js +15 -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/field-metadata.entity.d.ts +1 -0
- package/dist/entities/field-metadata.entity.d.ts.map +1 -1
- package/dist/entities/field-metadata.entity.js +5 -1
- package/dist/entities/field-metadata.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 +7 -0
- package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +66 -32
- 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 +16 -1
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +100 -16
- 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 +94 -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 +4 -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 +45 -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 +9 -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 +6 -1
- package/dist/services/setting.service.js.map +1 -1
- package/dist/services/settings/default-settings-provider.service.d.ts +248 -12
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
- package/dist/services/settings/default-settings-provider.service.js +143 -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 +28 -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/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 +128 -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 +17 -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/field-metadata.entity.ts +3 -0
- 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 +90 -37
- 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 +180 -19
- package/src/services/crud-helper.service.ts +35 -50
- package/src/services/crud.service.ts +132 -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 +5 -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 +68 -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 +10 -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 +8 -1
- package/src/services/settings/default-settings-provider.service.ts +154 -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 +46 -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
|
@@ -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) {
|
|
@@ -399,6 +446,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
399
446
|
...commonOptions,
|
|
400
447
|
mediaMaxSizeKb: fieldMetadata.mediaMaxSizeKb,
|
|
401
448
|
mediaTypes: fieldMetadata.mediaTypes,
|
|
449
|
+
mediaAllowedExtensions: fieldMetadata.mediaAllowedExtensions,
|
|
402
450
|
type: fieldMetadata.type as unknown as SolidMediaType
|
|
403
451
|
};
|
|
404
452
|
return new MediaFieldCrudManager(options);
|
|
@@ -528,9 +576,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
528
576
|
var qb: SelectQueryBuilder<T> = await this.repo.createSecurityRuleAwareQueryBuilder(alias)
|
|
529
577
|
|
|
530
578
|
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);
|
|
579
|
+
const groupFilterQb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef, FilterCombinator.AND, false, false);
|
|
534
580
|
|
|
535
581
|
return this.crudHelperService.executeGroupPipeline(
|
|
536
582
|
groupFilterQb, basicFilterDto, alias,
|
|
@@ -538,13 +584,12 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
538
584
|
async (entities) => {
|
|
539
585
|
if (populateUserIdFields?.length) await this.handlePopulateUserIdFields(populateUserIdFields, entities);
|
|
540
586
|
if (populateMedia?.length) await this.handlePopulateMedia(populateMedia, entities);
|
|
541
|
-
}
|
|
587
|
+
},
|
|
588
|
+
internationalisation, draftPublishWorkflow, this.moduleRef
|
|
542
589
|
);
|
|
543
590
|
}
|
|
544
591
|
else {
|
|
545
|
-
qb = (internationalisation
|
|
546
|
-
? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef)
|
|
547
|
-
: this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);
|
|
592
|
+
qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef);
|
|
548
593
|
const { meta, records } = await this.handleNonGroupFind(qb, populateUserIdFields, populateMedia, offset, limit, alias);
|
|
549
594
|
return {
|
|
550
595
|
meta,
|
|
@@ -573,6 +618,29 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
573
618
|
return this.crudHelperService.pagedResponse(offset, limit, count, entities);
|
|
574
619
|
}
|
|
575
620
|
|
|
621
|
+
/**
|
|
622
|
+
* Reduce a user to USER_SUMMARY_FIELDS as a plain object.
|
|
623
|
+
*
|
|
624
|
+
* Returning the hydrated entity is not good enough. A partially selected `User` is still
|
|
625
|
+
* built with `new User()`, so every property that has a TypeScript field initializer
|
|
626
|
+
* (`active`, `forcePasswordChange`, `lastLoginProvider`, `failedLoginAttempts`,
|
|
627
|
+
* `isAllowedToGenerateApiKeys`) is present on the instance holding its *default* rather
|
|
628
|
+
* than the value in the database - `active: true` for a user who may well be inactive.
|
|
629
|
+
* Serialization does not help: those defaults are real own properties. Copying the
|
|
630
|
+
* allowlist into a fresh object is what guarantees the response contains only columns
|
|
631
|
+
* actually read from the database.
|
|
632
|
+
*/
|
|
633
|
+
protected toUserSummary(user: unknown): Partial<User> | null {
|
|
634
|
+
if (!user) {
|
|
635
|
+
return null;
|
|
636
|
+
}
|
|
637
|
+
const summary: Partial<User> = {};
|
|
638
|
+
for (const field of USER_SUMMARY_FIELDS) {
|
|
639
|
+
summary[field] = user[field] as never;
|
|
640
|
+
}
|
|
641
|
+
return summary;
|
|
642
|
+
}
|
|
643
|
+
|
|
576
644
|
// entities is an array of T
|
|
577
645
|
// T can contain createdBy and updatedBy fields
|
|
578
646
|
// We need to populate the createdBy and updatedBy fields with the User entity
|
|
@@ -584,9 +652,15 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
584
652
|
if (userId) {
|
|
585
653
|
const user = await userRepository.findOne({
|
|
586
654
|
where: { id: userId },
|
|
655
|
+
// SECURITY: a populated createdBy/updatedBy is only ever displayed as
|
|
656
|
+
// "who did this", so it must not ship the author's email, mobile, role
|
|
657
|
+
// assignments or API keys - let alone the credential columns, which
|
|
658
|
+
// survive here whenever User is subclassed (class-transformer resolves
|
|
659
|
+
// @Exclude() per class and does not inherit it).
|
|
660
|
+
select: USER_SUMMARY_FIELDS as unknown as (keyof User)[],
|
|
587
661
|
});
|
|
588
662
|
// @ts-ignore
|
|
589
|
-
entity[userFieldPath] = user;
|
|
663
|
+
entity[userFieldPath] = this.toUserSummary(user);
|
|
590
664
|
}
|
|
591
665
|
}
|
|
592
666
|
}
|
|
@@ -765,6 +839,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
765
839
|
module: true,
|
|
766
840
|
});
|
|
767
841
|
|
|
842
|
+
const solidRegistry = this.moduleRef.get(SolidRegistry, { strict: false });
|
|
768
843
|
const entitiesForSave: T[] = [];
|
|
769
844
|
for (const createDto of createDtos) {
|
|
770
845
|
// Validate and transform each createDto sequentially
|
|
@@ -777,6 +852,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
777
852
|
}
|
|
778
853
|
transformedDto = await fieldManager.transformForCreate(createDto);
|
|
779
854
|
}
|
|
855
|
+
this.internationalisationHelperService.applyCreateDefaults(model, transformedDto, solidRegistry);
|
|
780
856
|
const entity = this.repo.create(transformedDto);
|
|
781
857
|
entitiesForSave.push(entity as unknown as T);
|
|
782
858
|
}
|
|
@@ -814,7 +890,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
814
890
|
|
|
815
891
|
|
|
816
892
|
|
|
817
|
-
const removedEntities = [];
|
|
893
|
+
const removedEntities: T[] = [];
|
|
818
894
|
for (let i = 0; i < ids.length; i++) {
|
|
819
895
|
const id = ids[i]
|
|
820
896
|
const entity = await this.repo.findOne({
|
|
@@ -823,36 +899,21 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
823
899
|
} as unknown as FindOptionsWhere<T>,
|
|
824
900
|
});
|
|
825
901
|
|
|
902
|
+
if (!entity) {
|
|
903
|
+
throw new Error(`Entity [${this.moduleName}.${this.modelName}] with id ${id} not found`);
|
|
904
|
+
}
|
|
905
|
+
|
|
826
906
|
removedEntities.push(entity);
|
|
827
907
|
}
|
|
828
908
|
|
|
829
909
|
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
let publishedEntitiesExists: T[] = [];
|
|
834
|
-
|
|
835
|
-
if (isDraftPublishEnabled) {
|
|
836
|
-
publishedEntitiesExists = removedEntities.filter(
|
|
837
|
-
(x) => !!x?.publishedAt
|
|
838
|
-
);
|
|
910
|
+
if (this.draftPublishHelperService.isDraftPublishEnabled(model)) {
|
|
911
|
+
this.draftPublishHelperService.assertDraftPublishDeleteAllowed(this.modelName, removedEntities);
|
|
839
912
|
}
|
|
840
913
|
|
|
841
|
-
|
|
842
|
-
const publishedEntitiesExistsID = publishedEntitiesExists.map(x => x.id);
|
|
914
|
+
await this.internationalisationHelperService.deleteChildLocaleEntities(this.repo, model, ids);
|
|
843
915
|
|
|
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
|
|
916
|
+
return this.deleteEntitiesAndPromote(model, removedEntities);
|
|
856
917
|
}
|
|
857
918
|
|
|
858
919
|
async recover(id: number, solidRequestContext: any = {}) {
|
|
@@ -882,6 +943,10 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
882
943
|
} as unknown as QueryDeepPartialEntity<T>
|
|
883
944
|
);
|
|
884
945
|
|
|
946
|
+
if (this.draftPublishHelperService.isDraftPublishEnabled(loadedmodel)) {
|
|
947
|
+
await this.draftPublishHelperService.promoteRecoveredDraftPublishVersion(this.repo, softDeletedRows);
|
|
948
|
+
}
|
|
949
|
+
|
|
885
950
|
return { message: SUCCESS_MESSAGES.RECORD_RECOVERED, data: softDeletedRows };
|
|
886
951
|
} catch (error: any) {
|
|
887
952
|
if (error instanceof QueryFailedError && (error as any).code === '23505') {
|
|
@@ -928,6 +993,14 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
928
993
|
{ deletedAt: null, deletedTracker: "not-deleted" } as unknown as QueryDeepPartialEntity<T>
|
|
929
994
|
);
|
|
930
995
|
|
|
996
|
+
if (this.draftPublishHelperService.isDraftPublishEnabled(loadedmodel)) {
|
|
997
|
+
// Sequential: two ids in the same batch could belong to the same version
|
|
998
|
+
// chain, and each promotion clears isLatest across the whole chain first.
|
|
999
|
+
for (const entity of softDeletedRows) {
|
|
1000
|
+
await this.draftPublishHelperService.promoteRecoveredDraftPublishVersion(this.repo, entity);
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
|
|
931
1004
|
return { message: SUCCESS_MESSAGES.SELECTED_RECORDS_RECOVERED, recoveredIds: ids };
|
|
932
1005
|
} catch (error: any) {
|
|
933
1006
|
if (error instanceof QueryFailedError && (error as any).code === "23505") {
|
|
@@ -982,18 +1055,11 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
982
1055
|
return model.userKeyField?.name || '';
|
|
983
1056
|
}
|
|
984
1057
|
|
|
985
|
-
/* Publish a record -
|
|
1058
|
+
/* Publish a record - marks the selected version as the active published version. */
|
|
986
1059
|
async publishRecord(id: number, solidRequestContext: any = {}): Promise<T> {
|
|
987
1060
|
|
|
988
1061
|
const model = await this.loadModel();
|
|
989
1062
|
|
|
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
1063
|
// Check user permissions
|
|
998
1064
|
if (solidRequestContext.activeUser) {
|
|
999
1065
|
const hasPermission = this.crudHelperService.hasPublishPermissionOnModel(
|
|
@@ -1005,37 +1071,14 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
1005
1071
|
}
|
|
1006
1072
|
}
|
|
1007
1073
|
|
|
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
|
|
1074
|
+
return this.draftPublishHelperService.publishRecord(this.repo, model, this.modelName, id, solidRequestContext.activeUser);
|
|
1025
1075
|
}
|
|
1026
1076
|
|
|
1027
|
-
/* Unpublish a record -
|
|
1077
|
+
/* Unpublish a record - marks the selected version as not currently published. */
|
|
1028
1078
|
async unpublishRecord(id: number, solidRequestContext: any = {}): Promise<T> {
|
|
1029
1079
|
|
|
1030
1080
|
const model = await this.loadModel();
|
|
1031
1081
|
|
|
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
1082
|
// Check user permissions
|
|
1040
1083
|
if (solidRequestContext.activeUser) {
|
|
1041
1084
|
const hasPermission = this.crudHelperService.hasUnpublishPermissionOnModel(
|
|
@@ -1047,23 +1090,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
|
|
|
1047
1090
|
}
|
|
1048
1091
|
}
|
|
1049
1092
|
|
|
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
|
|
1093
|
+
return this.draftPublishHelperService.unpublishRecord(this.repo, model, this.modelName, id, solidRequestContext.activeUser);
|
|
1067
1094
|
}
|
|
1068
1095
|
|
|
1069
1096
|
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",
|