@solidstarters/solid-core 1.2.200 → 1.2.202
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/config/cache.options.d.ts +1 -1
- package/dist/config/cache.options.d.ts.map +1 -1
- package/dist/config/cache.options.js +2 -2
- package/dist/config/cache.options.js.map +1 -1
- package/dist/config/iam.config.d.ts +4 -0
- package/dist/config/iam.config.d.ts.map +1 -1
- package/dist/config/iam.config.js +2 -0
- package/dist/config/iam.config.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-metadata.controller.d.ts +25 -0
- package/dist/controllers/model-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/model-metadata.controller.js +23 -0
- package/dist/controllers/model-metadata.controller.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 +2 -2
- package/dist/controllers/setting.controller.d.ts.map +1 -1
- package/dist/controllers/setting.controller.js +36 -42
- package/dist/controllers/setting.controller.js.map +1 -1
- package/dist/decorators/sms-provider.decorator.d.ts +3 -0
- package/dist/decorators/sms-provider.decorator.d.ts.map +1 -0
- package/dist/decorators/sms-provider.decorator.js +11 -0
- package/dist/decorators/sms-provider.decorator.js.map +1 -0
- 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/navigation.dto.d.ts +6 -0
- package/dist/dtos/navigation.dto.d.ts.map +1 -0
- package/dist/dtos/navigation.dto.js +33 -0
- package/dist/dtos/navigation.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/sign-in.dto.js +3 -3
- package/dist/dtos/sign-in.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 +6 -4
- package/dist/entities/common.entity.js.map +1 -1
- package/dist/entities/field-metadata.entity.d.ts.map +1 -1
- package/dist/entities/field-metadata.entity.js +2 -1
- package/dist/entities/field-metadata.entity.js.map +1 -1
- package/dist/entities/legacy-common.entity.d.ts.map +1 -1
- package/dist/entities/legacy-common.entity.js +6 -4
- package/dist/entities/legacy-common.entity.js.map +1 -1
- package/dist/entities/model-metadata.entity.d.ts.map +1 -1
- package/dist/entities/model-metadata.entity.js +5 -1
- package/dist/entities/model-metadata.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/factories/mail.factory.d.ts.map +1 -1
- package/dist/factories/mail.factory.js.map +1 -1
- package/dist/factories/sms.factory.d.ts +14 -0
- package/dist/factories/sms.factory.d.ts.map +1 -0
- package/dist/factories/sms.factory.js +53 -0
- package/dist/factories/sms.factory.js.map +1 -0
- package/dist/helpers/date.helper.d.ts.map +1 -1
- package/dist/helpers/date.helper.js +13 -4
- package/dist/helpers/date.helper.js.map +1 -1
- 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 +14 -0
- package/dist/helpers/solid-registry.d.ts.map +1 -1
- package/dist/helpers/solid-registry.js +7 -0
- package/dist/helpers/solid-registry.js.map +1 -1
- package/dist/index.d.ts +12 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -8
- 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/jobs/database/{sms-publisher-database.service.d.ts → msg91-sms-publisher-database.service.d.ts} +2 -2
- package/dist/jobs/database/msg91-sms-publisher-database.service.d.ts.map +1 -0
- package/dist/jobs/database/{sms-publisher-database.service.js → msg91-sms-publisher-database.service.js} +8 -8
- package/dist/jobs/database/msg91-sms-publisher-database.service.js.map +1 -0
- package/dist/jobs/database/{sms-queue-database-options.d.ts → msg91-sms-queue-database-options.d.ts} +1 -1
- package/dist/jobs/database/msg91-sms-queue-database-options.d.ts.map +1 -0
- package/dist/jobs/database/{sms-queue-database-options.js → msg91-sms-queue-database-options.js} +1 -1
- package/dist/jobs/database/msg91-sms-queue-database-options.js.map +1 -0
- package/dist/jobs/database/{sms-subscriber-database.service.d.ts → msg91-sms-subscriber-database.service.d.ts} +5 -5
- package/dist/jobs/database/msg91-sms-subscriber-database.service.d.ts.map +1 -0
- package/dist/jobs/database/{sms-subscriber-database.service.js → msg91-sms-subscriber-database.service.js} +14 -12
- package/dist/jobs/database/msg91-sms-subscriber-database.service.js.map +1 -0
- package/dist/jobs/database/otp-subscriber-database.service.d.ts +4 -4
- package/dist/jobs/database/otp-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/otp-subscriber-database.service.js +6 -4
- package/dist/jobs/database/otp-subscriber-database.service.js.map +1 -1
- package/dist/jobs/database/twilio-sms-subscriber-database.service.d.ts +3 -3
- package/dist/jobs/database/twilio-sms-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/twilio-sms-subscriber-database.service.js +6 -4
- package/dist/jobs/database/twilio-sms-subscriber-database.service.js.map +1 -1
- package/dist/jobs/{sms-publisher.service.d.ts → msg91-otp-publisher.service.d.ts} +2 -2
- package/dist/jobs/msg91-otp-publisher.service.d.ts.map +1 -0
- package/dist/jobs/{sms-publisher.service.js → msg91-otp-publisher.service.js} +8 -8
- package/dist/jobs/msg91-otp-publisher.service.js.map +1 -0
- package/dist/jobs/{sms-queue-options.d.ts → msg91-otp-queue-options.d.ts} +1 -1
- package/dist/jobs/msg91-otp-queue-options.d.ts.map +1 -0
- package/dist/jobs/{otp-queue-options.js → msg91-otp-queue-options.js} +1 -1
- package/dist/jobs/msg91-otp-queue-options.js.map +1 -0
- package/dist/jobs/{sms-subscriber.service.d.ts → msg91-otp-subscriber.service.d.ts} +6 -6
- package/dist/jobs/msg91-otp-subscriber.service.d.ts.map +1 -0
- package/dist/jobs/{otp-subscriber.service.js → msg91-otp-subscriber.service.js} +14 -12
- package/dist/jobs/msg91-otp-subscriber.service.js.map +1 -0
- package/dist/jobs/{otp-publisher.service.d.ts → msg91-sms-publisher.service.d.ts} +2 -2
- package/dist/jobs/msg91-sms-publisher.service.d.ts.map +1 -0
- package/dist/jobs/{otp-publisher.service.js → msg91-sms-publisher.service.js} +8 -8
- package/dist/jobs/msg91-sms-publisher.service.js.map +1 -0
- package/dist/jobs/{otp-queue-options.d.ts → msg91-sms-queue-options.d.ts} +1 -1
- package/dist/jobs/msg91-sms-queue-options.d.ts.map +1 -0
- package/dist/jobs/{sms-queue-options.js → msg91-sms-queue-options.js} +1 -1
- package/dist/jobs/msg91-sms-queue-options.js.map +1 -0
- package/dist/jobs/{otp-subscriber.service.d.ts → msg91-sms-subscriber.service.d.ts} +7 -7
- package/dist/jobs/msg91-sms-subscriber.service.d.ts.map +1 -0
- package/dist/jobs/{sms-subscriber.service.js → msg91-sms-subscriber.service.js} +14 -12
- package/dist/jobs/msg91-sms-subscriber.service.js.map +1 -0
- package/dist/jobs/twilio-sms-subscriber.service.d.ts +3 -3
- package/dist/jobs/twilio-sms-subscriber.service.d.ts.map +1 -1
- package/dist/jobs/twilio-sms-subscriber.service.js +6 -4
- package/dist/jobs/twilio-sms-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 +87 -27
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +373 -52
- 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/seeders/user-seeder.service.d.ts.map +1 -1
- package/dist/seeders/user-seeder.service.js +5 -4
- package/dist/seeders/user-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 +6 -3
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +70 -27
- 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.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 +4 -3
- 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 +11 -0
- package/dist/services/excel.service.d.ts.map +1 -1
- package/dist/services/excel.service.js +104 -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 +28 -1
- package/dist/services/model-metadata.service.d.ts.map +1 -1
- package/dist/services/model-metadata.service.js +111 -44
- 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 +28 -48
- package/dist/services/setting.service.js.map +1 -1
- package/dist/services/sms/Msg91BaseSMSService.js +6 -6
- package/dist/services/sms/Msg91BaseSMSService.js.map +1 -1
- package/dist/services/sms/Msg91OTPService.d.ts.map +1 -1
- package/dist/services/sms/Msg91OTPService.js +3 -1
- package/dist/services/sms/Msg91OTPService.js.map +1 -1
- package/dist/services/sms/Msg91SMSService.d.ts.map +1 -1
- package/dist/services/sms/Msg91SMSService.js +3 -1
- package/dist/services/sms/Msg91SMSService.js.map +1 -1
- package/dist/services/sms/TwilioSMSService.d.ts.map +1 -1
- package/dist/services/sms/TwilioSMSService.js +2 -0
- package/dist/services/sms/TwilioSMSService.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 +5 -13
- package/dist/services/solid-introspect.service.d.ts.map +1 -1
- package/dist/services/solid-introspect.service.js +18 -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-cli.module.js +1 -1
- package/dist/solid-core-cli.module.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +40 -13
- 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/subscribers/scheduled-job.subscriber.d.ts.map +1 -1
- package/dist/subscribers/scheduled-job.subscriber.js +1 -1
- package/dist/subscribers/scheduled-job.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 +48 -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/config/cache.options.ts +6 -3
- package/src/config/iam.config.ts +2 -1
- package/src/constants/error-messages.ts +7 -1
- package/src/controllers/model-metadata.controller.ts +21 -1
- package/src/controllers/model-sequence.controller.ts +93 -0
- package/src/controllers/setting.controller.ts +62 -54
- package/src/decorators/sms-provider.decorator.ts +7 -0
- 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/navigation.dto.ts +14 -0
- package/src/dtos/resolve-s3-url.dto.ts +9 -11
- package/src/dtos/sign-in.dto.ts +3 -3
- package/src/dtos/update-model-sequence.dto.ts +53 -0
- package/src/entities/common.entity.ts +8 -8
- package/src/entities/field-metadata.entity.ts +1 -1
- package/src/entities/legacy-common.entity.ts +8 -6
- package/src/entities/model-metadata.entity.ts +1 -1
- package/src/entities/model-sequence.entity.ts +32 -0
- package/src/factories/mail.factory.ts +0 -1
- package/src/factories/sms.factory.ts +43 -0
- package/src/helpers/date.helper.ts +38 -9
- 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 +23 -0
- package/src/index.ts +12 -7
- package/src/jobs/computed-field-evaluation-subscriber.service.ts +15 -4
- package/src/jobs/database/{sms-publisher-database.service.ts → msg91-sms-publisher-database.service.ts} +2 -2
- package/src/jobs/database/{sms-subscriber-database.service.ts → msg91-sms-subscriber-database.service.ts} +9 -4
- package/src/jobs/database/otp-subscriber-database.service.ts +8 -2
- package/src/jobs/database/twilio-sms-subscriber-database.service.ts +5 -2
- package/src/jobs/{otp-publisher.service.ts → msg91-otp-publisher.service.ts} +2 -2
- package/src/jobs/{otp-subscriber.service.ts → msg91-otp-subscriber.service.ts} +10 -4
- package/src/jobs/{sms-publisher.service.ts → msg91-sms-publisher.service.ts} +2 -2
- package/src/jobs/{sms-subscriber.service.ts → msg91-sms-subscriber.service.ts} +9 -4
- package/src/jobs/twilio-sms-subscriber.service.ts +6 -2
- 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 +133 -34
- package/src/seeders/seed-data/email-templates/email-on-signup.handlebars.html +155 -0
- package/src/seeders/seed-data/sms-templates/text-on-signup.handlebars.txt +10 -0
- package/src/seeders/seed-data/solid-core-metadata.json +374 -53
- package/src/seeders/system-fields-seeder.service.ts +6 -2
- package/src/seeders/user-seeder.service.ts +5 -4
- package/src/services/action-metadata.service.ts +3 -2
- package/src/services/ai-interaction.service.ts +2 -1
- package/src/services/authentication.service.ts +119 -24
- 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 +9 -9
- 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 +95 -45
- 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 +152 -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 +201 -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 +42 -55
- package/src/services/sms/Msg91BaseSMSService.ts +6 -6
- package/src/services/sms/Msg91OTPService.ts +3 -2
- package/src/services/sms/Msg91SMSService.ts +3 -1
- package/src/services/sms/TwilioSMSService.ts +3 -3
- package/src/services/sms-template.service.ts +11 -13
- package/src/services/solid-introspect.service.ts +28 -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-cli.module.ts +2 -2
- package/src/solid-core.module.ts +42 -13
- package/src/subscribers/audit.subscriber.ts +3 -2
- package/src/subscribers/computed-entity-field.subscriber.ts +60 -17
- package/src/subscribers/scheduled-job.subscriber.ts +9 -2
- package/src/transformers/typeorm/local-date-time-transformer.ts +55 -0
- package/dist/jobs/database/sms-publisher-database.service.d.ts.map +0 -1
- package/dist/jobs/database/sms-publisher-database.service.js.map +0 -1
- package/dist/jobs/database/sms-queue-database-options.d.ts.map +0 -1
- package/dist/jobs/database/sms-queue-database-options.js.map +0 -1
- package/dist/jobs/database/sms-subscriber-database.service.d.ts.map +0 -1
- package/dist/jobs/database/sms-subscriber-database.service.js.map +0 -1
- package/dist/jobs/otp-publisher.service.d.ts.map +0 -1
- package/dist/jobs/otp-publisher.service.js.map +0 -1
- package/dist/jobs/otp-queue-options.d.ts.map +0 -1
- package/dist/jobs/otp-queue-options.js.map +0 -1
- package/dist/jobs/otp-subscriber.service.d.ts.map +0 -1
- package/dist/jobs/otp-subscriber.service.js.map +0 -1
- package/dist/jobs/sms-publisher.service.d.ts.map +0 -1
- package/dist/jobs/sms-publisher.service.js.map +0 -1
- package/dist/jobs/sms-queue-options.d.ts.map +0 -1
- package/dist/jobs/sms-queue-options.js.map +0 -1
- package/dist/jobs/sms-subscriber.service.d.ts.map +0 -1
- package/dist/jobs/sms-subscriber.service.js.map +0 -1
- /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
- /package/src/jobs/database/{sms-queue-database-options.ts → msg91-sms-queue-database-options.ts} +0 -0
- /package/src/jobs/{otp-queue-options.ts → msg91-otp-queue-options.ts} +0 -0
- /package/src/jobs/{sms-queue-options.ts → msg91-sms-queue-options.ts} +0 -0
|
@@ -2,7 +2,7 @@ import { BadRequestException, NotFoundException } from "@nestjs/common";
|
|
|
2
2
|
import { ConfigService } from "@nestjs/config";
|
|
3
3
|
import { DiscoveryService, ModuleRef } from "@nestjs/core";
|
|
4
4
|
import { isArray } from "class-validator";
|
|
5
|
-
import { CommonEntity, SolidBaseRepository, User } from "src";
|
|
5
|
+
import { CommonEntity, FileService, SolidBaseRepository, User } from "src";
|
|
6
6
|
import { ERROR_MESSAGES } from "src/constants/error-messages";
|
|
7
7
|
import { SUCCESS_MESSAGES } from "src/constants/success-messages";
|
|
8
8
|
import { EntityManager, FindOptionsWhere, In, IsNull, Not, QueryFailedError, SelectQueryBuilder } from "typeorm";
|
|
@@ -33,28 +33,30 @@ import { SelectionStaticFieldCrudManager } from "../helpers/field-crud-managers/
|
|
|
33
33
|
import { ShortTextFieldCrudManager } from "../helpers/field-crud-managers/ShortTextFieldCrudManager";
|
|
34
34
|
import { UUIDFieldCrudManager } from "../helpers/field-crud-managers/UUIDFieldCrudManager";
|
|
35
35
|
import { FieldCrudManager, MediaWithFullUrl } from "../interfaces";
|
|
36
|
-
import { CrudHelperService, UserIdFields } from "./crud-helper.service";
|
|
37
|
-
import { FileService } from "./file.service";
|
|
36
|
+
import { CrudHelperService, FilterCombinator, UserIdFields } from "./crud-helper.service";
|
|
38
37
|
import { HashingService } from "./hashing.service";
|
|
39
38
|
import { getMediaStorageProvider } from "./mediaStorageProviders";
|
|
40
39
|
import { ModelMetadataService } from "./model-metadata.service";
|
|
41
40
|
import { ModuleMetadataService } from "./module-metadata.service";
|
|
42
41
|
import { RequestContextService } from "./request-context.service";
|
|
42
|
+
import { BasicGroupFilterDto } from "src/dtos/basic-group-filters.dto";
|
|
43
43
|
|
|
44
44
|
export class CRUDService<T extends CommonEntity> { // Add two generic value i.e Person,CreatePersonDto, so we get the proper types in our service
|
|
45
45
|
|
|
46
46
|
constructor(
|
|
47
|
-
readonly modelMetadataService: ModelMetadataService,
|
|
48
|
-
readonly moduleMetadataService: ModuleMetadataService,
|
|
49
|
-
readonly configService: ConfigService,
|
|
50
|
-
readonly fileService: FileService,
|
|
51
|
-
readonly discoveryService: DiscoveryService,
|
|
52
|
-
readonly crudHelperService: CrudHelperService,
|
|
47
|
+
readonly modelMetadataService: ModelMetadataService, // go away
|
|
48
|
+
readonly moduleMetadataService: ModuleMetadataService, // go away
|
|
49
|
+
readonly configService: ConfigService, // we don't use it - go away
|
|
50
|
+
readonly fileService: FileService, // we don't use it - go away
|
|
51
|
+
readonly discoveryService: DiscoveryService, // go away
|
|
52
|
+
readonly crudHelperService: CrudHelperService, // go away
|
|
53
53
|
readonly entityManager: EntityManager,
|
|
54
54
|
readonly repo: SolidBaseRepository<T>,
|
|
55
55
|
readonly modelName: string,
|
|
56
56
|
readonly moduleName: string,
|
|
57
57
|
readonly moduleRef: ModuleRef,
|
|
58
|
+
readonly defaultEntityManager?: EntityManager
|
|
59
|
+
|
|
58
60
|
//We can just have the Model Entity here
|
|
59
61
|
) { }
|
|
60
62
|
|
|
@@ -182,7 +184,12 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
182
184
|
throw new BadRequestException(`Cannot update a published record for model ${this.modelName}. Unpublish it first.`
|
|
183
185
|
);
|
|
184
186
|
}
|
|
185
|
-
|
|
187
|
+
|
|
188
|
+
// // In some instances for legacy tables sometimes id is mapped as a bigint.
|
|
189
|
+
// // in these cases the update method ends up attempting to insert records due to some type orm type mismatch issue.
|
|
190
|
+
// const idFieldMetadata = model.fields.find(f => f.name === 'id');
|
|
191
|
+
// updateDto.id = idFieldMetadata?.type === 'bigint' ? BigInt(id) : id;
|
|
192
|
+
|
|
186
193
|
// This class will be extended by the generated service class i.e PersonService
|
|
187
194
|
// The data required to identify the model and module name will be passed from the generate CrudService subclass
|
|
188
195
|
//TODO: Algorithm to create the entity
|
|
@@ -427,11 +434,11 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
427
434
|
}
|
|
428
435
|
|
|
429
436
|
private isSkipComputation(isPartialUpdate: boolean, computedFieldMetadata: FieldMetadata) {
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
437
|
+
if (isPartialUpdate) return true; // If it is a partial update, then skip computation
|
|
438
|
+
if (computedFieldMetadata.computedFieldTriggerConfig && computedFieldMetadata.computedFieldTriggerConfig.length > 0) {
|
|
439
|
+
return true; // computedFieldTriggerConfig is a new field introduced as part of the IEntityComputedFieldProvider new interface, so this computation will be skiipped in crud service & will be called in the subscriber instead
|
|
440
|
+
}
|
|
441
|
+
return false; // If it is not a partial update, then do not skip computation
|
|
435
442
|
}
|
|
436
443
|
|
|
437
444
|
async find(basicFilterDto: BasicFilterDto, solidRequestContext: any = {}) {
|
|
@@ -455,19 +462,34 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
455
462
|
|
|
456
463
|
// Create above query on pincode table using query builder
|
|
457
464
|
var qb: SelectQueryBuilder<T> = await this.repo.createSecurityRuleAwareQueryBuilder(alias)
|
|
458
|
-
// qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);
|
|
459
|
-
if (internationalisation && draftPublishWorkflow) {
|
|
460
|
-
qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef);
|
|
461
|
-
}
|
|
462
|
-
else {
|
|
463
|
-
qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);
|
|
464
|
-
}
|
|
465
465
|
|
|
466
466
|
if (basicFilterDto.groupBy) {
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
467
|
+
const groupFilterQb = (internationalisation && draftPublishWorkflow)
|
|
468
|
+
? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef, FilterCombinator.AND, false, false)
|
|
469
|
+
: this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, undefined, undefined, undefined, FilterCombinator.AND, false, false);
|
|
470
|
+
|
|
471
|
+
const groupByFields = this.crudHelperService.normalize(basicFilterDto.groupBy);
|
|
472
|
+
if (!groupByFields.length) {
|
|
473
|
+
throw new BadRequestException(ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
if (basicFilterDto.populateGroup) {
|
|
477
|
+
const hasRelationGroup = groupByFields.some(field => field.includes('.'));
|
|
478
|
+
if (hasRelationGroup) {
|
|
479
|
+
throw new BadRequestException('populateGroup is not supported when grouping on relation fields. Fetch group metadata first and retrieve records in a separate call.');
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
const { aliasMap: groupAliasMap, formatMap: groupFormatMap, expressionMap: groupExpressionMap } = this.crudHelperService.applyGroupBySelections(groupFilterQb, groupByFields, alias);
|
|
484
|
+
const aggregateAliasMap = this.crudHelperService.applyAggregates(groupFilterQb, basicFilterDto.aggregates, alias);
|
|
485
|
+
const sortAliasMap = { ...groupAliasMap, ...aggregateAliasMap };
|
|
486
|
+
this.crudHelperService.applyGroupSortingAndPagination(groupFilterQb, basicFilterDto.sort, sortAliasMap, limit, offset);
|
|
487
|
+
|
|
488
|
+
const groupByResult = await groupFilterQb.getRawMany();
|
|
489
|
+
const totalGroups = await this.crudHelperService.countGroups(groupFilterQb);
|
|
490
|
+
|
|
491
|
+
const groupByFieldsOrdered = this.crudHelperService.normalize(basicFilterDto.groupBy || []);
|
|
492
|
+
const { groupMeta, groupRecords } = await this.handleGroupFind(groupByResult, groupFilter, populateGroup, alias, populateUserIdFields, populateMedia, basicFilterDto, groupAliasMap, aggregateAliasMap, groupByFieldsOrdered, groupFormatMap, groupExpressionMap);
|
|
471
493
|
|
|
472
494
|
return {
|
|
473
495
|
meta: {
|
|
@@ -478,7 +500,9 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
478
500
|
}
|
|
479
501
|
}
|
|
480
502
|
else {
|
|
481
|
-
|
|
503
|
+
qb = (internationalisation && draftPublishWorkflow)
|
|
504
|
+
? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef)
|
|
505
|
+
: this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);
|
|
482
506
|
const { meta, records } = await this.handleNonGroupFind(qb, populateUserIdFields, populateMedia, offset, limit, alias);
|
|
483
507
|
return {
|
|
484
508
|
meta,
|
|
@@ -503,17 +527,38 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
503
527
|
return this.wrapFindResponse(offset, limit, count, entities);
|
|
504
528
|
}
|
|
505
529
|
|
|
506
|
-
private async handleGroupFind(
|
|
507
|
-
|
|
508
|
-
|
|
530
|
+
private async handleGroupFind(
|
|
531
|
+
groupByResult: any[],
|
|
532
|
+
groupFilter: BasicGroupFilterDto | undefined,
|
|
533
|
+
populateGroup: boolean,
|
|
534
|
+
alias: string,
|
|
535
|
+
populateUserIdFields: UserIdFields[],
|
|
536
|
+
populateMedia: string[],
|
|
537
|
+
baseFilterDto: BasicFilterDto,
|
|
538
|
+
groupAliasMap: Record<string, string>,
|
|
539
|
+
aggregateAliasMap: Record<string, string>,
|
|
540
|
+
groupByFieldsOrdered: string[],
|
|
541
|
+
groupFormatMap: Record<string, string | undefined>,
|
|
542
|
+
groupExpressionMap: Record<string, string>
|
|
543
|
+
) {
|
|
509
544
|
const groupMeta = [];
|
|
510
545
|
const groupRecords = [];
|
|
546
|
+
const aggregateAliasSet = new Set(Object.values(aggregateAliasMap));
|
|
511
547
|
// For each group, get the records and the count
|
|
512
548
|
for (const group of groupByResult) {
|
|
513
549
|
if (populateGroup) {
|
|
514
550
|
let groupByQb: SelectQueryBuilder<T> = await this.repo.createSecurityRuleAwareQueryBuilder(alias);
|
|
515
|
-
|
|
516
|
-
|
|
551
|
+
const groupFilterDto: BasicFilterDto = {
|
|
552
|
+
...baseFilterDto,
|
|
553
|
+
...groupFilter,
|
|
554
|
+
groupBy: undefined,
|
|
555
|
+
aggregates: undefined,
|
|
556
|
+
// Only use explicit groupFilter.sort for record ordering; group-level sorts can contain
|
|
557
|
+
// group expressions (e.g. createdAt:day) that are invalid on record queries.
|
|
558
|
+
sort: groupFilter?.sort,
|
|
559
|
+
};
|
|
560
|
+
groupByQb = this.crudHelperService.buildFilterQuery(groupByQb, groupFilterDto, alias);
|
|
561
|
+
groupByQb = this.crudHelperService.buildGroupByRecordsQuery(groupByQb, group, alias, groupAliasMap, aggregateAliasMap, groupExpressionMap);
|
|
517
562
|
const [entities, count] = await groupByQb.getManyAndCount();
|
|
518
563
|
|
|
519
564
|
// Populate the entity with the userId fields
|
|
@@ -525,20 +570,22 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
525
570
|
if (populateMedia && populateMedia.length > 0) {
|
|
526
571
|
await this.handlePopulateMedia(populateMedia, entities);
|
|
527
572
|
}
|
|
528
|
-
const groupData = this.wrapFindResponse(groupFilter
|
|
529
|
-
groupRecords.push(this.crudHelperService.createGroupRecords(group,
|
|
573
|
+
const groupData = this.wrapFindResponse(groupFilter?.offset, groupFilter?.limit, count, entities);
|
|
574
|
+
groupRecords.push(this.crudHelperService.createGroupRecords(group, aggregateAliasSet, groupData, groupByFieldsOrdered, groupAliasMap, groupFormatMap));
|
|
530
575
|
}
|
|
531
|
-
groupMeta.push(this.crudHelperService.createGroupMeta(group,
|
|
576
|
+
groupMeta.push(this.crudHelperService.createGroupMeta(group, aggregateAliasSet, groupByFieldsOrdered, groupAliasMap, groupFormatMap));
|
|
532
577
|
}
|
|
533
578
|
return { groupMeta, groupRecords };
|
|
534
579
|
}
|
|
535
580
|
|
|
536
|
-
private wrapFindResponse(offset: number, limit: number, count: number, entities: T[]) {
|
|
537
|
-
const
|
|
538
|
-
const
|
|
581
|
+
private wrapFindResponse(offset: number | undefined, limit: number | undefined, count: number, entities: T[]) {
|
|
582
|
+
const safeLimit = limit ?? count ?? 0;
|
|
583
|
+
const safeOffset = offset ?? 0;
|
|
584
|
+
const currentPage = safeLimit ? Math.floor(safeOffset / safeLimit) + 1 : 1;
|
|
585
|
+
const totalPages = safeLimit ? Math.ceil(count / safeLimit) : 1;
|
|
539
586
|
|
|
540
|
-
const nextPage = currentPage < totalPages ? currentPage + 1 : null;
|
|
541
|
-
const prevPage = currentPage > 1 ? currentPage - 1 : null;
|
|
587
|
+
const nextPage = safeLimit && currentPage < totalPages ? currentPage + 1 : null;
|
|
588
|
+
const prevPage = safeLimit && currentPage > 1 ? currentPage - 1 : null;
|
|
542
589
|
|
|
543
590
|
const r = {
|
|
544
591
|
meta: {
|
|
@@ -547,7 +594,7 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
547
594
|
nextPage: nextPage,
|
|
548
595
|
prevPage: prevPage,
|
|
549
596
|
totalPages: totalPages,
|
|
550
|
-
perPage: +
|
|
597
|
+
perPage: safeLimit ? +safeLimit : 0,
|
|
551
598
|
},
|
|
552
599
|
records: entities
|
|
553
600
|
};
|
|
@@ -574,7 +621,7 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
574
621
|
}
|
|
575
622
|
|
|
576
623
|
private async handlePopulateMedia(populateMedia: string[], entities: T[]) {
|
|
577
|
-
const model = await this.
|
|
624
|
+
const model = await this.getDefaultEntityManager().getRepository(ModelMetadata).findOne({
|
|
578
625
|
where: {
|
|
579
626
|
singularName: this.modelName,
|
|
580
627
|
},
|
|
@@ -657,7 +704,7 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
657
704
|
return mediaDetails as MediaWithFullUrl[];
|
|
658
705
|
}
|
|
659
706
|
|
|
660
|
-
async findOne(id: number, query: any={}, solidRequestContext: any = {}) {
|
|
707
|
+
async findOne(id: number, query: any = {}, solidRequestContext: any = {}) {
|
|
661
708
|
const { populate = [], fields = [], populateMedia = [] } = query;
|
|
662
709
|
|
|
663
710
|
// const normalizedFields = this.crudHelperService.normalize(fields);
|
|
@@ -913,7 +960,7 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
913
960
|
throw new BadRequestException(`Field ${field.name} does not define a relationCoModelSingularName`);
|
|
914
961
|
}
|
|
915
962
|
|
|
916
|
-
const relationCoModel = await this.
|
|
963
|
+
const relationCoModel = await this.getDefaultEntityManager().getRepository(ModelMetadata).findOne({
|
|
917
964
|
where: { singularName: field.relationCoModelSingularName },
|
|
918
965
|
relations: ['fields', 'fields.mediaStorageProvider', 'fields.model'],
|
|
919
966
|
});
|
|
@@ -1016,5 +1063,8 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
|
|
|
1016
1063
|
|
|
1017
1064
|
return updatedEntity
|
|
1018
1065
|
}
|
|
1019
|
-
}
|
|
1020
1066
|
|
|
1067
|
+
private getDefaultEntityManager() {
|
|
1068
|
+
return this.defaultEntityManager ?? this.entityManager;
|
|
1069
|
+
}
|
|
1070
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import { DataSource } from 'typeorm';
|
|
3
|
+
import { readdir, readFile } from 'fs/promises';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { InjectDataSource } from '@nestjs/typeorm';
|
|
6
|
+
|
|
7
|
+
@Injectable()
|
|
8
|
+
export class DatabaseBootstrapService implements OnModuleInit {
|
|
9
|
+
private readonly logger = new Logger(DatabaseBootstrapService.name);
|
|
10
|
+
|
|
11
|
+
constructor(
|
|
12
|
+
@InjectDataSource()
|
|
13
|
+
private readonly dataSource: DataSource,
|
|
14
|
+
) { }
|
|
15
|
+
|
|
16
|
+
async onModuleInit() {
|
|
17
|
+
if (!this.dataSource.isInitialized) {
|
|
18
|
+
this.logger.warn(`[${this.dataSource.name}] DataSource not initialized. Skipping SQL bootstrap.`);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
this.logger.debug(`[${this.dataSource.name}] Bootstrapping stored procedures...`);
|
|
23
|
+
|
|
24
|
+
await this.applyAllSqlFiles();
|
|
25
|
+
|
|
26
|
+
this.logger.debug(`[${this.dataSource.name}] SQL bootstrap completed`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
private resolveSqlDirectory(): string {
|
|
30
|
+
const datasourceName = this.dataSource.name || 'default';
|
|
31
|
+
const dbType = this.dataSource.options.type;
|
|
32
|
+
|
|
33
|
+
const sqlFilePath = path.resolve(__dirname, `../../../sql/${datasourceName}/${dbType}`);
|
|
34
|
+
|
|
35
|
+
return sqlFilePath
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private async applyAllSqlFiles() {
|
|
39
|
+
const sqlDir = this.resolveSqlDirectory();
|
|
40
|
+
|
|
41
|
+
this.logger.debug(`[${this.dataSource.name}] SQL directory: ${sqlDir}`);
|
|
42
|
+
|
|
43
|
+
let files: string[];
|
|
44
|
+
try {
|
|
45
|
+
files = await readdir(sqlDir);
|
|
46
|
+
} catch {
|
|
47
|
+
this.logger.warn(
|
|
48
|
+
`[${this.dataSource.name}] No SQL directory found. Skipping.`,
|
|
49
|
+
);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const sqlFiles = files
|
|
54
|
+
.filter(file => file.endsWith('.sql'))
|
|
55
|
+
.sort();
|
|
56
|
+
|
|
57
|
+
if (!sqlFiles.length) {
|
|
58
|
+
this.logger.warn(
|
|
59
|
+
`[${this.dataSource.name}] No SQL files found`,
|
|
60
|
+
);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
for (const file of sqlFiles) {
|
|
65
|
+
await this.applySqlFileSafely(
|
|
66
|
+
path.join(sqlDir, file),
|
|
67
|
+
file,
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private async applySqlFileSafely(
|
|
73
|
+
filePath: string,
|
|
74
|
+
fileName: string,
|
|
75
|
+
) {
|
|
76
|
+
this.logger.debug(`[${this.dataSource.name}] Applying ${fileName}`);
|
|
77
|
+
|
|
78
|
+
try {
|
|
79
|
+
const sql = await readFile(filePath, 'utf8');
|
|
80
|
+
await this.dataSource.query(sql);
|
|
81
|
+
|
|
82
|
+
this.logger.debug(`[${this.dataSource.name}] Applied ${fileName}`);
|
|
83
|
+
} catch (error) {
|
|
84
|
+
// DO NOT THROW — continue with next file
|
|
85
|
+
this.logger.error(
|
|
86
|
+
`[${this.dataSource.name}] Failed ${fileName}`,
|
|
87
|
+
error instanceof Error ? error.stack : String(error),
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -1,25 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { forwardRef, Inject, Injectable } from '@nestjs/common';
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { ConfigService } from '@nestjs/config';
|
|
4
|
+
import { DiscoveryService, ModuleRef } from '@nestjs/core';
|
|
5
|
+
import { InjectEntityManager } from '@nestjs/typeorm';
|
|
6
|
+
import { EmailTemplateRepository } from 'src/repository/email-template.repository';
|
|
7
|
+
import { EntityManager } from 'typeorm';
|
|
6
8
|
import { EmailTemplate } from '../entities/email-template.entity';
|
|
7
|
-
import {
|
|
8
|
-
import { UpdateEmailTemplateDto } from '../dtos/update-email-template.dto';
|
|
9
|
+
import { CrudHelperService } from './crud-helper.service';
|
|
9
10
|
import { CRUDService } from './crud.service';
|
|
10
|
-
import { ModelMetadataService } from './model-metadata.service';
|
|
11
|
-
import { ModuleMetadataService } from './module-metadata.service';
|
|
12
|
-
import { MediaStorageProviderMetadataService } from './media-storage-provider-metadata.service';
|
|
13
|
-
import { ConfigService } from '@nestjs/config';
|
|
14
11
|
import { FileService } from './file.service';
|
|
12
|
+
import { MediaStorageProviderMetadataService } from './media-storage-provider-metadata.service';
|
|
15
13
|
import { MediaService } from './media.service';
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import { EmailTemplateRepository } from 'src/repository/email-template.repository';
|
|
14
|
+
import { ModelMetadataService } from './model-metadata.service';
|
|
15
|
+
import { ModuleMetadataService } from './module-metadata.service';
|
|
19
16
|
|
|
20
17
|
@Injectable()
|
|
21
18
|
export class EmailTemplateService extends CRUDService<EmailTemplate>{
|
|
22
19
|
constructor(
|
|
20
|
+
@Inject(forwardRef(() => ModelMetadataService))
|
|
23
21
|
readonly modelMetadataService: ModelMetadataService,
|
|
24
22
|
readonly moduleMetadataService: ModuleMetadataService,
|
|
25
23
|
readonly mediaStorageProviderService: MediaStorageProviderMetadataService,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Injectable, Logger } from '@nestjs/common';
|
|
2
2
|
import * as ExcelJS from 'exceljs';
|
|
3
3
|
import { ERROR_MESSAGES } from 'src/constants/error-messages';
|
|
4
|
+
import { parseFlexibleDate } from 'src/helpers/date.helper';
|
|
4
5
|
import { PassThrough, Readable } from 'stream';
|
|
5
6
|
|
|
6
|
-
|
|
7
7
|
export interface ExcelReadOptions {
|
|
8
8
|
pageSize?: number; // Number of records per page
|
|
9
9
|
hasHeaderRow?: boolean; // Whether the first row contains headers
|
|
@@ -17,6 +17,11 @@ export interface ExcelReadResult {
|
|
|
17
17
|
data: Record<string, any>[]; // Data records in the current page
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
export interface ExcelReadAllResult {
|
|
21
|
+
headers: string[];
|
|
22
|
+
rows: Record<string, any>[];
|
|
23
|
+
}
|
|
24
|
+
|
|
20
25
|
@Injectable()
|
|
21
26
|
export class ExcelService {
|
|
22
27
|
private logger = new Logger(ExcelService.name);
|
|
@@ -59,7 +64,7 @@ export class ExcelService {
|
|
|
59
64
|
// headers.reduce((acc, header) => ({ ...acc, [header]: '' }), {})
|
|
60
65
|
// ).commit(); // Write a dummy record with headers
|
|
61
66
|
|
|
62
|
-
|
|
67
|
+
workbook.commit();
|
|
63
68
|
return passThrough;
|
|
64
69
|
}
|
|
65
70
|
|
|
@@ -86,7 +91,7 @@ export class ExcelService {
|
|
|
86
91
|
this.logger.debug(`✅ Chunk ${chunkIndex} written to Excel`);
|
|
87
92
|
}
|
|
88
93
|
|
|
89
|
-
|
|
94
|
+
workbook.commit();
|
|
90
95
|
// passThrough.end(); // ✅ Properly close the stream
|
|
91
96
|
} catch (error) {
|
|
92
97
|
this.logger.error(`❌ Error writing Excel: ${error.message}`);
|
|
@@ -159,4 +164,148 @@ export class ExcelService {
|
|
|
159
164
|
}
|
|
160
165
|
}
|
|
161
166
|
|
|
167
|
+
private cleanString(value: any): string {
|
|
168
|
+
return (value === null || value === undefined ? '' : String(value))
|
|
169
|
+
.replace(/\uFEFF/g, '') // BOM
|
|
170
|
+
.replace(/\u00A0/g, ' ') // NBSP
|
|
171
|
+
.replace(/\s+/g, ' ')
|
|
172
|
+
.trim();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
private normalizeCellValue(value: any, sharedStrings?: any[]): any {
|
|
176
|
+
if (value === undefined || value === null) return null;
|
|
177
|
+
|
|
178
|
+
// ExcelJS streaming shared string ref: { sharedString: number }
|
|
179
|
+
if (typeof value === 'object' && value && 'sharedString' in value) {
|
|
180
|
+
const idx = (value as any).sharedString;
|
|
181
|
+
const resolved = sharedStrings?.[idx];
|
|
182
|
+
// sharedStrings may store objects or plain strings depending on ExcelJS internals
|
|
183
|
+
if (resolved === undefined || resolved === null) return null;
|
|
184
|
+
if (typeof resolved === 'string') return resolved;
|
|
185
|
+
if (typeof resolved === 'object') {
|
|
186
|
+
if ('text' in resolved && typeof (resolved as any).text === 'string') return (resolved as any).text;
|
|
187
|
+
if ('richText' in resolved && Array.isArray((resolved as any).richText)) {
|
|
188
|
+
return (resolved as any).richText.map((item: any) => item?.text ?? '').join('');
|
|
189
|
+
}
|
|
190
|
+
if ('value' in resolved) return (resolved as any).value;
|
|
191
|
+
}
|
|
192
|
+
return resolved;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// ExcelJS can return rich objects for styled cells; unwrap to plain text/primitive
|
|
196
|
+
if (typeof value === 'object' && value) {
|
|
197
|
+
// Plain rich cell: { text: '...' }
|
|
198
|
+
if ('text' in value && typeof (value as any).text === 'string') return (value as any).text;
|
|
199
|
+
|
|
200
|
+
// Rich text: { richText: [{text:'a'}, ...] }
|
|
201
|
+
if ('richText' in value && Array.isArray((value as any).richText)) {
|
|
202
|
+
return (value as any).richText.map((item: any) => item?.text ?? '').join('');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Formula cells: { formula: '...', result: ... }
|
|
206
|
+
if ('result' in value) return (value as any).result;
|
|
207
|
+
if ('formula' in value) return (value as any).formula;
|
|
208
|
+
|
|
209
|
+
// Hyperlinks: { text: '...', hyperlink: '...' }
|
|
210
|
+
if ('hyperlink' in value && typeof (value as any).hyperlink === 'string') {
|
|
211
|
+
return (value as any).text ?? (value as any).hyperlink;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Sometimes primitive nested under .value
|
|
215
|
+
if ('value' in value) return this.normalizeCellValue((value as any).value, sharedStrings);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return value;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
public async readExcelFromStreamNonStreaming(
|
|
222
|
+
stream: Readable,
|
|
223
|
+
options?: ExcelReadOptions & { worksheetIndex?: number; maxRows?: number }
|
|
224
|
+
): Promise<ExcelReadAllResult> {
|
|
225
|
+
const {
|
|
226
|
+
hasHeaderRow = true,
|
|
227
|
+
providedHeaders = [],
|
|
228
|
+
worksheetIndex = 0, // 0-based
|
|
229
|
+
maxRows,
|
|
230
|
+
} = options || {};
|
|
231
|
+
|
|
232
|
+
// 1) Read entire stream into a Buffer
|
|
233
|
+
const chunks: Buffer[] = [];
|
|
234
|
+
for await (const chunk of stream) {
|
|
235
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
236
|
+
}
|
|
237
|
+
const buffer = Buffer.concat(chunks);
|
|
238
|
+
|
|
239
|
+
// 2) Load workbook (non-streaming)
|
|
240
|
+
const workbook = new ExcelJS.Workbook();
|
|
241
|
+
// @ts-ignore
|
|
242
|
+
await workbook.xlsx.load(buffer);
|
|
243
|
+
|
|
244
|
+
const worksheet = workbook.worksheets?.[worksheetIndex];
|
|
245
|
+
if (!worksheet) {
|
|
246
|
+
return { headers: [], rows: [] };
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// 3) Determine headers
|
|
250
|
+
let headers: string[] = [];
|
|
251
|
+
|
|
252
|
+
const firstRow = worksheet.getRow(1);
|
|
253
|
+
const firstRowValues = Array.isArray(firstRow.values) ? (firstRow.values as any[]).slice(1) : [];
|
|
254
|
+
|
|
255
|
+
const normalizeNonStreamingCell = (v: any) => {
|
|
256
|
+
// In non-streaming ExcelJS, cell.value can be:
|
|
257
|
+
// - string/number/boolean/date
|
|
258
|
+
// - {richText}, {text}, {hyperlink}, {formula,result}, etc.
|
|
259
|
+
// We'll reuse your normalizeCellValue but without sharedStrings
|
|
260
|
+
return this.normalizeCellValue(v);
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
if (hasHeaderRow) {
|
|
264
|
+
headers = firstRowValues.map((v) => this.cleanString(normalizeNonStreamingCell(v)));
|
|
265
|
+
} else if (providedHeaders.length) {
|
|
266
|
+
headers = providedHeaders.map((h) => this.cleanString(h));
|
|
267
|
+
} else {
|
|
268
|
+
headers = firstRowValues.map((_, idx) => `${idx}`);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// If headers are all blank and hasHeaderRow=true, treat as no headers (avoid mapping everything to "")
|
|
272
|
+
if (hasHeaderRow && headers.length > 0 && headers.every((h) => !h)) {
|
|
273
|
+
this.logger.warn(`ExcelService.readExcelFromStreamNonStreaming: header row appears blank`);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// 4) Read rows
|
|
277
|
+
const rows: Record<string, any>[] = [];
|
|
278
|
+
|
|
279
|
+
const startRowNumber = hasHeaderRow ? 2 : 1;
|
|
280
|
+
const lastRowNumber = worksheet.rowCount || 0;
|
|
281
|
+
|
|
282
|
+
for (let r = startRowNumber; r <= lastRowNumber; r++) {
|
|
283
|
+
if (maxRows && rows.length >= maxRows) break;
|
|
284
|
+
|
|
285
|
+
const row = worksheet.getRow(r);
|
|
286
|
+
const rawValues = Array.isArray(row.values) ? (row.values as any[]).slice(1) : [];
|
|
287
|
+
const values = rawValues.map((v) => normalizeNonStreamingCell(v));
|
|
288
|
+
|
|
289
|
+
// Align row width to header width
|
|
290
|
+
while (values.length < headers.length) values.push(null);
|
|
291
|
+
if (values.length > headers.length) values.length = headers.length;
|
|
292
|
+
|
|
293
|
+
const record = headers.reduce((acc, key, i) => {
|
|
294
|
+
acc[key] = values[i] ?? null;
|
|
295
|
+
return acc;
|
|
296
|
+
}, {} as Record<string, any>);
|
|
297
|
+
|
|
298
|
+
// Skip fully empty rows
|
|
299
|
+
if (Object.values(record).every((v) => v === null || this.cleanString(v) === '')) continue;
|
|
300
|
+
|
|
301
|
+
rows.push(record);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
return { headers, rows };
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
public parseAndValidateDate(value: string): Date | null {
|
|
308
|
+
return parseFlexibleDate(value);
|
|
309
|
+
}
|
|
310
|
+
|
|
162
311
|
}
|