rez_core 7.1.1 → 7.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +26 -0
- package/.idea/250218_nodejs_core.iml +9 -0
- package/.idea/codeStyles/Project.xml +58 -58
- package/.idea/codeStyles/codeStyleConfig.xml +4 -4
- package/.idea/copilot.data.migration.agent.xml +6 -0
- package/.idea/copilot.data.migration.ask.xml +6 -0
- package/.idea/copilot.data.migration.ask2agent.xml +6 -0
- package/.idea/copilot.data.migration.edit.xml +6 -0
- package/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/.idea/misc.xml +6 -0
- package/.idea/modules.xml +7 -7
- package/.idea/prettier.xml +6 -0
- package/.idea/vcs.xml +5 -5
- package/.prettierrc +3 -3
- package/README.md +99 -99
- package/dist/module/filter/repository/saved-filter.repository.js +0 -2
- package/dist/module/filter/repository/saved-filter.repository.js.map +1 -1
- package/dist/module/filter/service/filter.service.js +28 -33
- package/dist/module/filter/service/filter.service.js.map +1 -1
- package/dist/module/integration/examples/usage.example.js +9 -9
- package/dist/module/integration/service/integration.service.d.ts +1 -6
- package/dist/module/integration/service/integration.service.js +2 -14
- package/dist/module/integration/service/integration.service.js.map +1 -1
- package/dist/module/integration/service/oauth.service.js +0 -2
- package/dist/module/integration/service/oauth.service.js.map +1 -1
- package/dist/module/integration/service/wrapper.service.js +0 -1
- package/dist/module/integration/service/wrapper.service.js.map +1 -1
- package/dist/module/integration/strategies/email/gmail-api.strategy.js +7 -23
- package/dist/module/integration/strategies/email/gmail-api.strategy.js.map +1 -1
- package/dist/module/integration/strategies/email/sendgrid-api.strategy.js +5 -8
- package/dist/module/integration/strategies/email/sendgrid-api.strategy.js.map +1 -1
- package/dist/module/listmaster/controller/list-master.controller.d.ts +21 -6
- package/dist/module/listmaster/controller/list-master.controller.js +17 -6
- package/dist/module/listmaster/controller/list-master.controller.js.map +1 -1
- package/dist/module/listmaster/service/list-master.service.d.ts +9 -4
- package/dist/module/listmaster/service/list-master.service.js +54 -45
- package/dist/module/listmaster/service/list-master.service.js.map +1 -1
- package/dist/module/meta/controller/media.controller.d.ts +0 -3
- package/dist/module/meta/controller/media.controller.js +0 -27
- package/dist/module/meta/controller/media.controller.js.map +1 -1
- package/dist/module/meta/entity/media-data.entity.d.ts +0 -1
- package/dist/module/meta/entity/media-data.entity.js +0 -4
- package/dist/module/meta/entity/media-data.entity.js.map +1 -1
- package/dist/module/meta/repository/attribute-master.repository.js +14 -14
- package/dist/module/meta/service/entity-dynamic.service.js +16 -16
- package/dist/module/meta/service/entity-dynamic.service.js.map +1 -1
- package/dist/module/meta/service/entity-master.service.js +20 -20
- package/dist/module/meta/service/media-data.service.d.ts +0 -2
- package/dist/module/meta/service/media-data.service.js +0 -8
- package/dist/module/meta/service/media-data.service.js.map +1 -1
- package/dist/module/meta/service/resolver.service.js +13 -23
- package/dist/module/meta/service/resolver.service.js.map +1 -1
- package/dist/module/notification/notification.module.js +0 -2
- package/dist/module/notification/notification.module.js.map +1 -1
- package/dist/module/notification/service/notification.service.d.ts +1 -3
- package/dist/module/notification/service/notification.service.js +40 -27
- package/dist/module/notification/service/notification.service.js.map +1 -1
- package/dist/module/workflow/controller/workflow.controller.js +1 -1
- package/dist/module/workflow/controller/workflow.controller.js.map +1 -1
- package/dist/module/workflow/repository/action-data.repository.js +3 -10
- package/dist/module/workflow/repository/action-data.repository.js.map +1 -1
- package/dist/module/workflow/repository/action.repository.js +2 -2
- package/dist/module/workflow/repository/stage.repository.js +8 -8
- package/dist/module/workflow/repository/task.repository.js +4 -4
- package/dist/module/workflow/repository/task.repository.js.map +1 -1
- package/dist/module/workflow/service/action-template-mapping.service.js +2 -2
- package/dist/module/workflow/service/action.service.js +5 -5
- package/dist/module/workflow/service/entity-modification.service.d.ts +1 -4
- package/dist/module/workflow/service/entity-modification.service.js +5 -9
- package/dist/module/workflow/service/entity-modification.service.js.map +1 -1
- package/dist/module/workflow/service/populate-workflow.service.d.ts +1 -1
- package/dist/module/workflow/service/populate-workflow.service.js +24 -24
- package/dist/module/workflow/service/populate-workflow.service.js.map +1 -1
- package/dist/module/workflow/service/task.service.js +9 -9
- package/dist/module/workflow/service/task.service.js.map +1 -1
- package/dist/module/workflow-automation/service/schedule-handler.service.js +9 -9
- package/dist/module/workflow-automation/service/workflow-automation.service.js +6 -8
- package/dist/module/workflow-automation/service/workflow-automation.service.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utils/service/reflection-helper.service.js +2 -2
- package/docs/modules/event-driven-integration-design.md +91 -91
- package/docs/modules/integration.md +250 -250
- package/eslint.config.mjs +34 -34
- package/nest-cli.json +14 -14
- package/package.json +128 -128
- package/server.log +850 -0
- package/src/app.controller.ts +12 -12
- package/src/app.module.ts +62 -62
- package/src/app.service.ts +8 -8
- package/src/config/bull.config.ts +72 -72
- package/src/config/config.module.ts +17 -17
- package/src/config/database.config.ts +48 -48
- package/src/config/redis.config.ts +55 -55
- package/src/constant/attribute.constant.ts +8 -8
- package/src/constant/db-data-type.constant.ts +160 -160
- package/src/constant/entity.constant.ts +3 -3
- package/src/constant/global.constant.ts +67 -67
- package/src/constant/status.constant.ts +3 -3
- package/src/core.module.ts +96 -96
- package/src/decorators/roles.decorator.ts +7 -7
- package/src/dtos/response.dto.ts +6 -6
- package/src/dtos/response.ts +5 -5
- package/src/index.ts +1 -1
- package/src/module/auth/auth.module.ts +65 -65
- package/src/module/auth/controller/auth.controller.ts +28 -28
- package/src/module/auth/dto/user.dto.ts +56 -56
- package/src/module/auth/guards/google-auth.guard.ts +9 -9
- package/src/module/auth/guards/jwt.guard.ts +22 -22
- package/src/module/auth/services/auth.service.ts +56 -56
- package/src/module/auth/services/jwt.service.ts +11 -11
- package/src/module/auth/strategies/google.strategy.ts +54 -54
- package/src/module/auth/strategies/jwt.strategy.ts +65 -65
- package/src/module/auth/strategies/local.strategy.ts +13 -13
- package/src/module/dashboard/controller/dashboard.controller.ts +38 -38
- package/src/module/dashboard/dashboard.module.ts +19 -19
- package/src/module/dashboard/entity/dashboard_page_data.entity.ts +23 -23
- package/src/module/dashboard/entity/widget_master.entity.ts +15 -15
- package/src/module/dashboard/repository/dashboard.repository.ts +49 -49
- package/src/module/dashboard/service/dashboard.service.ts +69 -69
- package/src/module/eav/EAV_USAGE_GUIDE.md +351 -351
- package/src/module/eav/controller/eav.controller.ts +119 -119
- package/src/module/eav/dto/eav-operation.dto.ts +62 -62
- package/src/module/eav/eav.module.ts +79 -79
- package/src/module/eav/entity/eav-boolean.entity.ts +25 -25
- package/src/module/eav/entity/eav-date.entity.ts +24 -24
- package/src/module/eav/entity/eav-decimal.entity.ts +24 -24
- package/src/module/eav/entity/eav-int.entity.ts +24 -24
- package/src/module/eav/entity/eav-json.entity.ts +24 -24
- package/src/module/eav/entity/eav-text.entity.ts +24 -24
- package/src/module/eav/entity/eav-time.entity.ts +24 -24
- package/src/module/eav/entity/eav-timestamp.entity.ts +24 -24
- package/src/module/eav/entity/eav-varchar.entity.ts +24 -24
- package/src/module/eav/interface/eav-strategy.interface.ts +32 -32
- package/src/module/eav/repository/eav-boolean.repository.ts +67 -67
- package/src/module/eav/repository/eav-date.repository.ts +67 -67
- package/src/module/eav/repository/eav-decimal.repository.ts +67 -67
- package/src/module/eav/repository/eav-int.repository.ts +67 -67
- package/src/module/eav/repository/eav-json.repository.ts +67 -67
- package/src/module/eav/repository/eav-text.repository.ts +67 -67
- package/src/module/eav/repository/eav-time.repository.ts +67 -67
- package/src/module/eav/repository/eav-timestamp.repository.ts +67 -67
- package/src/module/eav/repository/eav-varchar.repository.ts +67 -67
- package/src/module/eav/service/eav-boolean.service.ts +64 -64
- package/src/module/eav/service/eav-date.service.ts +64 -64
- package/src/module/eav/service/eav-decimal.service.ts +64 -64
- package/src/module/eav/service/eav-factory.service.ts +93 -93
- package/src/module/eav/service/eav-int.service.ts +64 -64
- package/src/module/eav/service/eav-json.service.ts +64 -64
- package/src/module/eav/service/eav-text.service.ts +64 -64
- package/src/module/eav/service/eav-time.service.ts +64 -64
- package/src/module/eav/service/eav-timestamp.service.ts +64 -64
- package/src/module/eav/service/eav-varchar.service.ts +65 -65
- package/src/module/eav/service/eav.service.ts +116 -116
- package/src/module/entity_json/controller/entity_json.controller.ts +75 -75
- package/src/module/entity_json/docs/FlatJson_Filterin_System.md +2803 -2803
- package/src/module/entity_json/entity/entityJson.entity.ts +42 -42
- package/src/module/entity_json/entity_json.module.ts +22 -22
- package/src/module/entity_json/service/entityJson.repository.ts +37 -37
- package/src/module/entity_json/service/entity_json.service.ts +492 -492
- package/src/module/export/controller/export.controller.ts +83 -83
- package/src/module/export/export.module.ts +14 -14
- package/src/module/export/service/export.service.ts +107 -107
- package/src/module/filter/controller/filter.controller.ts +214 -214
- package/src/module/filter/dto/filter-request.dto.ts +41 -41
- package/src/module/filter/entity/saved-filter-detail.entity.ts +37 -37
- package/src/module/filter/entity/saved-filter-master.entity.ts +30 -30
- package/src/module/filter/filter.module.ts +33 -33
- package/src/module/filter/repository/saved-filter.repository.ts +247 -249
- package/src/module/filter/repository/saved.filter-detail.repository.ts +19 -19
- package/src/module/filter/service/filter-evaluator.service.ts +82 -82
- package/src/module/filter/service/filter.service.ts +1722 -1752
- package/src/module/filter/service/saved-filter.service.ts +164 -164
- package/src/module/ics/controller/ics.controller.ts +21 -21
- package/src/module/ics/dto/ics.dto.ts +55 -55
- package/src/module/ics/ics.module.ts +13 -13
- package/src/module/ics/service/ics.service.ts +57 -57
- package/src/module/integration/controller/calender-event.controller.ts +31 -31
- package/src/module/integration/controller/integration.controller.ts +662 -662
- package/src/module/integration/controller/wrapper.controller.ts +37 -37
- package/src/module/integration/dto/create-config.dto.ts +526 -526
- package/src/module/integration/entity/integration-config.entity.ts +112 -112
- package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
- package/src/module/integration/entity/integration-source.entity.ts +17 -17
- package/src/module/integration/entity/user-integration.entity.ts +71 -71
- package/src/module/integration/examples/usage.example.ts +338 -338
- package/src/module/integration/factories/base.factory.ts +7 -7
- package/src/module/integration/factories/email.factory.ts +49 -49
- package/src/module/integration/factories/integration.factory.ts +121 -121
- package/src/module/integration/factories/sms.factory.ts +51 -51
- package/src/module/integration/factories/telephone.factory.ts +41 -41
- package/src/module/integration/factories/whatsapp.factory.ts +56 -56
- package/src/module/integration/integration.module.ts +110 -110
- package/src/module/integration/service/calendar-event.service.ts +118 -118
- package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
- package/src/module/integration/service/integration-queue.service.ts +229 -229
- package/src/module/integration/service/integration.service.ts +2632 -2651
- package/src/module/integration/service/oauth.service.ts +224 -226
- package/src/module/integration/service/wrapper.service.ts +753 -754
- package/src/module/integration/strategies/email/gmail-api.strategy.ts +281 -307
- package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
- package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
- package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -263
- package/src/module/integration/strategies/integration.strategy.ts +97 -97
- package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
- package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
- package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
- package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
- package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
- package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
- package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
- package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
- package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
- package/src/module/layout/controller/layout.controller.ts +38 -38
- package/src/module/layout/entity/header-items.entity.ts +28 -28
- package/src/module/layout/entity/header-section.entity.ts +13 -13
- package/src/module/layout/layout.module.ts +20 -20
- package/src/module/layout/repository/header-items.repository.ts +18 -18
- package/src/module/layout/repository/header-section.repository.ts +16 -16
- package/src/module/layout/service/header-section.service.ts +25 -25
- package/src/module/layout_preference/controller/layout_preference.controller.ts +76 -76
- package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
- package/src/module/layout_preference/layout_preference.module.ts +22 -22
- package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
- package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
- package/src/module/linked_attributes/controller/linked_attributes.controller.ts +137 -137
- package/src/module/linked_attributes/dto/create-linked-attribute-smart.dto.ts +54 -54
- package/src/module/linked_attributes/entity/linked_attribute.entity.ts +51 -51
- package/src/module/linked_attributes/linked_attributes.module.ts +23 -23
- package/src/module/linked_attributes/repository/linked_attribute.repository.ts +12 -12
- package/src/module/linked_attributes/service/linked_attributes.service.ts +650 -650
- package/src/module/linked_attributes/test/linked-attributes.service.spec.ts +244 -244
- package/src/module/listmaster/controller/list-master.controller.ts +226 -215
- package/src/module/listmaster/entity/list-master-items.entity.ts +30 -30
- package/src/module/listmaster/entity/list-master.entity.ts +25 -25
- package/src/module/listmaster/listmaster.module.ts +46 -46
- package/src/module/listmaster/repository/list-master-items.repository.ts +262 -262
- package/src/module/listmaster/repository/list-master.repository.ts +60 -60
- package/src/module/listmaster/service/list-master-engine.ts +19 -19
- package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
- package/src/module/listmaster/service/list-master-item.service.ts +382 -382
- package/src/module/listmaster/service/list-master-registry.ts +15 -15
- package/src/module/listmaster/service/list-master.service.ts +760 -774
- package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
- package/src/module/mapper/controller/mapper.controller.ts +20 -20
- package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
- package/src/module/mapper/entity/field-lovs.entity.ts +15 -15
- package/src/module/mapper/entity/field-mapper.entity.ts +49 -49
- package/src/module/mapper/entity/mapper.entity.ts +9 -9
- package/src/module/mapper/mapper.module.ts +35 -35
- package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
- package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
- package/src/module/mapper/repository/mapper.repository.ts +32 -32
- package/src/module/mapper/service/field-mapper.service.ts +268 -268
- package/src/module/mapper/service/mapper.service.ts +80 -80
- package/src/module/master/controller/master.controller.ts +71 -71
- package/src/module/master/service/master.service.ts +460 -460
- package/src/module/master/service/poupulate-meta.service.ts +210 -210
- package/src/module/meta/controller/attribute-master.controller.ts +83 -83
- package/src/module/meta/controller/entity-dynamic.controller.ts +123 -123
- package/src/module/meta/controller/entity-master.controller.ts +41 -41
- package/src/module/meta/controller/entity-relation.controller.ts +36 -36
- package/src/module/meta/controller/entity.controller.ts +301 -301
- package/src/module/meta/controller/entity.public.controller.ts +76 -76
- package/src/module/meta/controller/media.controller.ts +135 -162
- package/src/module/meta/controller/meta.controller.ts +80 -80
- package/src/module/meta/controller/view-master.controller.ts +79 -79
- package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
- package/src/module/meta/dto/entity-tab.dto.ts +4 -4
- package/src/module/meta/dto/entity-table.dto.ts +12 -12
- package/src/module/meta/entity/attribute-master.entity.ts +62 -62
- package/src/module/meta/entity/base-entity.entity.ts +52 -52
- package/src/module/meta/entity/dynamic.entity.ts +5 -5
- package/src/module/meta/entity/entity-master.entity.ts +53 -53
- package/src/module/meta/entity/entity-relation-data.entity.ts +24 -24
- package/src/module/meta/entity/entity-relation.entity.ts +18 -18
- package/src/module/meta/entity/entity-table-column.entity.ts +56 -56
- package/src/module/meta/entity/entity-table.entity.ts +45 -45
- package/src/module/meta/entity/media-data.entity.ts +32 -35
- package/src/module/meta/entity/preference.entity.ts +57 -57
- package/src/module/meta/entity/view-master.entity.ts +36 -36
- package/src/module/meta/entity.module.ts +153 -153
- package/src/module/meta/repository/attribute-master.repository.ts +206 -206
- package/src/module/meta/repository/entity-attribute-update.repository.ts +48 -48
- package/src/module/meta/repository/entity-master.repository.ts +120 -120
- package/src/module/meta/repository/entity-relation.repository.ts +36 -36
- package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
- package/src/module/meta/repository/entity-table.repository.ts +53 -53
- package/src/module/meta/repository/media-data.repository.ts +50 -50
- package/src/module/meta/repository/preference.repository.ts +20 -20
- package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
- package/src/module/meta/repository/view-master.repository.ts +42 -42
- package/src/module/meta/service/attribute-master.service.ts +329 -329
- package/src/module/meta/service/common.service.ts +9 -9
- package/src/module/meta/service/entity-attribute-update.service.ts +26 -26
- package/src/module/meta/service/entity-dynamic.service.ts +1037 -1038
- package/src/module/meta/service/entity-master.service.ts +288 -288
- package/src/module/meta/service/entity-realation-data.service.ts +9 -9
- package/src/module/meta/service/entity-relation.service.ts +85 -85
- package/src/module/meta/service/entity-service-impl.service.ts +390 -390
- package/src/module/meta/service/entity-table-column.service.ts +26 -26
- package/src/module/meta/service/entity-table.service.ts +144 -144
- package/src/module/meta/service/entity-validation.service.ts +187 -187
- package/src/module/meta/service/entity.service.ts +48 -48
- package/src/module/meta/service/field-group.service.ts +103 -103
- package/src/module/meta/service/media-data.service.ts +385 -397
- package/src/module/meta/service/preference.service.ts +16 -16
- package/src/module/meta/service/resolver.service.ts +260 -293
- package/src/module/meta/service/section-master.service.ts +104 -104
- package/src/module/meta/service/update-form-json.service.ts +22 -22
- package/src/module/meta/service/user-app-mapping.service.ts +17 -17
- package/src/module/meta/service/view-master.service.ts +127 -127
- package/src/module/microservice-client/microservice-clients.module.ts +13 -13
- package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
- package/src/module/microservice-client/service/microservice-clients.ts +4 -4
- package/src/module/notification/controller/notification.controller.ts +58 -58
- package/src/module/notification/entity/notification.entity.ts +76 -76
- package/src/module/notification/entity/otp.entity.ts +28 -28
- package/src/module/notification/firebase-admin.config.ts +22 -22
- package/src/module/notification/notification.module.ts +63 -65
- package/src/module/notification/repository/otp.repository.ts +27 -27
- package/src/module/notification/service/email.service.ts +142 -142
- package/src/module/notification/service/notification.service.ts +163 -145
- package/src/module/preference_master/entity/preference.entity.ts +25 -25
- package/src/module/preference_master/preference.service.ts +27 -27
- package/src/module/preference_master/repo/preference.repository.ts +36 -36
- package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
- package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
- package/src/module/third-party-module/service/api-registry.service.ts +13 -13
- package/src/module/third-party-module/third-party.module.ts +12 -12
- package/src/module/workflow/controller/action-category.controller.ts +54 -54
- package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
- package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
- package/src/module/workflow/controller/action.controller.ts +111 -111
- package/src/module/workflow/controller/activity-log.controller.ts +55 -55
- package/src/module/workflow/controller/comm-template.controller.ts +43 -43
- package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
- package/src/module/workflow/controller/form-master.controller.ts +43 -43
- package/src/module/workflow/controller/stage-group.controller.ts +49 -49
- package/src/module/workflow/controller/stage.controller.ts +51 -51
- package/src/module/workflow/controller/task.controller.ts +77 -77
- package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
- package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
- package/src/module/workflow/controller/workflow.controller.ts +66 -66
- package/src/module/workflow/entity/action-category.entity.ts +33 -33
- package/src/module/workflow/entity/action-data.entity.ts +51 -51
- package/src/module/workflow/entity/action-resources-mapping.entity.ts +21 -21
- package/src/module/workflow/entity/action-template-mapping.entity.ts +12 -12
- package/src/module/workflow/entity/action.entity.ts +48 -48
- package/src/module/workflow/entity/activity-log.entity.ts +39 -39
- package/src/module/workflow/entity/comm-template.entity.ts +38 -38
- package/src/module/workflow/entity/entity-modification.entity.ts +33 -33
- package/src/module/workflow/entity/form.entity.ts +21 -21
- package/src/module/workflow/entity/stage-action-mapping.entity.ts +12 -12
- package/src/module/workflow/entity/stage-group.entity.ts +18 -18
- package/src/module/workflow/entity/stage-movement-data.entity.ts +33 -33
- package/src/module/workflow/entity/stage.entity.ts +15 -15
- package/src/module/workflow/entity/task-data.entity.ts +84 -84
- package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
- package/src/module/workflow/entity/workflow-data.entity.ts +6 -6
- package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
- package/src/module/workflow/entity/workflow.entity.ts +15 -15
- package/src/module/workflow/repository/action-category.repository.ts +78 -78
- package/src/module/workflow/repository/action-data.repository.ts +345 -353
- package/src/module/workflow/repository/action.repository.ts +339 -339
- package/src/module/workflow/repository/activity-log.repository.ts +148 -148
- package/src/module/workflow/repository/comm-template.repository.ts +157 -157
- package/src/module/workflow/repository/form-master.repository.ts +50 -50
- package/src/module/workflow/repository/stage-group.repository.ts +186 -186
- package/src/module/workflow/repository/stage-movement.repository.ts +217 -217
- package/src/module/workflow/repository/stage.repository.ts +160 -160
- package/src/module/workflow/repository/task.repository.ts +154 -156
- package/src/module/workflow/repository/workflow.repository.ts +42 -42
- package/src/module/workflow/service/action-category.service.ts +32 -32
- package/src/module/workflow/service/action-data.service.ts +62 -62
- package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
- package/src/module/workflow/service/action-template-mapping.service.ts +137 -137
- package/src/module/workflow/service/action.service.ts +300 -300
- package/src/module/workflow/service/activity-log.service.ts +106 -106
- package/src/module/workflow/service/comm-template.service.ts +179 -179
- package/src/module/workflow/service/entity-modification.service.ts +55 -63
- package/src/module/workflow/service/form-master.service.ts +35 -35
- package/src/module/workflow/service/populate-workflow.service.ts +313 -313
- package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
- package/src/module/workflow/service/stage-group.service.ts +325 -325
- package/src/module/workflow/service/stage.service.ts +196 -196
- package/src/module/workflow/service/task.service.ts +547 -547
- package/src/module/workflow/service/workflow-list-master.service.ts +68 -68
- package/src/module/workflow/service/workflow-meta.service.ts +638 -638
- package/src/module/workflow/service/workflow.service.ts +212 -212
- package/src/module/workflow/workflow.module.ts +180 -180
- package/src/module/workflow-automation/SCHEDULING_GUIDE.md +145 -145
- package/src/module/workflow-automation/controller/workflow-automation.controller.ts +43 -43
- package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
- package/src/module/workflow-automation/entity/workflow-automation.entity.ts +35 -35
- package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
- package/src/module/workflow-automation/interface/action.interface.ts +5 -5
- package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
- package/src/module/workflow-automation/service/schedule-handler.service.ts +167 -167
- package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +219 -219
- package/src/module/workflow-automation/service/workflow-automation.service.ts +486 -486
- package/src/module/workflow-automation/workflow-automation.module.ts +55 -55
- package/src/module/workflow-schedule/INSTALLATION.md +244 -244
- package/src/module/workflow-schedule/MULTI_PROJECT_GUIDE.md +196 -196
- package/src/module/workflow-schedule/README.md +422 -422
- package/src/module/workflow-schedule/constants/schedule.constants.ts +48 -48
- package/src/module/workflow-schedule/controller/workflow-schedule.controller.ts +253 -253
- package/src/module/workflow-schedule/docs/CLAUDE_CODE_GUIDE.md +510 -510
- package/src/module/workflow-schedule/docs/CLAUDE_CODE_PROMPT.md +362 -362
- package/src/module/workflow-schedule/docs/RUN_CLAUDE_CODE.sh +68 -68
- package/src/module/workflow-schedule/dto/create-schedule.dto.ts +147 -147
- package/src/module/workflow-schedule/dto/get-execution-logs.dto.ts +119 -119
- package/src/module/workflow-schedule/dto/update-schedule.dto.ts +96 -96
- package/src/module/workflow-schedule/entities/scheduled-workflow.entity.ts +148 -148
- package/src/module/workflow-schedule/entities/workflow-execution-log.entity.ts +154 -154
- package/src/module/workflow-schedule/interfaces/schedule-job-data.interface.ts +51 -51
- package/src/module/workflow-schedule/interfaces/workflow-schedule-options.interface.ts +12 -12
- package/src/module/workflow-schedule/processors/schedule.processor.ts +616 -616
- package/src/module/workflow-schedule/service/workflow-schedule.service.ts +588 -588
- package/src/module/workflow-schedule/workflow-schedule.module.ts +67 -67
- package/src/resources/dev.properties.yaml +33 -33
- package/src/resources/local.properties.yaml +27 -27
- package/src/resources/properties.module.ts +12 -12
- package/src/resources/properties.yaml.ts +11 -11
- package/src/resources/uat.properties.yaml +31 -31
- package/src/table.config.ts +123 -123
- package/src/utils/dto/excel-data.dto.ts +14 -14
- package/src/utils/dto/excelsheet-data.dto.ts +5 -5
- package/src/utils/service/base64util.service.ts +18 -18
- package/src/utils/service/clockIDGenUtil.service.ts +21 -21
- package/src/utils/service/codeGenerator.service.ts +22 -22
- package/src/utils/service/dateUtil.service.ts +17 -17
- package/src/utils/service/encryptUtil.service.ts +97 -97
- package/src/utils/service/excel-helper.service.ts +72 -72
- package/src/utils/service/excelUtil.service.ts +15 -15
- package/src/utils/service/file-util.service.ts +11 -11
- package/src/utils/service/json-util.service.ts +23 -23
- package/src/utils/service/loggingUtil.service.ts +88 -88
- package/src/utils/service/reflection-helper.service.ts +62 -62
- package/src/utils/service/wbsCodeGen.service.ts +8 -8
- package/src/utils/utils.module.ts +27 -27
- package/tsconfig.build.json +4 -4
- package/tsconfig.json +24 -24
- package/.idea/250218_ether_core.iml +0 -12
- package/dist/module/notification/repository/notification.repository.d.ts +0 -7
- package/dist/module/notification/repository/notification.repository.js +0 -43
- package/dist/module/notification/repository/notification.repository.js.map +0 -1
- package/src/module/notification/repository/notification.repository.ts +0 -33
|
@@ -1,329 +1,329 @@
|
|
|
1
|
-
import { forwardRef, Inject, Injectable } from '@nestjs/common';
|
|
2
|
-
import { AttributeMasterRepository } from '../repository/attribute-master.repository';
|
|
3
|
-
import { UserData } from 'src/module/auth/dto/user.dto';
|
|
4
|
-
import { AttributeMaster } from '../entity/attribute-master.entity';
|
|
5
|
-
import { EntityServiceImpl } from './entity-service-impl.service';
|
|
6
|
-
import { getDbColumnType, getDbDataTypeName } from '../../../constant/db-data-type.constant';
|
|
7
|
-
import { AttributeStorageType } from '../../../constant/attribute.constant';
|
|
8
|
-
import { StorageType } from '../../../constant/entity.constant';
|
|
9
|
-
import { EntityMasterService } from './entity-master.service';
|
|
10
|
-
import { EntityRelationRepository } from '../repository/entity-relation.repository';
|
|
11
|
-
|
|
12
|
-
@Injectable()
|
|
13
|
-
export class AttributeMasterService {
|
|
14
|
-
constructor(
|
|
15
|
-
private readonly attributeMasterRepository: AttributeMasterRepository,
|
|
16
|
-
@Inject(forwardRef(() => EntityServiceImpl))
|
|
17
|
-
private readonly entityServiceImpl: EntityServiceImpl,
|
|
18
|
-
@Inject('EntityMasterService')
|
|
19
|
-
private readonly entityMasterService: EntityMasterService,
|
|
20
|
-
private readonly entityRelationService: EntityRelationRepository,
|
|
21
|
-
) {
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
async findAttributesByMappedEntityType(
|
|
25
|
-
entity_type: string,
|
|
26
|
-
loggedInUser: UserData,
|
|
27
|
-
) {
|
|
28
|
-
return this.attributeMasterRepository.findAttributesByMappedEntityType(
|
|
29
|
-
entity_type,
|
|
30
|
-
loggedInUser,
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Override createEntity to handle attribute-specific logic
|
|
36
|
-
* - Automatically sets db_datatype based on element_type
|
|
37
|
-
* - Creates database column if storage_type is DB_COL AND entity storage_type is SELF
|
|
38
|
-
*/
|
|
39
|
-
async createEntity(
|
|
40
|
-
entityData: AttributeMaster,
|
|
41
|
-
loggedInUser: UserData | null,
|
|
42
|
-
): Promise<AttributeMaster> {
|
|
43
|
-
// Automatically set db_datatype based on element_type
|
|
44
|
-
if (entityData.element_type) {
|
|
45
|
-
entityData.db_datatype = getDbDataTypeName(entityData.element_type);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Only create DB column if attribute storage_type is DB_COL
|
|
49
|
-
if (AttributeStorageType.DB_COL.toLowerCase() === entityData.storage_type.toLowerCase() && loggedInUser) {
|
|
50
|
-
// Get the table name and storage type from entity_master
|
|
51
|
-
const entityInfo = await this.attributeMasterRepository.getTableNameByEntityType(
|
|
52
|
-
entityData.mapped_entity_type,
|
|
53
|
-
loggedInUser,
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
if (!entityInfo.tableName) {
|
|
57
|
-
throw new Error(
|
|
58
|
-
`No table found for entity type ${entityData.mapped_entity_type}`,
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Only add column if entity storage_type is SELF (has its own table)
|
|
63
|
-
if (entityInfo.storageType?.toLowerCase() === StorageType.SELF.toLowerCase()) {
|
|
64
|
-
// Get the database column type from element_type and db_length
|
|
65
|
-
const columnType = getDbColumnType(entityData.element_type, entityData.db_length);
|
|
66
|
-
|
|
67
|
-
// Check if column already exists
|
|
68
|
-
const columnExists = await this.attributeMasterRepository.checkIfColumnExists(
|
|
69
|
-
entityInfo.tableName,
|
|
70
|
-
entityData.attribute_key,
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
// Add column if it doesn't exist
|
|
74
|
-
if (!columnExists) {
|
|
75
|
-
await this.attributeMasterRepository.addColumnToTable(
|
|
76
|
-
entityInfo.tableName,
|
|
77
|
-
entityData.attribute_key,
|
|
78
|
-
columnType,
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
} else {
|
|
83
|
-
entityData.storage_type = AttributeStorageType.EAV;
|
|
84
|
-
}
|
|
85
|
-
// Call entity service to handle standard entity creation logic
|
|
86
|
-
return await this.entityServiceImpl.createEntity(entityData, loggedInUser);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Override updateEntity to handle attribute-specific logic
|
|
91
|
-
* - Updates db_datatype if element_type changes
|
|
92
|
-
* - Handles column type changes if storage_type is DB_COL AND entity storage_type is SELF
|
|
93
|
-
*/
|
|
94
|
-
async updateEntity(
|
|
95
|
-
entityData: AttributeMaster,
|
|
96
|
-
loggedInUser: UserData,
|
|
97
|
-
): Promise<AttributeMaster | null> {
|
|
98
|
-
// Get existing attribute to compare
|
|
99
|
-
const existingAttr = await this.attributeMasterRepository.getAttributeById(entityData.id);
|
|
100
|
-
if (!existingAttr) {
|
|
101
|
-
throw new Error(`Attribute with id ${entityData.id} not found`);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Update db_datatype if element_type has changed
|
|
105
|
-
if (entityData.element_type && entityData.element_type !== existingAttr.element_type) {
|
|
106
|
-
entityData.db_datatype = getDbDataTypeName(entityData.element_type);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// Handle column type changes if storage_type is DB_COL
|
|
110
|
-
if (entityData.storage_type.toLowerCase() === AttributeStorageType.DB_COL.toLowerCase() ||
|
|
111
|
-
existingAttr.storage_type.toLowerCase() === AttributeStorageType.DB_COL.toLowerCase()) {
|
|
112
|
-
|
|
113
|
-
const entityInfo = await this.attributeMasterRepository.getTableNameByEntityType(
|
|
114
|
-
entityData.mapped_entity_type || existingAttr.mapped_entity_type,
|
|
115
|
-
loggedInUser,
|
|
116
|
-
);
|
|
117
|
-
|
|
118
|
-
if (!entityInfo.tableName) {
|
|
119
|
-
throw new Error(
|
|
120
|
-
`No table found for entity type ${entityData.mapped_entity_type || existingAttr.mapped_entity_type}`,
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Only perform column operations if entity storage_type is SELF
|
|
125
|
-
if (entityInfo.storageType?.toLowerCase() === StorageType.SELF.toLowerCase()) {
|
|
126
|
-
// Case 1: Storage type changed from EAV to DB_COL - add column
|
|
127
|
-
if (entityData.storage_type.toLowerCase() === AttributeStorageType.DB_COL.toLowerCase() &&
|
|
128
|
-
existingAttr.storage_type.toLowerCase() === AttributeStorageType.EAV.toLowerCase()) {
|
|
129
|
-
const columnType = getDbColumnType(
|
|
130
|
-
entityData.element_type || existingAttr.element_type,
|
|
131
|
-
entityData.db_length || existingAttr.db_length,
|
|
132
|
-
);
|
|
133
|
-
const columnExists = await this.attributeMasterRepository.checkIfColumnExists(
|
|
134
|
-
entityInfo.tableName,
|
|
135
|
-
entityData.attribute_key || existingAttr.attribute_key,
|
|
136
|
-
);
|
|
137
|
-
|
|
138
|
-
if (!columnExists) {
|
|
139
|
-
await this.attributeMasterRepository.addColumnToTable(
|
|
140
|
-
entityInfo.tableName,
|
|
141
|
-
entityData.attribute_key || existingAttr.attribute_key,
|
|
142
|
-
columnType,
|
|
143
|
-
);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Case 2: Storage type changed from DB_COL to EAV - drop column
|
|
148
|
-
else if (entityData.storage_type.toLowerCase() === AttributeStorageType.EAV.toLowerCase() &&
|
|
149
|
-
existingAttr.storage_type.toLowerCase() === AttributeStorageType.DB_COL.toLowerCase()) {
|
|
150
|
-
const columnExists = await this.attributeMasterRepository.checkIfColumnExists(
|
|
151
|
-
entityInfo.tableName,
|
|
152
|
-
existingAttr.attribute_key,
|
|
153
|
-
);
|
|
154
|
-
|
|
155
|
-
if (columnExists) {
|
|
156
|
-
await this.attributeMasterRepository.dropColumnFromTable(
|
|
157
|
-
entityInfo.tableName,
|
|
158
|
-
existingAttr.attribute_key,
|
|
159
|
-
);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Case 3: Element type or db_length changed while storage_type is DB_COL - alter column type
|
|
164
|
-
else if (entityData.storage_type.toLowerCase() === AttributeStorageType.DB_COL.toLowerCase() &&
|
|
165
|
-
existingAttr.storage_type.toLowerCase() === AttributeStorageType.DB_COL.toLowerCase() &&
|
|
166
|
-
(
|
|
167
|
-
(entityData.element_type && entityData.element_type !== existingAttr.element_type) ||
|
|
168
|
-
(entityData.db_length && entityData.db_length !== existingAttr.db_length)
|
|
169
|
-
)) {
|
|
170
|
-
const newColumnType = getDbColumnType(
|
|
171
|
-
entityData.element_type || existingAttr.element_type,
|
|
172
|
-
entityData.db_length || existingAttr.db_length,
|
|
173
|
-
);
|
|
174
|
-
await this.attributeMasterRepository.alterColumnType(
|
|
175
|
-
entityInfo.tableName,
|
|
176
|
-
entityData.attribute_key || existingAttr.attribute_key,
|
|
177
|
-
newColumnType,
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
// Call entity service to handle standard entity update logic
|
|
184
|
-
return await this.entityServiceImpl.updateEntity(entityData, loggedInUser);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Backward compatibility wrapper for createEntity
|
|
189
|
-
* @deprecated Use createEntity instead
|
|
190
|
-
*/
|
|
191
|
-
async createAttribute(
|
|
192
|
-
attributeData: AttributeMaster,
|
|
193
|
-
loggedInUser: UserData,
|
|
194
|
-
): Promise<AttributeMaster> {
|
|
195
|
-
return this.createEntity(attributeData, loggedInUser);
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Backward compatibility wrapper for updateEntity
|
|
200
|
-
* @deprecated Use updateEntity instead
|
|
201
|
-
*/
|
|
202
|
-
async updateAttribute(
|
|
203
|
-
attributeData: AttributeMaster,
|
|
204
|
-
id: number,
|
|
205
|
-
loggedInUser: UserData,
|
|
206
|
-
): Promise<AttributeMaster | null> {
|
|
207
|
-
attributeData.id = id;
|
|
208
|
-
return this.updateEntity(attributeData, loggedInUser);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
async getAttributeById(id: number): Promise<AttributeMaster | null> {
|
|
213
|
-
return this.attributeMasterRepository.getAttributeById(id);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
async getAttributesByEntityType(entity_type, loggedInUser) {
|
|
217
|
-
return this.attributeMasterRepository.getAllAttributeByEntity(entity_type, loggedInUser);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
async getAttributesByMappedEntityType(
|
|
221
|
-
entityType: string,
|
|
222
|
-
loggedInUser: UserData,
|
|
223
|
-
): Promise<AttributeMaster[]> {
|
|
224
|
-
return this.attributeMasterRepository.findAttributesByMappedEntityType(
|
|
225
|
-
entityType,
|
|
226
|
-
loggedInUser,
|
|
227
|
-
);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
async getAttributesDropdownList(
|
|
231
|
-
entityType: string,
|
|
232
|
-
loggedInUser: UserData,
|
|
233
|
-
): Promise<{ label: string; value: number }[]> {
|
|
234
|
-
return this.attributeMasterRepository.getAttributesDropdownList(
|
|
235
|
-
entityType,
|
|
236
|
-
loggedInUser,
|
|
237
|
-
);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
async findByMappedEntityTypeAndAttributeKey(mapped_entity_type: string, attribute_key: string, loggedInUser: UserData) {
|
|
241
|
-
return await this.attributeMasterRepository.findByMappedEntityTypeAndAttributeKeyAndOrganizationId(
|
|
242
|
-
mapped_entity_type,
|
|
243
|
-
attribute_key,
|
|
244
|
-
loggedInUser.enterprise_id,
|
|
245
|
-
);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
async getAttributesForDirect(
|
|
249
|
-
entityType: string,
|
|
250
|
-
enterpriseId: number,
|
|
251
|
-
allowedElementTypes: string[],
|
|
252
|
-
): Promise<AttributeMaster[]> {
|
|
253
|
-
return this.attributeMasterRepository.getAttributesDirect(
|
|
254
|
-
entityType,
|
|
255
|
-
enterpriseId,
|
|
256
|
-
allowedElementTypes,
|
|
257
|
-
);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
async getEntityAttributes(entityType: string, loggedInUser: UserData, direct?: boolean) {
|
|
261
|
-
const allowedElementTypes = [
|
|
262
|
-
'label',
|
|
263
|
-
'text',
|
|
264
|
-
'textarea',
|
|
265
|
-
'select',
|
|
266
|
-
'number',
|
|
267
|
-
'decimal',
|
|
268
|
-
'date',
|
|
269
|
-
'time',
|
|
270
|
-
'datetime',
|
|
271
|
-
'phone',
|
|
272
|
-
'email',
|
|
273
|
-
'checkbox',
|
|
274
|
-
'multicheckbox',
|
|
275
|
-
'radio',
|
|
276
|
-
'file-upload'
|
|
277
|
-
];
|
|
278
|
-
let entityMaster = await this.entityMasterService.getEntityData(entityType, loggedInUser);
|
|
279
|
-
if (entityMaster.is_flat_json && !direct) {
|
|
280
|
-
return await this.getAttributesForFlatJson(entityType, loggedInUser, allowedElementTypes);
|
|
281
|
-
} else {
|
|
282
|
-
let attributeMasters = await this.attributeMasterRepository.getAttributesDirect(entityType, loggedInUser.enterprise_id, allowedElementTypes);
|
|
283
|
-
return attributeMasters.map(attribute => ({
|
|
284
|
-
id: attribute.id,
|
|
285
|
-
name: attribute.name,
|
|
286
|
-
attribute_key: attribute.attribute_key,
|
|
287
|
-
element_type: attribute.element_type,
|
|
288
|
-
}));
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
async getAttributesForFlatJson(entityType: string, loggedInUser: UserData, allowedElementTypes: string[]) {
|
|
293
|
-
let attributes: any[] = [];
|
|
294
|
-
|
|
295
|
-
const mainAttributes = await this.getAttributesForDirect(entityType, loggedInUser.enterprise_id, allowedElementTypes);
|
|
296
|
-
|
|
297
|
-
mainAttributes.map(attribute => {
|
|
298
|
-
attributes.push({
|
|
299
|
-
name: attribute.name,
|
|
300
|
-
attribute_key: `${entityType}__${attribute.attribute_key}`,
|
|
301
|
-
element_type: attribute.element_type,
|
|
302
|
-
});
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
const relatedRelations = await this.entityRelationService.getOneToOneRelations(
|
|
306
|
-
entityType,
|
|
307
|
-
loggedInUser.enterprise_id,
|
|
308
|
-
);
|
|
309
|
-
|
|
310
|
-
const relatedEntityTypes = relatedRelations.map(
|
|
311
|
-
(r) => r.target_entity_type,
|
|
312
|
-
);
|
|
313
|
-
|
|
314
|
-
if (relatedEntityTypes.length > 0) {
|
|
315
|
-
for (const type of relatedEntityTypes) {
|
|
316
|
-
const attrs = await this.getAttributesForDirect(type, loggedInUser.enterprise_id, allowedElementTypes);
|
|
317
|
-
attrs.map(attribute => {
|
|
318
|
-
attributes.push({
|
|
319
|
-
name: attribute.name,
|
|
320
|
-
attribute_key: `${type}__${attribute.attribute_key}`,
|
|
321
|
-
element_type: attribute.element_type,
|
|
322
|
-
});
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
return attributes;
|
|
328
|
-
}
|
|
329
|
-
}
|
|
1
|
+
import { forwardRef, Inject, Injectable } from '@nestjs/common';
|
|
2
|
+
import { AttributeMasterRepository } from '../repository/attribute-master.repository';
|
|
3
|
+
import { UserData } from 'src/module/auth/dto/user.dto';
|
|
4
|
+
import { AttributeMaster } from '../entity/attribute-master.entity';
|
|
5
|
+
import { EntityServiceImpl } from './entity-service-impl.service';
|
|
6
|
+
import { getDbColumnType, getDbDataTypeName } from '../../../constant/db-data-type.constant';
|
|
7
|
+
import { AttributeStorageType } from '../../../constant/attribute.constant';
|
|
8
|
+
import { StorageType } from '../../../constant/entity.constant';
|
|
9
|
+
import { EntityMasterService } from './entity-master.service';
|
|
10
|
+
import { EntityRelationRepository } from '../repository/entity-relation.repository';
|
|
11
|
+
|
|
12
|
+
@Injectable()
|
|
13
|
+
export class AttributeMasterService {
|
|
14
|
+
constructor(
|
|
15
|
+
private readonly attributeMasterRepository: AttributeMasterRepository,
|
|
16
|
+
@Inject(forwardRef(() => EntityServiceImpl))
|
|
17
|
+
private readonly entityServiceImpl: EntityServiceImpl,
|
|
18
|
+
@Inject('EntityMasterService')
|
|
19
|
+
private readonly entityMasterService: EntityMasterService,
|
|
20
|
+
private readonly entityRelationService: EntityRelationRepository,
|
|
21
|
+
) {
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async findAttributesByMappedEntityType(
|
|
25
|
+
entity_type: string,
|
|
26
|
+
loggedInUser: UserData,
|
|
27
|
+
) {
|
|
28
|
+
return this.attributeMasterRepository.findAttributesByMappedEntityType(
|
|
29
|
+
entity_type,
|
|
30
|
+
loggedInUser,
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Override createEntity to handle attribute-specific logic
|
|
36
|
+
* - Automatically sets db_datatype based on element_type
|
|
37
|
+
* - Creates database column if storage_type is DB_COL AND entity storage_type is SELF
|
|
38
|
+
*/
|
|
39
|
+
async createEntity(
|
|
40
|
+
entityData: AttributeMaster,
|
|
41
|
+
loggedInUser: UserData | null,
|
|
42
|
+
): Promise<AttributeMaster> {
|
|
43
|
+
// Automatically set db_datatype based on element_type
|
|
44
|
+
if (entityData.element_type) {
|
|
45
|
+
entityData.db_datatype = getDbDataTypeName(entityData.element_type);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Only create DB column if attribute storage_type is DB_COL
|
|
49
|
+
if (AttributeStorageType.DB_COL.toLowerCase() === entityData.storage_type.toLowerCase() && loggedInUser) {
|
|
50
|
+
// Get the table name and storage type from entity_master
|
|
51
|
+
const entityInfo = await this.attributeMasterRepository.getTableNameByEntityType(
|
|
52
|
+
entityData.mapped_entity_type,
|
|
53
|
+
loggedInUser,
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
if (!entityInfo.tableName) {
|
|
57
|
+
throw new Error(
|
|
58
|
+
`No table found for entity type ${entityData.mapped_entity_type}`,
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Only add column if entity storage_type is SELF (has its own table)
|
|
63
|
+
if (entityInfo.storageType?.toLowerCase() === StorageType.SELF.toLowerCase()) {
|
|
64
|
+
// Get the database column type from element_type and db_length
|
|
65
|
+
const columnType = getDbColumnType(entityData.element_type, entityData.db_length);
|
|
66
|
+
|
|
67
|
+
// Check if column already exists
|
|
68
|
+
const columnExists = await this.attributeMasterRepository.checkIfColumnExists(
|
|
69
|
+
entityInfo.tableName,
|
|
70
|
+
entityData.attribute_key,
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
// Add column if it doesn't exist
|
|
74
|
+
if (!columnExists) {
|
|
75
|
+
await this.attributeMasterRepository.addColumnToTable(
|
|
76
|
+
entityInfo.tableName,
|
|
77
|
+
entityData.attribute_key,
|
|
78
|
+
columnType,
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
} else {
|
|
83
|
+
entityData.storage_type = AttributeStorageType.EAV;
|
|
84
|
+
}
|
|
85
|
+
// Call entity service to handle standard entity creation logic
|
|
86
|
+
return await this.entityServiceImpl.createEntity(entityData, loggedInUser);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Override updateEntity to handle attribute-specific logic
|
|
91
|
+
* - Updates db_datatype if element_type changes
|
|
92
|
+
* - Handles column type changes if storage_type is DB_COL AND entity storage_type is SELF
|
|
93
|
+
*/
|
|
94
|
+
async updateEntity(
|
|
95
|
+
entityData: AttributeMaster,
|
|
96
|
+
loggedInUser: UserData,
|
|
97
|
+
): Promise<AttributeMaster | null> {
|
|
98
|
+
// Get existing attribute to compare
|
|
99
|
+
const existingAttr = await this.attributeMasterRepository.getAttributeById(entityData.id);
|
|
100
|
+
if (!existingAttr) {
|
|
101
|
+
throw new Error(`Attribute with id ${entityData.id} not found`);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Update db_datatype if element_type has changed
|
|
105
|
+
if (entityData.element_type && entityData.element_type !== existingAttr.element_type) {
|
|
106
|
+
entityData.db_datatype = getDbDataTypeName(entityData.element_type);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Handle column type changes if storage_type is DB_COL
|
|
110
|
+
if (entityData.storage_type.toLowerCase() === AttributeStorageType.DB_COL.toLowerCase() ||
|
|
111
|
+
existingAttr.storage_type.toLowerCase() === AttributeStorageType.DB_COL.toLowerCase()) {
|
|
112
|
+
|
|
113
|
+
const entityInfo = await this.attributeMasterRepository.getTableNameByEntityType(
|
|
114
|
+
entityData.mapped_entity_type || existingAttr.mapped_entity_type,
|
|
115
|
+
loggedInUser,
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
if (!entityInfo.tableName) {
|
|
119
|
+
throw new Error(
|
|
120
|
+
`No table found for entity type ${entityData.mapped_entity_type || existingAttr.mapped_entity_type}`,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Only perform column operations if entity storage_type is SELF
|
|
125
|
+
if (entityInfo.storageType?.toLowerCase() === StorageType.SELF.toLowerCase()) {
|
|
126
|
+
// Case 1: Storage type changed from EAV to DB_COL - add column
|
|
127
|
+
if (entityData.storage_type.toLowerCase() === AttributeStorageType.DB_COL.toLowerCase() &&
|
|
128
|
+
existingAttr.storage_type.toLowerCase() === AttributeStorageType.EAV.toLowerCase()) {
|
|
129
|
+
const columnType = getDbColumnType(
|
|
130
|
+
entityData.element_type || existingAttr.element_type,
|
|
131
|
+
entityData.db_length || existingAttr.db_length,
|
|
132
|
+
);
|
|
133
|
+
const columnExists = await this.attributeMasterRepository.checkIfColumnExists(
|
|
134
|
+
entityInfo.tableName,
|
|
135
|
+
entityData.attribute_key || existingAttr.attribute_key,
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
if (!columnExists) {
|
|
139
|
+
await this.attributeMasterRepository.addColumnToTable(
|
|
140
|
+
entityInfo.tableName,
|
|
141
|
+
entityData.attribute_key || existingAttr.attribute_key,
|
|
142
|
+
columnType,
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Case 2: Storage type changed from DB_COL to EAV - drop column
|
|
148
|
+
else if (entityData.storage_type.toLowerCase() === AttributeStorageType.EAV.toLowerCase() &&
|
|
149
|
+
existingAttr.storage_type.toLowerCase() === AttributeStorageType.DB_COL.toLowerCase()) {
|
|
150
|
+
const columnExists = await this.attributeMasterRepository.checkIfColumnExists(
|
|
151
|
+
entityInfo.tableName,
|
|
152
|
+
existingAttr.attribute_key,
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
if (columnExists) {
|
|
156
|
+
await this.attributeMasterRepository.dropColumnFromTable(
|
|
157
|
+
entityInfo.tableName,
|
|
158
|
+
existingAttr.attribute_key,
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Case 3: Element type or db_length changed while storage_type is DB_COL - alter column type
|
|
164
|
+
else if (entityData.storage_type.toLowerCase() === AttributeStorageType.DB_COL.toLowerCase() &&
|
|
165
|
+
existingAttr.storage_type.toLowerCase() === AttributeStorageType.DB_COL.toLowerCase() &&
|
|
166
|
+
(
|
|
167
|
+
(entityData.element_type && entityData.element_type !== existingAttr.element_type) ||
|
|
168
|
+
(entityData.db_length && entityData.db_length !== existingAttr.db_length)
|
|
169
|
+
)) {
|
|
170
|
+
const newColumnType = getDbColumnType(
|
|
171
|
+
entityData.element_type || existingAttr.element_type,
|
|
172
|
+
entityData.db_length || existingAttr.db_length,
|
|
173
|
+
);
|
|
174
|
+
await this.attributeMasterRepository.alterColumnType(
|
|
175
|
+
entityInfo.tableName,
|
|
176
|
+
entityData.attribute_key || existingAttr.attribute_key,
|
|
177
|
+
newColumnType,
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Call entity service to handle standard entity update logic
|
|
184
|
+
return await this.entityServiceImpl.updateEntity(entityData, loggedInUser);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Backward compatibility wrapper for createEntity
|
|
189
|
+
* @deprecated Use createEntity instead
|
|
190
|
+
*/
|
|
191
|
+
async createAttribute(
|
|
192
|
+
attributeData: AttributeMaster,
|
|
193
|
+
loggedInUser: UserData,
|
|
194
|
+
): Promise<AttributeMaster> {
|
|
195
|
+
return this.createEntity(attributeData, loggedInUser);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Backward compatibility wrapper for updateEntity
|
|
200
|
+
* @deprecated Use updateEntity instead
|
|
201
|
+
*/
|
|
202
|
+
async updateAttribute(
|
|
203
|
+
attributeData: AttributeMaster,
|
|
204
|
+
id: number,
|
|
205
|
+
loggedInUser: UserData,
|
|
206
|
+
): Promise<AttributeMaster | null> {
|
|
207
|
+
attributeData.id = id;
|
|
208
|
+
return this.updateEntity(attributeData, loggedInUser);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
async getAttributeById(id: number): Promise<AttributeMaster | null> {
|
|
213
|
+
return this.attributeMasterRepository.getAttributeById(id);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
async getAttributesByEntityType(entity_type, loggedInUser) {
|
|
217
|
+
return this.attributeMasterRepository.getAllAttributeByEntity(entity_type, loggedInUser);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
async getAttributesByMappedEntityType(
|
|
221
|
+
entityType: string,
|
|
222
|
+
loggedInUser: UserData,
|
|
223
|
+
): Promise<AttributeMaster[]> {
|
|
224
|
+
return this.attributeMasterRepository.findAttributesByMappedEntityType(
|
|
225
|
+
entityType,
|
|
226
|
+
loggedInUser,
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
async getAttributesDropdownList(
|
|
231
|
+
entityType: string,
|
|
232
|
+
loggedInUser: UserData,
|
|
233
|
+
): Promise<{ label: string; value: number }[]> {
|
|
234
|
+
return this.attributeMasterRepository.getAttributesDropdownList(
|
|
235
|
+
entityType,
|
|
236
|
+
loggedInUser,
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
async findByMappedEntityTypeAndAttributeKey(mapped_entity_type: string, attribute_key: string, loggedInUser: UserData) {
|
|
241
|
+
return await this.attributeMasterRepository.findByMappedEntityTypeAndAttributeKeyAndOrganizationId(
|
|
242
|
+
mapped_entity_type,
|
|
243
|
+
attribute_key,
|
|
244
|
+
loggedInUser.enterprise_id,
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
async getAttributesForDirect(
|
|
249
|
+
entityType: string,
|
|
250
|
+
enterpriseId: number,
|
|
251
|
+
allowedElementTypes: string[],
|
|
252
|
+
): Promise<AttributeMaster[]> {
|
|
253
|
+
return this.attributeMasterRepository.getAttributesDirect(
|
|
254
|
+
entityType,
|
|
255
|
+
enterpriseId,
|
|
256
|
+
allowedElementTypes,
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
async getEntityAttributes(entityType: string, loggedInUser: UserData, direct?: boolean) {
|
|
261
|
+
const allowedElementTypes = [
|
|
262
|
+
'label',
|
|
263
|
+
'text',
|
|
264
|
+
'textarea',
|
|
265
|
+
'select',
|
|
266
|
+
'number',
|
|
267
|
+
'decimal',
|
|
268
|
+
'date',
|
|
269
|
+
'time',
|
|
270
|
+
'datetime',
|
|
271
|
+
'phone',
|
|
272
|
+
'email',
|
|
273
|
+
'checkbox',
|
|
274
|
+
'multicheckbox',
|
|
275
|
+
'radio',
|
|
276
|
+
'file-upload'
|
|
277
|
+
];
|
|
278
|
+
let entityMaster = await this.entityMasterService.getEntityData(entityType, loggedInUser);
|
|
279
|
+
if (entityMaster.is_flat_json && !direct) {
|
|
280
|
+
return await this.getAttributesForFlatJson(entityType, loggedInUser, allowedElementTypes);
|
|
281
|
+
} else {
|
|
282
|
+
let attributeMasters = await this.attributeMasterRepository.getAttributesDirect(entityType, loggedInUser.enterprise_id, allowedElementTypes);
|
|
283
|
+
return attributeMasters.map(attribute => ({
|
|
284
|
+
id: attribute.id,
|
|
285
|
+
name: attribute.name,
|
|
286
|
+
attribute_key: attribute.attribute_key,
|
|
287
|
+
element_type: attribute.element_type,
|
|
288
|
+
}));
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
async getAttributesForFlatJson(entityType: string, loggedInUser: UserData, allowedElementTypes: string[]) {
|
|
293
|
+
let attributes: any[] = [];
|
|
294
|
+
|
|
295
|
+
const mainAttributes = await this.getAttributesForDirect(entityType, loggedInUser.enterprise_id, allowedElementTypes);
|
|
296
|
+
|
|
297
|
+
mainAttributes.map(attribute => {
|
|
298
|
+
attributes.push({
|
|
299
|
+
name: attribute.name,
|
|
300
|
+
attribute_key: `${entityType}__${attribute.attribute_key}`,
|
|
301
|
+
element_type: attribute.element_type,
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
const relatedRelations = await this.entityRelationService.getOneToOneRelations(
|
|
306
|
+
entityType,
|
|
307
|
+
loggedInUser.enterprise_id,
|
|
308
|
+
);
|
|
309
|
+
|
|
310
|
+
const relatedEntityTypes = relatedRelations.map(
|
|
311
|
+
(r) => r.target_entity_type,
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
if (relatedEntityTypes.length > 0) {
|
|
315
|
+
for (const type of relatedEntityTypes) {
|
|
316
|
+
const attrs = await this.getAttributesForDirect(type, loggedInUser.enterprise_id, allowedElementTypes);
|
|
317
|
+
attrs.map(attribute => {
|
|
318
|
+
attributes.push({
|
|
319
|
+
name: attribute.name,
|
|
320
|
+
attribute_key: `${type}__${attribute.attribute_key}`,
|
|
321
|
+
element_type: attribute.element_type,
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return attributes;
|
|
328
|
+
}
|
|
329
|
+
}
|