@solidstarters/solid-core 1.2.200 → 1.2.201
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/fixtures/fixtures-setup.command.d.ts +15 -0
- package/dist/commands/fixtures/fixtures-setup.command.d.ts.map +1 -0
- package/dist/commands/fixtures/fixtures-setup.command.js +58 -0
- package/dist/commands/fixtures/fixtures-setup.command.js.map +1 -0
- package/dist/commands/fixtures/fixtures-tear-down.command.d.ts +16 -0
- package/dist/commands/fixtures/fixtures-tear-down.command.d.ts.map +1 -0
- package/dist/commands/fixtures/fixtures-tear-down.command.js +59 -0
- package/dist/commands/fixtures/fixtures-tear-down.command.js.map +1 -0
- package/dist/commands/refresh-model.command.d.ts.map +1 -1
- package/dist/commands/refresh-model.command.js +4 -0
- package/dist/commands/refresh-model.command.js.map +1 -1
- package/dist/constants/error-messages.d.ts +2 -0
- package/dist/constants/error-messages.d.ts.map +1 -1
- package/dist/constants/error-messages.js +4 -0
- package/dist/constants/error-messages.js.map +1 -1
- package/dist/controllers/model-sequence.controller.d.ts +43 -0
- package/dist/controllers/model-sequence.controller.d.ts.map +1 -0
- package/dist/controllers/model-sequence.controller.js +179 -0
- package/dist/controllers/model-sequence.controller.js.map +1 -0
- package/dist/controllers/setting.controller.d.ts +1 -0
- package/dist/controllers/setting.controller.d.ts.map +1 -1
- package/dist/controllers/setting.controller.js +15 -0
- package/dist/controllers/setting.controller.js.map +1 -1
- package/dist/dtos/basic-filters.dto.d.ts +3 -1
- package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
- package/dist/dtos/basic-filters.dto.js +8 -2
- package/dist/dtos/basic-filters.dto.js.map +1 -1
- package/dist/dtos/basic-group-filters.dto.d.ts +6 -0
- package/dist/dtos/basic-group-filters.dto.d.ts.map +1 -0
- package/dist/dtos/basic-group-filters.dto.js +46 -0
- package/dist/dtos/basic-group-filters.dto.js.map +1 -0
- package/dist/dtos/create-field-metadata.dto.js +2 -2
- package/dist/dtos/create-field-metadata.dto.js.map +1 -1
- package/dist/dtos/create-model-sequence.dto.d.ts +14 -0
- package/dist/dtos/create-model-sequence.dto.d.ts.map +1 -0
- package/dist/dtos/create-model-sequence.dto.js +90 -0
- package/dist/dtos/create-model-sequence.dto.js.map +1 -0
- package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-role-metadata.dto.js +1 -0
- package/dist/dtos/create-role-metadata.dto.js.map +1 -1
- package/dist/dtos/get-mcp-url.dto.d.ts +5 -0
- package/dist/dtos/get-mcp-url.dto.d.ts.map +1 -0
- package/dist/dtos/get-mcp-url.dto.js +31 -0
- package/dist/dtos/get-mcp-url.dto.js.map +1 -0
- package/dist/dtos/resolve-s3-url.dto.d.ts +5 -5
- package/dist/dtos/resolve-s3-url.dto.d.ts.map +1 -1
- package/dist/dtos/resolve-s3-url.dto.js +7 -7
- package/dist/dtos/resolve-s3-url.dto.js.map +1 -1
- package/dist/dtos/update-model-sequence.dto.d.ts +15 -0
- package/dist/dtos/update-model-sequence.dto.d.ts.map +1 -0
- package/dist/dtos/update-model-sequence.dto.js +94 -0
- package/dist/dtos/update-model-sequence.dto.js.map +1 -0
- package/dist/entities/common.entity.d.ts.map +1 -1
- package/dist/entities/common.entity.js +1 -0
- package/dist/entities/common.entity.js.map +1 -1
- package/dist/entities/legacy-common.entity.d.ts.map +1 -1
- package/dist/entities/legacy-common.entity.js +1 -0
- package/dist/entities/legacy-common.entity.js.map +1 -1
- package/dist/entities/model-sequence.entity.d.ts +15 -0
- package/dist/entities/model-sequence.entity.d.ts.map +1 -0
- package/dist/entities/model-sequence.entity.js +67 -0
- package/dist/entities/model-sequence.entity.js.map +1 -0
- package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js +13 -2
- package/dist/helpers/field-crud-managers/BigIntFieldCrudManager.js.map +1 -1
- package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts +0 -1
- package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js +4 -9
- package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js.map +1 -1
- package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.d.ts +0 -1
- package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.js +7 -8
- package/dist/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.js.map +1 -1
- package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts +0 -1
- package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js +4 -9
- package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js.map +1 -1
- package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
- package/dist/helpers/model-metadata-helper.service.js +6 -2
- package/dist/helpers/model-metadata-helper.service.js.map +1 -1
- package/dist/helpers/module-metadata-helper.service.d.ts +1 -0
- package/dist/helpers/module-metadata-helper.service.d.ts.map +1 -1
- package/dist/helpers/module-metadata-helper.service.js +9 -0
- package/dist/helpers/module-metadata-helper.service.js.map +1 -1
- package/dist/helpers/module.helper.d.ts +1 -0
- package/dist/helpers/module.helper.d.ts.map +1 -1
- package/dist/helpers/module.helper.js +29 -3
- package/dist/helpers/module.helper.js.map +1 -1
- package/dist/helpers/solid-registry.d.ts +11 -0
- package/dist/helpers/solid-registry.d.ts.map +1 -1
- package/dist/helpers/solid-registry.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/jobs/computed-field-evaluation-subscriber.service.d.ts +1 -0
- package/dist/jobs/computed-field-evaluation-subscriber.service.d.ts.map +1 -1
- package/dist/jobs/computed-field-evaluation-subscriber.service.js +16 -4
- package/dist/jobs/computed-field-evaluation-subscriber.service.js.map +1 -1
- package/dist/repository/media.repository.d.ts.map +1 -1
- package/dist/repository/media.repository.js +4 -0
- package/dist/repository/media.repository.js.map +1 -1
- package/dist/repository/model-sequence.repository.d.ts +14 -0
- package/dist/repository/model-sequence.repository.d.ts.map +1 -0
- package/dist/repository/model-sequence.repository.js +103 -0
- package/dist/repository/model-sequence.repository.js.map +1 -0
- package/dist/seeders/module-metadata-seeder.service.d.ts +7 -12
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +64 -26
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +343 -27
- package/dist/seeders/system-fields-seeder.service.d.ts +1 -0
- package/dist/seeders/system-fields-seeder.service.d.ts.map +1 -1
- package/dist/seeders/system-fields-seeder.service.js +11 -2
- package/dist/seeders/system-fields-seeder.service.js.map +1 -1
- package/dist/services/action-metadata.service.d.ts.map +1 -1
- package/dist/services/action-metadata.service.js +1 -0
- package/dist/services/action-metadata.service.js.map +1 -1
- package/dist/services/ai-interaction.service.d.ts.map +1 -1
- package/dist/services/ai-interaction.service.js +1 -0
- package/dist/services/ai-interaction.service.js.map +1 -1
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +22 -14
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/chatter-message-details.service.d.ts.map +1 -1
- package/dist/services/chatter-message-details.service.js +1 -0
- package/dist/services/chatter-message-details.service.js.map +1 -1
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +7 -3
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.d.ts.map +1 -1
- package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js +7 -5
- package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
- package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts +15 -0
- package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.d.ts.map +1 -0
- package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js +72 -0
- package/dist/services/computed-fields/entity/sequence-num-computed-field-provider.js.map +1 -0
- package/dist/services/crud-helper.service.d.ts +23 -6
- package/dist/services/crud-helper.service.d.ts.map +1 -1
- package/dist/services/crud-helper.service.js +257 -45
- package/dist/services/crud-helper.service.js.map +1 -1
- package/dist/services/crud.service.d.ts +3 -1
- package/dist/services/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +53 -24
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/database/database-bootstrap.service.d.ts +12 -0
- package/dist/services/database/database-bootstrap.service.d.ts.map +1 -0
- package/dist/services/database/database-bootstrap.service.js +115 -0
- package/dist/services/database/database-bootstrap.service.js.map +1 -0
- package/dist/services/email-template.service.d.ts +7 -7
- package/dist/services/email-template.service.d.ts.map +1 -1
- package/dist/services/email-template.service.js +8 -7
- package/dist/services/email-template.service.js.map +1 -1
- package/dist/services/excel.service.d.ts +10 -0
- package/dist/services/excel.service.d.ts.map +1 -1
- package/dist/services/excel.service.js +100 -0
- package/dist/services/excel.service.js.map +1 -1
- package/dist/services/field-metadata.service.d.ts +4 -1
- package/dist/services/field-metadata.service.d.ts.map +1 -1
- package/dist/services/field-metadata.service.js +35 -30
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/file.service.d.ts +1 -0
- package/dist/services/file.service.d.ts.map +1 -1
- package/dist/services/file.service.js +9 -0
- package/dist/services/file.service.js.map +1 -1
- package/dist/services/fixtures.service.d.ts +13 -0
- package/dist/services/fixtures.service.d.ts.map +1 -0
- package/dist/services/fixtures.service.js +95 -0
- package/dist/services/fixtures.service.js.map +1 -0
- package/dist/services/genai/ingest-metadata.service.d.ts.map +1 -1
- package/dist/services/genai/ingest-metadata.service.js +1 -1
- package/dist/services/genai/ingest-metadata.service.js.map +1 -1
- package/dist/services/import-transaction-error-log.service.d.ts.map +1 -1
- package/dist/services/import-transaction-error-log.service.js +1 -0
- package/dist/services/import-transaction-error-log.service.js.map +1 -1
- package/dist/services/import-transaction.service.d.ts.map +1 -1
- package/dist/services/import-transaction.service.js +7 -1
- package/dist/services/import-transaction.service.js.map +1 -1
- package/dist/services/list-of-values.service.d.ts +2 -2
- package/dist/services/list-of-values.service.d.ts.map +1 -1
- package/dist/services/list-of-values.service.js +2 -1
- package/dist/services/list-of-values.service.js.map +1 -1
- package/dist/services/locale.service.d.ts.map +1 -1
- package/dist/services/locale.service.js +1 -0
- package/dist/services/locale.service.js.map +1 -1
- package/dist/services/mail/smtp-email.service.js +0 -1
- package/dist/services/mail/smtp-email.service.js.map +1 -1
- package/dist/services/media.service.d.ts +3 -3
- package/dist/services/media.service.d.ts.map +1 -1
- package/dist/services/media.service.js +6 -4
- package/dist/services/media.service.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js +17 -6
- 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 +0 -13
- package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
- package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
- package/dist/services/menu-item-metadata.service.js +4 -0
- package/dist/services/menu-item-metadata.service.js.map +1 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +2 -42
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/model-sequence.service.d.ts +23 -0
- package/dist/services/model-sequence.service.d.ts.map +1 -0
- package/dist/services/model-sequence.service.js +55 -0
- package/dist/services/model-sequence.service.js.map +1 -0
- package/dist/services/module-metadata.service.d.ts +1 -0
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +35 -1
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/permission-metadata.service.d.ts +5 -5
- package/dist/services/permission-metadata.service.d.ts.map +1 -1
- package/dist/services/permission-metadata.service.js +6 -5
- package/dist/services/permission-metadata.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 +2 -1
- package/dist/services/queues/database-subscriber.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 +2 -2
- package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
- package/dist/services/role-metadata.service.d.ts.map +1 -1
- package/dist/services/role-metadata.service.js +1 -0
- package/dist/services/role-metadata.service.js.map +1 -1
- package/dist/services/scheduled-job.service.d.ts +6 -6
- package/dist/services/scheduled-job.service.d.ts.map +1 -1
- package/dist/services/scheduled-job.service.js +8 -8
- package/dist/services/scheduled-job.service.js.map +1 -1
- package/dist/services/scheduled-jobs/scheduler.service.d.ts.map +1 -1
- package/dist/services/scheduled-jobs/scheduler.service.js +4 -0
- package/dist/services/scheduled-jobs/scheduler.service.js.map +1 -1
- package/dist/services/security-rule.service.d.ts.map +1 -1
- package/dist/services/security-rule.service.js +1 -0
- package/dist/services/security-rule.service.js.map +1 -1
- package/dist/services/selection-providers/list-of-models-selection-provider.service.d.ts.map +1 -1
- package/dist/services/selection-providers/list-of-models-selection-provider.service.js +4 -0
- package/dist/services/selection-providers/list-of-models-selection-provider.service.js.map +1 -1
- package/dist/services/setting.service.d.ts +7 -5
- package/dist/services/setting.service.d.ts.map +1 -1
- package/dist/services/setting.service.js +26 -4
- package/dist/services/setting.service.js.map +1 -1
- package/dist/services/sms-template.service.d.ts +7 -7
- package/dist/services/sms-template.service.d.ts.map +1 -1
- package/dist/services/sms-template.service.js +8 -7
- package/dist/services/sms-template.service.js.map +1 -1
- package/dist/services/solid-introspect.service.d.ts +4 -13
- package/dist/services/solid-introspect.service.d.ts.map +1 -1
- package/dist/services/solid-introspect.service.js +4 -22
- package/dist/services/solid-introspect.service.js.map +1 -1
- package/dist/services/solid-ts-morph.service.js +2 -2
- package/dist/services/solid-ts-morph.service.js.map +1 -1
- package/dist/services/user-activity-history.service.d.ts.map +1 -1
- package/dist/services/user-activity-history.service.js +1 -0
- package/dist/services/user-activity-history.service.js.map +1 -1
- package/dist/services/user-view-metadata.service.d.ts.map +1 -1
- package/dist/services/user-view-metadata.service.js +3 -2
- package/dist/services/user-view-metadata.service.js.map +1 -1
- package/dist/services/user.service.d.ts.map +1 -1
- package/dist/services/user.service.js +1 -0
- package/dist/services/user.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts +1 -1
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +3 -1
- package/dist/services/view-metadata.service.js.map +1 -1
- package/dist/solid-core-cli-db.module.d.ts.map +1 -1
- package/dist/solid-core-cli-db.module.js +5 -2
- package/dist/solid-core-cli-db.module.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +18 -0
- package/dist/solid-core.module.js.map +1 -1
- package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
- package/dist/subscribers/audit.subscriber.js +5 -1
- package/dist/subscribers/audit.subscriber.js.map +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.d.ts +4 -2
- package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.js +53 -12
- package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
- package/dist/transformers/typeorm/local-date-time-transformer.d.ts +5 -0
- package/dist/transformers/typeorm/local-date-time-transformer.d.ts.map +1 -0
- package/dist/transformers/typeorm/local-date-time-transformer.js +26 -0
- package/dist/transformers/typeorm/local-date-time-transformer.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/docs/grouping-enhancements.md +89 -0
- package/package.json +1 -1
- package/src/commands/fixtures/fixtures-setup.command.ts +44 -0
- package/src/commands/fixtures/fixtures-tear-down.command.ts +45 -0
- package/src/commands/refresh-model.command.ts +3 -1
- package/src/constants/error-messages.ts +7 -1
- package/src/controllers/model-sequence.controller.ts +93 -0
- package/src/controllers/setting.controller.ts +33 -21
- package/src/dtos/basic-filters.dto.ts +6 -1
- package/src/dtos/basic-group-filters.dto.ts +23 -0
- package/src/dtos/create-field-metadata.dto.ts +1 -1
- package/src/dtos/create-model-sequence.dto.ts +51 -0
- package/src/dtos/create-role-metadata.dto.ts +16 -3
- package/src/dtos/get-mcp-url.dto.ts +13 -0
- package/src/dtos/resolve-s3-url.dto.ts +9 -11
- package/src/dtos/update-model-sequence.dto.ts +53 -0
- package/src/entities/common.entity.ts +2 -2
- package/src/entities/legacy-common.entity.ts +2 -1
- package/src/entities/model-sequence.entity.ts +32 -0
- package/src/helpers/field-crud-managers/BigIntFieldCrudManager.ts +18 -5
- package/src/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.ts +9 -9
- package/src/helpers/field-crud-managers/ManyToOneRelationFieldCrudManager.ts +16 -8
- package/src/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.ts +9 -9
- package/src/helpers/model-metadata-helper.service.ts +6 -4
- package/src/helpers/module-metadata-helper.service.ts +18 -1
- package/src/helpers/module.helper.ts +40 -5
- package/src/helpers/solid-registry.ts +14 -0
- package/src/index.ts +3 -1
- package/src/jobs/computed-field-evaluation-subscriber.service.ts +15 -4
- package/src/repository/media.repository.ts +3 -2
- package/src/repository/model-sequence.repository.ts +97 -0
- package/src/seeders/module-metadata-seeder.service.ts +103 -29
- package/src/seeders/seed-data/solid-core-metadata.json +343 -27
- package/src/seeders/system-fields-seeder.service.ts +6 -2
- package/src/services/action-metadata.service.ts +3 -2
- package/src/services/ai-interaction.service.ts +2 -1
- package/src/services/authentication.service.ts +46 -14
- package/src/services/chatter-message-details.service.ts +2 -1
- package/src/services/chatter-message.service.ts +10 -4
- package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +8 -7
- package/src/services/computed-fields/entity/sequence-num-computed-field-provider.ts +86 -0
- package/src/services/crud-helper.service.ts +287 -49
- package/src/services/crud.service.ts +83 -32
- package/src/services/database/database-bootstrap.service.ts +91 -0
- package/src/services/email-template.service.ts +11 -13
- package/src/services/excel.service.ts +146 -3
- package/src/services/field-metadata.service.ts +102 -55
- package/src/services/file.service.ts +9 -0
- package/src/services/fixtures.service.ts +108 -0
- package/src/services/genai/ingest-metadata.service.ts +4 -3
- package/src/services/import-transaction-error-log.service.ts +2 -1
- package/src/services/import-transaction.service.ts +8 -4
- package/src/services/list-of-values.service.ts +4 -4
- package/src/services/locale.service.ts +2 -1
- package/src/services/mail/smtp-email.service.ts +1 -1
- package/src/services/media.service.ts +10 -11
- package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +22 -7
- package/src/services/mediaStorageProviders/file-storage-provider.ts +18 -13
- package/src/services/menu-item-metadata.service.ts +6 -2
- package/src/services/model-metadata.service.ts +50 -44
- package/src/services/model-sequence.service.ts +33 -0
- package/src/services/module-metadata.service.ts +49 -2
- package/src/services/permission-metadata.service.ts +8 -9
- package/src/services/queues/database-subscriber.service.ts +3 -1
- package/src/services/queues/rabbitmq-subscriber.service.ts +4 -2
- package/src/services/role-metadata.service.ts +1 -0
- package/src/services/scheduled-job.service.ts +9 -9
- package/src/services/scheduled-jobs/scheduler.service.ts +5 -0
- package/src/services/security-rule.service.ts +1 -0
- package/src/services/selection-providers/list-of-models-selection-provider.service.ts +5 -2
- package/src/services/setting.service.ts +33 -6
- package/src/services/sms-template.service.ts +11 -13
- package/src/services/solid-introspect.service.ts +6 -19
- package/src/services/solid-ts-morph.service.ts +2 -2
- package/src/services/user-activity-history.service.ts +3 -2
- package/src/services/user-view-metadata.service.ts +4 -3
- package/src/services/user.service.ts +2 -1
- package/src/services/view-metadata.service.ts +5 -4
- package/src/solid-core-cli-db.module.ts +5 -4
- package/src/solid-core.module.ts +18 -0
- package/src/subscribers/audit.subscriber.ts +3 -2
- package/src/subscribers/computed-entity-field.subscriber.ts +60 -17
- package/src/transformers/typeorm/local-date-time-transformer.ts +30 -0
- /package/sql/{mssql → default/mssql}/proc_CleanupModelMetadata.sql +0 -0
- /package/sql/{mssql → default/mssql}/proc_CleanupModuleMetadata.sql +0 -0
- /package/sql/{mssql/scratchpad.sql → default/mssql/scratchpad.sql.txt} +0 -0
- /package/sql/{postgres → default/postgres}/proc_CleanupModelMetadata.sql +0 -0
- /package/sql/{postgres → default/postgres}/proc_CleanupModuleMetadata.sql +0 -0
- /package/sql/{postgres/scratchpad.sql → default/postgres/scratchpad.sql.txt} +0 -0
|
@@ -12,13 +12,15 @@ import { SelectionDynamicQueryDto } from '../dtos/selection-dynamic-query.dto';
|
|
|
12
12
|
import { UpdateFieldMetaDataDto } from '../dtos/update-field-metadata.dto';
|
|
13
13
|
import { FieldMetadata } from '../entities/field-metadata.entity';
|
|
14
14
|
import { ModelMetadata } from '../entities/model-metadata.entity';
|
|
15
|
-
import { ISelectionProviderValues } from '../interfaces';
|
|
15
|
+
import { ISelectionProviderValues, MediaStorageProvider } from '../interfaces';
|
|
16
16
|
import { CrudHelperService } from './crud-helper.service';
|
|
17
17
|
import { ERROR_MESSAGES } from 'src/constants/error-messages';
|
|
18
18
|
import qs from 'qs';
|
|
19
19
|
import { ResolveS3UrlDto } from 'src/dtos/resolve-s3-url.dto';
|
|
20
|
+
import { MediaStorageProviderMetadataRepository } from 'src/repository/media-storage-provider-metadata.repository';
|
|
20
21
|
import { ConfigService } from '@nestjs/config';
|
|
21
22
|
import { FileService } from './file.service';
|
|
23
|
+
import { MediaStorageProviderMetadata } from 'src/entities/media-storage-provider-metadata.entity';
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
@Injectable()
|
|
@@ -27,6 +29,7 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
27
29
|
private readonly fieldMetadataRepo: FieldMetadataRepository,
|
|
28
30
|
private readonly configService: ConfigService,
|
|
29
31
|
private readonly fileService: FileService,
|
|
32
|
+
private readonly mediaStorageProviderMetadataRepository: MediaStorageProviderMetadataRepository,
|
|
30
33
|
|
|
31
34
|
@InjectDataSource()
|
|
32
35
|
private readonly dataSource: DataSource,
|
|
@@ -60,6 +63,7 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
60
63
|
computedFieldTriggerConfig: field.computedFieldTriggerConfig ?? [], // Ensure it's an array, default to empty if not provided
|
|
61
64
|
computedFieldValueProviderName: field.computedFieldValueProvider,
|
|
62
65
|
computedFieldValueProviderCtxt: field.computedFieldValueProviderCtxt ? JSON.parse(field.computedFieldValueProviderCtxt) : {}, // Parse the context if it exists, default to empty object
|
|
66
|
+
eventContext: {}
|
|
63
67
|
};
|
|
64
68
|
});
|
|
65
69
|
|
|
@@ -776,7 +780,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
776
780
|
"encrypt",
|
|
777
781
|
"encryptionType",
|
|
778
782
|
"decryptWhen",
|
|
779
|
-
"columnName"
|
|
783
|
+
"columnName",
|
|
784
|
+
"enableAuditTracking"
|
|
780
785
|
];
|
|
781
786
|
|
|
782
787
|
case SolidFieldType.richText:
|
|
@@ -1081,7 +1086,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
1081
1086
|
"encryptionType",
|
|
1082
1087
|
"decryptWhen",
|
|
1083
1088
|
"columnName",
|
|
1084
|
-
"isUserKey"
|
|
1089
|
+
"isUserKey",
|
|
1090
|
+
"enableAuditTracking"
|
|
1085
1091
|
];
|
|
1086
1092
|
|
|
1087
1093
|
case SolidFieldType.uuid:
|
|
@@ -1280,76 +1286,117 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
1280
1286
|
return fieldObject;
|
|
1281
1287
|
}
|
|
1282
1288
|
|
|
1283
|
-
async resolveS3Url(resolveS3UrlDto: ResolveS3UrlDto) {
|
|
1289
|
+
// async resolveS3Url(resolveS3UrlDto: ResolveS3UrlDto) {
|
|
1284
1290
|
|
|
1285
|
-
|
|
1291
|
+
// const { modelName, fieldName, fieldValue, s3KeyFieldName } = resolveS3UrlDto;
|
|
1286
1292
|
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1293
|
+
// // ------------------------------------------------
|
|
1294
|
+
// // 1. Load model metadata
|
|
1295
|
+
// // ------------------------------------------------
|
|
1296
|
+
// const modelRepo = this.dataSource.getRepository(ModelMetadata);
|
|
1297
|
+
// const model = await modelRepo.findOne({
|
|
1298
|
+
// where: { singularName: modelName },
|
|
1299
|
+
// relations: ['fields']
|
|
1300
|
+
// });
|
|
1295
1301
|
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1302
|
+
// if (!model) {
|
|
1303
|
+
// throw new NotFoundException(`Model ${modelName} not found`);
|
|
1304
|
+
// }
|
|
1299
1305
|
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1306
|
+
// // ------------------------------------------------
|
|
1307
|
+
// // 2. Validate the field we are filtering by
|
|
1308
|
+
// // ------------------------------------------------
|
|
1309
|
+
// const filterFieldMeta = model.fields.find(f => f.name === fieldName);
|
|
1310
|
+
// if (!filterFieldMeta) {
|
|
1311
|
+
// throw new NotFoundException(
|
|
1312
|
+
// `Field ${fieldName} not found in model ${modelName}`
|
|
1313
|
+
// );
|
|
1314
|
+
// }
|
|
1309
1315
|
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1316
|
+
// // ------------------------------------------------
|
|
1317
|
+
// // 3. Load the actual entity repository
|
|
1318
|
+
// // ------------------------------------------------
|
|
1319
|
+
// const entityRepo = this.dataSource.getRepository(model.singularName);
|
|
1314
1320
|
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
+
// // ------------------------------------------------
|
|
1322
|
+
// // 4. Query using fieldName = fieldValue
|
|
1323
|
+
// // ------------------------------------------------
|
|
1324
|
+
// const record = await entityRepo.findOne({
|
|
1325
|
+
// where: { [fieldName]: fieldValue }
|
|
1326
|
+
// });
|
|
1321
1327
|
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1328
|
+
// if (!record) {
|
|
1329
|
+
// throw new NotFoundException(
|
|
1330
|
+
// `${modelName} record not found for ${fieldName}="${fieldValue}"`
|
|
1331
|
+
// );
|
|
1332
|
+
// }
|
|
1327
1333
|
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1334
|
+
// // ------------------------------------------------
|
|
1335
|
+
// // 5. Extract S3 key from s3KeyFieldName
|
|
1336
|
+
// // ------------------------------------------------
|
|
1337
|
+
// const s3Key = record[s3KeyFieldName];
|
|
1332
1338
|
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1339
|
+
// if (!s3Key) {
|
|
1340
|
+
// throw new NotFoundException(
|
|
1341
|
+
// `Field "${s3KeyFieldName}" has no value in ${modelName}.${fieldName}="${fieldValue}"`
|
|
1342
|
+
// );
|
|
1343
|
+
// }
|
|
1344
|
+
|
|
1345
|
+
// // ------------------------------------------------
|
|
1346
|
+
// // 6. Generate signed or public URL
|
|
1347
|
+
// // ------------------------------------------------
|
|
1348
|
+
// let url = "";
|
|
1349
|
+
|
|
1350
|
+
// // TODO - get
|
|
1351
|
+
// if (resolveS3UrlDto.isPrivate == "true") {
|
|
1352
|
+
// const expiryInSeconds = 60 * 60;
|
|
1353
|
+
// url = await this.fileService.getSignedUrl(s3Key, expiryInSeconds, resolveS3UrlDto.bucketName);
|
|
1354
|
+
// } else {
|
|
1355
|
+
// url = `https://${resolveS3UrlDto.bucketName}.s3.${this.configService.get('S3_AWS_REGION_NAME')}.amazonaws.com/${s3Key}`;
|
|
1356
|
+
// }
|
|
1357
|
+
// return { url: url }
|
|
1358
|
+
// }
|
|
1338
1359
|
|
|
1339
|
-
|
|
1340
|
-
// 6. Generate signed or public URL
|
|
1341
|
-
// ------------------------------------------------
|
|
1360
|
+
async resolveS3Url(resolveS3UrlDto: ResolveS3UrlDto) {
|
|
1342
1361
|
let url = "";
|
|
1362
|
+
const normalizedKey = this.normalizeS3Key(resolveS3UrlDto.s3Key);
|
|
1343
1363
|
|
|
1344
|
-
|
|
1364
|
+
let resolvedBucketName = resolveS3UrlDto.bucketName;
|
|
1365
|
+
if (resolveS3UrlDto.mediaStorageProviderUserKey) {
|
|
1366
|
+
const mediaStorageProvider = await this.mediaStorageProviderMetadataRepository.findOne({
|
|
1367
|
+
where: {
|
|
1368
|
+
name: resolveS3UrlDto.mediaStorageProviderUserKey
|
|
1369
|
+
}
|
|
1370
|
+
});
|
|
1371
|
+
if (!mediaStorageProvider) {
|
|
1372
|
+
throw new NotFoundException(`MediaStorageProviderMetadata with user key ${resolveS3UrlDto.mediaStorageProviderUserKey} not found`);
|
|
1373
|
+
}
|
|
1374
|
+
resolvedBucketName = mediaStorageProvider.bucketName;
|
|
1375
|
+
}
|
|
1376
|
+
this.logger.debug(`INSIDE::resolveS3Url:: resolvedBucketName: ${resolvedBucketName}`)
|
|
1377
|
+
|
|
1345
1378
|
if (resolveS3UrlDto.isPrivate == "true") {
|
|
1346
1379
|
const expiryInSeconds = 60 * 60;
|
|
1347
|
-
url = await this.fileService.getSignedUrl(
|
|
1380
|
+
url = await this.fileService.getSignedUrl(normalizedKey, expiryInSeconds, resolvedBucketName);
|
|
1348
1381
|
} else {
|
|
1349
|
-
url = `https://${
|
|
1382
|
+
url = `https://${resolvedBucketName}.s3.${this.configService.get(
|
|
1383
|
+
'S3_AWS_REGION_NAME',
|
|
1384
|
+
)}.amazonaws.com/${normalizedKey}`;
|
|
1350
1385
|
}
|
|
1351
1386
|
return { url: url }
|
|
1352
1387
|
}
|
|
1388
|
+
|
|
1389
|
+
private normalizeS3Key(input: string): string {
|
|
1390
|
+
try {
|
|
1391
|
+
const url = new URL(input);
|
|
1392
|
+
|
|
1393
|
+
// remove leading slash from pathname
|
|
1394
|
+
return decodeURIComponent(url.pathname.replace(/^\/+/, ""));
|
|
1395
|
+
} catch {
|
|
1396
|
+
// not a valid URL → treat as raw S3 key
|
|
1397
|
+
return input;
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1353
1400
|
}
|
|
1354
1401
|
|
|
1355
1402
|
|
|
@@ -175,6 +175,15 @@ export class FileService {
|
|
|
175
175
|
}
|
|
176
176
|
}
|
|
177
177
|
|
|
178
|
+
public async pathExists(targetPath: string): Promise<boolean> {
|
|
179
|
+
try {
|
|
180
|
+
await fs.promises.access(targetPath, fs.constants.F_OK);
|
|
181
|
+
return true;
|
|
182
|
+
} catch {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
178
187
|
public async getSignedUrl(key: string, expiresIn: number, bucketName: string): Promise<string> {
|
|
179
188
|
const command = new GetObjectCommand({
|
|
180
189
|
Bucket: bucketName,
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { Injectable, Logger } from "@nestjs/common";
|
|
2
|
+
import { SolidIntrospectService } from "./solid-introspect.service";
|
|
3
|
+
import { ModuleMetadataHelperService } from "src/helpers/module-metadata-helper.service";
|
|
4
|
+
import { classify } from "@angular-devkit/core/src/utils/strings";
|
|
5
|
+
|
|
6
|
+
interface ScenarioFixture {
|
|
7
|
+
name: string;
|
|
8
|
+
models: {
|
|
9
|
+
singularName: string;
|
|
10
|
+
data: any;
|
|
11
|
+
}[];
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// This service can contain common logic for fixtures setup and tear down
|
|
15
|
+
@Injectable()
|
|
16
|
+
export class FixturesService {
|
|
17
|
+
private readonly logger = new Logger(this.constructor.name);
|
|
18
|
+
|
|
19
|
+
constructor(
|
|
20
|
+
private readonly introspectService: SolidIntrospectService,
|
|
21
|
+
private readonly moduleMetadataHelper: ModuleMetadataHelperService,
|
|
22
|
+
) { }
|
|
23
|
+
|
|
24
|
+
async setupFixtures(moduleName: string, scenarioName: string) {
|
|
25
|
+
const scenarioFixture = await this.loadScenario(moduleName, scenarioName);
|
|
26
|
+
if (!scenarioFixture?.models || scenarioFixture.models.length === 0) {
|
|
27
|
+
this.logger.warn(`No models found to setup for scenario: ${scenarioName} in module: ${moduleName}`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// For each model in the fixtures, use introspectService to get model service
|
|
32
|
+
for (const modelFixture of scenarioFixture.models) {
|
|
33
|
+
const modelServiceInstance = await this.loadModelService(modelFixture.singularName);
|
|
34
|
+
try {
|
|
35
|
+
// Create the model instance in the database
|
|
36
|
+
const createdInstance = await modelServiceInstance.create(modelFixture.data);
|
|
37
|
+
this.logger.log(`Successfully created fixture for model: ${modelFixture.singularName} with ID: ${createdInstance.id}`);
|
|
38
|
+
} catch (error) {
|
|
39
|
+
this.logger.error(`Error creating fixture for model: ${modelFixture.singularName} - ${error.message}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async tearDownFixtures(moduleName: string, scenarioName: string) {
|
|
45
|
+
// Call delete on the modelService to remove the created fixtures, in reverse order
|
|
46
|
+
const scenarioFixture = await this.loadScenario(moduleName, scenarioName);
|
|
47
|
+
if (!scenarioFixture?.models || scenarioFixture.models.length === 0) {
|
|
48
|
+
this.logger.warn(`No models found to tear down for scenario: ${scenarioName} in module: ${moduleName}`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// For each model in reverse order
|
|
53
|
+
for (const modelFixture of scenarioFixture.models.reverse()) {
|
|
54
|
+
const modelServiceInstance = await this.loadModelService(modelFixture.singularName);
|
|
55
|
+
|
|
56
|
+
// Get the user key field for the model to identify the created instances
|
|
57
|
+
try {
|
|
58
|
+
// Assuming we have some way to identify the created instances, e.g., by a unique field in data
|
|
59
|
+
const deleteCriteria = modelFixture.data; // This should be adjusted based on actual criteria
|
|
60
|
+
await modelServiceInstance.delete(deleteCriteria);
|
|
61
|
+
this.logger.log(`Successfully deleted fixture for model: ${modelFixture.singularName}`);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
this.logger.error(`Error deleting fixture for model: ${modelFixture.singularName} - ${error.message}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private async loadScenario(moduleName: string, scenarioName: string): Promise<ScenarioFixture | undefined> {
|
|
70
|
+
// Read the module metadata file based on module name
|
|
71
|
+
const moduleMetadataConfiguration = await this.moduleMetadataHelper.getModuleMetadataConfiguration(
|
|
72
|
+
await this.moduleMetadataHelper.getModuleMetadataFilePath(moduleName)
|
|
73
|
+
);
|
|
74
|
+
if (!moduleMetadataConfiguration) {
|
|
75
|
+
this.logger.error(`No module metadata configuration found for module: ${moduleName}`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
this.logger.debug(`Module Metadata Configuration loaded for module: ${moduleName}`);
|
|
79
|
+
|
|
80
|
+
// Read the fixtures json from above file
|
|
81
|
+
const allFixtures = moduleMetadataConfiguration?.fixtures;
|
|
82
|
+
this.logger.debug(`All Fixtures: ${JSON.stringify(allFixtures)}`);
|
|
83
|
+
// Check if scenarios exists
|
|
84
|
+
if (!allFixtures?.scenarios.length || allFixtures?.scenarios.length === 0) {
|
|
85
|
+
this.logger.error(`No scenarios defined in the module metadata configuration for module: ${moduleName}`);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Find the fixtures for the given scenario
|
|
90
|
+
const scenarioFixture = allFixtures.scenarios.find((scenario: ScenarioFixture) => scenario.name === scenarioName);
|
|
91
|
+
if (!scenarioFixture) {
|
|
92
|
+
this.logger.error(`Scenario: ${scenarioName} not found in module metadata configuration for module: ${moduleName}`);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
this.logger.log(`Scenario: ${scenarioName} found with fixtures to setup.`);
|
|
96
|
+
return scenarioFixture;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private async loadModelService(singularName: string): Promise<any> {
|
|
100
|
+
const modelServiceProvider = this.introspectService.getProvider(`${classify(singularName)}Service`);
|
|
101
|
+
if (!modelServiceProvider) {
|
|
102
|
+
this.logger.error(`Model service provider not found for model: ${singularName}`);
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
this.logger.debug(`Model service provider found for model: ${singularName}`);
|
|
106
|
+
return modelServiceProvider.instance;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -3,10 +3,10 @@ import * as crypto from 'crypto';
|
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import * as path from 'path';
|
|
5
5
|
|
|
6
|
-
import { getDynamicModuleNames } from 'src/helpers/module.helper';
|
|
6
|
+
import { getDynamicModuleNames, getDynamicModuleNamesBasedOnMetadata } from 'src/helpers/module.helper';
|
|
7
7
|
import { CreateModuleMetadataDto } from 'src/dtos/create-module-metadata.dto';
|
|
8
8
|
import { R2RHelperService } from './r2r-helper.service';
|
|
9
|
-
import {
|
|
9
|
+
import { r2rClient } from 'r2r-js';
|
|
10
10
|
import { CreateModelMetadataDto } from 'src/dtos/create-model-metadata.dto';
|
|
11
11
|
import { CreateFieldMetadataDto } from 'src/dtos/create-field-metadata.dto';
|
|
12
12
|
|
|
@@ -90,7 +90,8 @@ export class IngestMetadataService {
|
|
|
90
90
|
|
|
91
91
|
// const allModuleMetadataJson = [];
|
|
92
92
|
this.logger.debug(`getting dynamics modules`);
|
|
93
|
-
const enabledModules = getDynamicModuleNames();
|
|
93
|
+
// const enabledModules = getDynamicModuleNames();
|
|
94
|
+
const enabledModules = getDynamicModuleNamesBasedOnMetadata();
|
|
94
95
|
this.logger.log(`ingesting metadata`);
|
|
95
96
|
|
|
96
97
|
for (let i = 0; i < enabledModules.length; i++) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
1
|
+
import { forwardRef, Inject, Injectable } from '@nestjs/common';
|
|
2
2
|
import { InjectEntityManager, InjectRepository } from '@nestjs/typeorm';
|
|
3
3
|
import { DiscoveryService, ModuleRef } from "@nestjs/core";
|
|
4
4
|
import { EntityManager, Repository } from 'typeorm';
|
|
@@ -17,6 +17,7 @@ import { ImportTransactionErrorLogRepository } from 'src/repository/import-trans
|
|
|
17
17
|
@Injectable()
|
|
18
18
|
export class ImportTransactionErrorLogService extends CRUDService<ImportTransactionErrorLog>{
|
|
19
19
|
constructor(
|
|
20
|
+
@Inject(forwardRef(() => ModelMetadataService))
|
|
20
21
|
readonly modelMetadataService: ModelMetadataService,
|
|
21
22
|
readonly moduleMetadataService: ModuleMetadataService,
|
|
22
23
|
readonly configService: ConfigService,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BadRequestException, ForbiddenException, Injectable, Logger } from '@nestjs/common';
|
|
1
|
+
import { BadRequestException, ForbiddenException, forwardRef, Inject, Injectable, Logger } from '@nestjs/common';
|
|
2
2
|
import { DiscoveryService, ModuleRef } from "@nestjs/core";
|
|
3
3
|
import { InjectEntityManager } from '@nestjs/typeorm';
|
|
4
4
|
import { EntityManager } from 'typeorm';
|
|
@@ -94,6 +94,7 @@ interface ImportRecordsResult {
|
|
|
94
94
|
@Injectable()
|
|
95
95
|
export class ImportTransactionService extends CRUDService<ImportTransaction> {
|
|
96
96
|
constructor(
|
|
97
|
+
@Inject(forwardRef(() => ModelMetadataService))
|
|
97
98
|
readonly modelMetadataService: ModelMetadataService,
|
|
98
99
|
readonly moduleMetadataService: ModuleMetadataService,
|
|
99
100
|
readonly configService: ConfigService,
|
|
@@ -305,9 +306,12 @@ export class ImportTransactionService extends CRUDService<ImportTransaction> {
|
|
|
305
306
|
: userPermissions[permissionKey] === true;
|
|
306
307
|
|
|
307
308
|
if (!hasPermission) {
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
309
|
+
const action = permissionKey.split('.').pop()!;
|
|
310
|
+
const message = ERROR_MESSAGES.PERMISSION_MESSAGES[action]?.(modelName) ?? 'You are not allowed to perform this action.';
|
|
311
|
+
throw new ForbiddenException({
|
|
312
|
+
message,
|
|
313
|
+
errorCode: 'permission-denied',
|
|
314
|
+
});
|
|
311
315
|
}
|
|
312
316
|
|
|
313
317
|
// Get the import file media object from the import transaction
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
1
|
+
import { forwardRef, Inject, Injectable } from '@nestjs/common';
|
|
2
2
|
import { DiscoveryService, ModuleRef } from "@nestjs/core";
|
|
3
3
|
import { InjectEntityManager } from '@nestjs/typeorm';
|
|
4
4
|
import { EntityManager } from 'typeorm';
|
|
@@ -12,11 +12,10 @@ import { ModuleMetadataService } from 'src/services/module-metadata.service';
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
import * as fs from 'fs/promises'; // Use the Promise-based version of fs for async/await
|
|
15
|
-
import { ListOfValuesRepository } from 'src/repository/list-of-values.repository';
|
|
16
|
-
import { ListOfValues } from '../entities/list-of-values.entity';
|
|
17
|
-
import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
|
|
18
15
|
import { ModuleMetadataHelperService } from 'src/helpers/module-metadata-helper.service';
|
|
19
16
|
import { ListOfValuesMapper } from 'src/mappers/list-of-values-mapper';
|
|
17
|
+
import { ListOfValuesRepository } from 'src/repository/list-of-values.repository';
|
|
18
|
+
import { ListOfValues } from '../entities/list-of-values.entity';
|
|
20
19
|
|
|
21
20
|
|
|
22
21
|
@Injectable()
|
|
@@ -25,6 +24,7 @@ export class ListOfValuesService extends CRUDService<ListOfValues> {
|
|
|
25
24
|
// moduleMetadataHelperService: any;
|
|
26
25
|
// listOfValuesMapper: any;
|
|
27
26
|
constructor(
|
|
27
|
+
@Inject(forwardRef(() => ModelMetadataService))
|
|
28
28
|
readonly modelMetadataService: ModelMetadataService,
|
|
29
29
|
readonly moduleMetadataService: ModuleMetadataService,
|
|
30
30
|
readonly configService: ConfigService,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common';
|
|
1
|
+
import { forwardRef, Inject, Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common';
|
|
2
2
|
import { DiscoveryService, ModuleRef } from "@nestjs/core";
|
|
3
3
|
import { InjectEntityManager } from '@nestjs/typeorm';
|
|
4
4
|
import { EntityManager } from 'typeorm';
|
|
@@ -16,6 +16,7 @@ import { RequestContextService } from './request-context.service';
|
|
|
16
16
|
@Injectable()
|
|
17
17
|
export class LocaleService extends CRUDService<Locale> implements OnApplicationBootstrap{
|
|
18
18
|
constructor(
|
|
19
|
+
@Inject(forwardRef(() => ModelMetadataService))
|
|
19
20
|
readonly modelMetadataService: ModelMetadataService,
|
|
20
21
|
readonly moduleMetadataService: ModuleMetadataService,
|
|
21
22
|
readonly configService: ConfigService,
|
|
@@ -153,7 +153,7 @@ export class SMTPEMailService implements IMail {
|
|
|
153
153
|
attachments: attachmentsList,
|
|
154
154
|
});
|
|
155
155
|
// this.logger.debug(`Sending email to ${to} with subject ${subject} and body ${body}`);
|
|
156
|
-
this.logger.debug(`Sending email to ${to} with subject ${subject}`);
|
|
156
|
+
// this.logger.debug(`Sending email to ${to} with subject ${subject}`);
|
|
157
157
|
|
|
158
158
|
return r;
|
|
159
159
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Injectable, NotFoundException } from '@nestjs/common';
|
|
1
|
+
import { forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';
|
|
2
2
|
import { DiscoveryService, ModuleRef } from "@nestjs/core";
|
|
3
|
-
import { InjectEntityManager
|
|
4
|
-
import { EntityManager,
|
|
3
|
+
import { InjectEntityManager } from '@nestjs/typeorm';
|
|
4
|
+
import { EntityManager, In } from 'typeorm';
|
|
5
5
|
|
|
6
6
|
import { ConfigService } from '@nestjs/config';
|
|
7
7
|
import { CrudHelperService } from 'src/services/crud-helper.service';
|
|
@@ -11,23 +11,21 @@ import { ModelMetadataService } from 'src/services/model-metadata.service';
|
|
|
11
11
|
import { ModuleMetadataService } from 'src/services/module-metadata.service';
|
|
12
12
|
|
|
13
13
|
|
|
14
|
+
import { ERROR_MESSAGES } from 'src/constants/error-messages';
|
|
15
|
+
import { BasicFilterDto } from 'src/dtos/basic-filters.dto';
|
|
14
16
|
import { MediaStorageProviderType } from 'src/dtos/create-media-storage-provider-metadata.dto';
|
|
15
|
-
import { FieldMetadata } from 'src/entities/field-metadata.entity';
|
|
16
|
-
import { MediaStorageProviderMetadata } from 'src/entities/media-storage-provider-metadata.entity';
|
|
17
17
|
import { Media } from 'src/entities/media.entity';
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import { BasicFilterDto } from 'src/dtos/basic-filters.dto';
|
|
21
|
-
import { ERROR_MESSAGES } from 'src/constants/error-messages';
|
|
18
|
+
import { FieldMetadataRepository } from 'src/repository/field-metadata.repository';
|
|
19
|
+
import { MediaStorageProviderMetadataRepository } from 'src/repository/media-storage-provider-metadata.repository';
|
|
22
20
|
import { MediaRepository } from 'src/repository/media.repository';
|
|
23
21
|
import { ModelMetadataRepository } from 'src/repository/model-metadata.repository';
|
|
24
|
-
import {
|
|
25
|
-
import { FieldMetadataRepository } from 'src/repository/field-metadata.repository';
|
|
22
|
+
import { getMediaStorageProvider } from "./mediaStorageProviders";
|
|
26
23
|
|
|
27
24
|
|
|
28
25
|
@Injectable()
|
|
29
26
|
export class MediaService extends CRUDService<Media> {
|
|
30
27
|
constructor(
|
|
28
|
+
@Inject(forwardRef(() => ModelMetadataService))
|
|
31
29
|
readonly modelMetadataService: ModelMetadataService,
|
|
32
30
|
readonly moduleMetadataService: ModuleMetadataService,
|
|
33
31
|
readonly configService: ConfigService,
|
|
@@ -45,6 +43,7 @@ export class MediaService extends CRUDService<Media> {
|
|
|
45
43
|
// private readonly mediaStorageProviderMetadataRepo: Repository<MediaStorageProviderMetadata>,
|
|
46
44
|
// @InjectRepository(FieldMetadata)
|
|
47
45
|
// private readonly fieldMetadataRepo: Repository<FieldMetadata>,
|
|
46
|
+
@Inject(forwardRef(() => ModelMetadataRepository))
|
|
48
47
|
private readonly modelMetadataRepo: ModelMetadataRepository,
|
|
49
48
|
private readonly mediaStorageProviderMetadataRepo: MediaStorageProviderMetadataRepository,
|
|
50
49
|
private readonly fieldMetadataRepo: FieldMetadataRepository,
|
|
@@ -2,6 +2,8 @@ import { Inject, Injectable, Logger } from "@nestjs/common";
|
|
|
2
2
|
import { ConfigService, ConfigType } from "@nestjs/config";
|
|
3
3
|
import { CommonEntity } from "src/entities/common.entity";
|
|
4
4
|
import { FieldMetadata } from "src/entities/field-metadata.entity";
|
|
5
|
+
import { LegacyCommonEntity } from "src/entities/legacy-common.entity";
|
|
6
|
+
import { LegacyCommonWithIdEntity } from "src/entities/legacy-common-with-id.entity";
|
|
5
7
|
import { Media } from "src/entities/media.entity";
|
|
6
8
|
import { MediaStorageProvider } from "src/interfaces";
|
|
7
9
|
import { FileService } from "src/services/file.service";
|
|
@@ -28,9 +30,13 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
|
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
async retrieve(entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
const isSupportedEntity = entity instanceof CommonEntity
|
|
34
|
+
|| entity instanceof LegacyCommonEntity
|
|
35
|
+
|| entity instanceof LegacyCommonWithIdEntity;
|
|
36
|
+
if (!isSupportedEntity) {
|
|
37
|
+
throw new Error("Entity must be an instance of CommonEntity, LegacyCommonEntity or LegacyCommonWithIdEntity"); // FIXME This needs to be handled through generics. e.g T extends CommonEntity
|
|
33
38
|
}
|
|
39
|
+
// @ts-ignore
|
|
34
40
|
const media = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);
|
|
35
41
|
|
|
36
42
|
// TODO: Check if the mediaStorageProvider (s3 in this case) is configured with a public bucket or not.
|
|
@@ -56,8 +62,11 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
|
|
|
56
62
|
}
|
|
57
63
|
|
|
58
64
|
async store(files: Express.Multer.File[], entity: T, mediaFieldMetadata: FieldMetadata): Promise<Media[]> {
|
|
59
|
-
|
|
60
|
-
|
|
65
|
+
const isSupportedEntity = entity instanceof CommonEntity
|
|
66
|
+
|| entity instanceof LegacyCommonEntity
|
|
67
|
+
|| entity instanceof LegacyCommonWithIdEntity;
|
|
68
|
+
if (!isSupportedEntity) {
|
|
69
|
+
throw new Error("Entity must be an instance of CommonEntity, LegacyCommonEntity or LegacyCommonWithIdEntity"); // FIXME This needs to be handled through generics. e.g T extends CommonEntity
|
|
61
70
|
}
|
|
62
71
|
const result: Media[] = [];
|
|
63
72
|
for (const file of files) {
|
|
@@ -73,6 +82,7 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
|
|
|
73
82
|
|
|
74
83
|
// Create an entry in the media table
|
|
75
84
|
const mediaEntity = await this.mediaRepository.createMedia({
|
|
85
|
+
// @ts-ignore
|
|
76
86
|
entityId: entity.id,
|
|
77
87
|
modelMetadataId: mediaFieldMetadata.model.id,
|
|
78
88
|
relativeUri: awsFileUrl,
|
|
@@ -89,10 +99,15 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
|
|
|
89
99
|
}
|
|
90
100
|
|
|
91
101
|
async delete(entity: T, mediaFieldMetadata: FieldMetadata): Promise<void> {
|
|
92
|
-
|
|
93
|
-
|
|
102
|
+
const isSupportedEntity = entity instanceof CommonEntity
|
|
103
|
+
|| entity instanceof LegacyCommonEntity
|
|
104
|
+
|| entity instanceof LegacyCommonWithIdEntity;
|
|
105
|
+
if (!isSupportedEntity) {
|
|
106
|
+
throw new Error("Entity must be an instance of CommonEntity, LegacyCommonEntity or LegacyCommonWithIdEntity"); // FIXME This needs to be handled through generics. e.g T extends CommonEntity
|
|
94
107
|
}
|
|
108
|
+
// @ts-ignore
|
|
95
109
|
const existingMedia = await this.mediaRepository.findByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id, ['mediaStorageProviderMetadata']);
|
|
110
|
+
// @ts-ignore
|
|
96
111
|
this.mediaRepository.deleteByEntityIdAndFieldIdAndModelMetadataId(entity.id, mediaFieldMetadata.id, mediaFieldMetadata.model.id);
|
|
97
112
|
existingMedia.forEach(media => {
|
|
98
113
|
this.fileService.deleteFromS3(media.relativeUri, mediaFieldMetadata.mediaStorageProvider.bucketName); //TODO
|
|
@@ -108,4 +123,4 @@ export class FileS3StorageProvider<T> implements MediaStorageProvider<T> {
|
|
|
108
123
|
private getFileName(file: Express.Multer.File): string {
|
|
109
124
|
return `${file.filename}-${file.originalname}`;
|
|
110
125
|
}
|
|
111
|
-
}
|
|
126
|
+
}
|