@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
|
@@ -7,7 +7,7 @@ import { ComputedFieldMetadata, SolidRegistry } from 'src/helpers/solid-registry
|
|
|
7
7
|
import { FieldMetadataRepository } from 'src/repository/field-metadata.repository';
|
|
8
8
|
import { DataSource, Repository, SelectQueryBuilder } from 'typeorm';
|
|
9
9
|
import { BasicFilterDto } from '../dtos/basic-filters.dto';
|
|
10
|
-
import { CascadeType, ComputedFieldValueType, CreateFieldMetadataDto, DecryptWhenType, EncryptionType, MediaType, PSQLType, RelationType, SelectionValueType, SolidFieldType } from '../dtos/create-field-metadata.dto';
|
|
10
|
+
import { CascadeType, ComputedFieldValueType, CreateFieldMetadataDto, DecryptWhenType, EncryptionType, MediaType, MSSQLType, PSQLType, RelationType, SelectionValueType, SolidFieldType } from '../dtos/create-field-metadata.dto';
|
|
11
11
|
import { SelectionDynamicQueryDto } from '../dtos/selection-dynamic-query.dto';
|
|
12
12
|
import { UpdateFieldMetaDataDto } from '../dtos/update-field-metadata.dto';
|
|
13
13
|
import { FieldMetadata } from '../entities/field-metadata.entity';
|
|
@@ -16,12 +16,18 @@ import { ISelectionProviderValues } from '../interfaces';
|
|
|
16
16
|
import { CrudHelperService } from './crud-helper.service';
|
|
17
17
|
import { ERROR_MESSAGES } from 'src/constants/error-messages';
|
|
18
18
|
import qs from 'qs';
|
|
19
|
+
import { ResolveS3UrlDto } from 'src/dtos/resolve-s3-url.dto';
|
|
20
|
+
import { ConfigService } from '@nestjs/config';
|
|
21
|
+
import { FileService } from './file.service';
|
|
19
22
|
|
|
20
23
|
|
|
21
24
|
@Injectable()
|
|
22
25
|
export class FieldMetadataService implements OnApplicationBootstrap {
|
|
23
26
|
constructor(
|
|
24
27
|
private readonly fieldMetadataRepo: FieldMetadataRepository,
|
|
28
|
+
private readonly configService: ConfigService,
|
|
29
|
+
private readonly fileService: FileService,
|
|
30
|
+
|
|
25
31
|
@InjectDataSource()
|
|
26
32
|
private readonly dataSource: DataSource,
|
|
27
33
|
private readonly solidRegistry: SolidRegistry,
|
|
@@ -35,9 +41,9 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
35
41
|
this.loadAndRegisterComputedFieldsDetails();
|
|
36
42
|
}
|
|
37
43
|
|
|
38
|
-
|
|
44
|
+
async loadAndRegisterComputedFieldsDetails() {
|
|
39
45
|
// Load all the modules and models and within that load all the computed fields
|
|
40
|
-
const computedFieldsWithModelAndModule =
|
|
46
|
+
const computedFieldsWithModelAndModule = await this.fieldMetadataRepo.findComputedFieldsPopulatedWithModelAndModule();
|
|
41
47
|
|
|
42
48
|
// Convert the computed fields object above to the ComputedFieldMetadata type
|
|
43
49
|
const computedFieldMetadata: ComputedFieldMetadata[] = computedFieldsWithModelAndModule.map((field) => {
|
|
@@ -354,7 +360,71 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
354
360
|
};
|
|
355
361
|
|
|
356
362
|
// Orm Data type and Solid Dat Type Mapping
|
|
357
|
-
const ormFieldTypeForSolid =
|
|
363
|
+
const ormFieldTypeForSolid = this.getOrmFieldTypes();
|
|
364
|
+
|
|
365
|
+
// Fetch Data Source Type
|
|
366
|
+
const dataSourceTypes = Object.keys(ormFieldTypeForSolid); // ["psql"]
|
|
367
|
+
|
|
368
|
+
const fieldTypes = Object.entries(ormFieldTypeForSolid.postgres).map(([key, value]) => ({
|
|
369
|
+
type: key,
|
|
370
|
+
label: key,
|
|
371
|
+
value: key,
|
|
372
|
+
fieldType: key,
|
|
373
|
+
ormTypes: value.ormTypes,
|
|
374
|
+
fields: this.fetchCurrentFields(key)
|
|
375
|
+
}));
|
|
376
|
+
|
|
377
|
+
const dataSource = this.solidRegistry.getSolidDatabaseModules().map((solidDatabaseModule) => {
|
|
378
|
+
return {
|
|
379
|
+
'name': solidDatabaseModule.instance.name(),
|
|
380
|
+
'type': solidDatabaseModule.instance.type()
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
// Creating response arrays for each enum
|
|
385
|
+
// Get all selection providers.
|
|
386
|
+
const sps = [];
|
|
387
|
+
const selectionProviders = this.solidRegistry.getSelectionProviders();
|
|
388
|
+
for (let i = 0; i < selectionProviders.length; i++) {
|
|
389
|
+
const selectionProvider = selectionProviders[i];
|
|
390
|
+
sps.push({
|
|
391
|
+
provider: selectionProvider.instance.name(),
|
|
392
|
+
help: selectionProvider.instance.help(),
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
const cps = [];
|
|
397
|
+
const computedProviders = this.solidRegistry.getComputedFieldProviders();
|
|
398
|
+
for (let i = 0; i < computedProviders.length; i++) {
|
|
399
|
+
const computedProvider = computedProviders[i];
|
|
400
|
+
cps.push({
|
|
401
|
+
provider: computedProvider.instance.name(),
|
|
402
|
+
help: computedProvider.instance.help(),
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const r = {
|
|
407
|
+
// Field Types with ormtypes, available fields
|
|
408
|
+
fieldTypes: fieldTypes,
|
|
409
|
+
encryptionTypes: enumToResponseArray(EncryptionType),
|
|
410
|
+
ormType: ormFieldTypeForSolid,
|
|
411
|
+
decryptWhenTypes: enumToResponseArray(DecryptWhenType),
|
|
412
|
+
mediaTypes: enumToResponseArray(MediaType),
|
|
413
|
+
relationTypes: enumToResponseArray(RelationType),
|
|
414
|
+
selectionDynamicProviders: sps,
|
|
415
|
+
computedProviders: cps,
|
|
416
|
+
cascadeTypes: enumToResponseArray(CascadeType),
|
|
417
|
+
selectionValueTypes: enumToResponseArray(SelectionValueType),
|
|
418
|
+
computedFieldValueTypes: enumToResponseArray(ComputedFieldValueType),
|
|
419
|
+
dataSourceType: dataSourceTypes,
|
|
420
|
+
dataSource: dataSource,
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
return r
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
private getOrmFieldTypes() {
|
|
427
|
+
return {
|
|
358
428
|
"postgres": {
|
|
359
429
|
// Numeric types
|
|
360
430
|
"int": {
|
|
@@ -379,6 +449,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
379
449
|
},
|
|
380
450
|
"json": {
|
|
381
451
|
"ormTypes": [
|
|
452
|
+
// { label: PSQLType.simplejson, description: "Creates DB agnostic column for storing json style data." },
|
|
453
|
+
{ label: MSSQLType.simplejson, description: "Creates DB agnostic column for storing json style data." },
|
|
382
454
|
{ label: PSQLType.json, description: "Stores JSON data without indexing." },
|
|
383
455
|
{ label: PSQLType.jsonb, description: "Stores JSON data with indexing for faster queries." }
|
|
384
456
|
]
|
|
@@ -443,69 +515,131 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
443
515
|
"uuid": {
|
|
444
516
|
"ormTypes": [{ label: PSQLType.varchar, description: "Stores universally unique identifiers (UUIDs)." }]
|
|
445
517
|
}
|
|
446
|
-
}
|
|
447
|
-
|
|
518
|
+
},
|
|
519
|
+
"mssql": {
|
|
520
|
+
// Numeric types
|
|
521
|
+
"int": {
|
|
522
|
+
ormTypes: [
|
|
523
|
+
{ label: MSSQLType.int, description: "A 4-byte integer for general numeric data." }
|
|
524
|
+
]
|
|
525
|
+
},
|
|
526
|
+
"bigint": {
|
|
527
|
+
ormTypes: [
|
|
528
|
+
{ label: MSSQLType.bigint, description: "An 8-byte integer for large numeric values." }
|
|
529
|
+
]
|
|
530
|
+
},
|
|
531
|
+
"decimal": {
|
|
532
|
+
ormTypes: [
|
|
533
|
+
{ label: MSSQLType.numeric, description: "A high-precision numeric type for financial or exact values." },
|
|
534
|
+
{ label: MSSQLType.decimal, description: "A high-precision decimal type for financial or exact values." }
|
|
535
|
+
]
|
|
536
|
+
},
|
|
448
537
|
|
|
538
|
+
// Text types
|
|
539
|
+
"shortText": {
|
|
540
|
+
ormTypes: [
|
|
541
|
+
{ label: MSSQLType.varchar, description: "A variable-length string for short text." },
|
|
542
|
+
{ label: MSSQLType.nvarchar, description: "A unicode supported variable-length string for short text." }
|
|
543
|
+
]
|
|
544
|
+
},
|
|
545
|
+
"longText": {
|
|
546
|
+
ormTypes: [
|
|
547
|
+
{ label: MSSQLType.nvarchar, description: "A large or unbounded string type." }
|
|
548
|
+
]
|
|
549
|
+
},
|
|
550
|
+
"richText": {
|
|
551
|
+
ormTypes: [
|
|
552
|
+
{ label: MSSQLType.nvarchar, description: "A large text field for formatted or long content." }
|
|
553
|
+
]
|
|
554
|
+
},
|
|
555
|
+
"json": {
|
|
556
|
+
ormTypes: [
|
|
557
|
+
{ label: MSSQLType.simplejson, description: "Creates DB agnostic column for storing json style data." },
|
|
558
|
+
{ label: MSSQLType.nvarchar, description: "Stores JSON data as string (MSSQL doesn't have native JSON type)." }
|
|
559
|
+
]
|
|
560
|
+
},
|
|
449
561
|
|
|
450
|
-
|
|
451
|
-
|
|
562
|
+
// Boolean types
|
|
563
|
+
"boolean": {
|
|
564
|
+
ormTypes: [
|
|
565
|
+
{ label: MSSQLType.bit, description: "Stores true or false values as 0 or 1." }
|
|
566
|
+
]
|
|
567
|
+
},
|
|
452
568
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
569
|
+
// Date and time types
|
|
570
|
+
"date": {
|
|
571
|
+
ormTypes: [
|
|
572
|
+
{ label: MSSQLType.date, description: "Stores calendar dates (YYYY-MM-DD)." }
|
|
573
|
+
]
|
|
574
|
+
},
|
|
575
|
+
"datetime": {
|
|
576
|
+
ormTypes: [
|
|
577
|
+
{ label: MSSQLType.datetime, description: "Stores date and time without timezone." },
|
|
578
|
+
{ label: MSSQLType.datetime2, description: "High-precision date and time type." }
|
|
579
|
+
]
|
|
580
|
+
},
|
|
581
|
+
"time": {
|
|
582
|
+
ormTypes: [
|
|
583
|
+
{ label: MSSQLType.time, description: "Stores time values (HH:MM:SS)." }
|
|
584
|
+
]
|
|
585
|
+
},
|
|
461
586
|
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
587
|
+
// Relation
|
|
588
|
+
"relation": {
|
|
589
|
+
ormTypes: [
|
|
590
|
+
{ label: MSSQLType.int, description: "Used for foreign keys referencing other entities." }
|
|
591
|
+
]
|
|
592
|
+
},
|
|
468
593
|
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
594
|
+
// Media types
|
|
595
|
+
"mediaSingle": {
|
|
596
|
+
ormTypes: [
|
|
597
|
+
{ label: MSSQLType.varchar, description: "Stores file paths or URLs for single media files." }
|
|
598
|
+
]
|
|
599
|
+
},
|
|
600
|
+
"mediaMultiple": {
|
|
601
|
+
ormTypes: [
|
|
602
|
+
{ label: MSSQLType.varchar, description: "Stores file paths or URLs for multiple media files." }
|
|
603
|
+
]
|
|
604
|
+
},
|
|
480
605
|
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
606
|
+
// Email and password
|
|
607
|
+
"email": {
|
|
608
|
+
ormTypes: [
|
|
609
|
+
{ label: MSSQLType.nvarchar, description: "Stores email addresses." }
|
|
610
|
+
]
|
|
611
|
+
},
|
|
612
|
+
"password": {
|
|
613
|
+
ormTypes: [
|
|
614
|
+
{ label: MSSQLType.nvarchar, description: "Stores hashed or plain-text passwords." }
|
|
615
|
+
]
|
|
616
|
+
},
|
|
490
617
|
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
selectionValueTypes: enumToResponseArray(SelectionValueType),
|
|
503
|
-
computedFieldValueTypes: enumToResponseArray(ComputedFieldValueType),
|
|
504
|
-
dataSourceType: dataSourceTypes,
|
|
505
|
-
dataSource: dataSource,
|
|
506
|
-
};
|
|
618
|
+
// Selection types
|
|
619
|
+
"selectionStatic": {
|
|
620
|
+
ormTypes: [
|
|
621
|
+
{ label: MSSQLType.nvarchar, description: "Used for predefined selection options." }
|
|
622
|
+
]
|
|
623
|
+
},
|
|
624
|
+
"selectionDynamic": {
|
|
625
|
+
ormTypes: [
|
|
626
|
+
{ label: MSSQLType.nvarchar, description: "Used for dynamic selection options." }
|
|
627
|
+
]
|
|
628
|
+
},
|
|
507
629
|
|
|
508
|
-
|
|
630
|
+
// Computed and external ID
|
|
631
|
+
"computed": {
|
|
632
|
+
ormTypes: [
|
|
633
|
+
{ label: MSSQLType.nvarchar, description: "Represents computed or derived fields." }
|
|
634
|
+
]
|
|
635
|
+
},
|
|
636
|
+
"uuid": {
|
|
637
|
+
ormTypes: [
|
|
638
|
+
{ label: MSSQLType.uniqueidentifier, description: "Stores universally unique identifiers (UUIDs)." }
|
|
639
|
+
]
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
};
|
|
509
643
|
}
|
|
510
644
|
|
|
511
645
|
async fetchCurrentFieldsBasedOnType(type: string) {
|
|
@@ -533,7 +667,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
533
667
|
"encryptionType",
|
|
534
668
|
"decryptWhen",
|
|
535
669
|
"columnName",
|
|
536
|
-
"enableAuditTracking"
|
|
670
|
+
"enableAuditTracking",
|
|
671
|
+
"isPrimaryKey"
|
|
537
672
|
];
|
|
538
673
|
|
|
539
674
|
case SolidFieldType.bigint:
|
|
@@ -553,7 +688,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
553
688
|
"encryptionType",
|
|
554
689
|
"decryptWhen",
|
|
555
690
|
"columnName",
|
|
556
|
-
"enableAuditTracking"
|
|
691
|
+
"enableAuditTracking",
|
|
692
|
+
"isPrimaryKey"
|
|
557
693
|
];
|
|
558
694
|
|
|
559
695
|
// case SolidFieldType.float:
|
|
@@ -616,7 +752,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
616
752
|
"decryptWhen",
|
|
617
753
|
"columnName",
|
|
618
754
|
"isUserKey",
|
|
619
|
-
"enableAuditTracking"
|
|
755
|
+
"enableAuditTracking",
|
|
756
|
+
"isPrimaryKey"
|
|
620
757
|
];
|
|
621
758
|
|
|
622
759
|
case SolidFieldType.longtext:
|
|
@@ -852,7 +989,8 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
852
989
|
"encryptionType",
|
|
853
990
|
"decryptWhen",
|
|
854
991
|
"columnName",
|
|
855
|
-
"enableAuditTracking"
|
|
992
|
+
"enableAuditTracking",
|
|
993
|
+
"isPrimaryKey"
|
|
856
994
|
];
|
|
857
995
|
|
|
858
996
|
case SolidFieldType.password:
|
|
@@ -964,10 +1102,6 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
964
1102
|
"decryptWhen",
|
|
965
1103
|
"columnName"
|
|
966
1104
|
];
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
1105
|
default:
|
|
972
1106
|
return [
|
|
973
1107
|
"name",
|
|
@@ -1145,6 +1279,77 @@ export class FieldMetadataService implements OnApplicationBootstrap {
|
|
|
1145
1279
|
|
|
1146
1280
|
return fieldObject;
|
|
1147
1281
|
}
|
|
1282
|
+
|
|
1283
|
+
async resolveS3Url(resolveS3UrlDto: ResolveS3UrlDto) {
|
|
1284
|
+
|
|
1285
|
+
const { modelName, fieldName, fieldValue, s3KeyFieldName } = resolveS3UrlDto;
|
|
1286
|
+
|
|
1287
|
+
// ------------------------------------------------
|
|
1288
|
+
// 1. Load model metadata
|
|
1289
|
+
// ------------------------------------------------
|
|
1290
|
+
const modelRepo = this.dataSource.getRepository(ModelMetadata);
|
|
1291
|
+
const model = await modelRepo.findOne({
|
|
1292
|
+
where: { singularName: modelName },
|
|
1293
|
+
relations: ['fields']
|
|
1294
|
+
});
|
|
1295
|
+
|
|
1296
|
+
if (!model) {
|
|
1297
|
+
throw new NotFoundException(`Model ${modelName} not found`);
|
|
1298
|
+
}
|
|
1299
|
+
|
|
1300
|
+
// ------------------------------------------------
|
|
1301
|
+
// 2. Validate the field we are filtering by
|
|
1302
|
+
// ------------------------------------------------
|
|
1303
|
+
const filterFieldMeta = model.fields.find(f => f.name === fieldName);
|
|
1304
|
+
if (!filterFieldMeta) {
|
|
1305
|
+
throw new NotFoundException(
|
|
1306
|
+
`Field ${fieldName} not found in model ${modelName}`
|
|
1307
|
+
);
|
|
1308
|
+
}
|
|
1309
|
+
|
|
1310
|
+
// ------------------------------------------------
|
|
1311
|
+
// 3. Load the actual entity repository
|
|
1312
|
+
// ------------------------------------------------
|
|
1313
|
+
const entityRepo = this.dataSource.getRepository(model.singularName);
|
|
1314
|
+
|
|
1315
|
+
// ------------------------------------------------
|
|
1316
|
+
// 4. Query using fieldName = fieldValue
|
|
1317
|
+
// ------------------------------------------------
|
|
1318
|
+
const record = await entityRepo.findOne({
|
|
1319
|
+
where: { [fieldName]: fieldValue }
|
|
1320
|
+
});
|
|
1321
|
+
|
|
1322
|
+
if (!record) {
|
|
1323
|
+
throw new NotFoundException(
|
|
1324
|
+
`${modelName} record not found for ${fieldName}="${fieldValue}"`
|
|
1325
|
+
);
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
// ------------------------------------------------
|
|
1329
|
+
// 5. Extract S3 key from s3KeyFieldName
|
|
1330
|
+
// ------------------------------------------------
|
|
1331
|
+
const s3Key = record[s3KeyFieldName];
|
|
1332
|
+
|
|
1333
|
+
if (!s3Key) {
|
|
1334
|
+
throw new NotFoundException(
|
|
1335
|
+
`Field "${s3KeyFieldName}" has no value in ${modelName}.${fieldName}="${fieldValue}"`
|
|
1336
|
+
);
|
|
1337
|
+
}
|
|
1338
|
+
|
|
1339
|
+
// ------------------------------------------------
|
|
1340
|
+
// 6. Generate signed or public URL
|
|
1341
|
+
// ------------------------------------------------
|
|
1342
|
+
let url = "";
|
|
1343
|
+
|
|
1344
|
+
// TODO - get
|
|
1345
|
+
if (resolveS3UrlDto.isPrivate == "true") {
|
|
1346
|
+
const expiryInSeconds = 60 * 60;
|
|
1347
|
+
url = await this.fileService.getSignedUrl(s3Key, expiryInSeconds, resolveS3UrlDto.bucketName);
|
|
1348
|
+
} else {
|
|
1349
|
+
url = `https://${resolveS3UrlDto.bucketName}.s3.${this.configService.get('S3_AWS_REGION_NAME')}.amazonaws.com/${s3Key}`;
|
|
1350
|
+
}
|
|
1351
|
+
return { url: url }
|
|
1352
|
+
}
|
|
1148
1353
|
}
|
|
1149
1354
|
|
|
1150
1355
|
|
|
@@ -16,6 +16,7 @@ import { ActiveUserData } from 'src/interfaces/active-user-data.interface';
|
|
|
16
16
|
import { ModuleMetadata } from '../entities/module-metadata.entity';
|
|
17
17
|
import { dasherize } from '@angular-devkit/core/src/utils/strings';
|
|
18
18
|
import { MenuItemMetadataRepository } from 'src/repository/menu-item-metadata.repository';
|
|
19
|
+
import { SavedFiltersRepository } from 'src/repository/saved-filters.repository';
|
|
19
20
|
|
|
20
21
|
@Injectable()
|
|
21
22
|
export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
|
|
@@ -31,6 +32,7 @@ export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
|
|
|
31
32
|
// @InjectRepository(MenuItemMetadata, 'default')
|
|
32
33
|
// readonly repo: Repository<MenuItemMetadata>,
|
|
33
34
|
readonly repo: MenuItemMetadataRepository,
|
|
35
|
+
readonly savedFiltersRepo: SavedFiltersRepository,
|
|
34
36
|
readonly moduleRef: ModuleRef
|
|
35
37
|
|
|
36
38
|
) {
|
|
@@ -92,7 +94,7 @@ export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
|
|
|
92
94
|
.leftJoinAndSelect('menuItem.parentMenuItem', 'parentMenuItem')
|
|
93
95
|
.leftJoinAndSelect('menuItem.action', 'action')
|
|
94
96
|
.leftJoinAndSelect('action.model', 'model') // Join the model relation of action
|
|
95
|
-
.leftJoinAndSelect('action.view', 'view') // Join the
|
|
97
|
+
.leftJoinAndSelect('action.view', 'view') // Join the view relation of action
|
|
96
98
|
.leftJoinAndSelect('menuItem.roles', 'roles')
|
|
97
99
|
.where('roles.name IN (:...roleNames)', { roleNames: activeUser.roles })
|
|
98
100
|
.addOrderBy('module.menuSequenceNumber', 'ASC')
|
|
@@ -120,73 +122,102 @@ export class MenuItemMetadataService extends CRUDService<MenuItemMetadata> {
|
|
|
120
122
|
// 3. Then for each module, do a recursive compilation of children based on parentMenuItem, while doing this use the relation - action to get hold of the path.
|
|
121
123
|
const menu: any[] = [];
|
|
122
124
|
|
|
123
|
-
modulesToMenuItemsMap.forEach((menuItems, moduleName) => {
|
|
124
|
-
|
|
125
|
+
// modulesToMenuItemsMap.forEach((menuItems, moduleName) => {
|
|
126
|
+
// const rootMenuItems = menuItems.filter(item => !item.parentMenuItem);
|
|
127
|
+
// const moduleMetadata = modulesMap.get(moduleName);
|
|
128
|
+
|
|
129
|
+
// const moduleMenu = {
|
|
130
|
+
// title: moduleMetadata.displayName,
|
|
131
|
+
// // No need for path the module level.
|
|
132
|
+
// // path: ``,
|
|
133
|
+
// key: moduleName.toLowerCase().replace(/\s+/g, '-'),
|
|
134
|
+
// // TODO: We need to add the module icon as part of the metadata so it can be brought here.
|
|
135
|
+
// // icon: `/images/menu/${moduleName.toLowerCase().replace(/\s+/g, '-')}.svg`,
|
|
136
|
+
// children: this.buildMenuTree(rootMenuItems, menuItems, activeUser),
|
|
137
|
+
// icon: moduleMetadata.menuIconUrl,
|
|
138
|
+
// };
|
|
139
|
+
|
|
140
|
+
// menu.push(moduleMenu);
|
|
141
|
+
// });
|
|
142
|
+
for (const [moduleName, menuItemsForModule] of modulesToMenuItemsMap.entries()) {
|
|
143
|
+
const rootMenuItems = menuItemsForModule.filter(item => !item.parentMenuItem);
|
|
125
144
|
const moduleMetadata = modulesMap.get(moduleName);
|
|
126
145
|
|
|
127
146
|
const moduleMenu = {
|
|
128
147
|
title: moduleMetadata.displayName,
|
|
129
|
-
// No need for path the module level.
|
|
130
|
-
// path: ``,
|
|
131
148
|
key: moduleName.toLowerCase().replace(/\s+/g, '-'),
|
|
132
|
-
|
|
133
|
-
// icon: `/images/menu/${moduleName.toLowerCase().replace(/\s+/g, '-')}.svg`,
|
|
134
|
-
children: this.buildMenuTree(rootMenuItems, menuItems, activeUser),
|
|
149
|
+
children: await this.buildMenuTree(rootMenuItems, menuItemsForModule, activeUser), // ✅ await here
|
|
135
150
|
icon: moduleMetadata.menuIconUrl,
|
|
136
151
|
};
|
|
137
152
|
|
|
138
153
|
menu.push(moduleMenu);
|
|
139
|
-
}
|
|
154
|
+
}
|
|
155
|
+
|
|
140
156
|
|
|
141
157
|
return menu.filter(m => m.children.length > 0);
|
|
142
158
|
}
|
|
143
159
|
|
|
144
160
|
// Recursive function to build the tree
|
|
145
|
-
private buildMenuTree(rootItems: MenuItemMetadata[], allMenuItems: MenuItemMetadata[], activeUser: ActiveUserData): any[] {
|
|
146
|
-
const menuItemsData =
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
161
|
+
private async buildMenuTree(rootItems: MenuItemMetadata[], allMenuItems: MenuItemMetadata[], activeUser: ActiveUserData): Promise<any[]> {
|
|
162
|
+
const menuItemsData = await Promise.all(
|
|
163
|
+
rootItems.map(async rootItem => {
|
|
164
|
+
const allowedMenuItems = allMenuItems.filter(i => {
|
|
165
|
+
if (!i.parentMenuItem) {
|
|
166
|
+
return true
|
|
167
|
+
} else {
|
|
168
|
+
return this.crudHelperService.hasReadPermissionOnModel(activeUser, i.action.model.singularName)
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
// Get immediate children of the current loop variable menuItem.
|
|
172
|
+
const children = allowedMenuItems.filter(item => item.parentMenuItem && item.parentMenuItem.id === rootItem.id);
|
|
173
|
+
const menuItemId = rootItem?.id ?? "";
|
|
174
|
+
const menuItemName = rootItem?.name ?? "";
|
|
175
|
+
const actionId = rootItem?.action?.id ?? "";
|
|
176
|
+
const actionName = rootItem?.action?.name ?? "";
|
|
177
|
+
// TODO: We should specify path only if there are no more children present.
|
|
178
|
+
// For now adding path everywhere.
|
|
179
|
+
let path = '';
|
|
180
|
+
|
|
181
|
+
const layout = rootItem?.action?.view && rootItem?.action?.view?.layout ? JSON.parse(rootItem?.action?.view?.layout) : null
|
|
182
|
+
let savedFilterId = null;
|
|
183
|
+
if (layout && layout?.attrs?.defaultSavedFilter) {
|
|
184
|
+
const savedFilter = await this.savedFiltersRepo.findOne({
|
|
185
|
+
where: {
|
|
186
|
+
name: layout?.attrs?.defaultSavedFilter,
|
|
187
|
+
isPrivate: false
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
if (savedFilter) {
|
|
191
|
+
savedFilterId = savedFilter.id
|
|
192
|
+
}
|
|
152
193
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
if (rootItem.action && rootItem.action.type === 'solid') {
|
|
165
|
-
if (this.crudHelperService.hasReadPermissionOnModel(activeUser, rootItem.action.model.singularName)) {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
// TODO: Here we are assuming that we will always take the user to collection view of a model.
|
|
169
|
-
// We can make provision to take them other views also in the future.
|
|
170
|
-
// path = `/admin/core/${rootItem.module.name}/${rootItem.action.model.singularName}/${rootItem.action.view.name}`;
|
|
171
|
-
path = `/admin/core/${rootItem.module.name}/${dasherize(rootItem.action?.model?.singularName ?? 'unknown')}/${rootItem.action?.view?.type ?? 'list'}`;
|
|
172
|
-
|
|
194
|
+
if (rootItem.action && rootItem.action.type === 'custom') {
|
|
195
|
+
path = `${rootItem.action.customComponent}?menuItemId=${menuItemId}&menuItemName=${menuItemName}&actionId=${actionId}&actionName=${actionName}${savedFilterId ? `&savedQuery=${savedFilterId}` : ''}`;
|
|
196
|
+
}
|
|
197
|
+
if (rootItem.action && rootItem.action.type === 'solid') {
|
|
198
|
+
if (this.crudHelperService.hasReadPermissionOnModel(activeUser, rootItem.action.model.singularName)) {
|
|
199
|
+
// TODO: Here we are assuming that we will always take the user to collection view of a model.
|
|
200
|
+
// We can make provision to take them other views also in the future.
|
|
201
|
+
// path = `/admin/core/${rootItem.module.name}/${rootItem.action.model.singularName}/${rootItem.action.view.name}`;
|
|
202
|
+
path = `/admin/core/${rootItem.module.name}/${dasherize(rootItem.action?.model?.singularName ?? 'unknown')}/${rootItem.action?.view?.type ?? 'list'}?menuItemId=${menuItemId}&menuItemName=${menuItemName}&actionId=${actionId}&actionName=${actionName}${savedFilterId ? `&savedQuery=${savedFilterId}` : ''}`;
|
|
203
|
+
|
|
204
|
+
}
|
|
173
205
|
}
|
|
174
|
-
}
|
|
175
206
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
207
|
+
// We are not checking for empty path coz, this is required for parent menu items.
|
|
208
|
+
const data = {
|
|
209
|
+
title: rootItem.displayName || rootItem.name,
|
|
210
|
+
path: path,
|
|
211
|
+
key: rootItem.name.toLowerCase().replace(/\s+/g, '-'),
|
|
212
|
+
icon: rootItem.iconName,
|
|
213
|
+
// iconVariant : rootItem.iconVariant
|
|
214
|
+
}
|
|
215
|
+
if (children.length > 0) {
|
|
216
|
+
data["children"] = await this.buildMenuTree(children, allMenuItems, activeUser);
|
|
217
|
+
}
|
|
218
|
+
return data;
|
|
188
219
|
|
|
189
|
-
|
|
220
|
+
}));
|
|
190
221
|
return menuItemsData.filter(mi => mi && mi)
|
|
191
222
|
}
|
|
192
223
|
|
|
@@ -270,6 +270,8 @@ export class ModelMetadataService {
|
|
|
270
270
|
tableName: model.tableName,
|
|
271
271
|
userKeyFieldUserKey: model.fields.find(field => field.isUserKey)?.name,
|
|
272
272
|
isChild: model?.isChild,
|
|
273
|
+
isLegacyTable: model?.isLegacyTable,
|
|
274
|
+
isLegacyTableWithId: model?.isLegacyTableWithId,
|
|
273
275
|
parentModelUserKey: model?.parentModel?.singularName,
|
|
274
276
|
enableAuditTracking: model?.enableAuditTracking,
|
|
275
277
|
enableSoftDelete: model?.enableSoftDelete,
|
|
@@ -1174,14 +1176,24 @@ export class ModelMetadataService {
|
|
|
1174
1176
|
};
|
|
1175
1177
|
const model = options.modelId ? await this.findOne(options.modelId, query) : await this.findOneByUserKey(options.modelUserKey, query.populate);
|
|
1176
1178
|
|
|
1179
|
+
let fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
|
|
1180
|
+
|
|
1181
|
+
// If a list of field ids or field names is passed for refresh, use these fields only
|
|
1182
|
+
if (options.fieldIdsForRefresh && options.fieldIdsForRefresh.length > 0) {
|
|
1183
|
+
fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldIdsForRefresh.includes(+field.id));
|
|
1184
|
+
} else if (options.fieldNamesForRefresh && options.fieldNamesForRefresh.length > 0) {
|
|
1185
|
+
fieldsForRefresh = fieldsForRefresh.filter((field) => options.fieldNamesForRefresh.includes(field.name));
|
|
1186
|
+
}
|
|
1187
|
+
// const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
|
|
1188
|
+
|
|
1177
1189
|
//Execute the schematic command to refresh the model
|
|
1178
|
-
const refreshOuput = await this.executeRefreshModelCommand(model, options.dryRun);
|
|
1190
|
+
const refreshOuput = await this.executeRefreshModelCommand(model, fieldsForRefresh, options.dryRun);
|
|
1179
1191
|
|
|
1180
1192
|
return `${refreshOuput}`;
|
|
1181
1193
|
}
|
|
1182
1194
|
|
|
1183
|
-
private async executeRefreshModelCommand(model: ModelMetadata, dryRun: boolean = false): Promise<string> {
|
|
1184
|
-
const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
|
|
1195
|
+
private async executeRefreshModelCommand(model: ModelMetadata, fieldsForRefresh: FieldMetadata[], dryRun: boolean = false): Promise<string> {
|
|
1196
|
+
// const fieldsForRefresh = model.fields.filter((field) => !field.isMarkedForRemoval);
|
|
1185
1197
|
const output = await this.schematicService.executeSchematicCommand(
|
|
1186
1198
|
REFRESH_MODEL_COMMAND,
|
|
1187
1199
|
{
|
|
@@ -1195,6 +1207,9 @@ export class ModelMetadataService {
|
|
|
1195
1207
|
parentModel: model.parentModel?.singularName,
|
|
1196
1208
|
parentModule: model.parentModel?.module?.name,
|
|
1197
1209
|
draftPublishWorkflowEnabled: model.draftPublishWorkflow,
|
|
1210
|
+
isLegacyTable: model.isLegacyTable,
|
|
1211
|
+
isLegacyTableWithId: model.isLegacyTableWithId,
|
|
1212
|
+
dataSourceType: model.dataSourceType,
|
|
1198
1213
|
},
|
|
1199
1214
|
dryRun
|
|
1200
1215
|
);
|