@solidstarters/solid-core 1.2.192 → 1.2.200
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/mcp.command.d.ts +20 -0
- package/dist/commands/mcp.command.d.ts.map +1 -0
- package/dist/commands/mcp.command.js +208 -0
- package/dist/commands/mcp.command.js.map +1 -0
- package/dist/commands/refresh-model.command.d.ts +8 -5
- package/dist/commands/refresh-model.command.d.ts.map +1 -1
- package/dist/commands/refresh-model.command.js +32 -0
- package/dist/commands/refresh-model.command.js.map +1 -1
- package/dist/commands/remove-fields.command.js +1 -1
- package/dist/commands/remove-fields.command.js.map +1 -1
- package/dist/commands/seed.command.d.ts +2 -0
- package/dist/commands/seed.command.d.ts.map +1 -1
- package/dist/commands/seed.command.js +28 -1
- package/dist/commands/seed.command.js.map +1 -1
- package/dist/controllers/authentication.controller.js +1 -1
- package/dist/controllers/authentication.controller.js.map +1 -1
- package/dist/controllers/email-template.controller.js +1 -1
- package/dist/controllers/email-template.controller.js.map +1 -1
- package/dist/controllers/field-metadata.controller.d.ts +136 -4
- package/dist/controllers/field-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/field-metadata.controller.js +14 -1
- package/dist/controllers/field-metadata.controller.js.map +1 -1
- package/dist/controllers/media-storage-provider-metadata.controller.js +1 -1
- package/dist/controllers/media-storage-provider-metadata.controller.js.map +1 -1
- package/dist/controllers/model-metadata.controller.js +1 -1
- package/dist/controllers/model-metadata.controller.js.map +1 -1
- package/dist/controllers/module-metadata.controller.js +1 -1
- package/dist/controllers/module-metadata.controller.js.map +1 -1
- package/dist/controllers/otp-authentication.controller.js +1 -1
- package/dist/controllers/otp-authentication.controller.js.map +1 -1
- package/dist/controllers/service.controller.js +1 -1
- package/dist/controllers/service.controller.js.map +1 -1
- package/dist/controllers/sms-template.controller.js +1 -1
- package/dist/controllers/sms-template.controller.js.map +1 -1
- package/dist/controllers/test-queue.controller.js +1 -1
- package/dist/controllers/test-queue.controller.js.map +1 -1
- package/dist/controllers/test.controller.js +1 -1
- package/dist/controllers/test.controller.js.map +1 -1
- package/dist/dtos/create-ai-interaction.dto.d.ts +2 -0
- package/dist/dtos/create-ai-interaction.dto.d.ts.map +1 -1
- package/dist/dtos/create-ai-interaction.dto.js +14 -1
- package/dist/dtos/create-ai-interaction.dto.js.map +1 -1
- package/dist/dtos/create-field-metadata.dto.d.ts +22 -5
- package/dist/dtos/create-field-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-field-metadata.dto.js +33 -7
- package/dist/dtos/create-field-metadata.dto.js.map +1 -1
- package/dist/dtos/create-import-transaction.dto.d.ts +0 -1
- package/dist/dtos/create-import-transaction.dto.d.ts.map +1 -1
- package/dist/dtos/create-import-transaction.dto.js +1 -7
- package/dist/dtos/create-import-transaction.dto.js.map +1 -1
- package/dist/dtos/create-model-metadata.dto.d.ts +2 -0
- package/dist/dtos/create-model-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-model-metadata.dto.js +13 -1
- package/dist/dtos/create-model-metadata.dto.js.map +1 -1
- package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-role-metadata.dto.js +5 -1
- package/dist/dtos/create-role-metadata.dto.js.map +1 -1
- package/dist/dtos/resolve-s3-url.dto.d.ts +10 -0
- package/dist/dtos/resolve-s3-url.dto.d.ts.map +1 -0
- package/dist/dtos/resolve-s3-url.dto.js +49 -0
- package/dist/dtos/resolve-s3-url.dto.js.map +1 -0
- package/dist/dtos/update-ai-interaction.dto.d.ts +2 -0
- package/dist/dtos/update-ai-interaction.dto.d.ts.map +1 -1
- package/dist/dtos/update-ai-interaction.dto.js +13 -1
- package/dist/dtos/update-ai-interaction.dto.js.map +1 -1
- package/dist/dtos/update-field-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/update-field-metadata.dto.js.map +1 -1
- package/dist/dtos/update-import-transaction.dto.d.ts +0 -1
- package/dist/dtos/update-import-transaction.dto.d.ts.map +1 -1
- package/dist/dtos/update-import-transaction.dto.js +1 -7
- package/dist/dtos/update-import-transaction.dto.js.map +1 -1
- package/dist/entities/action-metadata.entity.js +4 -4
- package/dist/entities/action-metadata.entity.js.map +1 -1
- package/dist/entities/ai-interaction.entity.d.ts +2 -0
- package/dist/entities/ai-interaction.entity.d.ts.map +1 -1
- package/dist/entities/ai-interaction.entity.js +15 -6
- package/dist/entities/ai-interaction.entity.js.map +1 -1
- package/dist/entities/chatter-message-details.entity.d.ts.map +1 -1
- package/dist/entities/chatter-message-details.entity.js +1 -1
- package/dist/entities/chatter-message-details.entity.js.map +1 -1
- package/dist/entities/chatter-message.entity.js +1 -1
- package/dist/entities/chatter-message.entity.js.map +1 -1
- package/dist/entities/common.entity.d.ts +2 -3
- package/dist/entities/common.entity.d.ts.map +1 -1
- package/dist/entities/common.entity.js +9 -11
- package/dist/entities/common.entity.js.map +1 -1
- package/dist/entities/dashboard-question-sql-dataset-config.entity.js +2 -2
- package/dist/entities/dashboard-question-sql-dataset-config.entity.js.map +1 -1
- package/dist/entities/dashboard-question.entity.js +3 -3
- package/dist/entities/dashboard-question.entity.js.map +1 -1
- package/dist/entities/dashboard-variable.entity.js +3 -3
- package/dist/entities/dashboard-variable.entity.js.map +1 -1
- package/dist/entities/dashboard.entity.js +1 -1
- package/dist/entities/dashboard.entity.js.map +1 -1
- package/dist/entities/email-template.entity.d.ts.map +1 -1
- package/dist/entities/email-template.entity.js +4 -3
- package/dist/entities/email-template.entity.js.map +1 -1
- package/dist/entities/export-template.entity.js +2 -2
- package/dist/entities/export-template.entity.js.map +1 -1
- package/dist/entities/export-transaction.entity.js +2 -2
- package/dist/entities/export-transaction.entity.js.map +1 -1
- package/dist/entities/field-metadata.entity.d.ts +1 -0
- package/dist/entities/field-metadata.entity.d.ts.map +1 -1
- package/dist/entities/field-metadata.entity.js +8 -4
- package/dist/entities/field-metadata.entity.js.map +1 -1
- package/dist/entities/import-transaction-error-log.entity.js +1 -1
- package/dist/entities/import-transaction-error-log.entity.js.map +1 -1
- package/dist/entities/import-transaction.entity.d.ts +0 -1
- package/dist/entities/import-transaction.entity.d.ts.map +1 -1
- package/dist/entities/import-transaction.entity.js +2 -7
- package/dist/entities/import-transaction.entity.js.map +1 -1
- package/dist/entities/legacy-common-with-id.entity.d.ts +5 -0
- package/dist/entities/legacy-common-with-id.entity.d.ts.map +1 -0
- package/dist/entities/legacy-common-with-id.entity.js +32 -0
- package/dist/entities/legacy-common-with-id.entity.js.map +1 -0
- package/dist/entities/legacy-common.entity.d.ts +13 -0
- package/dist/entities/legacy-common.entity.d.ts.map +1 -0
- package/dist/entities/legacy-common.entity.js +67 -0
- package/dist/entities/legacy-common.entity.js.map +1 -0
- package/dist/entities/list-of-values.entity.js +2 -2
- package/dist/entities/list-of-values.entity.js.map +1 -1
- package/dist/entities/locale.entity.js +1 -1
- package/dist/entities/locale.entity.js.map +1 -1
- package/dist/entities/media.entity.d.ts.map +1 -1
- package/dist/entities/media.entity.js +3 -3
- package/dist/entities/media.entity.js.map +1 -1
- package/dist/entities/menu-item-metadata.entity.js +4 -4
- package/dist/entities/menu-item-metadata.entity.js.map +1 -1
- package/dist/entities/model-metadata.entity.d.ts +2 -0
- package/dist/entities/model-metadata.entity.d.ts.map +1 -1
- package/dist/entities/model-metadata.entity.js +11 -3
- package/dist/entities/model-metadata.entity.js.map +1 -1
- package/dist/entities/mq-message-queue.entity.js +1 -1
- package/dist/entities/mq-message-queue.entity.js.map +1 -1
- package/dist/entities/mq-message.entity.d.ts +3 -3
- package/dist/entities/mq-message.entity.d.ts.map +1 -1
- package/dist/entities/mq-message.entity.js +10 -10
- package/dist/entities/mq-message.entity.js.map +1 -1
- package/dist/entities/saved-filters.entity.js +4 -4
- package/dist/entities/saved-filters.entity.js.map +1 -1
- package/dist/entities/scheduled-job.entity.js +4 -4
- package/dist/entities/scheduled-job.entity.js.map +1 -1
- package/dist/entities/security-rule.entity.js +2 -2
- package/dist/entities/security-rule.entity.js.map +1 -1
- package/dist/entities/setting.entity.js +2 -2
- package/dist/entities/setting.entity.js.map +1 -1
- package/dist/entities/sms-template.entity.js +2 -2
- package/dist/entities/sms-template.entity.js.map +1 -1
- package/dist/entities/user-activity-history.entity.d.ts.map +1 -1
- package/dist/entities/user-activity-history.entity.js +1 -1
- package/dist/entities/user-activity-history.entity.js.map +1 -1
- package/dist/entities/user-view-metadata.entity.js +2 -2
- package/dist/entities/user-view-metadata.entity.js.map +1 -1
- package/dist/entities/user.entity.js +13 -15
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/entities/view-metadata.entity.js +3 -3
- package/dist/entities/view-metadata.entity.js.map +1 -1
- package/dist/helpers/date.helper.d.ts +1 -1
- package/dist/helpers/date.helper.d.ts.map +1 -1
- package/dist/helpers/date.helper.js +24 -2
- package/dist/helpers/date.helper.js.map +1 -1
- package/dist/helpers/model-metadata-helper.service.d.ts +4 -1
- package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
- package/dist/helpers/model-metadata-helper.service.js +48 -30
- package/dist/helpers/model-metadata-helper.service.js.map +1 -1
- package/dist/helpers/module.helper.d.ts.map +1 -1
- package/dist/helpers/module.helper.js +1 -3
- package/dist/helpers/module.helper.js.map +1 -1
- package/dist/helpers/schematic.service.d.ts +9 -3
- package/dist/helpers/schematic.service.d.ts.map +1 -1
- package/dist/helpers/schematic.service.js +49 -32
- package/dist/helpers/schematic.service.js.map +1 -1
- package/dist/helpers/solid-registry.d.ts +3 -2
- package/dist/helpers/solid-registry.d.ts.map +1 -1
- package/dist/helpers/solid-registry.js +10 -0
- package/dist/helpers/solid-registry.js.map +1 -1
- package/dist/helpers/typeorm-db-helper.d.ts +3 -0
- package/dist/helpers/typeorm-db-helper.d.ts.map +1 -0
- package/dist/helpers/typeorm-db-helper.js +24 -0
- package/dist/helpers/typeorm-db-helper.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +3 -0
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/interfaces.js.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.d.ts.map +1 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js +6 -1
- package/dist/jobs/database/trigger-mcp-client-subscriber-database.service.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +39 -17
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +53 -468
- package/dist/seeders/system-fields-seeder.service.d.ts.map +1 -1
- package/dist/seeders/system-fields-seeder.service.js +1 -1
- package/dist/seeders/system-fields-seeder.service.js.map +1 -1
- package/dist/services/ai-interaction.service.js +1 -1
- package/dist/services/ai-interaction.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 +6 -4
- package/dist/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.js.map +1 -1
- package/dist/services/crud-helper.service.d.ts +8 -0
- package/dist/services/crud-helper.service.d.ts.map +1 -1
- package/dist/services/crud-helper.service.js +28 -5
- package/dist/services/crud-helper.service.js.map +1 -1
- package/dist/services/crud.service.d.ts +4 -1
- package/dist/services/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +87 -7
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/field-metadata.service.d.ts +143 -6
- package/dist/services/field-metadata.service.d.ts.map +1 -1
- package/dist/services/field-metadata.service.js +211 -56
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/menu-item-metadata.service.d.ts +3 -1
- package/dist/services/menu-item-metadata.service.d.ts.map +1 -1
- package/dist/services/menu-item-metadata.service.js +31 -11
- 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 +14 -3
- package/dist/services/model-metadata.service.js.map +1 -1
- package/dist/services/mq-message.service.d.ts.map +1 -1
- package/dist/services/mq-message.service.js +3 -4
- package/dist/services/mq-message.service.js.map +1 -1
- package/dist/services/queues/publisher-factory.service.d.ts.map +1 -1
- package/dist/services/queues/publisher-factory.service.js +4 -0
- package/dist/services/queues/publisher-factory.service.js.map +1 -1
- package/dist/{providers → services/selection-providers}/list-of-values-selection-providers.service.d.ts +2 -2
- package/dist/services/selection-providers/list-of-values-selection-providers.service.d.ts.map +1 -0
- package/dist/{providers → services/selection-providers}/list-of-values-selection-providers.service.js +3 -3
- package/dist/services/selection-providers/list-of-values-selection-providers.service.js.map +1 -0
- package/dist/services/selection-providers/pseudo-foreign-key-selection-provider.service.d.ts +20 -0
- package/dist/services/selection-providers/pseudo-foreign-key-selection-provider.service.d.ts.map +1 -0
- package/dist/services/selection-providers/pseudo-foreign-key-selection-provider.service.js +87 -0
- package/dist/services/selection-providers/pseudo-foreign-key-selection-provider.service.js.map +1 -0
- package/dist/services/setting.service.d.ts.map +1 -1
- package/dist/services/setting.service.js +2 -1
- package/dist/services/setting.service.js.map +1 -1
- package/dist/services/solid-introspect.service.d.ts +19 -3
- package/dist/services/solid-introspect.service.d.ts.map +1 -1
- package/dist/services/solid-introspect.service.js +83 -11
- package/dist/services/solid-introspect.service.js.map +1 -1
- package/dist/services/view-metadata.service.d.ts +3 -1
- package/dist/services/view-metadata.service.d.ts.map +1 -1
- package/dist/services/view-metadata.service.js +31 -5
- package/dist/services/view-metadata.service.js.map +1 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +5 -1
- package/dist/solid-core.module.js.map +1 -1
- package/dist/subscribers/audit.subscriber.d.ts +3 -2
- package/dist/subscribers/audit.subscriber.d.ts.map +1 -1
- package/dist/subscribers/audit.subscriber.js +6 -12
- package/dist/subscribers/audit.subscriber.js.map +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.d.ts +3 -2
- package/dist/subscribers/computed-entity-field.subscriber.d.ts.map +1 -1
- package/dist/subscribers/computed-entity-field.subscriber.js +7 -9
- package/dist/subscribers/computed-entity-field.subscriber.js.map +1 -1
- package/dist/subscribers/created-by-updated-by.subscriber.d.ts +4 -2
- package/dist/subscribers/created-by-updated-by.subscriber.d.ts.map +1 -1
- package/dist/subscribers/created-by-updated-by.subscriber.js +10 -8
- package/dist/subscribers/created-by-updated-by.subscriber.js.map +1 -1
- package/dist/subscribers/field-metadata.subscriber.d.ts.map +1 -1
- package/dist/subscribers/field-metadata.subscriber.js +0 -1
- package/dist/subscribers/field-metadata.subscriber.js.map +1 -1
- package/dist/subscribers/model-metadata.subscriber.d.ts.map +1 -1
- package/dist/subscribers/model-metadata.subscriber.js +3 -2
- package/dist/subscribers/model-metadata.subscriber.js.map +1 -1
- package/dist/subscribers/soft-delete-aware-event.subscriber.d.ts +3 -2
- package/dist/subscribers/soft-delete-aware-event.subscriber.d.ts.map +1 -1
- package/dist/subscribers/soft-delete-aware-event.subscriber.js +6 -11
- package/dist/subscribers/soft-delete-aware-event.subscriber.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/sql/mssql/proc_CleanupModelMetadata.sql +175 -0
- package/sql/mssql/proc_CleanupModuleMetadata.sql +78 -0
- package/sql/mssql/scratchpad.sql +10 -0
- package/sql/postgres/proc_CleanupModelMetadata.sql +148 -0
- package/sql/postgres/proc_CleanupModuleMetadata.sql +50 -0
- package/sql/postgres/scratchpad.sql +12 -0
- package/sql-server-changes.txt +88 -0
- package/src/commands/mcp.command.ts +215 -0
- package/src/commands/refresh-model.command.ts +37 -5
- package/src/commands/remove-fields.command.ts +1 -1
- package/src/commands/seed.command.ts +34 -15
- package/src/controllers/authentication.controller.ts +1 -1
- package/src/controllers/email-template.controller.ts +1 -1
- package/src/controllers/field-metadata.controller.ts +7 -1
- package/src/controllers/media-storage-provider-metadata.controller.ts +1 -1
- package/src/controllers/model-metadata.controller.ts +1 -1
- package/src/controllers/module-metadata.controller.ts +1 -1
- package/src/controllers/otp-authentication.controller.ts +1 -1
- package/src/controllers/service.controller.ts +1 -1
- package/src/controllers/sms-template.controller.ts +1 -1
- package/src/controllers/test-queue.controller.ts +1 -1
- package/src/controllers/test.controller.ts +1 -1
- package/src/dtos/create-ai-interaction.dto.ts +16 -9
- package/src/dtos/create-field-metadata.dto.ts +42 -12
- package/src/dtos/create-import-transaction.dto.ts +0 -4
- package/src/dtos/create-model-metadata.dto.ts +10 -0
- package/src/dtos/create-role-metadata.dto.ts +8 -2
- package/src/dtos/resolve-s3-url.dto.ts +33 -0
- package/src/dtos/update-ai-interaction.dto.ts +16 -9
- package/src/dtos/update-field-metadata.dto.ts +1 -2
- package/src/dtos/update-import-transaction.dto.ts +0 -4
- package/src/entities/action-metadata.entity.ts +4 -4
- package/src/entities/ai-interaction.entity.ts +16 -12
- package/src/entities/chatter-message-details.entity.ts +18 -18
- package/src/entities/chatter-message.entity.ts +2 -2
- package/src/entities/common.entity.ts +19 -10
- package/src/entities/dashboard-question-sql-dataset-config.entity.ts +2 -2
- package/src/entities/dashboard-question.entity.ts +3 -3
- package/src/entities/dashboard-variable.entity.ts +3 -3
- package/src/entities/dashboard.entity.ts +1 -1
- package/src/entities/email-template.entity.ts +4 -3
- package/src/entities/export-template.entity.ts +2 -2
- package/src/entities/export-transaction.entity.ts +2 -2
- package/src/entities/field-metadata.entity.ts +6 -3
- package/src/entities/import-transaction-error-log.entity.ts +2 -2
- package/src/entities/import-transaction.entity.ts +2 -5
- package/src/entities/legacy-common-with-id.entity.ts +11 -0
- package/src/entities/legacy-common.entity.ts +57 -0
- package/src/entities/list-of-values.entity.ts +2 -2
- package/src/entities/locale.entity.ts +1 -1
- package/src/entities/media.entity.ts +25 -25
- package/src/entities/menu-item-metadata.entity.ts +4 -4
- package/src/entities/model-metadata.entity.ts +9 -2
- package/src/entities/mq-message-queue.entity.ts +1 -1
- package/src/entities/mq-message.entity.ts +34 -34
- package/src/entities/saved-filters.entity.ts +5 -5
- package/src/entities/scheduled-job.entity.ts +4 -4
- package/src/entities/security-rule.entity.ts +2 -2
- package/src/entities/setting.entity.ts +2 -2
- package/src/entities/sms-template.entity.ts +2 -2
- package/src/entities/user-activity-history.entity.ts +14 -14
- package/src/entities/user-view-metadata.entity.ts +2 -2
- package/src/entities/user.entity.ts +15 -15
- package/src/entities/view-metadata.entity.ts +3 -3
- package/src/helpers/date.helper.ts +31 -10
- package/src/helpers/model-metadata-helper.service.ts +63 -32
- package/src/helpers/module.helper.ts +4 -3
- package/src/helpers/schematic.service.ts +72 -46
- package/src/helpers/solid-registry.ts +14 -2
- package/src/helpers/typeorm-db-helper.ts +26 -0
- package/src/index.ts +5 -1
- package/src/interfaces.ts +3 -0
- package/src/jobs/database/trigger-mcp-client-subscriber-database.service.ts +17 -21
- package/src/seeders/module-metadata-seeder.service.ts +73 -29
- package/src/seeders/seed-data/solid-core-metadata.json +55 -470
- package/src/seeders/system-fields-seeder.service.ts +34 -35
- package/src/services/ai-interaction.service.ts +1 -1
- package/src/services/computed-fields/entity/alpha-num-external-id-computed-field-provider.ts +13 -9
- package/src/services/crud-helper.service.ts +32 -4
- package/src/services/crud.service.ts +158 -10
- package/src/services/field-metadata.service.ts +272 -67
- package/src/services/menu-item-metadata.service.ts +81 -50
- package/src/services/model-metadata.service.ts +18 -3
- package/src/services/mq-message.service.ts +16 -15
- package/src/services/queues/publisher-factory.service.ts +2 -1
- package/src/{providers → services/selection-providers}/list-of-values-selection-providers.service.ts +2 -2
- package/src/services/selection-providers/pseudo-foreign-key-selection-provider.service.ts +94 -0
- package/src/services/setting.service.ts +13 -10
- package/src/services/solid-introspect.service.ts +110 -10
- package/src/services/view-metadata.service.ts +48 -18
- package/src/solid-core.module.ts +5 -1
- package/src/subscribers/audit.subscriber.ts +12 -8
- package/src/subscribers/computed-entity-field.subscriber.ts +13 -7
- package/src/subscribers/created-by-updated-by.subscriber.ts +14 -8
- package/src/subscribers/field-metadata.subscriber.ts +1 -1
- package/src/subscribers/model-metadata.subscriber.ts +4 -2
- package/src/subscribers/soft-delete-aware-event.subscriber.ts +12 -6
- package/dist/providers/list-of-values-selection-providers.service.d.ts.map +0 -1
- package/dist/providers/list-of-values-selection-providers.service.js.map +0 -1
- package/src/commands/ingest-rag-chunking-strategy-for.md +0 -224
- package/src/entities/user.entity.ts.bkp +0 -144
- package/src/services/docker exec -it mssql //" +0 -8
|
@@ -70,17 +70,17 @@ export class MqMessageService extends CRUDService<MqMessage> {
|
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
/**
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
73
|
+
/**
|
|
74
|
+
* Wait until a queue message reaches a terminal status (succeeded/failed).
|
|
75
|
+
*
|
|
76
|
+
* @param messageId string – the external message id you store in `ss_mq_message.messageId`
|
|
77
|
+
* @param opts.timeoutMs total time to wait before giving up (default 60s)
|
|
78
|
+
* @param opts.intervalMs initial poll interval (default 500ms)
|
|
79
|
+
* @param opts.maxIntervalMs cap for exponential backoff (default 2000ms)
|
|
80
|
+
* @param opts.throwOnFailure if true, throws when stage === 'failed' (default false)
|
|
81
|
+
* @param opts.parseJson try JSON.parse on `output` and `error` (default true)
|
|
82
|
+
* @returns resolves with the final MqMessage row when terminal, rejects on timeout (or failure if throwOnFailure)
|
|
83
|
+
*/
|
|
84
84
|
async waitForTerminalStatus(
|
|
85
85
|
messageId: string,
|
|
86
86
|
opts?: {
|
|
@@ -139,14 +139,15 @@ export class MqMessageService extends CRUDService<MqMessage> {
|
|
|
139
139
|
} else if (rec.stage === 'succeeded' || rec.stage === 'failed') {
|
|
140
140
|
// Optionally parse output/error if they contain JSON strings
|
|
141
141
|
if (parseJson) {
|
|
142
|
-
rec.output = this.safeJsonParse(rec.output);
|
|
143
|
-
rec.
|
|
142
|
+
// rec.output = this.safeJsonParse(rec.output);
|
|
143
|
+
rec.output = rec.output;
|
|
144
|
+
// rec.error = this.safeJsonParse(rec.error);
|
|
145
|
+
rec.error = rec.error;
|
|
144
146
|
}
|
|
145
147
|
|
|
146
148
|
if (rec.stage === 'failed' && throwOnFailure) {
|
|
147
149
|
throw new Error(
|
|
148
|
-
`Queue message ${messageId} failed` +
|
|
149
|
-
(rec.error ? `: ${JSON.stringify(rec.error).slice(0, 500)}` : '')
|
|
150
|
+
`Queue message ${messageId} failed` + (rec.error ? `: ${JSON.stringify(rec.error).slice(0, 500)}` : '')
|
|
150
151
|
);
|
|
151
152
|
}
|
|
152
153
|
return rec;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Logger } from '@nestjs/common';
|
|
1
|
+
import { forwardRef, Inject, Logger } from '@nestjs/common';
|
|
2
2
|
import { Injectable } from '@nestjs/common';
|
|
3
3
|
|
|
4
4
|
import { QueueMessage, QueuePublisher } from 'src/interfaces/mq';
|
|
@@ -11,6 +11,7 @@ export class PublisherFactory<T> {
|
|
|
11
11
|
private readonly logger = new Logger(PublisherFactory.name);
|
|
12
12
|
|
|
13
13
|
constructor(
|
|
14
|
+
@Inject(forwardRef(() => SolidIntrospectService))
|
|
14
15
|
private readonly solidIntrospectionService: SolidIntrospectService
|
|
15
16
|
) {
|
|
16
17
|
}
|
package/src/{providers → services/selection-providers}/list-of-values-selection-providers.service.ts
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
import { ListOfValuesService } from "../
|
|
2
|
+
import { ListOfValuesService } from "../list-of-values.service";
|
|
3
3
|
import { PaginationQueryDto } from "src/dtos/pagination-query.dto";
|
|
4
4
|
import { SelectionProvider } from "src/decorators/selection-provider.decorator";
|
|
5
5
|
import { Injectable } from "@nestjs/common";
|
|
6
|
-
import { ISelectionProvider, ISelectionProviderContext, ISelectionProviderValues } from "
|
|
6
|
+
import { ISelectionProvider, ISelectionProviderContext, ISelectionProviderValues } from "../../interfaces";
|
|
7
7
|
import { filter } from "rxjs";
|
|
8
8
|
import { BasicFilterDto } from "src/dtos/basic-filters.dto";
|
|
9
9
|
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { ListOfValuesService } from "../list-of-values.service";
|
|
2
|
+
import { SelectionProvider } from "src/decorators/selection-provider.decorator";
|
|
3
|
+
import { BadRequestException, Injectable } from "@nestjs/common";
|
|
4
|
+
import { ISelectionProvider, ISelectionProviderContext, ISelectionProviderValues } from "../../interfaces";
|
|
5
|
+
import { BasicFilterDto } from "src/dtos/basic-filters.dto";
|
|
6
|
+
import { SolidIntrospectService } from "../solid-introspect.service";
|
|
7
|
+
import { classify } from "@angular-devkit/core/src/utils/strings";
|
|
8
|
+
import { CRUDService } from "../crud.service";
|
|
9
|
+
|
|
10
|
+
interface PseudoForeignKeySelectionProviderContext extends ISelectionProviderContext {
|
|
11
|
+
modelName: string;
|
|
12
|
+
// ['countryName', 'countryCode'] - IN|INR
|
|
13
|
+
whereClauseFields: string[];
|
|
14
|
+
labelFieldName: string;
|
|
15
|
+
valueFieldName: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const DEFAULT_LIMIT = 100;
|
|
19
|
+
|
|
20
|
+
@SelectionProvider()
|
|
21
|
+
@Injectable()
|
|
22
|
+
export class PseudoForeignKeySelectionProvider implements ISelectionProvider<PseudoForeignKeySelectionProviderContext> {
|
|
23
|
+
constructor(
|
|
24
|
+
private readonly listOfValuesService: ListOfValuesService,
|
|
25
|
+
readonly introspectService: SolidIntrospectService,
|
|
26
|
+
) { }
|
|
27
|
+
|
|
28
|
+
name(): string {
|
|
29
|
+
return 'PseudoForeignKeySelectionProvider';
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
help(): string {
|
|
33
|
+
return "# Use this provider to implement pseudo foreign key style relationships.";
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async value(optionValue: string, ctxt: PseudoForeignKeySelectionProviderContext): Promise<ISelectionProviderValues | any> {
|
|
37
|
+
const basicFilterQuery = new BasicFilterDto(DEFAULT_LIMIT, 0);
|
|
38
|
+
basicFilterQuery.filters = {
|
|
39
|
+
[ctxt.valueFieldName]: {
|
|
40
|
+
$eq: optionValue
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const modelServiceInstanceWrapper = this.introspectService.getProvider(`${classify(ctxt.modelName)}Service`);
|
|
45
|
+
if (!modelServiceInstanceWrapper) {
|
|
46
|
+
throw new BadRequestException(`Invalid model name (${ctxt.modelName}) specified in PseudoForeignKeySelectionProvider context.`);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const modelService: CRUDService<any> = modelServiceInstanceWrapper.instance;
|
|
50
|
+
const recs = await modelService.find(basicFilterQuery);
|
|
51
|
+
if (!recs.records || recs.records.length == 0) {
|
|
52
|
+
throw new Error(`Invalid optionValue=${optionValue}, for PseudoForeignKeySelectionProvider with context: ${JSON.stringify(ctxt)}`)
|
|
53
|
+
// return null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
label: recs.records[0][ctxt.labelFieldName],
|
|
58
|
+
value: recs.records[0][ctxt.valueFieldName]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async values(query: string, ctxt: PseudoForeignKeySelectionProviderContext): Promise<readonly ISelectionProviderValues[]> {
|
|
63
|
+
const basicFilterQuery = new BasicFilterDto(ctxt.limit, ctxt.offset);
|
|
64
|
+
|
|
65
|
+
// Next we get hold of the userkey field in the parent model.
|
|
66
|
+
if (query) {
|
|
67
|
+
basicFilterQuery.filters = {
|
|
68
|
+
$or: ctxt.whereClauseFields.map((whereClauseField) => {
|
|
69
|
+
return {
|
|
70
|
+
[whereClauseField]: {
|
|
71
|
+
$containsi: `%${query}%`
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const modelServiceInstanceWrapper = this.introspectService.getProvider(`${classify(ctxt.modelName)}Service`);
|
|
79
|
+
if (!modelServiceInstanceWrapper) {
|
|
80
|
+
throw new BadRequestException(`Invalid model name (${ctxt.modelName}) specified in PseudoForeignKeySelectionProvider context.`);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const modelService: CRUDService<any> = modelServiceInstanceWrapper.instance;
|
|
84
|
+
|
|
85
|
+
const recs = await modelService.find(basicFilterQuery);
|
|
86
|
+
const selectionValues = recs.records.map(rec => {
|
|
87
|
+
return {
|
|
88
|
+
label: rec[ctxt.labelFieldName],
|
|
89
|
+
value: rec[ctxt.valueFieldName]
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
return selectionValues;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -79,10 +79,10 @@ export class SettingService extends CRUDService<Setting> {
|
|
|
79
79
|
authenticationPasswordRegexErrorMessage: this.iamConfiguration.PASSWORD_REGEX_ERROR_MESSAGE,
|
|
80
80
|
authenticationPasswordComplexityDescription: this.iamConfiguration.PASSWORD_COMPLEXITY_DESC,
|
|
81
81
|
solidXGenAiCodeBuilderConfig: JSON.stringify({
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
showNameFieldsForRegistration:this.iamConfiguration.showNameFieldsForRegistration,
|
|
82
|
+
defaultProvider: "",
|
|
83
|
+
availableProviders: []
|
|
84
|
+
}),
|
|
85
|
+
showNameFieldsForRegistration: this.iamConfiguration.showNameFieldsForRegistration,
|
|
86
86
|
forceChangePasswordOnFirstLogin: this.iamConfiguration.forceChangePasswordOnFirstLogin
|
|
87
87
|
};
|
|
88
88
|
|
|
@@ -199,11 +199,11 @@ export class SettingService extends CRUDService<Setting> {
|
|
|
199
199
|
authenticationPasswordRegexErrorMessage: this.iamConfiguration.PASSWORD_REGEX_ERROR_MESSAGE,
|
|
200
200
|
authenticationPasswordComplexityDescription: this.iamConfiguration.PASSWORD_COMPLEXITY_DESC,
|
|
201
201
|
solidXGenAiCodeBuilderConfig: JSON.stringify({
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
iamAutoGeneratedPassword:this.iamConfiguration.iamAutoGeneratedPassword,
|
|
206
|
-
showNameFieldsForRegistration:this.iamConfiguration.showNameFieldsForRegistration
|
|
202
|
+
defaultProvider: "",
|
|
203
|
+
availableProviders: []
|
|
204
|
+
}),
|
|
205
|
+
iamAutoGeneratedPassword: this.iamConfiguration.iamAutoGeneratedPassword,
|
|
206
|
+
showNameFieldsForRegistration: this.iamConfiguration.showNameFieldsForRegistration
|
|
207
207
|
};
|
|
208
208
|
}
|
|
209
209
|
|
|
@@ -297,7 +297,10 @@ export class SettingService extends CRUDService<Setting> {
|
|
|
297
297
|
}
|
|
298
298
|
|
|
299
299
|
const key = settingDto.key;
|
|
300
|
-
const value = settingDto.value ?? '';
|
|
300
|
+
// const value = settingDto.value ?? '';
|
|
301
|
+
const rawValue = settingDto.value;
|
|
302
|
+
const value = rawValue === null || rawValue === undefined ? null : String(rawValue);
|
|
303
|
+
|
|
301
304
|
const settingType = settingDto.type ?? 'system';
|
|
302
305
|
|
|
303
306
|
const existingSetting = existingSettings.find(s => s.key === key);
|
|
@@ -1,19 +1,36 @@
|
|
|
1
1
|
import { classify } from '@angular-devkit/core/src/utils/strings';
|
|
2
|
-
import { Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common';
|
|
3
|
-
import { DiscoveryService, MetadataScanner, Reflector } from '@nestjs/core';
|
|
2
|
+
import { forwardRef, Inject, Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common';
|
|
3
|
+
import { DiscoveryService, MetadataScanner, ModuleRef, Reflector } from '@nestjs/core';
|
|
4
4
|
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
|
|
5
|
+
import { getDataSourceToken } from '@nestjs/typeorm';
|
|
5
6
|
import { IS_COMPUTED_FIELD_PROVIDER } from 'src/decorators/computed-field-provider.decorator';
|
|
7
|
+
import { IS_DASHBOARD_QUESTION_DATA_PROVIDER } from 'src/decorators/dashboard-question-data-provider.decorator';
|
|
8
|
+
import { IS_DASHBOARD_VARIABLE_SELECTION_PROVIDER } from 'src/decorators/dashboard-selection-provider.decorator';
|
|
9
|
+
import { IS_ERROR_CODE_PROVIDER } from 'src/decorators/error-codes-provider.decorator';
|
|
10
|
+
import { IS_MAIL_PROVIDER } from 'src/decorators/mail-provider.decorator';
|
|
11
|
+
import { IS_SCHEDULED_JOB_PROVIDER } from 'src/decorators/scheduled-job-provider.decorator';
|
|
12
|
+
import { IS_SECURITY_RULE_CONFIG_PROVIDER } from 'src/decorators/security-rule-config-provider.decorator';
|
|
6
13
|
import { IS_SELECTION_PROVIDER } from 'src/decorators/selection-provider.decorator';
|
|
7
14
|
import { IS_SOLID_DATABASE_MODULE } from 'src/decorators/solid-database-module.decorator';
|
|
15
|
+
import { IS_WA_PROVIDER } from 'src/decorators/whatsapp-provider.decorator';
|
|
8
16
|
import { SolidRegistry } from 'src/helpers/solid-registry';
|
|
17
|
+
import { DataSource } from 'typeorm';
|
|
9
18
|
import { CRUDService } from './crud.service';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
19
|
+
import { RequestContextService } from './request-context.service';
|
|
20
|
+
import { CreatedByUpdatedBySubscriber } from 'src/subscribers/created-by-updated-by.subscriber';
|
|
21
|
+
import { AuditSubscriber } from 'src/subscribers/audit.subscriber';
|
|
22
|
+
import { ComputedEntityFieldSubscriber, ComputedFieldEvaluationPayload } from 'src/subscribers/computed-entity-field.subscriber';
|
|
23
|
+
import { SoftDeleteAwareEventSubscriber } from 'src/subscribers/soft-delete-aware-event.subscriber';
|
|
24
|
+
import { ChatterMessageService } from './chatter-message.service';
|
|
25
|
+
import { ModelMetadataRepository } from 'src/repository/model-metadata.repository';
|
|
26
|
+
import { ModelMetadataHelperService, PublisherFactory } from 'src';
|
|
27
|
+
|
|
28
|
+
export const coreSubscriberClasses = [
|
|
29
|
+
AuditSubscriber,
|
|
30
|
+
ComputedEntityFieldSubscriber,
|
|
31
|
+
CreatedByUpdatedBySubscriber,
|
|
32
|
+
SoftDeleteAwareEventSubscriber
|
|
33
|
+
];
|
|
17
34
|
|
|
18
35
|
@Injectable()
|
|
19
36
|
export class SolidIntrospectService implements OnApplicationBootstrap {
|
|
@@ -22,10 +39,20 @@ export class SolidIntrospectService implements OnApplicationBootstrap {
|
|
|
22
39
|
private readonly reflector: Reflector,
|
|
23
40
|
private readonly metadataScanner: MetadataScanner,
|
|
24
41
|
private readonly solidRegistry: SolidRegistry,
|
|
42
|
+
private readonly moduleRef: ModuleRef,
|
|
43
|
+
private readonly requestContextService: RequestContextService,
|
|
44
|
+
// AuditSubscribe related dependencies
|
|
45
|
+
private readonly chatterMessageService: ChatterMessageService,
|
|
46
|
+
private readonly modelMetadataHelperService: ModelMetadataHelperService,
|
|
47
|
+
private readonly modelMetadataRepo: ModelMetadataRepository,
|
|
48
|
+
// ComputedEntityFieldSubscriber related dependencies
|
|
49
|
+
@Inject(forwardRef(() => PublisherFactory))
|
|
50
|
+
private readonly publisherFactory: PublisherFactory<any>,
|
|
51
|
+
|
|
25
52
|
) { }
|
|
26
53
|
|
|
27
54
|
private readonly logger = new Logger(SolidIntrospectService.name);
|
|
28
|
-
onApplicationBootstrap() {
|
|
55
|
+
async onApplicationBootstrap() {
|
|
29
56
|
this.logger.log('Introspecting the application for Solid metadata');
|
|
30
57
|
|
|
31
58
|
// Register all seeders
|
|
@@ -147,6 +174,79 @@ export class SolidIntrospectService implements OnApplicationBootstrap {
|
|
|
147
174
|
securityRuleConfigProviders.forEach((securityRuleConfigProvider) => {
|
|
148
175
|
this.solidRegistry.registerSecurityRuleConfigProvider(securityRuleConfigProvider);
|
|
149
176
|
});
|
|
177
|
+
|
|
178
|
+
// Register the core subscribers against all the configured database modules / datasources
|
|
179
|
+
await this.bootstrapCoreTypeOrmSubscribers(solidDatabaseModules)
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
async bootstrapCoreTypeOrmSubscribers(dbModules: Array<InstanceWrapper<any>>): Promise<void> {
|
|
183
|
+
// Register core subscribers for each Solid database module
|
|
184
|
+
for (const wrapper of dbModules) {
|
|
185
|
+
// Get the Database Module instance
|
|
186
|
+
const instance = (wrapper as InstanceWrapper).instance as any;
|
|
187
|
+
if (!instance || typeof instance.name !== 'function') {
|
|
188
|
+
this.logger.warn('Skipping a solid DB module wrapper with no instance or name() method');
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Get the DataSource for this module
|
|
193
|
+
const dsName: string | undefined = instance.name();
|
|
194
|
+
// getDataSourceToken() without name = default; pass dsName if non-default
|
|
195
|
+
const token = dsName ? getDataSourceToken(dsName) : getDataSourceToken();
|
|
196
|
+
let ds: DataSource | undefined;
|
|
197
|
+
try {
|
|
198
|
+
ds = this.moduleRef.get<DataSource>(token, { strict: false });
|
|
199
|
+
} catch (err) {
|
|
200
|
+
this.logger.warn(`DataSource token for "${dsName ?? 'default'}" not found: ${err?.message ?? err}`);
|
|
201
|
+
}
|
|
202
|
+
if (!ds) {
|
|
203
|
+
this.logger.warn(`No DataSource found for module "${dsName}". Skipping subscriber registration.`);
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Ensure DataSource is initialized (optional)
|
|
208
|
+
if (!ds.isInitialized) {
|
|
209
|
+
try {
|
|
210
|
+
await ds.initialize(); // only if you need to initialize here; in many apps datasources are created earlier
|
|
211
|
+
} catch (err) {
|
|
212
|
+
this.logger.error(`Failed to initialize DataSource "${dsName}": ${err}`);
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// Register each subscriber class for this DataSource
|
|
218
|
+
// const auditSubscriberInstance = new AuditSubscriber(this.chatterMessageService, this.modelMetadataRepo, this.modelMetadataHelperService);
|
|
219
|
+
// auditSubscriberInstance.bindToDataSource(ds);
|
|
220
|
+
|
|
221
|
+
// const computedEntityFieldSubscriberInstance = new ComputedEntityFieldSubscriber(this.solidRegistry, this.publisherFactory);
|
|
222
|
+
// computedEntityFieldSubscriberInstance.bindToDataSource(ds);
|
|
223
|
+
|
|
224
|
+
// const createdByUpdatedBySubscriberInstance = new CreatedByUpdatedBySubscriber(this.requestContextService);
|
|
225
|
+
// createdByUpdatedBySubscriberInstance.bindToDataSource(ds);
|
|
226
|
+
|
|
227
|
+
// const softDeleteAwareEventSubscriberInstance = new SoftDeleteAwareEventSubscriber();
|
|
228
|
+
// softDeleteAwareEventSubscriberInstance.bindToDataSource(ds);
|
|
229
|
+
for (const SubClass of coreSubscriberClasses) {
|
|
230
|
+
const alreadyRegistered = ds.subscribers.some(
|
|
231
|
+
(s) => (s as any).constructor?.name === SubClass.name,
|
|
232
|
+
);
|
|
233
|
+
if (alreadyRegistered) {
|
|
234
|
+
this.logger.debug(`Subscriber ${SubClass.name} already registered on datasource ${dsName ?? 'default'}`);
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Resolve subscriber from NestJS moduleRef to ensure dependencies are injected
|
|
239
|
+
const subscriberInstance = await this.moduleRef.resolve(SubClass, undefined, { strict: false });
|
|
240
|
+
subscriberInstance.bindToDataSource(ds);
|
|
241
|
+
|
|
242
|
+
// instantiate subscriber bound to this DataSource
|
|
243
|
+
// NOTE: constructor signature must be (dataSource: DataSource, requestContextService: RequestContextService, ...)
|
|
244
|
+
// const subscriberInstance = new (SubClass as any)(ds, this.requestContextService);
|
|
245
|
+
|
|
246
|
+
// ds.subscribers.push(subscriberInstance);
|
|
247
|
+
// this.logger.log(`Registered subscriber ${SubClass.name} on datasource ${dsName ?? 'default'}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
150
250
|
}
|
|
151
251
|
|
|
152
252
|
isDashboardQuestionDataProvider(providerWrapper: InstanceWrapper<any>) {
|
|
@@ -23,6 +23,7 @@ import { ViewMetadata } from '../entities/view-metadata.entity';
|
|
|
23
23
|
import { ActionMetadataService } from './action-metadata.service';
|
|
24
24
|
import { SolidIntrospectService } from './solid-introspect.service';
|
|
25
25
|
import { UserViewMetadataService } from './user-view-metadata.service';
|
|
26
|
+
import { MenuItemMetadataService } from './menu-item-metadata.service';
|
|
26
27
|
|
|
27
28
|
@Injectable()
|
|
28
29
|
export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
@@ -34,6 +35,7 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
|
34
35
|
readonly discoveryService: DiscoveryService,
|
|
35
36
|
readonly crudHelperService: CrudHelperService,
|
|
36
37
|
readonly actionMetadataService: ActionMetadataService,
|
|
38
|
+
readonly menuItemMetadataService: MenuItemMetadataService,
|
|
37
39
|
readonly introspectService: SolidIntrospectService,
|
|
38
40
|
readonly userViewMetadataService: UserViewMetadataService,
|
|
39
41
|
@InjectEntityManager()
|
|
@@ -55,13 +57,13 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
|
55
57
|
|
|
56
58
|
//for locales
|
|
57
59
|
private async getEntityRecordsInAllLocales(
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
): Promise<{ records: any[], defaultEntityLocaleId: string | null }> {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
60
|
+
modelName: string,
|
|
61
|
+
id: string,
|
|
62
|
+
defaultEntityLocaleIdFromQuery?: string
|
|
63
|
+
): Promise<{ records: any[], defaultEntityLocaleId: string | null }> {
|
|
64
|
+
const solidRegistry = await this.moduleRef.get(SolidRegistry, { strict: false });
|
|
65
|
+
// const currentEntityTarget = solidRegistry.getEntityTarget(this.entityManager, classify(modelName));
|
|
66
|
+
const currentEntityRepository = this.entityManager.getRepository(classify(modelName));
|
|
65
67
|
|
|
66
68
|
// Case 1: Creating a new record with no defaultEntityLocaleId to clone
|
|
67
69
|
if (id === 'new' && !defaultEntityLocaleIdFromQuery) {
|
|
@@ -117,16 +119,35 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
|
117
119
|
|
|
118
120
|
// START: Custom Service Methods
|
|
119
121
|
async getLayout(query, activeUser) {
|
|
120
|
-
let { modelName, moduleName, viewType, id, populate } = query;
|
|
122
|
+
let { modelName, moduleName, viewType, id, populate, menuItemId, menuItemName, actionId, actionName } = query;
|
|
121
123
|
|
|
122
|
-
// modelName = camelize(modelName);
|
|
123
124
|
|
|
124
|
-
// 1. Fetch the
|
|
125
|
+
// 1. Fetch the action based on actionId.
|
|
126
|
+
const solidRequestContext = {
|
|
127
|
+
activeUser: activeUser
|
|
128
|
+
}
|
|
129
|
+
const actionQuery = {
|
|
130
|
+
populate: ["view"]
|
|
131
|
+
}
|
|
132
|
+
let action = null;
|
|
133
|
+
if (actionId) {
|
|
134
|
+
action = await this.actionMetadataService.findOne(actionId, actionQuery, solidRequestContext);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// 2. Fetch the menu based on menuItemId.
|
|
138
|
+
const menuItemQuery = {
|
|
139
|
+
}
|
|
140
|
+
let menuItem = null;
|
|
141
|
+
if (menuItemId) {
|
|
142
|
+
menuItem = await this.menuItemMetadataService.findOne(menuItemId, menuItemQuery, solidRequestContext);
|
|
143
|
+
}
|
|
144
|
+
const viewId = action?.view?.id
|
|
145
|
+
// 3. Fetch the view based on module, model & view name.
|
|
125
146
|
const entity = await this.repo.findOne({
|
|
126
147
|
where: {
|
|
127
148
|
model: { singularName: modelName },
|
|
128
149
|
module: { name: moduleName },
|
|
129
|
-
type: viewType
|
|
150
|
+
...(actionId && viewId ? { id: action.view.id } : { type: viewType })
|
|
130
151
|
},
|
|
131
152
|
relations: {
|
|
132
153
|
model: {
|
|
@@ -143,7 +164,16 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
|
143
164
|
throw new BadRequestException(`Unable to identify user for module: ${moduleName}, model: ${modelName} and viewType: ${viewType}`);
|
|
144
165
|
}
|
|
145
166
|
|
|
146
|
-
//
|
|
167
|
+
// 4. add action and menuItem to Entity which is our solid View
|
|
168
|
+
if (actionId) {
|
|
169
|
+
delete action.view;
|
|
170
|
+
entity['action'] = action
|
|
171
|
+
}
|
|
172
|
+
if (menuItemId) {
|
|
173
|
+
entity['menu'] = menuItem
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// 5. See if we have a user specific layout for this view.
|
|
147
177
|
const userLayout = await this.userViewMetadataService.repo.findOne({
|
|
148
178
|
where: {
|
|
149
179
|
user: { id: activeUser?.sub },
|
|
@@ -158,7 +188,7 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
|
158
188
|
}
|
|
159
189
|
|
|
160
190
|
|
|
161
|
-
//
|
|
191
|
+
// 6. We are resolving the create & edit actions if specified in the layout.
|
|
162
192
|
if (entity?.layout?.attrs?.createAction) {
|
|
163
193
|
const actionName: string = entity.layout.attrs.createAction;
|
|
164
194
|
entity.layout.attrs.createAction = await this.actionMetadataService.findOneByUserKey(actionName)
|
|
@@ -168,14 +198,14 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
|
168
198
|
entity.layout.attrs.editAction = await this.actionMetadataService.findOneByUserKey(actionName)
|
|
169
199
|
}
|
|
170
200
|
|
|
171
|
-
//
|
|
201
|
+
// 7. For form views we need to fetch the workflow field metadata if specified.
|
|
172
202
|
let workflowFieldName = null;
|
|
173
203
|
let workflowField = null;
|
|
174
204
|
if (viewType === 'form') {
|
|
175
205
|
workflowFieldName = entity.layout?.attrs?.workflowField;
|
|
176
206
|
}
|
|
177
207
|
|
|
178
|
-
//
|
|
208
|
+
// 8. Create an easy to use map of field metadata, rather than sending an array of fields it becomes easier to use in the frontend.
|
|
179
209
|
const fields = await this.modelMetadataHelperService.loadFieldHierarchy(modelName);
|
|
180
210
|
const fieldsMap = new Map<string, FieldMetadata>();
|
|
181
211
|
for (let i = 0; i < fields.length; i++) {
|
|
@@ -207,7 +237,7 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
|
207
237
|
}
|
|
208
238
|
}
|
|
209
239
|
|
|
210
|
-
//
|
|
240
|
+
// 9. Use the resolved workflowField to populate workflow specific metadata.
|
|
211
241
|
// Check if we were able to resolve an actual workflowField.
|
|
212
242
|
let solidFormViewWorkflowData = [];
|
|
213
243
|
if (viewType === 'form' && workflowField) {
|
|
@@ -232,7 +262,7 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
|
232
262
|
}
|
|
233
263
|
}
|
|
234
264
|
|
|
235
|
-
//
|
|
265
|
+
// 10. If this model supports internationalisation, we need to load the locales applicable with the id of an actual record for each locale if present.
|
|
236
266
|
// This is the shape of locales that will be returned
|
|
237
267
|
/**
|
|
238
268
|
* [
|
|
@@ -335,7 +365,7 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
|
|
|
335
365
|
'solidView': entity,
|
|
336
366
|
'solidFieldsMetadata': Object.fromEntries(fieldsMap),
|
|
337
367
|
'solidFormViewWorkflowData': solidFormViewWorkflowData,
|
|
338
|
-
'applicableLocales': applicableLocales
|
|
368
|
+
'applicableLocales': applicableLocales,
|
|
339
369
|
}
|
|
340
370
|
|
|
341
371
|
return r;
|
package/src/solid-core.module.ts
CHANGED
|
@@ -25,7 +25,8 @@ import { ModelMetadata } from './entities/model-metadata.entity';
|
|
|
25
25
|
import { ModuleMetadata } from './entities/module-metadata.entity';
|
|
26
26
|
import { CommandService } from './helpers/command.service';
|
|
27
27
|
import { SchematicService } from './helpers/schematic.service';
|
|
28
|
-
import { ListOfValuesSelectionProvider } from './providers/list-of-values-selection-providers.service';
|
|
28
|
+
import { ListOfValuesSelectionProvider } from './services/selection-providers/list-of-values-selection-providers.service';
|
|
29
|
+
import { PseudoForeignKeySelectionProvider } from './services/selection-providers/pseudo-foreign-key-selection-provider.service'
|
|
29
30
|
import { ModuleMetadataSeederService } from './seeders/module-metadata-seeder.service';
|
|
30
31
|
import { CrudHelperService } from './services/crud-helper.service';
|
|
31
32
|
import { FieldMetadataService } from './services/field-metadata.service';
|
|
@@ -326,6 +327,7 @@ import { ScheduledJobSubscriber } from './subscribers/scheduled-job.subscriber';
|
|
|
326
327
|
import { SecurityRuleSubscriber } from './subscribers/security-rule.subscriber';
|
|
327
328
|
import { ViewMetadataSubsciber } from './subscribers/view-metadata.subscriber';
|
|
328
329
|
import { MediaStorageProviderMetadataRepository } from './repository/media-storage-provider-metadata.repository';
|
|
330
|
+
import { McpCommand } from './commands/mcp.command';
|
|
329
331
|
|
|
330
332
|
|
|
331
333
|
@Global()
|
|
@@ -486,6 +488,7 @@ import { MediaStorageProviderMetadataRepository } from './repository/media-stora
|
|
|
486
488
|
ModuleMetadataSeederService,
|
|
487
489
|
ListOfValuesService,
|
|
488
490
|
ListOfValuesSelectionProvider,
|
|
491
|
+
PseudoForeignKeySelectionProvider,
|
|
489
492
|
ModelMetadataSubscriber,
|
|
490
493
|
ViewMetadataService,
|
|
491
494
|
ActionMetadataService,
|
|
@@ -497,6 +500,7 @@ import { MediaStorageProviderMetadataRepository } from './repository/media-stora
|
|
|
497
500
|
TextractService,
|
|
498
501
|
SolidRegistry,
|
|
499
502
|
SeedCommand,
|
|
503
|
+
McpCommand,
|
|
500
504
|
IngestCommand,
|
|
501
505
|
IngestMetadataService,
|
|
502
506
|
SMTPEMailService,
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { Injectable } from '@nestjs/common';
|
|
2
|
-
import { InjectDataSource } from '@nestjs/typeorm';
|
|
1
|
+
import { Injectable, Scope } from '@nestjs/common';
|
|
3
2
|
import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
|
|
4
3
|
import { lowerFirst } from 'src/helpers/string.helper';
|
|
5
4
|
import { ModelMetadataRepository } from 'src/repository/model-metadata.repository';
|
|
6
|
-
import { DataSource, EntityMetadata, EntitySubscriberInterface,
|
|
5
|
+
import { DataSource, EntityMetadata, EntitySubscriberInterface, InsertEvent, RemoveEvent, UpdateEvent } from 'typeorm';
|
|
7
6
|
import { ChatterMessageService } from '../services/chatter-message.service';
|
|
8
7
|
|
|
9
8
|
|
|
@@ -12,19 +11,24 @@ type DeferredCall =
|
|
|
12
11
|
| { kind: 'update'; args: Parameters<ChatterMessageService['postAuditMessageOnUpdate']> }
|
|
13
12
|
| { kind: 'delete'; args: Parameters<ChatterMessageService['postAuditMessageOnDelete']> };
|
|
14
13
|
|
|
15
|
-
@Injectable()
|
|
16
|
-
@EventSubscriber()
|
|
14
|
+
@Injectable({scope: Scope.TRANSIENT})
|
|
15
|
+
// @EventSubscriber()
|
|
17
16
|
export class AuditSubscriber implements EntitySubscriberInterface {
|
|
18
|
-
|
|
17
|
+
private dataSource: DataSource;
|
|
19
18
|
constructor(
|
|
20
|
-
@InjectDataSource()
|
|
21
|
-
private readonly dataSource: DataSource,
|
|
19
|
+
// @InjectDataSource()
|
|
20
|
+
// private readonly dataSource: DataSource,
|
|
22
21
|
private readonly chatterMessageService: ChatterMessageService,
|
|
23
22
|
// @InjectRepository(ModelMetadata)
|
|
24
23
|
// private readonly modelMetadataRepo: Repository<ModelMetadata>,
|
|
25
24
|
private readonly modelMetadataRepo: ModelMetadataRepository,
|
|
26
25
|
private readonly modelMetadataHelperService: ModelMetadataHelperService,
|
|
27
26
|
) {
|
|
27
|
+
// this.dataSource.subscribers.push(this);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
bindToDataSource(dataSource: DataSource) {
|
|
31
|
+
this.dataSource = dataSource;
|
|
28
32
|
this.dataSource.subscribers.push(this);
|
|
29
33
|
}
|
|
30
34
|
|
|
@@ -1,28 +1,34 @@
|
|
|
1
1
|
import { camelize } from "@angular-devkit/core/src/utils/strings";
|
|
2
|
-
import { Injectable, InternalServerErrorException, Logger } from "@nestjs/common";
|
|
3
|
-
import { InjectDataSource } from "@nestjs/typeorm";
|
|
2
|
+
import { forwardRef, Inject, Injectable, InternalServerErrorException, Logger, Scope } from "@nestjs/common";
|
|
4
3
|
import { ComputedFieldTriggerOperation } from "src/dtos/create-field-metadata.dto";
|
|
5
4
|
import { ComputedFieldMetadata, SolidRegistry } from "src/helpers/solid-registry";
|
|
6
5
|
import { IEntityPreComputeFieldProvider } from "src/interfaces";
|
|
7
6
|
import { PublisherFactory } from "src/services/queues/publisher-factory.service";
|
|
8
|
-
import { DataSource, EntitySubscriberInterface,
|
|
7
|
+
import { DataSource, EntitySubscriberInterface, InsertEvent, UpdateEvent } from "typeorm";
|
|
9
8
|
|
|
10
9
|
// Create an interface i.e ComputedFieldEvaluationPayload which has same fields as the ComputedFieldMetadata and an additional field for the database entity
|
|
11
10
|
export interface ComputedFieldEvaluationPayload extends ComputedFieldMetadata {
|
|
12
11
|
databaseEntity: any;
|
|
13
12
|
}
|
|
14
13
|
|
|
15
|
-
@Injectable()
|
|
16
|
-
@EventSubscriber()
|
|
14
|
+
@Injectable({scope: Scope.TRANSIENT})
|
|
15
|
+
// @EventSubscriber()
|
|
17
16
|
export class ComputedEntityFieldSubscriber implements EntitySubscriberInterface {
|
|
18
17
|
private readonly logger = new Logger(this.constructor.name);
|
|
18
|
+
private dataSource: DataSource;
|
|
19
19
|
constructor(
|
|
20
|
-
@InjectDataSource()
|
|
21
|
-
private readonly dataSource: DataSource,
|
|
20
|
+
// @InjectDataSource()
|
|
21
|
+
// private readonly dataSource: DataSource,
|
|
22
22
|
private readonly solidRegistry: SolidRegistry,
|
|
23
|
+
@Inject(forwardRef(() => PublisherFactory))
|
|
23
24
|
private readonly publisherFactory: PublisherFactory<ComputedFieldEvaluationPayload>
|
|
24
25
|
// private readonly computedFieldPublisher: ComputedFieldEvaluationPublisherDatabase,
|
|
25
26
|
) {
|
|
27
|
+
// this.dataSource.subscribers.push(this);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
bindToDataSource(dataSource: DataSource) {
|
|
31
|
+
this.dataSource = dataSource;
|
|
26
32
|
this.dataSource.subscribers.push(this);
|
|
27
33
|
}
|
|
28
34
|
|