@solidxai/core 0.1.2 → 0.1.5-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +8 -0
- package/dist/commands/run-tests.command.d.ts +37 -0
- package/dist/commands/run-tests.command.d.ts.map +1 -0
- package/dist/commands/run-tests.command.js +345 -0
- package/dist/commands/run-tests.command.js.map +1 -0
- package/dist/commands/test-data.command.d.ts +6 -6
- package/dist/commands/test-data.command.d.ts.map +1 -1
- package/dist/commands/test-data.command.js +25 -25
- package/dist/commands/test-data.command.js.map +1 -1
- package/dist/commands/test.command.d.ts +5 -0
- package/dist/commands/test.command.d.ts.map +1 -0
- package/dist/commands/test.command.js +26 -0
- package/dist/commands/test.command.js.map +1 -0
- package/dist/constants/error-messages.d.ts +1 -0
- package/dist/constants/error-messages.d.ts.map +1 -1
- package/dist/constants/error-messages.js +1 -0
- package/dist/constants/error-messages.js.map +1 -1
- package/dist/constants.d.ts +3 -3
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +12 -12
- package/dist/constants.js.map +1 -1
- package/dist/controllers/otp-authentication.controller.d.ts +1 -4
- package/dist/controllers/otp-authentication.controller.d.ts.map +1 -1
- package/dist/controllers/otp-authentication.controller.js +1 -1
- package/dist/controllers/role-metadata.controller.d.ts +1 -0
- package/dist/controllers/role-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/role-metadata.controller.js +15 -0
- package/dist/controllers/role-metadata.controller.js.map +1 -1
- package/dist/controllers/service.controller.d.ts +0 -9
- package/dist/controllers/service.controller.d.ts.map +1 -1
- package/dist/controllers/service.controller.js +0 -45
- package/dist/controllers/service.controller.js.map +1 -1
- package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
- package/dist/dtos/basic-filters.dto.js.map +1 -1
- package/dist/dtos/create-email-template.dto.d.ts.map +1 -1
- package/dist/dtos/create-email-template.dto.js.map +1 -1
- package/dist/dtos/create-list-of-values.dto.d.ts.map +1 -1
- package/dist/dtos/create-list-of-values.dto.js.map +1 -1
- package/dist/dtos/create-menu-item-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-menu-item-metadata.dto.js.map +1 -1
- package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-role-metadata.dto.js.map +1 -1
- package/dist/dtos/create-scheduled-job.dto.d.ts.map +1 -1
- package/dist/dtos/create-scheduled-job.dto.js.map +1 -1
- package/dist/dtos/create-security-rule.dto.d.ts.map +1 -1
- package/dist/dtos/create-security-rule.dto.js.map +1 -1
- package/dist/dtos/create-sms-template.dto.d.ts.map +1 -1
- package/dist/dtos/create-sms-template.dto.js.map +1 -1
- package/dist/dtos/create-user.dto.d.ts +1 -0
- package/dist/dtos/create-user.dto.d.ts.map +1 -1
- package/dist/dtos/create-user.dto.js +2 -1
- package/dist/dtos/create-user.dto.js.map +1 -1
- package/dist/dtos/create-view-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-view-metadata.dto.js.map +1 -1
- package/dist/dtos/otp-sign-in.dto.d.ts +1 -1
- package/dist/dtos/otp-sign-in.dto.d.ts.map +1 -1
- package/dist/dtos/otp-sign-in.dto.js +2 -2
- package/dist/dtos/otp-sign-in.dto.js.map +1 -1
- package/dist/dtos/otp-sign-up.dto.d.ts +2 -2
- package/dist/dtos/otp-sign-up.dto.d.ts.map +1 -1
- package/dist/dtos/otp-sign-up.dto.js +2 -2
- package/dist/dtos/otp-sign-up.dto.js.map +1 -1
- package/dist/dtos/resolve-s3-url.dto.d.ts +2 -5
- package/dist/dtos/resolve-s3-url.dto.d.ts.map +1 -1
- package/dist/dtos/resolve-s3-url.dto.js +1 -13
- package/dist/dtos/resolve-s3-url.dto.js.map +1 -1
- package/dist/dtos/sign-up.dto.d.ts.map +1 -1
- package/dist/dtos/sign-up.dto.js.map +1 -1
- package/dist/dtos/update-email-template.dto.d.ts.map +1 -1
- package/dist/dtos/update-email-template.dto.js.map +1 -1
- package/dist/dtos/update-list-of-values.dto.d.ts.map +1 -1
- package/dist/dtos/update-list-of-values.dto.js.map +1 -1
- package/dist/dtos/update-menu-item-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/update-menu-item-metadata.dto.js.map +1 -1
- package/dist/dtos/update-scheduled-job.dto.d.ts.map +1 -1
- package/dist/dtos/update-scheduled-job.dto.js.map +1 -1
- package/dist/dtos/update-security-rule.dto.d.ts.map +1 -1
- package/dist/dtos/update-security-rule.dto.js.map +1 -1
- package/dist/dtos/update-sms-template.dto.d.ts.map +1 -1
- package/dist/dtos/update-sms-template.dto.js.map +1 -1
- package/dist/dtos/update-view-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/update-view-metadata.dto.js.map +1 -1
- package/dist/entities/user.entity.d.ts +1 -0
- package/dist/entities/user.entity.d.ts.map +1 -1
- package/dist/entities/user.entity.js +6 -1
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts +2 -0
- package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js +33 -23
- package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js.map +1 -1
- package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts +3 -0
- package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js +36 -23
- package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js.map +1 -1
- package/dist/helpers/security.helper.js +1 -0
- package/dist/helpers/security.helper.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/repository/solid-base.repository.d.ts +10 -1
- package/dist/repository/solid-base.repository.d.ts.map +1 -1
- package/dist/repository/solid-base.repository.js +109 -0
- package/dist/repository/solid-base.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts +2 -0
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +142 -91
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/module-test-data.service.d.ts.map +1 -1
- package/dist/seeders/module-test-data.service.js +3 -3
- package/dist/seeders/module-test-data.service.js.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.d.ts +1 -1
- package/dist/seeders/permission-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.js +1 -1
- package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +12 -25
- package/dist/services/authentication.service.d.ts +22 -8
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +228 -214
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/chatter-message.service.d.ts +2 -0
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +18 -2
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/crud-helper.service.d.ts +4 -0
- package/dist/services/crud-helper.service.d.ts.map +1 -1
- package/dist/services/crud-helper.service.js +66 -32
- package/dist/services/crud-helper.service.js.map +1 -1
- package/dist/services/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +7 -4
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/field-metadata.service.d.ts.map +1 -1
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/file/disk-file.service.d.ts +0 -2
- package/dist/services/file/disk-file.service.d.ts.map +1 -1
- package/dist/services/file/disk-file.service.js +7 -16
- package/dist/services/file/disk-file.service.js.map +1 -1
- package/dist/services/file/index.d.ts +1 -0
- package/dist/services/file/index.d.ts.map +1 -1
- package/dist/services/file/index.js +1 -0
- package/dist/services/file/index.js.map +1 -1
- package/dist/services/file/storage-path-builder.d.ts +17 -0
- package/dist/services/file/storage-path-builder.d.ts.map +1 -0
- package/dist/{seeders/sms-template-seeder.service.js → services/file/storage-path-builder.js} +45 -35
- package/dist/services/file/storage-path-builder.js.map +1 -0
- package/dist/services/media.service.d.ts +1 -1
- package/dist/services/media.service.d.ts.map +1 -1
- package/dist/services/media.service.js +45 -6
- package/dist/services/media.service.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.js +46 -7
- package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts +4 -6
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +16 -14
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/queues/common.d.ts +3 -0
- package/dist/services/queues/common.d.ts.map +1 -0
- package/dist/services/queues/common.js +39 -0
- package/dist/services/queues/common.js.map +1 -0
- package/dist/services/queues/database-publisher.service.d.ts.map +1 -1
- package/dist/services/queues/database-publisher.service.js +3 -1
- package/dist/services/queues/database-publisher.service.js.map +1 -1
- package/dist/services/queues/database-subscriber.service.d.ts.map +1 -1
- package/dist/services/queues/database-subscriber.service.js +5 -2
- package/dist/services/queues/database-subscriber.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-publisher.service.d.ts.map +1 -1
- package/dist/services/queues/rabbitmq-publisher.service.js +13 -6
- package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-subscriber.service.d.ts.map +1 -1
- package/dist/services/queues/rabbitmq-subscriber.service.js +9 -5
- package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
- package/dist/services/setting.service.d.ts +3 -2
- package/dist/services/setting.service.d.ts.map +1 -1
- package/dist/services/setting.service.js +7 -4
- package/dist/services/setting.service.js.map +1 -1
- package/dist/services/settings/default-settings-provider.service.d.ts +24 -2
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
- package/dist/services/settings/default-settings-provider.service.js +8 -6
- package/dist/services/settings/default-settings-provider.service.js.map +1 -1
- package/dist/solid-core.module.d.ts +3 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +49 -9
- package/dist/solid-core.module.js.map +1 -1
- package/dist/testing/__examples__/register-example-specs.d.ts +3 -0
- package/dist/testing/__examples__/register-example-specs.d.ts.map +1 -0
- package/dist/testing/__examples__/register-example-specs.js +8 -0
- package/dist/testing/__examples__/register-example-specs.js.map +1 -0
- package/dist/testing/__examples__/specs/custom-health.spec.d.ts +17 -0
- package/dist/testing/__examples__/specs/custom-health.spec.d.ts.map +1 -0
- package/dist/testing/__examples__/specs/custom-health.spec.js +30 -0
- package/dist/testing/__examples__/specs/custom-health.spec.js.map +1 -0
- package/dist/testing/adapters/api/api-adapter.d.ts +9 -0
- package/dist/testing/adapters/api/api-adapter.d.ts.map +1 -0
- package/dist/testing/adapters/api/api-adapter.js +76 -0
- package/dist/testing/adapters/api/api-adapter.js.map +1 -0
- package/dist/testing/adapters/api/api.types.d.ts +14 -0
- package/dist/testing/adapters/api/api.types.d.ts.map +1 -0
- package/dist/testing/adapters/api/api.types.js +3 -0
- package/dist/testing/adapters/api/api.types.js.map +1 -0
- package/dist/testing/adapters/ui/playwright-adapter.d.ts +14 -0
- package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -0
- package/dist/testing/adapters/ui/playwright-adapter.js +80 -0
- package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -0
- package/dist/testing/adapters/ui/ui.types.d.ts +5 -0
- package/dist/testing/adapters/ui/ui.types.d.ts.map +1 -0
- package/dist/testing/adapters/ui/ui.types.js +3 -0
- package/dist/testing/adapters/ui/ui.types.js.map +1 -0
- package/dist/testing/contracts/runtime-context.types.d.ts +35 -0
- package/dist/testing/contracts/runtime-context.types.d.ts.map +1 -0
- package/dist/testing/contracts/runtime-context.types.js +3 -0
- package/dist/testing/contracts/runtime-context.types.js.map +1 -0
- package/dist/testing/contracts/test-spec.types.d.ts +21 -0
- package/dist/testing/contracts/test-spec.types.d.ts.map +1 -0
- package/dist/testing/contracts/test-spec.types.js +3 -0
- package/dist/testing/contracts/test-spec.types.js.map +1 -0
- package/dist/testing/contracts/testing-metadata.types.d.ts +41 -0
- package/dist/testing/contracts/testing-metadata.types.d.ts.map +1 -0
- package/dist/testing/contracts/testing-metadata.types.js +3 -0
- package/dist/testing/contracts/testing-metadata.types.js.map +1 -0
- package/dist/testing/core/interpolation.d.ts +4 -0
- package/dist/testing/core/interpolation.d.ts.map +1 -0
- package/dist/testing/core/interpolation.js +180 -0
- package/dist/testing/core/interpolation.js.map +1 -0
- package/dist/testing/core/normalize-steps.d.ts +7 -0
- package/dist/testing/core/normalize-steps.d.ts.map +1 -0
- package/dist/testing/core/normalize-steps.js +20 -0
- package/dist/testing/core/normalize-steps.js.map +1 -0
- package/dist/testing/core/resource-store.d.ts +8 -0
- package/dist/testing/core/resource-store.d.ts.map +1 -0
- package/dist/testing/core/resource-store.js +41 -0
- package/dist/testing/core/resource-store.js.map +1 -0
- package/dist/testing/core/spec-registry.d.ts +10 -0
- package/dist/testing/core/spec-registry.d.ts.map +1 -0
- package/dist/testing/core/spec-registry.js +32 -0
- package/dist/testing/core/spec-registry.js.map +1 -0
- package/dist/testing/core/step-registry.d.ts +10 -0
- package/dist/testing/core/step-registry.d.ts.map +1 -0
- package/dist/testing/core/step-registry.js +26 -0
- package/dist/testing/core/step-registry.js.map +1 -0
- package/dist/testing/core/testing-engine.d.ts +14 -0
- package/dist/testing/core/testing-engine.d.ts.map +1 -0
- package/dist/testing/core/testing-engine.js +97 -0
- package/dist/testing/core/testing-engine.js.map +1 -0
- package/dist/testing/core/timeout.d.ts +2 -0
- package/dist/testing/core/timeout.d.ts.map +1 -0
- package/dist/testing/core/timeout.js +18 -0
- package/dist/testing/core/timeout.js.map +1 -0
- package/dist/testing/reporter/attachments.d.ts +4 -0
- package/dist/testing/reporter/attachments.d.ts.map +1 -0
- package/dist/testing/reporter/attachments.js +25 -0
- package/dist/testing/reporter/attachments.js.map +1 -0
- package/dist/testing/reporter/console-reporter.d.ts +45 -0
- package/dist/testing/reporter/console-reporter.d.ts.map +1 -0
- package/dist/testing/reporter/console-reporter.js +189 -0
- package/dist/testing/reporter/console-reporter.js.map +1 -0
- package/dist/testing/reporter/reporter.types.d.ts +37 -0
- package/dist/testing/reporter/reporter.types.d.ts.map +1 -0
- package/dist/testing/reporter/reporter.types.js +3 -0
- package/dist/testing/reporter/reporter.types.js.map +1 -0
- package/dist/testing/runner/lifecycle.d.ts +9 -0
- package/dist/testing/runner/lifecycle.d.ts.map +1 -0
- package/dist/testing/runner/lifecycle.js +33 -0
- package/dist/testing/runner/lifecycle.js.map +1 -0
- package/dist/testing/runner/run-from-metadata.d.ts +24 -0
- package/dist/testing/runner/run-from-metadata.d.ts.map +1 -0
- package/dist/testing/runner/run-from-metadata.js +70 -0
- package/dist/testing/runner/run-from-metadata.js.map +1 -0
- package/dist/testing/runner/scenario-filter.d.ts +9 -0
- package/dist/testing/runner/scenario-filter.d.ts.map +1 -0
- package/dist/testing/runner/scenario-filter.js +22 -0
- package/dist/testing/runner/scenario-filter.js.map +1 -0
- package/dist/testing/steps/api/auth.step.d.ts +3 -0
- package/dist/testing/steps/api/auth.step.d.ts.map +1 -0
- package/dist/testing/steps/api/auth.step.js +38 -0
- package/dist/testing/steps/api/auth.step.js.map +1 -0
- package/dist/testing/steps/api/index.d.ts +3 -0
- package/dist/testing/steps/api/index.d.ts.map +1 -0
- package/dist/testing/steps/api/index.js +10 -0
- package/dist/testing/steps/api/index.js.map +1 -0
- package/dist/testing/steps/api/request.step.d.ts +3 -0
- package/dist/testing/steps/api/request.step.d.ts.map +1 -0
- package/dist/testing/steps/api/request.step.js +281 -0
- package/dist/testing/steps/api/request.step.js.map +1 -0
- package/dist/testing/steps/assert/http.step.d.ts +3 -0
- package/dist/testing/steps/assert/http.step.d.ts.map +1 -0
- package/dist/testing/steps/assert/http.step.js +27 -0
- package/dist/testing/steps/assert/http.step.js.map +1 -0
- package/dist/testing/steps/assert/index.d.ts +3 -0
- package/dist/testing/steps/assert/index.d.ts.map +1 -0
- package/dist/testing/steps/assert/index.js +12 -0
- package/dist/testing/steps/assert/index.js.map +1 -0
- package/dist/testing/steps/assert/jsonpath.step.d.ts +3 -0
- package/dist/testing/steps/assert/jsonpath.step.d.ts.map +1 -0
- package/dist/testing/steps/assert/jsonpath.step.js +40 -0
- package/dist/testing/steps/assert/jsonpath.step.js.map +1 -0
- package/dist/testing/steps/assert/primitives.step.d.ts +3 -0
- package/dist/testing/steps/assert/primitives.step.d.ts.map +1 -0
- package/dist/testing/steps/assert/primitives.step.js +43 -0
- package/dist/testing/steps/assert/primitives.step.js.map +1 -0
- package/dist/testing/steps/test/index.d.ts +3 -0
- package/dist/testing/steps/test/index.d.ts.map +1 -0
- package/dist/testing/steps/test/index.js +8 -0
- package/dist/testing/steps/test/index.js.map +1 -0
- package/dist/testing/steps/test/test-spec.step.d.ts +3 -0
- package/dist/testing/steps/test/test-spec.step.d.ts.map +1 -0
- package/dist/testing/steps/test/test-spec.step.js +41 -0
- package/dist/testing/steps/test/test-spec.step.js.map +1 -0
- package/dist/testing/steps/ui/actions.step.d.ts +3 -0
- package/dist/testing/steps/ui/actions.step.d.ts.map +1 -0
- package/dist/testing/steps/ui/actions.step.js +31 -0
- package/dist/testing/steps/ui/actions.step.js.map +1 -0
- package/dist/testing/steps/ui/assertions.step.d.ts +3 -0
- package/dist/testing/steps/ui/assertions.step.d.ts.map +1 -0
- package/dist/testing/steps/ui/assertions.step.js +41 -0
- package/dist/testing/steps/ui/assertions.step.js.map +1 -0
- package/dist/testing/steps/ui/form.step.d.ts +3 -0
- package/dist/testing/steps/ui/form.step.d.ts.map +1 -0
- package/dist/testing/steps/ui/form.step.js +34 -0
- package/dist/testing/steps/ui/form.step.js.map +1 -0
- package/dist/testing/steps/ui/index.d.ts +3 -0
- package/dist/testing/steps/ui/index.d.ts.map +1 -0
- package/dist/testing/steps/ui/index.js +14 -0
- package/dist/testing/steps/ui/index.js.map +1 -0
- package/dist/testing/steps/ui/navigation.step.d.ts +3 -0
- package/dist/testing/steps/ui/navigation.step.d.ts.map +1 -0
- package/dist/testing/steps/ui/navigation.step.js +39 -0
- package/dist/testing/steps/ui/navigation.step.js.map +1 -0
- package/dist/testing/steps/util/index.d.ts +3 -0
- package/dist/testing/steps/util/index.d.ts.map +1 -0
- package/dist/testing/steps/util/index.js +12 -0
- package/dist/testing/steps/util/index.js.map +1 -0
- package/dist/testing/steps/util/log.step.d.ts +3 -0
- package/dist/testing/steps/util/log.step.d.ts.map +1 -0
- package/dist/testing/steps/util/log.step.js +18 -0
- package/dist/testing/steps/util/log.step.js.map +1 -0
- package/dist/testing/steps/util/require.step.d.ts +3 -0
- package/dist/testing/steps/util/require.step.d.ts.map +1 -0
- package/dist/testing/steps/util/require.step.js +16 -0
- package/dist/testing/steps/util/require.step.js.map +1 -0
- package/dist/testing/steps/util/sleep.step.d.ts +3 -0
- package/dist/testing/steps/util/sleep.step.d.ts.map +1 -0
- package/dist/testing/steps/util/sleep.step.js +13 -0
- package/dist/testing/steps/util/sleep.step.js.map +1 -0
- package/docs/test-data-workflow.md +51 -11
- package/package.json +10 -2
- package/src/commands/run-tests.command.ts +278 -0
- package/src/commands/test-data.command.ts +26 -26
- package/src/commands/test.command.ts +14 -0
- package/src/constants/error-messages.ts +1 -0
- package/src/constants.ts +3 -3
- package/src/controllers/role-metadata.controller.ts +26 -18
- package/src/controllers/service.controller.ts +58 -59
- package/src/dtos/basic-filters.dto.ts +0 -2
- package/src/dtos/create-email-template.dto.ts +7 -0
- package/src/dtos/create-list-of-values.dto.ts +7 -0
- package/src/dtos/create-menu-item-metadata.dto.ts +12 -1
- package/src/dtos/create-role-metadata.dto.ts +9 -0
- package/src/dtos/create-scheduled-job.dto.ts +14 -0
- package/src/dtos/create-security-rule.dto.ts +6 -0
- package/src/dtos/create-sms-template.dto.ts +6 -0
- package/src/dtos/create-user.dto.ts +1 -0
- package/src/dtos/create-view-metadata.dto.ts +11 -0
- package/src/dtos/otp-sign-in.dto.ts +3 -3
- package/src/dtos/otp-sign-up.dto.ts +3 -3
- package/src/dtos/resolve-s3-url.dto.ts +2 -12
- package/src/dtos/sign-up.dto.ts +0 -2
- package/src/dtos/update-email-template.dto.ts +6 -0
- package/src/dtos/update-list-of-values.dto.ts +8 -0
- package/src/dtos/update-menu-item-metadata.dto.ts +12 -0
- package/src/dtos/update-scheduled-job.dto.ts +15 -0
- package/src/dtos/update-security-rule.dto.ts +7 -0
- package/src/dtos/update-sms-template.dto.ts +32 -32
- package/src/dtos/update-view-metadata.dto.ts +12 -0
- package/src/entities/user.entity.ts +3 -0
- package/src/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.ts +43 -32
- package/src/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.ts +45 -33
- package/src/helpers/security.helper.ts +1 -1
- package/src/index.ts +3 -4
- package/src/repository/solid-base.repository.ts +172 -1
- package/src/seeders/module-metadata-seeder.service.ts +191 -150
- package/src/seeders/module-test-data.service.ts +5 -3
- package/src/seeders/permission-metadata-seeder.service.ts +1 -4
- package/src/seeders/seed-data/solid-core-metadata.json +12 -25
- package/src/services/authentication.service.ts +268 -266
- package/src/services/chatter-message.service.ts +18 -1
- package/src/services/crud-helper.service.ts +79 -36
- package/src/services/crud.service.ts +10 -4
- package/src/services/field-metadata.service.ts +0 -71
- package/src/services/file/disk-file.service.ts +8 -18
- package/src/services/file/index.ts +1 -0
- package/src/services/file/storage-path-builder.ts +56 -0
- package/src/services/media.service.ts +13 -7
- package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +1 -1
- package/src/services/mediaStorageProviders/file-storage-provider.ts +13 -8
- package/src/services/module-metadata.service.ts +18 -15
- package/src/services/queues/common.ts +75 -0
- package/src/services/queues/database-publisher.service.ts +4 -1
- package/src/services/queues/database-subscriber.service.ts +5 -3
- package/src/services/queues/rabbitmq-publisher.service.ts +17 -7
- package/src/services/queues/rabbitmq-subscriber.service.ts +9 -5
- package/src/services/setting.service.ts +5 -3
- package/src/services/settings/default-settings-provider.service.ts +5 -3
- package/src/solid-core.module.ts +20 -12
- package/src/testing/README.md +364 -0
- package/src/testing/__examples__/register-example-specs.ts +6 -0
- package/src/testing/__examples__/specs/custom-health.spec.ts +29 -0
- package/src/testing/__examples__/testing.sample.json +82 -0
- package/src/testing/adapters/api/api-adapter.ts +85 -0
- package/src/testing/adapters/api/api.types.ts +15 -0
- package/src/testing/adapters/ui/playwright-adapter.ts +54 -0
- package/src/testing/adapters/ui/ui.types.ts +4 -0
- package/src/testing/contracts/runtime-context.types.ts +36 -0
- package/src/testing/contracts/test-spec.types.ts +24 -0
- package/src/testing/contracts/testing-metadata.types.ts +46 -0
- package/src/testing/core/interpolation.ts +189 -0
- package/src/testing/core/normalize-steps.ts +21 -0
- package/src/testing/core/resource-store.ts +38 -0
- package/src/testing/core/spec-registry.ts +33 -0
- package/src/testing/core/step-registry.ts +27 -0
- package/src/testing/core/testing-engine.ts +127 -0
- package/src/testing/core/timeout.ts +19 -0
- package/src/testing/reporter/attachments.ts +25 -0
- package/src/testing/reporter/console-reporter.ts +229 -0
- package/src/testing/reporter/reporter.types.ts +36 -0
- package/src/testing/runner/lifecycle.ts +31 -0
- package/src/testing/runner/run-from-metadata.ts +87 -0
- package/src/testing/runner/scenario-filter.ts +33 -0
- package/src/testing/steps/api/auth.step.ts +66 -0
- package/src/testing/steps/api/index.ts +10 -0
- package/src/testing/steps/api/request.step.ts +358 -0
- package/src/testing/steps/assert/http.step.ts +33 -0
- package/src/testing/steps/assert/index.ts +12 -0
- package/src/testing/steps/assert/jsonpath.step.ts +50 -0
- package/src/testing/steps/assert/primitives.step.ts +69 -0
- package/src/testing/steps/test/index.ts +8 -0
- package/src/testing/steps/test/test-spec.step.ts +52 -0
- package/src/testing/steps/ui/actions.step.ts +36 -0
- package/src/testing/steps/ui/assertions.step.ts +54 -0
- package/src/testing/steps/ui/form.step.ts +39 -0
- package/src/testing/steps/ui/index.ts +12 -0
- package/src/testing/steps/ui/navigation.step.ts +53 -0
- package/src/testing/steps/util/index.ts +10 -0
- package/src/testing/steps/util/log.step.ts +19 -0
- package/src/testing/steps/util/require.step.ts +16 -0
- package/src/testing/steps/util/sleep.step.ts +15 -0
- package/tsconfig.json +35 -25
- package/tsconfig.tests.json +14 -0
- package/dist/passport-strategies/local.strategy.d.ts +0 -15
- package/dist/passport-strategies/local.strategy.d.ts.map +0 -1
- package/dist/passport-strategies/local.strategy.js +0 -44
- package/dist/passport-strategies/local.strategy.js.map +0 -1
- package/dist/seeders/email-template-seeder.service.d.ts +0 -10
- package/dist/seeders/email-template-seeder.service.d.ts.map +0 -1
- package/dist/seeders/email-template-seeder.service.js +0 -84
- package/dist/seeders/email-template-seeder.service.js.map +0 -1
- package/dist/seeders/sms-template-seeder.service.d.ts +0 -10
- package/dist/seeders/sms-template-seeder.service.d.ts.map +0 -1
- package/dist/seeders/sms-template-seeder.service.js.map +0 -1
- package/dist/seeders/user-seeder.service.d.ts +0 -10
- package/dist/seeders/user-seeder.service.d.ts.map +0 -1
- package/dist/seeders/user-seeder.service.js +0 -44
- package/dist/seeders/user-seeder.service.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/src/passport-strategies/local.strategy.ts +0 -28
- package/src/seeders/email-template-seeder.service.ts +0 -49
- package/src/seeders/sms-template-seeder.service.ts +0 -50
- package/src/seeders/user-seeder.service.ts +0 -33
|
@@ -7,7 +7,9 @@ import { MediaStorageProvider } from "src/interfaces";
|
|
|
7
7
|
import { MediaRepository } from "src/repository/media.repository";
|
|
8
8
|
import { DiskFileService } from "src/services/file";
|
|
9
9
|
import { Readable } from "stream";
|
|
10
|
+
import * as path from "path";
|
|
10
11
|
import { SettingService } from "../setting.service";
|
|
12
|
+
import { DEFAULT_MEDIA_FILE_STORAGE_DIR } from "src/services/settings/default-settings-provider.service";
|
|
11
13
|
import type { SolidCoreSetting } from "src/services/settings/default-settings-provider.service";
|
|
12
14
|
|
|
13
15
|
@Injectable()
|
|
@@ -34,7 +36,7 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
|
|
|
34
36
|
// media.forEach(m => {
|
|
35
37
|
// });
|
|
36
38
|
for (const m of media) {
|
|
37
|
-
m['_full_url'] = `${this.settingService.getConfigValue<SolidCoreSetting>("baseUrl")}/${
|
|
39
|
+
m['_full_url'] = `${this.settingService.getConfigValue<SolidCoreSetting>("baseUrl")}/${this.getFullFilePath(m.relativeUri)}`;
|
|
38
40
|
}
|
|
39
41
|
|
|
40
42
|
|
|
@@ -48,7 +50,7 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
|
|
|
48
50
|
const result: Media[] = [];
|
|
49
51
|
for (const file of files) {
|
|
50
52
|
// Store the file in the configured file storage directory
|
|
51
|
-
const fileStoragePath =
|
|
53
|
+
const fileStoragePath = this.getFullFilePath(this.getFileName(file));
|
|
52
54
|
await this.fileService.copy(file.path, fileStoragePath);
|
|
53
55
|
await this.fileService.delete(file.path);
|
|
54
56
|
|
|
@@ -78,7 +80,7 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
|
|
|
78
80
|
for (const pair of streamPairs) {
|
|
79
81
|
const stream = pair[0];
|
|
80
82
|
const fileName = pair[1];
|
|
81
|
-
await this.fileService.writeStream(
|
|
83
|
+
await this.fileService.writeStream(this.getFullFilePath(fileName), stream);
|
|
82
84
|
const mediaEntity = await this.mediaRepository.createMedia({
|
|
83
85
|
//@ts-ignore
|
|
84
86
|
entityId: entity.id,
|
|
@@ -102,16 +104,19 @@ export class FileStorageProvider<T> implements MediaStorageProvider<T> {
|
|
|
102
104
|
this.mediaRepository.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);
|
|
103
105
|
|
|
104
106
|
for (const media of existingMedia) {
|
|
105
|
-
await this.fileService.delete(
|
|
107
|
+
await this.fileService.delete(this.getFullFilePath(media.relativeUri));
|
|
106
108
|
}
|
|
107
109
|
// existingMedia.forEach(media => {
|
|
108
110
|
// });
|
|
109
111
|
}
|
|
110
112
|
|
|
111
|
-
private
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
private getFullFilePath(fileName: string): string {
|
|
114
|
+
const base = this.settingService.getConfigValue<SolidCoreSetting>("fileStorageDir")
|
|
115
|
+
|| DEFAULT_MEDIA_FILE_STORAGE_DIR;
|
|
116
|
+
if (path.isAbsolute(fileName) || fileName.startsWith(`${base}/`)) {
|
|
117
|
+
return fileName;
|
|
118
|
+
}
|
|
119
|
+
return `${base}/${fileName}`;
|
|
115
120
|
}
|
|
116
121
|
|
|
117
122
|
private getFileName(file: Express.Multer.File): string {
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import { BadRequestException, forwardRef, Inject, Injectable, Logger, NotFoundException } from '@nestjs/common';
|
|
2
|
-
import { InjectDataSource
|
|
3
|
-
import {
|
|
2
|
+
import { InjectDataSource } from '@nestjs/typeorm';
|
|
3
|
+
import { DEFAULT_MEDIA_FILE_STORAGE_DIR } from "src/services/settings/default-settings-provider.service";
|
|
4
|
+
import type { SolidCoreSetting } from "src/services/settings/default-settings-provider.service";
|
|
5
|
+
import { DataSource, EntityManager, SelectQueryBuilder } from 'typeorm';
|
|
4
6
|
import { CreateModuleMetadataDto } from '../dtos/create-module-metadata.dto';
|
|
5
7
|
import { ModuleMetadata } from '../entities/module-metadata.entity';
|
|
6
|
-
import type { SolidCoreSetting } from "src/services/settings/default-settings-provider.service";
|
|
7
8
|
|
|
8
|
-
import { classify
|
|
9
|
+
import { classify } from '@angular-devkit/core/src/utils/strings';
|
|
9
10
|
import { ConfigService } from '@nestjs/config';
|
|
10
11
|
import * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await
|
|
11
12
|
import * as path from 'path'; // To handle file paths
|
|
13
|
+
import { ERROR_MESSAGES } from 'src/constants/error-messages';
|
|
14
|
+
import { DisallowInProduction } from 'src/decorators/disallow-in-production.decorator';
|
|
15
|
+
import { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';
|
|
16
|
+
import { ModuleMetadataRepository } from 'src/repository/module-metadata.repository';
|
|
12
17
|
import { PermissionMetadataSeederService } from 'src/seeders/permission-metadata-seeder.service';
|
|
13
18
|
import { DiskFileService } from 'src/services/file';
|
|
14
19
|
import { BasicFilterDto } from '../dtos/basic-filters.dto';
|
|
@@ -21,11 +26,6 @@ import { SolidRegistry } from '../helpers/solid-registry';
|
|
|
21
26
|
import { CodeGenerationOptions, ModuleMetadataConfiguration } from '../interfaces';
|
|
22
27
|
import { CrudHelperService } from './crud-helper.service';
|
|
23
28
|
import { ModelMetadataService } from './model-metadata.service';
|
|
24
|
-
import { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';
|
|
25
|
-
import { DisallowInProduction } from 'src/decorators/disallow-in-production.decorator';
|
|
26
|
-
import { ERROR_MESSAGES } from 'src/constants/error-messages';
|
|
27
|
-
import Module from 'module';
|
|
28
|
-
import { ModuleMetadataRepository } from 'src/repository/module-metadata.repository';
|
|
29
29
|
import { SettingService } from './setting.service';
|
|
30
30
|
|
|
31
31
|
@Injectable()
|
|
@@ -40,7 +40,6 @@ export class ModuleMetadataService {
|
|
|
40
40
|
private readonly moduleMetadataRepo: ModuleMetadataRepository,
|
|
41
41
|
private readonly crudHelperService: CrudHelperService,
|
|
42
42
|
private readonly schematicService: SchematicService,
|
|
43
|
-
private readonly configService: ConfigService,
|
|
44
43
|
private readonly fileService: DiskFileService,
|
|
45
44
|
private readonly settingService: SettingService,
|
|
46
45
|
|
|
@@ -133,7 +132,7 @@ export class ModuleMetadataService {
|
|
|
133
132
|
|
|
134
133
|
async createInDB(manager: EntityManager, createDto: CreateModuleMetadataDto, files: Express.Multer.File[] = []) {
|
|
135
134
|
if (files.length > 0) {
|
|
136
|
-
const fileStoragePath =
|
|
135
|
+
const fileStoragePath = this.getFullFilePathForDisk(this.getFileName(files[0]));
|
|
137
136
|
this.fileService.copy(files[0].path, fileStoragePath);
|
|
138
137
|
this.fileService.delete(files[0].path);
|
|
139
138
|
createDto.menuIconUrl = fileStoragePath;
|
|
@@ -239,7 +238,7 @@ export class ModuleMetadataService {
|
|
|
239
238
|
}
|
|
240
239
|
if (files.length > 0) {
|
|
241
240
|
|
|
242
|
-
const fileStoragePath =
|
|
241
|
+
const fileStoragePath = this.getFullFilePathForDisk(this.getFileName(files[0]));
|
|
243
242
|
this.fileService.copy(files[0].path, fileStoragePath);
|
|
244
243
|
this.fileService.delete(files[0].path);
|
|
245
244
|
module.menuIconUrl = fileStoragePath;
|
|
@@ -464,9 +463,13 @@ export class ModuleMetadataService {
|
|
|
464
463
|
return outputLines.join('\n');
|
|
465
464
|
}
|
|
466
465
|
|
|
467
|
-
private
|
|
468
|
-
const
|
|
469
|
-
|
|
466
|
+
private getFullFilePathForDisk(fileName: string): string {
|
|
467
|
+
const base = this.settingService.getConfigValue<SolidCoreSetting>("fileStorageDir")
|
|
468
|
+
|| DEFAULT_MEDIA_FILE_STORAGE_DIR;
|
|
469
|
+
if (path.isAbsolute(fileName) || fileName.startsWith(`${base}/`)) {
|
|
470
|
+
return fileName;
|
|
471
|
+
}
|
|
472
|
+
return `${base}/${fileName}`;
|
|
470
473
|
}
|
|
471
474
|
|
|
472
475
|
private getFileName(file: Express.Multer.File): string {
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert a string into a lower-case slug separated by a join character.
|
|
3
|
+
*
|
|
4
|
+
* Logic:
|
|
5
|
+
* - Keep only ASCII letters and digits.
|
|
6
|
+
* - Convert A-Z to a-z.
|
|
7
|
+
* - Replace runs of non-alphanumeric characters with a single join character.
|
|
8
|
+
* - Trim leading/trailing join characters.
|
|
9
|
+
*
|
|
10
|
+
* Examples (joinChar "_"):
|
|
11
|
+
* - "Venue App" -> "venue_app"
|
|
12
|
+
* - "My-App@2025" -> "my_app_2025"
|
|
13
|
+
* - " CORE__API!! " -> "core_api"
|
|
14
|
+
*
|
|
15
|
+
* Examples (joinChar "-"):
|
|
16
|
+
* - "Venue App" -> "venue-app"
|
|
17
|
+
*/
|
|
18
|
+
export function toSlug(value?: string | null, joinChar: string = '-'): string {
|
|
19
|
+
if (!value) {
|
|
20
|
+
return '';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const slugChars: string[] = [];
|
|
24
|
+
let lastJoin = true;
|
|
25
|
+
|
|
26
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
27
|
+
const code = value.charCodeAt(i);
|
|
28
|
+
|
|
29
|
+
// ASCII uppercase -> lowercase
|
|
30
|
+
if (code >= 65 && code <= 90) {
|
|
31
|
+
slugChars.push(String.fromCharCode(code + 32));
|
|
32
|
+
lastJoin = false;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// ASCII lowercase letters or digits are kept as-is
|
|
37
|
+
if ((code >= 97 && code <= 122) || (code >= 48 && code <= 57)) {
|
|
38
|
+
slugChars.push(value[i]);
|
|
39
|
+
lastJoin = false;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Any other char becomes a single join character (collapse runs)
|
|
44
|
+
if (!lastJoin && slugChars.length > 0) {
|
|
45
|
+
slugChars.push(joinChar);
|
|
46
|
+
lastJoin = true;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (slugChars.length && slugChars[slugChars.length - 1] === joinChar) {
|
|
51
|
+
slugChars.pop();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return slugChars.join('');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Build a namespaced queue name by prefixing the queue name with the
|
|
59
|
+
* slugged app name, the slugged env, and underscores.
|
|
60
|
+
*
|
|
61
|
+
* Examples:
|
|
62
|
+
* - appName "Venue App", env "Prod", queue "orders" -> "venue_app_prod_orders"
|
|
63
|
+
* - appName "core-api", env "staging", queue "sync" -> "core_api_staging_sync"
|
|
64
|
+
* - appName "" or undefined, env "" or undefined, queue "jobs" -> "_dev_jobs"
|
|
65
|
+
*/
|
|
66
|
+
export function buildNamespacedQueueName(
|
|
67
|
+
queueName: string,
|
|
68
|
+
appName: string | undefined | null = process.env.SOLID_APP_NAME,
|
|
69
|
+
env: string | undefined | null = process.env.ENV,
|
|
70
|
+
): string {
|
|
71
|
+
const appNameSlug = toSlug(appName, '_');
|
|
72
|
+
const envValue = env && env.length > 0 ? env : (process.env.ENV && process.env.ENV.length > 0 ? process.env.ENV : 'dev');
|
|
73
|
+
const envSlug = toSlug(envValue, '_');
|
|
74
|
+
return `${appNameSlug}_${envSlug}_${queueName}`;
|
|
75
|
+
}
|
|
@@ -4,6 +4,7 @@ import { QueuesModuleOptions } from "../../interfaces";
|
|
|
4
4
|
import { QueueMessage, QueuePublisher } from '../../interfaces/mq';
|
|
5
5
|
import { MqMessageQueueService } from '../mq-message-queue.service';
|
|
6
6
|
import { MqMessageService } from '../mq-message.service';
|
|
7
|
+
import { buildNamespacedQueueName } from './common';
|
|
7
8
|
|
|
8
9
|
export abstract class DatabasePublisher<T> implements QueuePublisher<T> {
|
|
9
10
|
private readonly logger = new Logger(DatabasePublisher.name);
|
|
@@ -38,6 +39,8 @@ export abstract class DatabasePublisher<T> implements QueuePublisher<T> {
|
|
|
38
39
|
const options = this.options();
|
|
39
40
|
|
|
40
41
|
const queueName = options.queueName;
|
|
42
|
+
const namespacedQueueName = buildNamespacedQueueName(queueName);
|
|
43
|
+
|
|
41
44
|
if (!message.retryCount) message.retryCount = 0;
|
|
42
45
|
if (!message.retryInterval) message.retryInterval = 1000;
|
|
43
46
|
|
|
@@ -45,7 +48,7 @@ export abstract class DatabasePublisher<T> implements QueuePublisher<T> {
|
|
|
45
48
|
message.messageId = uuidv4();
|
|
46
49
|
|
|
47
50
|
// Save the message to the DB so that we can then change its status in the subscriber...
|
|
48
|
-
await this.persistToDatabase(
|
|
51
|
+
await this.persistToDatabase(namespacedQueueName, message);
|
|
49
52
|
|
|
50
53
|
// return the newly created message id.
|
|
51
54
|
return message.messageId;
|
|
@@ -4,7 +4,7 @@ import { QueueMessage, QueueSubscriber } from '../../interfaces/mq';
|
|
|
4
4
|
import { MqMessageQueueService } from '../mq-message-queue.service';
|
|
5
5
|
import { MqMessageService } from '../mq-message.service';
|
|
6
6
|
import { PollerService } from '../poller.service';
|
|
7
|
-
|
|
7
|
+
import { buildNamespacedQueueName } from './common';
|
|
8
8
|
|
|
9
9
|
export abstract class DatabaseSubscriber<T> implements OnModuleInit, QueueSubscriber<T> {
|
|
10
10
|
private readonly logger = new Logger(DatabaseSubscriber.name);
|
|
@@ -97,7 +97,8 @@ export abstract class DatabaseSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
|
|
100
|
+
const namespacedQueueName = buildNamespacedQueueName(queueName);
|
|
101
|
+
this.poller.start(namespacedQueueName, (q) => this.processNext(q), {
|
|
101
102
|
baseDelayMs: 1000,
|
|
102
103
|
maxDelayMs: 30_000,
|
|
103
104
|
timeoutPerIterationMs: 5 * 60_000,
|
|
@@ -111,7 +112,8 @@ export abstract class DatabaseSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
111
112
|
onModuleDestroy() {
|
|
112
113
|
const options = this.options();
|
|
113
114
|
const queueName = options.queueName;
|
|
114
|
-
|
|
115
|
+
const namespacedQueueName = buildNamespacedQueueName(queueName);
|
|
116
|
+
this.poller.stop(namespacedQueueName);
|
|
115
117
|
}
|
|
116
118
|
|
|
117
119
|
/**
|
|
@@ -5,6 +5,7 @@ import { QueuesModuleOptions } from "../../interfaces";
|
|
|
5
5
|
import { QueueMessage, QueuePublisher } from '../../interfaces/mq';
|
|
6
6
|
import { MqMessageQueueService } from '../mq-message-queue.service';
|
|
7
7
|
import { MqMessageService } from '../mq-message.service';
|
|
8
|
+
import { buildNamespacedQueueName } from './common';
|
|
8
9
|
|
|
9
10
|
export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePublisher<T> {
|
|
10
11
|
private readonly logger = new Logger(RabbitMqPublisher.name);
|
|
@@ -70,13 +71,21 @@ export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePubl
|
|
|
70
71
|
|
|
71
72
|
const channel = await conn.createChannel();
|
|
72
73
|
|
|
74
|
+
channel.on('return', (msg) => {
|
|
75
|
+
const content = msg.content?.toString?.() ?? '';
|
|
76
|
+
this.logger.warn(
|
|
77
|
+
`RabbitMqPublisher message returned from exchange ${msg.fields.exchange} with routingKey ${msg.fields.routingKey}: ${content}`,
|
|
78
|
+
);
|
|
79
|
+
});
|
|
80
|
+
|
|
73
81
|
const options = this.options();
|
|
74
82
|
const queueName = options.queueName;
|
|
75
|
-
const
|
|
76
|
-
const
|
|
83
|
+
const namespacedQueueName = buildNamespacedQueueName(queueName);
|
|
84
|
+
const exchangeName = `${namespacedQueueName}.exchange`;
|
|
85
|
+
const routingKey = `${namespacedQueueName}.routing-key`;
|
|
77
86
|
|
|
78
87
|
await channel.assertExchange(exchangeName, 'direct', {});
|
|
79
|
-
const queue = await channel.assertQueue(
|
|
88
|
+
const queue = await channel.assertQueue(namespacedQueueName, {});
|
|
80
89
|
await channel.bindQueue(queue.queue, exchangeName, routingKey);
|
|
81
90
|
|
|
82
91
|
this.connection = conn;
|
|
@@ -127,7 +136,6 @@ export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePubl
|
|
|
127
136
|
}
|
|
128
137
|
}
|
|
129
138
|
|
|
130
|
-
|
|
131
139
|
async publish(message: QueueMessage<T>): Promise<string> {
|
|
132
140
|
if (!this.url) {
|
|
133
141
|
this.logger.error('RabbitMqPublisher url is not defined in the environment variables');
|
|
@@ -148,8 +156,10 @@ export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePubl
|
|
|
148
156
|
const options = this.options();
|
|
149
157
|
|
|
150
158
|
const queueName = options.queueName;
|
|
151
|
-
const
|
|
152
|
-
|
|
159
|
+
const namespacedQueueName = buildNamespacedQueueName(queueName);
|
|
160
|
+
|
|
161
|
+
const exchangeName = `${namespacedQueueName}.exchange`;
|
|
162
|
+
const routingKey = `${namespacedQueueName}.routing-key`;
|
|
153
163
|
|
|
154
164
|
// Set default values for retry.
|
|
155
165
|
// by default there are no retries.
|
|
@@ -160,7 +170,7 @@ export abstract class RabbitMqPublisher<T> implements OnModuleDestroy, QueuePubl
|
|
|
160
170
|
message.messageId = uuidv4();
|
|
161
171
|
|
|
162
172
|
// Save the message to the DB so that we can then change its status in the subscriber...
|
|
163
|
-
await this.persistToDatabase(
|
|
173
|
+
await this.persistToDatabase(namespacedQueueName, message);
|
|
164
174
|
|
|
165
175
|
// wait for the channel to confirm
|
|
166
176
|
try {
|
|
@@ -4,6 +4,7 @@ import { QueuesModuleOptions } from "../../interfaces";
|
|
|
4
4
|
import { QueueMessage, QueueSubscriber } from '../../interfaces/mq';
|
|
5
5
|
import { MqMessageQueueService } from '../mq-message-queue.service';
|
|
6
6
|
import { MqMessageService } from '../mq-message.service';
|
|
7
|
+
import { buildNamespacedQueueName } from './common';
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscriber<T> { // TODO This can be made a generic type for better type visibility
|
|
@@ -80,19 +81,21 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
80
81
|
}
|
|
81
82
|
}
|
|
82
83
|
|
|
84
|
+
const namespacedQueueName = buildNamespacedQueueName(queueName);
|
|
83
85
|
try {
|
|
84
|
-
await this.connectAndConsume(
|
|
86
|
+
await this.connectAndConsume(namespacedQueueName);
|
|
85
87
|
} catch (err) {
|
|
86
|
-
this.logger.error(`Failed to connect to RabbitMQ for queue ${
|
|
87
|
-
this.triggerReconnect(
|
|
88
|
+
this.logger.error(`Failed to connect to RabbitMQ for queue ${namespacedQueueName}: ${(err as Error).message}`, (err as Error).stack);
|
|
89
|
+
this.triggerReconnect(namespacedQueueName, 'initial connection failure');
|
|
88
90
|
}
|
|
89
91
|
|
|
90
|
-
this.logger.log(`RabbitMqSubscriber ready to consume messages: ${JSON.stringify(
|
|
92
|
+
this.logger.log(`RabbitMqSubscriber ready to consume messages: ${JSON.stringify(options)} and url: ${this.url}`);
|
|
91
93
|
}
|
|
92
94
|
}
|
|
93
95
|
|
|
94
96
|
private async connectAndConsume(queueName: string): Promise<void> {
|
|
95
97
|
await this.cleanup();
|
|
98
|
+
this.logger.log(`RabbitMqSubscriber in connectAndConsume for queue: ${queueName} and url: ${this.url}`);
|
|
96
99
|
|
|
97
100
|
let connection: amqp.Connection;
|
|
98
101
|
try {
|
|
@@ -159,11 +162,12 @@ export abstract class RabbitMqSubscriber<T> implements OnModuleInit, QueueSubscr
|
|
|
159
162
|
return;
|
|
160
163
|
}
|
|
161
164
|
|
|
162
|
-
const messageContentString = rawMessage.content.toString();
|
|
163
165
|
let message: QueueMessage<T> = null;
|
|
164
166
|
|
|
165
167
|
try {
|
|
168
|
+
const messageContentString = rawMessage.content.toString();
|
|
166
169
|
message = JSON.parse(messageContentString) as QueueMessage<T>;
|
|
170
|
+
this.logger.debug(`rabbitmq subscriber received message with id: ${message.messageId} for queue ${queueName}`);
|
|
167
171
|
} catch (error) {
|
|
168
172
|
this.logger.error(`Invalid JSON message on queue ${queueName}: ${(error as Error).message}`);
|
|
169
173
|
await this.publishToFailedQueue(queueName, rawMessage.content, channel, error);
|
|
@@ -7,7 +7,7 @@ import { CreateSettingDto } from 'src/dtos/create-setting.dto';
|
|
|
7
7
|
import { GetMcpUrlDto } from 'src/dtos/get-mcp-url.dto';
|
|
8
8
|
import { User } from 'src/entities/user.entity';
|
|
9
9
|
import { SettingRepository } from '../repository/setting.repository';
|
|
10
|
-
import { FILE_SERVICE, IFileService } from './file';
|
|
10
|
+
import { FILE_SERVICE, IFileService, FILE_STORAGE_PATH_BUILDER, IStoragePathBuilder } from './file';
|
|
11
11
|
import { Setting } from '../entities/setting.entity';
|
|
12
12
|
import { RequestContextService } from './request-context.service';
|
|
13
13
|
import { SolidRegistry } from 'src/helpers/solid-registry';
|
|
@@ -32,6 +32,7 @@ export class SettingService {
|
|
|
32
32
|
|
|
33
33
|
constructor(
|
|
34
34
|
@Inject(FILE_SERVICE) readonly fileService: IFileService,
|
|
35
|
+
@Inject(FILE_STORAGE_PATH_BUILDER) readonly pathBuilder: IStoragePathBuilder,
|
|
35
36
|
readonly solidRegistry: SolidRegistry,
|
|
36
37
|
readonly repo: SettingRepository,
|
|
37
38
|
readonly moduleMetadataRepo: ModuleMetadataRepository,
|
|
@@ -251,9 +252,10 @@ export class SettingService {
|
|
|
251
252
|
const relativeFileName = `${file.filename}-${file.originalname}`;
|
|
252
253
|
|
|
253
254
|
// Read file from local disk (where Multer stores uploads) and write to storage
|
|
254
|
-
// The
|
|
255
|
+
// The path builder constructs the provider-appropriate storage path
|
|
255
256
|
const fileContent = await fsPromises.readFile(file.path);
|
|
256
|
-
const
|
|
257
|
+
const storagePath = this.pathBuilder.build(relativeFileName);
|
|
258
|
+
const fileUrl = await this.fileService.write(storagePath, fileContent, { contentType: file.mimetype });
|
|
257
259
|
// Delete the temp file from local disk
|
|
258
260
|
await fsPromises.unlink(file.path);
|
|
259
261
|
|
|
@@ -3,8 +3,8 @@ import { Environment } from "src/decorators/disallow-in-production.decorator";
|
|
|
3
3
|
import { SettingsProvider } from "src/decorators/settings-provider.decorator";
|
|
4
4
|
import { ISettingsProvider, SettingDefinition, SettingLevel } from "src/interfaces";
|
|
5
5
|
|
|
6
|
-
const DEFAULT_MEDIA_UPLOAD_DIR = 'media-uploads';
|
|
7
|
-
const DEFAULT_MEDIA_FILE_STORAGE_DIR = 'media-files-storage';
|
|
6
|
+
export const DEFAULT_MEDIA_UPLOAD_DIR = 'media-uploads';
|
|
7
|
+
export const DEFAULT_MEDIA_FILE_STORAGE_DIR = 'media-files-storage';
|
|
8
8
|
|
|
9
9
|
// 1.
|
|
10
10
|
const getSolidCoreSettings = (isProd: boolean) => ([
|
|
@@ -87,7 +87,8 @@ const getSolidCoreSettings = (isProd: boolean) => ([
|
|
|
87
87
|
// iam-settings-provider.service.ts
|
|
88
88
|
{ moduleName: "solid-core", key: "passwordLessAuth", value: (process.env.IAM_PASSWORD_LESS_AUTH?.trim() ?? 'false') === 'true', level: SettingLevel.SystemAdminEditable },
|
|
89
89
|
{ moduleName: "solid-core", key: "passwordBasedAuth", value: (process.env.IAM_PASSWORD_BASED_AUTH?.trim() ?? 'true') === 'true', level: SettingLevel.SystemAdminEditable },
|
|
90
|
-
{ moduleName: "solid-core", key: "passwordlessRegistrationValidateWhat", value: (process.env.IAM_PASSWORD_LESS_REGISTRATION_VALIDATE_WHAT ?? 'email').
|
|
90
|
+
{ moduleName: "solid-core", key: "passwordlessRegistrationValidateWhat", value: (process.env.IAM_PASSWORD_LESS_REGISTRATION_VALIDATE_WHAT ?? 'email').trim(), level: SettingLevel.SystemAdminEditable },
|
|
91
|
+
{ moduleName: "solid-core", key: "passwordlessLoginValidateWhat", value: process.env.IAM_PASSWORD_LESS_LOGIN_VALIDATE_WHAT ?? 'email', level: SettingLevel.SystemAdminEditable },
|
|
91
92
|
{ moduleName: "solid-core", key: "allowPublicRegistration", value: (process.env.IAM_ALLOW_PUBLIC_REGISTRATION ?? 'true') === 'true', level: SettingLevel.SystemAdminEditable },
|
|
92
93
|
{ moduleName: "solid-core", key: "activateUserOnRegistration", value: (process.env.IAM_ACTIVATE_USER_ON_REGISTRATION ?? 'true') === 'true', level: SettingLevel.SystemAdminEditable },
|
|
93
94
|
{ moduleName: "solid-core", key: "autoLoginUserOnRegistration", value: (process.env.IAM_AUTO_LOGIN_USER_ON_REGISTRATION ?? 'false') === 'true', level: SettingLevel.SystemEnv },
|
|
@@ -96,6 +97,7 @@ const getSolidCoreSettings = (isProd: boolean) => ([
|
|
|
96
97
|
{ moduleName: "solid-core", key: "defaultRole", value: process.env.IAM_DEFAULT_ROLE ?? 'Public', level: SettingLevel.SystemAdminEditable },
|
|
97
98
|
{ moduleName: "solid-core", key: "dummyOtp", value: process.env.IAM_OTP_DUMMY, level: SettingLevel.SystemEnv },
|
|
98
99
|
{ moduleName: "solid-core", key: "forgotPasswordSendVerificationTokenOn", value: process.env.IAM_FORGOT_PASSWORD_SEND_VERIFICATION_TOKEN_ON ?? 'email', level: SettingLevel.SystemEnv },
|
|
100
|
+
{ moduleName: "solid-core", key: "maxFailedLoginAttempts", value: parseInt(process.env.IAM_MAX_FAILED_LOGIN_ATTEMPTS ?? '0'), level: SettingLevel.SystemAdminReadonly },
|
|
99
101
|
{ moduleName: "solid-core", key: "forceChangePasswordOnFirstLogin", value: false, level: SettingLevel.SystemAdminEditable },
|
|
100
102
|
{ moduleName: "solid-core", key: "authenticationPasswordRegex", value: process.env.PASSWORD_REGEX || '^$|^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[^\\da-zA-Z]).*$', level: SettingLevel.SystemAdminEditable },
|
|
101
103
|
{ moduleName: "solid-core", key: "authenticationPasswordRegexErrorMessage", value: process.env.PASSWORD_REGEX_ERROR_MESSAGE || 'Password must contain at least one uppercase, one lowercase, one number, and one special character.', level: SettingLevel.SystemAdminEditable },
|
package/src/solid-core.module.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Global, Module } from '@nestjs/common';
|
|
1
|
+
import { Global, MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
|
|
2
|
+
import * as express from 'express';
|
|
2
3
|
import { ConfigModule, ConfigService } from '@nestjs/config';
|
|
3
4
|
import {
|
|
4
5
|
APP_FILTER,
|
|
@@ -58,6 +59,8 @@ import { HttpModule } from '@nestjs/axios';
|
|
|
58
59
|
import { JwtModule } from '@nestjs/jwt';
|
|
59
60
|
import { SeedCommand } from './commands/seed.command';
|
|
60
61
|
import { TestDataCommand } from './commands/test-data.command';
|
|
62
|
+
import { TestRunCommand } from './commands/run-tests.command';
|
|
63
|
+
import { TestCommand } from './commands/test.command';
|
|
61
64
|
import { AuthenticationController } from './controllers/authentication.controller';
|
|
62
65
|
import { EmailTemplateController } from './controllers/email-template.controller';
|
|
63
66
|
import { GoogleAuthenticationController } from './controllers/google-authentication.controller';
|
|
@@ -95,16 +98,12 @@ import { TestQueuePublisher } from './jobs/test-queue-publisher.service';
|
|
|
95
98
|
import { TestQueueSubscriber } from './jobs/test-queue-subscriber.service';
|
|
96
99
|
import { UserRegistrationListener } from './listeners/user-registration.listener';
|
|
97
100
|
import { GoogleOauthStrategy } from './passport-strategies/google-oauth.strategy';
|
|
98
|
-
import { LocalStrategy } from './passport-strategies/local.strategy';
|
|
99
|
-
import { EmailTemplateSeederService } from './seeders/email-template-seeder.service';
|
|
100
|
-
import { SmsTemplateSeederService } from './seeders/sms-template-seeder.service';
|
|
101
|
-
import { UserSeederService } from './seeders/user-seeder.service';
|
|
102
101
|
import { AuthenticationService } from './services/authentication.service';
|
|
103
102
|
import { BcryptService } from './services/bcrypt.service';
|
|
104
103
|
import { UuidExternalIdEntityComputedFieldProvider } from './services/computed-fields/entity/uuid-externalid-entity-computed-field-provider.service';
|
|
105
104
|
import { UuidExternalIdComputedFieldProvider } from './services/computed-fields/uuid-external-id-computed-field-provider.service';
|
|
106
105
|
import { EmailTemplateService } from './services/email-template.service';
|
|
107
|
-
import { DiskFileService, S3FileService, FileServiceFactory } from './services/file';
|
|
106
|
+
import { DiskFileService, S3FileService, FileServiceFactory, DiskStoragePathBuilder, S3StoragePathBuilder, StoragePathBuilderFactory } from './services/file';
|
|
108
107
|
import { HashingService } from './services/hashing.service';
|
|
109
108
|
import { ElasticEmailService } from './services/mail/elastic-email.service';
|
|
110
109
|
import { SMTPEMailService } from './services/mail/smtp-email.service';
|
|
@@ -503,10 +502,15 @@ import { ListOfRolesSelectionProvider } from './services/selection-providers/lis
|
|
|
503
502
|
DiskFileService,
|
|
504
503
|
S3FileService,
|
|
505
504
|
FileServiceFactory,
|
|
505
|
+
DiskStoragePathBuilder,
|
|
506
|
+
S3StoragePathBuilder,
|
|
507
|
+
StoragePathBuilderFactory,
|
|
506
508
|
TextractService,
|
|
507
509
|
SolidRegistry,
|
|
508
510
|
SeedCommand,
|
|
511
|
+
TestCommand,
|
|
509
512
|
TestDataCommand,
|
|
513
|
+
TestRunCommand,
|
|
510
514
|
McpCommand,
|
|
511
515
|
IngestCommand,
|
|
512
516
|
IngestMetadataService,
|
|
@@ -559,8 +563,6 @@ import { ListOfRolesSelectionProvider } from './services/selection-providers/lis
|
|
|
559
563
|
Three60WhatsappService,
|
|
560
564
|
MqMessageService,
|
|
561
565
|
MqMessageQueueService,
|
|
562
|
-
EmailTemplateSeederService,
|
|
563
|
-
SmsTemplateSeederService,
|
|
564
566
|
TinyUrlService,
|
|
565
567
|
PdfService,
|
|
566
568
|
UuidExternalIdComputedFieldProvider,
|
|
@@ -573,8 +575,6 @@ import { ListOfRolesSelectionProvider } from './services/selection-providers/lis
|
|
|
573
575
|
AuthenticationService,
|
|
574
576
|
GoogleAuthenticationController,
|
|
575
577
|
RefreshTokenIdsStorageService,
|
|
576
|
-
UserSeederService,
|
|
577
|
-
LocalStrategy,
|
|
578
578
|
GoogleOauthStrategy,
|
|
579
579
|
UserRegistrationListener,
|
|
580
580
|
TestQueuePublisher,
|
|
@@ -730,6 +730,9 @@ import { ListOfRolesSelectionProvider } from './services/selection-providers/lis
|
|
|
730
730
|
DiskFileService,
|
|
731
731
|
S3FileService,
|
|
732
732
|
FileServiceFactory,
|
|
733
|
+
DiskStoragePathBuilder,
|
|
734
|
+
S3StoragePathBuilder,
|
|
735
|
+
StoragePathBuilderFactory,
|
|
733
736
|
HttpModule,
|
|
734
737
|
ImportTransactionService,
|
|
735
738
|
ListOfValuesService,
|
|
@@ -764,11 +767,16 @@ import { ListOfRolesSelectionProvider } from './services/selection-providers/lis
|
|
|
764
767
|
TwilioSMSService,
|
|
765
768
|
TypeOrmModule,
|
|
766
769
|
UserActivityHistoryService,
|
|
767
|
-
UserSeederService,
|
|
768
770
|
ImageEncodingService,
|
|
769
771
|
SolidMicroserviceAdapter,
|
|
770
772
|
UserService,
|
|
771
773
|
SettingService,
|
|
772
774
|
],
|
|
773
775
|
})
|
|
774
|
-
export class SolidCoreModule {
|
|
776
|
+
export class SolidCoreModule implements NestModule {
|
|
777
|
+
configure(consumer: MiddlewareConsumer) {
|
|
778
|
+
consumer
|
|
779
|
+
.apply(express.json({ limit: '10mb' }), express.urlencoded({ limit: '10mb', extended: true }))
|
|
780
|
+
.forRoutes('*');
|
|
781
|
+
}
|
|
782
|
+
}
|