rez_core 7.0.13 → 7.1.1
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/.idea/250218_ether_core.iml +12 -0
- package/.idea/codeStyles/Project.xml +59 -0
- package/.idea/codeStyles/codeStyleConfig.xml +5 -0
- package/.idea/modules.xml +8 -0
- package/.idea/vcs.xml +6 -0
- package/.prettierrc +3 -3
- package/README.md +99 -99
- package/dist/module/filter/repository/saved-filter.repository.js +2 -0
- package/dist/module/filter/repository/saved-filter.repository.js.map +1 -1
- package/dist/module/filter/service/filter.service.js +33 -28
- 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 +6 -1
- package/dist/module/integration/service/integration.service.js +14 -2
- package/dist/module/integration/service/integration.service.js.map +1 -1
- package/dist/module/integration/service/oauth.service.js +2 -0
- package/dist/module/integration/service/oauth.service.js.map +1 -1
- package/dist/module/integration/service/wrapper.service.js +1 -0
- package/dist/module/integration/service/wrapper.service.js.map +1 -1
- package/dist/module/integration/strategies/email/gmail-api.strategy.js +23 -7
- package/dist/module/integration/strategies/email/gmail-api.strategy.js.map +1 -1
- package/dist/module/integration/strategies/email/sendgrid-api.strategy.js +8 -5
- package/dist/module/integration/strategies/email/sendgrid-api.strategy.js.map +1 -1
- package/dist/module/layout_preference/controller/layout_preference.controller.d.ts +0 -6
- package/dist/module/layout_preference/controller/layout_preference.controller.js +0 -16
- package/dist/module/layout_preference/controller/layout_preference.controller.js.map +1 -1
- package/dist/module/layout_preference/layout_preference.module.js +1 -1
- package/dist/module/layout_preference/layout_preference.module.js.map +1 -1
- package/dist/module/layout_preference/service/layout_preference.service.d.ts +0 -4
- package/dist/module/layout_preference/service/layout_preference.service.js +0 -67
- package/dist/module/layout_preference/service/layout_preference.service.js.map +1 -1
- package/dist/module/listmaster/controller/list-master.controller.d.ts +1 -1
- package/dist/module/listmaster/controller/list-master.controller.js +9 -6
- package/dist/module/listmaster/controller/list-master.controller.js.map +1 -1
- package/dist/module/listmaster/repository/list-master-items.repository.js +1 -1
- package/dist/module/listmaster/repository/list-master-items.repository.js.map +1 -1
- package/dist/module/listmaster/service/list-master.service.d.ts +1 -1
- package/dist/module/listmaster/service/list-master.service.js +7 -7
- package/dist/module/listmaster/service/list-master.service.js.map +1 -1
- package/dist/module/meta/controller/media.controller.d.ts +3 -0
- package/dist/module/meta/controller/media.controller.js +27 -0
- package/dist/module/meta/controller/media.controller.js.map +1 -1
- package/dist/module/meta/entity/media-data.entity.d.ts +1 -0
- package/dist/module/meta/entity/media-data.entity.js +4 -0
- package/dist/module/meta/entity/media-data.entity.js.map +1 -1
- package/dist/module/meta/entity.module.js +2 -0
- package/dist/module/meta/entity.module.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/entity-service-impl.service.d.ts +0 -2
- package/dist/module/meta/service/entity-service-impl.service.js +0 -5
- package/dist/module/meta/service/entity-service-impl.service.js.map +1 -1
- package/dist/module/meta/service/entity-table.service.d.ts +3 -8
- package/dist/module/meta/service/entity-table.service.js +54 -52
- package/dist/module/meta/service/entity-table.service.js.map +1 -1
- package/dist/module/meta/service/media-data.service.d.ts +2 -0
- package/dist/module/meta/service/media-data.service.js +8 -0
- package/dist/module/meta/service/media-data.service.js.map +1 -1
- package/dist/module/meta/service/resolver.service.js +23 -13
- package/dist/module/meta/service/resolver.service.js.map +1 -1
- package/dist/module/notification/notification.module.js +2 -0
- package/dist/module/notification/notification.module.js.map +1 -1
- package/dist/module/notification/repository/notification.repository.d.ts +7 -0
- package/dist/module/notification/repository/notification.repository.js +43 -0
- package/dist/module/notification/repository/notification.repository.js.map +1 -0
- package/dist/module/notification/service/notification.service.d.ts +3 -1
- package/dist/module/notification/service/notification.service.js +27 -40
- 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 +10 -3
- 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 +4 -1
- package/dist/module/workflow/service/entity-modification.service.js +9 -5
- 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 +8 -6
- package/dist/module/workflow-automation/service/workflow-automation.service.js.map +1 -1
- package/dist/table.config.d.ts +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/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 +249 -247
- 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 +1752 -1722
- 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 +2651 -2632
- package/src/module/integration/service/oauth.service.ts +226 -224
- package/src/module/integration/service/wrapper.service.ts +754 -753
- package/src/module/integration/strategies/email/gmail-api.strategy.ts +307 -281
- 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 +263 -260
- 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 +215 -208
- 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 -261
- 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 +774 -768
- 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 +162 -135
- 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 +35 -32
- 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 -151
- 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 +1038 -1037
- 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 -394
- package/src/module/meta/service/entity-table-column.service.ts +26 -26
- package/src/module/meta/service/entity-table.service.ts +144 -157
- 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 +397 -385
- package/src/module/meta/service/preference.service.ts +16 -16
- package/src/module/meta/service/resolver.service.ts +293 -260
- 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 +65 -63
- package/src/module/notification/repository/notification.repository.ts +33 -0
- 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 +145 -163
- 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 +353 -345
- 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 +156 -154
- 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 +63 -55
- 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
|
@@ -1,382 +1,382 @@
|
|
|
1
|
-
import { DataSource } from 'typeorm';
|
|
2
|
-
import { BadRequestException, forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';
|
|
3
|
-
import { ListMasterItemsRepository } from '../repository/list-master-items.repository';
|
|
4
|
-
import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
|
|
5
|
-
import { UserData } from 'src/module/auth/dto/user.dto';
|
|
6
|
-
import { CodeGeneratorService } from 'src/utils/service/codeGenerator.service';
|
|
7
|
-
import { AttributeMasterService } from 'src/module/meta/service/attribute-master.service';
|
|
8
|
-
import { ListMasterRepository } from '../repository/list-master.repository';
|
|
9
|
-
|
|
10
|
-
@Injectable()
|
|
11
|
-
export class ListMasterItemService extends EntityServiceImpl {
|
|
12
|
-
constructor(
|
|
13
|
-
private readonly listItemsRepo: ListMasterItemsRepository,
|
|
14
|
-
private readonly listMasterRepo: ListMasterRepository,
|
|
15
|
-
@Inject(forwardRef(() => EntityServiceImpl))
|
|
16
|
-
private readonly entityServiceImpl: EntityServiceImpl,
|
|
17
|
-
@Inject('AttributeMasterService')
|
|
18
|
-
protected readonly attributeMasterService: AttributeMasterService,
|
|
19
|
-
private readonly dataSource: DataSource,
|
|
20
|
-
) {
|
|
21
|
-
super();
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
async getListMasterItemsByType(
|
|
25
|
-
listType: string,
|
|
26
|
-
enterprise_id: number,
|
|
27
|
-
search?: string,
|
|
28
|
-
) {
|
|
29
|
-
// this method retrieves all list master items for a specific type and organization
|
|
30
|
-
return this.listItemsRepo.findAllItemsByListType(
|
|
31
|
-
listType,
|
|
32
|
-
'asc',
|
|
33
|
-
enterprise_id,
|
|
34
|
-
search,
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async createEntity(entityData: any, loggedInUser: UserData): Promise<any> {
|
|
39
|
-
try {
|
|
40
|
-
const generatedCode = CodeGeneratorService.generateCode(entityData.code);
|
|
41
|
-
|
|
42
|
-
entityData.code = generatedCode;
|
|
43
|
-
entityData.value = generatedCode;
|
|
44
|
-
|
|
45
|
-
return await this.entityServiceImpl.createEntity(
|
|
46
|
-
entityData,
|
|
47
|
-
loggedInUser,
|
|
48
|
-
);
|
|
49
|
-
} catch (error) {
|
|
50
|
-
throw error;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
async updateEntity(entityData: any, loggedInUser: UserData): Promise<any> {
|
|
55
|
-
return await this.entityServiceImpl.updateEntity(entityData, loggedInUser);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async upsertListMasterItem(
|
|
59
|
-
listType: string,
|
|
60
|
-
items: any[],
|
|
61
|
-
loggedInUser,
|
|
62
|
-
): Promise<any> {
|
|
63
|
-
const entId = loggedInUser.enterprise_id;
|
|
64
|
-
const errors: any[] = [];
|
|
65
|
-
|
|
66
|
-
// Step 1: Validate and prepare items
|
|
67
|
-
const processedItems = items.map((item, index) => ({
|
|
68
|
-
...item,
|
|
69
|
-
index,
|
|
70
|
-
name: item.name?.trim(),
|
|
71
|
-
code: item.code?.trim(),
|
|
72
|
-
itemId: item.id,
|
|
73
|
-
}));
|
|
74
|
-
|
|
75
|
-
// Step 2: Fetch all existing items for this list type in one query
|
|
76
|
-
const existingItems = await this.listItemsRepo.findAllItemsByListType(
|
|
77
|
-
listType,
|
|
78
|
-
'asc',
|
|
79
|
-
entId,
|
|
80
|
-
);
|
|
81
|
-
|
|
82
|
-
// Create lookup maps for efficient validation
|
|
83
|
-
const existingItemsById = new Map(existingItems.map(item => [item.id, item]));
|
|
84
|
-
const existingItemsByName = new Map(existingItems.map(item => [item.name?.toLowerCase(), item]));
|
|
85
|
-
const existingItemsByCode = new Map(
|
|
86
|
-
existingItems.filter(item => item.code).map(item => [item.code?.toLowerCase(), item])
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
// Step 3: Validate all items and collect errors
|
|
90
|
-
const validItems: any[] = [];
|
|
91
|
-
|
|
92
|
-
for (const processedItem of processedItems) {
|
|
93
|
-
const { index, name, code, itemId } = processedItem;
|
|
94
|
-
const itemErrors: any[] = [];
|
|
95
|
-
|
|
96
|
-
// Validate required fields - both name and code are required
|
|
97
|
-
if (!name) {
|
|
98
|
-
itemErrors.push({
|
|
99
|
-
field: 'name',
|
|
100
|
-
message: 'Name is required',
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (!code) {
|
|
105
|
-
itemErrors.push({
|
|
106
|
-
field: 'code',
|
|
107
|
-
message: 'Code is required',
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Determine if this is an update by checking for existing item
|
|
112
|
-
let existingItem: any = null;
|
|
113
|
-
let effectiveItemId = itemId; // Track the ID we'll use for this item
|
|
114
|
-
|
|
115
|
-
// First, check if ID is provided and exists
|
|
116
|
-
if (itemId) {
|
|
117
|
-
existingItem = existingItemsById.get(itemId) || null;
|
|
118
|
-
if (!existingItem) {
|
|
119
|
-
itemErrors.push({
|
|
120
|
-
field: 'id',
|
|
121
|
-
message: `List item with id ${itemId} not found`,
|
|
122
|
-
});
|
|
123
|
-
} else if (existingItem.listtype !== listType) {
|
|
124
|
-
itemErrors.push({
|
|
125
|
-
field: 'id',
|
|
126
|
-
message: `List item with id ${itemId} does not belong to list type ${listType}`,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
} else {
|
|
130
|
-
// If no ID provided, check if item exists by name or code (for upsert)
|
|
131
|
-
const existingByName = name ? existingItemsByName.get(name.toLowerCase()) : null;
|
|
132
|
-
const existingByCode = code ? existingItemsByCode.get(code.toLowerCase()) : null;
|
|
133
|
-
|
|
134
|
-
// If both name and code match the same item, it's an update - use that item's ID
|
|
135
|
-
if (existingByName && existingByCode && existingByName.id === existingByCode.id) {
|
|
136
|
-
existingItem = existingByName;
|
|
137
|
-
effectiveItemId = existingItem.id; // Automatically use the existing item's ID
|
|
138
|
-
}
|
|
139
|
-
// If name matches one item and code matches a different item, it's a conflict
|
|
140
|
-
else if (existingByName && existingByCode && existingByName.id !== existingByCode.id) {
|
|
141
|
-
itemErrors.push({
|
|
142
|
-
field: 'name',
|
|
143
|
-
message: `Name "${name}" belongs to item with code "${existingByName.code}"`,
|
|
144
|
-
});
|
|
145
|
-
itemErrors.push({
|
|
146
|
-
field: 'code',
|
|
147
|
-
message: `Code "${code}" belongs to item with name "${existingByCode.name}"`,
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
// If only name matches, it's a conflict (trying to create with existing name but different code)
|
|
151
|
-
else if (existingByName) {
|
|
152
|
-
itemErrors.push({
|
|
153
|
-
field: 'name',
|
|
154
|
-
message: `List item with name "${name}" already exists with code "${existingByName.code}"`,
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
// If only code matches, it's a conflict (trying to create with existing code but different name)
|
|
158
|
-
else if (existingByCode) {
|
|
159
|
-
itemErrors.push({
|
|
160
|
-
field: 'code',
|
|
161
|
-
message: `List item with code "${code}" already exists with name "${existingByCode.name}"`,
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Check for duplicates within the current batch
|
|
167
|
-
if (name) {
|
|
168
|
-
const duplicateInBatch = processedItems.find(
|
|
169
|
-
(other, otherIndex) =>
|
|
170
|
-
otherIndex < index &&
|
|
171
|
-
other.name?.toLowerCase() === name.toLowerCase() &&
|
|
172
|
-
(!effectiveItemId || other.itemId !== effectiveItemId)
|
|
173
|
-
);
|
|
174
|
-
if (duplicateInBatch) {
|
|
175
|
-
itemErrors.push({
|
|
176
|
-
field: 'name',
|
|
177
|
-
message: `Duplicate name "${name}" found in batch at row ${duplicateInBatch.index}`,
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
if (code) {
|
|
183
|
-
const duplicateCodeInBatch = processedItems.find(
|
|
184
|
-
(other, otherIndex) =>
|
|
185
|
-
otherIndex < index &&
|
|
186
|
-
other.code?.toLowerCase() === code.toLowerCase() &&
|
|
187
|
-
(!effectiveItemId || other.itemId !== effectiveItemId)
|
|
188
|
-
);
|
|
189
|
-
if (duplicateCodeInBatch) {
|
|
190
|
-
itemErrors.push({
|
|
191
|
-
field: 'code',
|
|
192
|
-
message: `Duplicate code "${code}" found in batch at row ${duplicateCodeInBatch.index}`,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// If there are validation errors, add to errors array
|
|
198
|
-
if (itemErrors.length > 0) {
|
|
199
|
-
errors.push({
|
|
200
|
-
row: index,
|
|
201
|
-
errors: itemErrors,
|
|
202
|
-
});
|
|
203
|
-
} else {
|
|
204
|
-
validItems.push({
|
|
205
|
-
...processedItem,
|
|
206
|
-
existingItem,
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// Step 4: Process valid items (create or update)
|
|
212
|
-
for (const validItem of validItems) {
|
|
213
|
-
const { index, name, code, itemId, existingItem, ...restOfItem } = validItem;
|
|
214
|
-
|
|
215
|
-
try {
|
|
216
|
-
if (existingItem) {
|
|
217
|
-
// Update existing item
|
|
218
|
-
await this.updateEntity(
|
|
219
|
-
{
|
|
220
|
-
...restOfItem,
|
|
221
|
-
id: existingItem.id, // Use the existing item's ID
|
|
222
|
-
name,
|
|
223
|
-
code,
|
|
224
|
-
listtype: listType,
|
|
225
|
-
},
|
|
226
|
-
loggedInUser,
|
|
227
|
-
);
|
|
228
|
-
} else {
|
|
229
|
-
// Create new item
|
|
230
|
-
await this.createEntity(
|
|
231
|
-
{
|
|
232
|
-
...restOfItem,
|
|
233
|
-
name,
|
|
234
|
-
code,
|
|
235
|
-
listtype: listType,
|
|
236
|
-
value: '',
|
|
237
|
-
},
|
|
238
|
-
loggedInUser,
|
|
239
|
-
);
|
|
240
|
-
}
|
|
241
|
-
} catch (error) {
|
|
242
|
-
// Catch any runtime errors during create/update
|
|
243
|
-
errors.push({
|
|
244
|
-
row: index,
|
|
245
|
-
errors: [
|
|
246
|
-
{
|
|
247
|
-
field: 'general',
|
|
248
|
-
message: error.message || 'An error occurred while processing the item',
|
|
249
|
-
},
|
|
250
|
-
],
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// Step 5: Fetch updated items and return response
|
|
256
|
-
const updatedItems = await this.listItemsRepo.findAllItemsByListType(
|
|
257
|
-
listType,
|
|
258
|
-
'asc',
|
|
259
|
-
entId,
|
|
260
|
-
);
|
|
261
|
-
|
|
262
|
-
return {
|
|
263
|
-
success: errors.length === 0,
|
|
264
|
-
listType,
|
|
265
|
-
errors,
|
|
266
|
-
items: updatedItems,
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
async deleteListMasterItem(listType: string, code: string): Promise<string> {
|
|
271
|
-
const item = await this.listItemsRepo.findOneByCondition({
|
|
272
|
-
code,
|
|
273
|
-
listtype: listType,
|
|
274
|
-
});
|
|
275
|
-
if (!item) {
|
|
276
|
-
throw new NotFoundException(
|
|
277
|
-
`Item with name ${code} not found in type ${listType}`,
|
|
278
|
-
);
|
|
279
|
-
}
|
|
280
|
-
await this.listItemsRepo.delete({ code, listtype: listType });
|
|
281
|
-
return `Item with name ${code} deleted successfully from type ${listType}`;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
async getListSourceType(
|
|
285
|
-
loggedInUser: UserData,
|
|
286
|
-
source: string,
|
|
287
|
-
): Promise<any> {
|
|
288
|
-
return await this.listMasterRepo.findByEnterpriseIdAndSource(loggedInUser.enterprise_id, source);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
// async getResolvedListMasterItems(
|
|
292
|
-
// loggedInUser: UserData,
|
|
293
|
-
// entityData: any,
|
|
294
|
-
// entityType: string,
|
|
295
|
-
// ): Promise<any> {
|
|
296
|
-
// const attributeItems =
|
|
297
|
-
// await this.attributeMasterService.findAttributesByMappedEntityType(
|
|
298
|
-
// entityType,
|
|
299
|
-
// loggedInUser,
|
|
300
|
-
// );
|
|
301
|
-
|
|
302
|
-
// const masterAttributes = attributeItems.filter(
|
|
303
|
-
// (attr) => attr.data_source_type === 'master',
|
|
304
|
-
// );
|
|
305
|
-
|
|
306
|
-
// const resolvedEntityData = { ...entityData };
|
|
307
|
-
|
|
308
|
-
// for (const attr of masterAttributes) {
|
|
309
|
-
// const field = attr.attribute_key;
|
|
310
|
-
// const codeValue = entityData[field];
|
|
311
|
-
// if (!codeValue) continue;
|
|
312
|
-
|
|
313
|
-
// const listItems = await this.listItemsRepo.findById(codeValue);
|
|
314
|
-
// if (!listItems) continue;
|
|
315
|
-
|
|
316
|
-
// }
|
|
317
|
-
|
|
318
|
-
// return resolvedEntityData;
|
|
319
|
-
// }
|
|
320
|
-
|
|
321
|
-
// async getResolvedListMasterItems(
|
|
322
|
-
// loggedInUser: UserData,
|
|
323
|
-
// entityData: any,
|
|
324
|
-
// entityType: string,
|
|
325
|
-
// ): Promise<any> {
|
|
326
|
-
// // const resolvedEntityData = super.getResolvedData(
|
|
327
|
-
// // loggedInUser,
|
|
328
|
-
// // entityData,
|
|
329
|
-
// // entityType,
|
|
330
|
-
// // );
|
|
331
|
-
// // const attributeItems =
|
|
332
|
-
// // await this.attributeMasterService.findAttributesByMappedEntityType(
|
|
333
|
-
// // entityType,
|
|
334
|
-
// // loggedInUser,
|
|
335
|
-
// // );
|
|
336
|
-
// // const resolvedEntityData = { ...entityData };
|
|
337
|
-
// // for (const attr of attributeItems) {
|
|
338
|
-
// // const field = attr.attribute_key;
|
|
339
|
-
// // const codeValue = entityData[field];
|
|
340
|
-
// // if (!codeValue) continue;
|
|
341
|
-
// // // ---------- ENTITY data_source_type ----------
|
|
342
|
-
// // if (attr.data_source_type === 'entity') {
|
|
343
|
-
// // if (Array.isArray(codeValue)) {
|
|
344
|
-
// // const resolvedValues: string[] = [];
|
|
345
|
-
// // for (const code of codeValue) {
|
|
346
|
-
// // const item = await super.getEntityData(
|
|
347
|
-
// // attr.datasource_list,
|
|
348
|
-
// // code,
|
|
349
|
-
// // loggedInUser,
|
|
350
|
-
// // );
|
|
351
|
-
// // resolvedValues.push(item?.[attr.data_source_attribute] ?? code);
|
|
352
|
-
// // }
|
|
353
|
-
// // resolvedEntityData[field] = resolvedValues;
|
|
354
|
-
// // } else {
|
|
355
|
-
// // const item = await super.getEntityData(
|
|
356
|
-
// // attr.datasource_list,
|
|
357
|
-
// // codeValue,
|
|
358
|
-
// // loggedInUser,
|
|
359
|
-
// // );
|
|
360
|
-
// // resolvedEntityData[field] =
|
|
361
|
-
// // item?.[attr.data_source_attribute] ?? codeValue;
|
|
362
|
-
// // }
|
|
363
|
-
// // }
|
|
364
|
-
// // // ---------- MASTER data_source_type ----------
|
|
365
|
-
// // else if (attr.data_source_type === 'master') {
|
|
366
|
-
// // if (Array.isArray(codeValue)) {
|
|
367
|
-
// // const resolvedValues: string[] = [];
|
|
368
|
-
// // for (const code of codeValue) {
|
|
369
|
-
// // const item = await this.listItemsRepo.findById(code);
|
|
370
|
-
// // resolvedValues.push(item?.[attr.data_source_attribute] ?? code);
|
|
371
|
-
// // }
|
|
372
|
-
// // resolvedEntityData[field] = resolvedValues;
|
|
373
|
-
// // } else {
|
|
374
|
-
// // const item = await this.listItemsRepo.findById(codeValue);
|
|
375
|
-
// // resolvedEntityData[field] =
|
|
376
|
-
// // item?.[attr.data_source_attribute] ?? codeValue;
|
|
377
|
-
// // }
|
|
378
|
-
// // }
|
|
379
|
-
// // }
|
|
380
|
-
// // return resolvedEntityData;
|
|
381
|
-
// }
|
|
382
|
-
}
|
|
1
|
+
import { DataSource } from 'typeorm';
|
|
2
|
+
import { BadRequestException, forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';
|
|
3
|
+
import { ListMasterItemsRepository } from '../repository/list-master-items.repository';
|
|
4
|
+
import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
|
|
5
|
+
import { UserData } from 'src/module/auth/dto/user.dto';
|
|
6
|
+
import { CodeGeneratorService } from 'src/utils/service/codeGenerator.service';
|
|
7
|
+
import { AttributeMasterService } from 'src/module/meta/service/attribute-master.service';
|
|
8
|
+
import { ListMasterRepository } from '../repository/list-master.repository';
|
|
9
|
+
|
|
10
|
+
@Injectable()
|
|
11
|
+
export class ListMasterItemService extends EntityServiceImpl {
|
|
12
|
+
constructor(
|
|
13
|
+
private readonly listItemsRepo: ListMasterItemsRepository,
|
|
14
|
+
private readonly listMasterRepo: ListMasterRepository,
|
|
15
|
+
@Inject(forwardRef(() => EntityServiceImpl))
|
|
16
|
+
private readonly entityServiceImpl: EntityServiceImpl,
|
|
17
|
+
@Inject('AttributeMasterService')
|
|
18
|
+
protected readonly attributeMasterService: AttributeMasterService,
|
|
19
|
+
private readonly dataSource: DataSource,
|
|
20
|
+
) {
|
|
21
|
+
super();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async getListMasterItemsByType(
|
|
25
|
+
listType: string,
|
|
26
|
+
enterprise_id: number,
|
|
27
|
+
search?: string,
|
|
28
|
+
) {
|
|
29
|
+
// this method retrieves all list master items for a specific type and organization
|
|
30
|
+
return this.listItemsRepo.findAllItemsByListType(
|
|
31
|
+
listType,
|
|
32
|
+
'asc',
|
|
33
|
+
enterprise_id,
|
|
34
|
+
search,
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async createEntity(entityData: any, loggedInUser: UserData): Promise<any> {
|
|
39
|
+
try {
|
|
40
|
+
const generatedCode = CodeGeneratorService.generateCode(entityData.code);
|
|
41
|
+
|
|
42
|
+
entityData.code = generatedCode;
|
|
43
|
+
entityData.value = generatedCode;
|
|
44
|
+
|
|
45
|
+
return await this.entityServiceImpl.createEntity(
|
|
46
|
+
entityData,
|
|
47
|
+
loggedInUser,
|
|
48
|
+
);
|
|
49
|
+
} catch (error) {
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async updateEntity(entityData: any, loggedInUser: UserData): Promise<any> {
|
|
55
|
+
return await this.entityServiceImpl.updateEntity(entityData, loggedInUser);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async upsertListMasterItem(
|
|
59
|
+
listType: string,
|
|
60
|
+
items: any[],
|
|
61
|
+
loggedInUser,
|
|
62
|
+
): Promise<any> {
|
|
63
|
+
const entId = loggedInUser.enterprise_id;
|
|
64
|
+
const errors: any[] = [];
|
|
65
|
+
|
|
66
|
+
// Step 1: Validate and prepare items
|
|
67
|
+
const processedItems = items.map((item, index) => ({
|
|
68
|
+
...item,
|
|
69
|
+
index,
|
|
70
|
+
name: item.name?.trim(),
|
|
71
|
+
code: item.code?.trim(),
|
|
72
|
+
itemId: item.id,
|
|
73
|
+
}));
|
|
74
|
+
|
|
75
|
+
// Step 2: Fetch all existing items for this list type in one query
|
|
76
|
+
const existingItems = await this.listItemsRepo.findAllItemsByListType(
|
|
77
|
+
listType,
|
|
78
|
+
'asc',
|
|
79
|
+
entId,
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
// Create lookup maps for efficient validation
|
|
83
|
+
const existingItemsById = new Map(existingItems.map(item => [item.id, item]));
|
|
84
|
+
const existingItemsByName = new Map(existingItems.map(item => [item.name?.toLowerCase(), item]));
|
|
85
|
+
const existingItemsByCode = new Map(
|
|
86
|
+
existingItems.filter(item => item.code).map(item => [item.code?.toLowerCase(), item])
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
// Step 3: Validate all items and collect errors
|
|
90
|
+
const validItems: any[] = [];
|
|
91
|
+
|
|
92
|
+
for (const processedItem of processedItems) {
|
|
93
|
+
const { index, name, code, itemId } = processedItem;
|
|
94
|
+
const itemErrors: any[] = [];
|
|
95
|
+
|
|
96
|
+
// Validate required fields - both name and code are required
|
|
97
|
+
if (!name) {
|
|
98
|
+
itemErrors.push({
|
|
99
|
+
field: 'name',
|
|
100
|
+
message: 'Name is required',
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (!code) {
|
|
105
|
+
itemErrors.push({
|
|
106
|
+
field: 'code',
|
|
107
|
+
message: 'Code is required',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Determine if this is an update by checking for existing item
|
|
112
|
+
let existingItem: any = null;
|
|
113
|
+
let effectiveItemId = itemId; // Track the ID we'll use for this item
|
|
114
|
+
|
|
115
|
+
// First, check if ID is provided and exists
|
|
116
|
+
if (itemId) {
|
|
117
|
+
existingItem = existingItemsById.get(itemId) || null;
|
|
118
|
+
if (!existingItem) {
|
|
119
|
+
itemErrors.push({
|
|
120
|
+
field: 'id',
|
|
121
|
+
message: `List item with id ${itemId} not found`,
|
|
122
|
+
});
|
|
123
|
+
} else if (existingItem.listtype !== listType) {
|
|
124
|
+
itemErrors.push({
|
|
125
|
+
field: 'id',
|
|
126
|
+
message: `List item with id ${itemId} does not belong to list type ${listType}`,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
} else {
|
|
130
|
+
// If no ID provided, check if item exists by name or code (for upsert)
|
|
131
|
+
const existingByName = name ? existingItemsByName.get(name.toLowerCase()) : null;
|
|
132
|
+
const existingByCode = code ? existingItemsByCode.get(code.toLowerCase()) : null;
|
|
133
|
+
|
|
134
|
+
// If both name and code match the same item, it's an update - use that item's ID
|
|
135
|
+
if (existingByName && existingByCode && existingByName.id === existingByCode.id) {
|
|
136
|
+
existingItem = existingByName;
|
|
137
|
+
effectiveItemId = existingItem.id; // Automatically use the existing item's ID
|
|
138
|
+
}
|
|
139
|
+
// If name matches one item and code matches a different item, it's a conflict
|
|
140
|
+
else if (existingByName && existingByCode && existingByName.id !== existingByCode.id) {
|
|
141
|
+
itemErrors.push({
|
|
142
|
+
field: 'name',
|
|
143
|
+
message: `Name "${name}" belongs to item with code "${existingByName.code}"`,
|
|
144
|
+
});
|
|
145
|
+
itemErrors.push({
|
|
146
|
+
field: 'code',
|
|
147
|
+
message: `Code "${code}" belongs to item with name "${existingByCode.name}"`,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
// If only name matches, it's a conflict (trying to create with existing name but different code)
|
|
151
|
+
else if (existingByName) {
|
|
152
|
+
itemErrors.push({
|
|
153
|
+
field: 'name',
|
|
154
|
+
message: `List item with name "${name}" already exists with code "${existingByName.code}"`,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// If only code matches, it's a conflict (trying to create with existing code but different name)
|
|
158
|
+
else if (existingByCode) {
|
|
159
|
+
itemErrors.push({
|
|
160
|
+
field: 'code',
|
|
161
|
+
message: `List item with code "${code}" already exists with name "${existingByCode.name}"`,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Check for duplicates within the current batch
|
|
167
|
+
if (name) {
|
|
168
|
+
const duplicateInBatch = processedItems.find(
|
|
169
|
+
(other, otherIndex) =>
|
|
170
|
+
otherIndex < index &&
|
|
171
|
+
other.name?.toLowerCase() === name.toLowerCase() &&
|
|
172
|
+
(!effectiveItemId || other.itemId !== effectiveItemId)
|
|
173
|
+
);
|
|
174
|
+
if (duplicateInBatch) {
|
|
175
|
+
itemErrors.push({
|
|
176
|
+
field: 'name',
|
|
177
|
+
message: `Duplicate name "${name}" found in batch at row ${duplicateInBatch.index}`,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (code) {
|
|
183
|
+
const duplicateCodeInBatch = processedItems.find(
|
|
184
|
+
(other, otherIndex) =>
|
|
185
|
+
otherIndex < index &&
|
|
186
|
+
other.code?.toLowerCase() === code.toLowerCase() &&
|
|
187
|
+
(!effectiveItemId || other.itemId !== effectiveItemId)
|
|
188
|
+
);
|
|
189
|
+
if (duplicateCodeInBatch) {
|
|
190
|
+
itemErrors.push({
|
|
191
|
+
field: 'code',
|
|
192
|
+
message: `Duplicate code "${code}" found in batch at row ${duplicateCodeInBatch.index}`,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// If there are validation errors, add to errors array
|
|
198
|
+
if (itemErrors.length > 0) {
|
|
199
|
+
errors.push({
|
|
200
|
+
row: index,
|
|
201
|
+
errors: itemErrors,
|
|
202
|
+
});
|
|
203
|
+
} else {
|
|
204
|
+
validItems.push({
|
|
205
|
+
...processedItem,
|
|
206
|
+
existingItem,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Step 4: Process valid items (create or update)
|
|
212
|
+
for (const validItem of validItems) {
|
|
213
|
+
const { index, name, code, itemId, existingItem, ...restOfItem } = validItem;
|
|
214
|
+
|
|
215
|
+
try {
|
|
216
|
+
if (existingItem) {
|
|
217
|
+
// Update existing item
|
|
218
|
+
await this.updateEntity(
|
|
219
|
+
{
|
|
220
|
+
...restOfItem,
|
|
221
|
+
id: existingItem.id, // Use the existing item's ID
|
|
222
|
+
name,
|
|
223
|
+
code,
|
|
224
|
+
listtype: listType,
|
|
225
|
+
},
|
|
226
|
+
loggedInUser,
|
|
227
|
+
);
|
|
228
|
+
} else {
|
|
229
|
+
// Create new item
|
|
230
|
+
await this.createEntity(
|
|
231
|
+
{
|
|
232
|
+
...restOfItem,
|
|
233
|
+
name,
|
|
234
|
+
code,
|
|
235
|
+
listtype: listType,
|
|
236
|
+
value: '',
|
|
237
|
+
},
|
|
238
|
+
loggedInUser,
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
} catch (error) {
|
|
242
|
+
// Catch any runtime errors during create/update
|
|
243
|
+
errors.push({
|
|
244
|
+
row: index,
|
|
245
|
+
errors: [
|
|
246
|
+
{
|
|
247
|
+
field: 'general',
|
|
248
|
+
message: error.message || 'An error occurred while processing the item',
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Step 5: Fetch updated items and return response
|
|
256
|
+
const updatedItems = await this.listItemsRepo.findAllItemsByListType(
|
|
257
|
+
listType,
|
|
258
|
+
'asc',
|
|
259
|
+
entId,
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
return {
|
|
263
|
+
success: errors.length === 0,
|
|
264
|
+
listType,
|
|
265
|
+
errors,
|
|
266
|
+
items: updatedItems,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
async deleteListMasterItem(listType: string, code: string): Promise<string> {
|
|
271
|
+
const item = await this.listItemsRepo.findOneByCondition({
|
|
272
|
+
code,
|
|
273
|
+
listtype: listType,
|
|
274
|
+
});
|
|
275
|
+
if (!item) {
|
|
276
|
+
throw new NotFoundException(
|
|
277
|
+
`Item with name ${code} not found in type ${listType}`,
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
await this.listItemsRepo.delete({ code, listtype: listType });
|
|
281
|
+
return `Item with name ${code} deleted successfully from type ${listType}`;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
async getListSourceType(
|
|
285
|
+
loggedInUser: UserData,
|
|
286
|
+
source: string,
|
|
287
|
+
): Promise<any> {
|
|
288
|
+
return await this.listMasterRepo.findByEnterpriseIdAndSource(loggedInUser.enterprise_id, source);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// async getResolvedListMasterItems(
|
|
292
|
+
// loggedInUser: UserData,
|
|
293
|
+
// entityData: any,
|
|
294
|
+
// entityType: string,
|
|
295
|
+
// ): Promise<any> {
|
|
296
|
+
// const attributeItems =
|
|
297
|
+
// await this.attributeMasterService.findAttributesByMappedEntityType(
|
|
298
|
+
// entityType,
|
|
299
|
+
// loggedInUser,
|
|
300
|
+
// );
|
|
301
|
+
|
|
302
|
+
// const masterAttributes = attributeItems.filter(
|
|
303
|
+
// (attr) => attr.data_source_type === 'master',
|
|
304
|
+
// );
|
|
305
|
+
|
|
306
|
+
// const resolvedEntityData = { ...entityData };
|
|
307
|
+
|
|
308
|
+
// for (const attr of masterAttributes) {
|
|
309
|
+
// const field = attr.attribute_key;
|
|
310
|
+
// const codeValue = entityData[field];
|
|
311
|
+
// if (!codeValue) continue;
|
|
312
|
+
|
|
313
|
+
// const listItems = await this.listItemsRepo.findById(codeValue);
|
|
314
|
+
// if (!listItems) continue;
|
|
315
|
+
|
|
316
|
+
// }
|
|
317
|
+
|
|
318
|
+
// return resolvedEntityData;
|
|
319
|
+
// }
|
|
320
|
+
|
|
321
|
+
// async getResolvedListMasterItems(
|
|
322
|
+
// loggedInUser: UserData,
|
|
323
|
+
// entityData: any,
|
|
324
|
+
// entityType: string,
|
|
325
|
+
// ): Promise<any> {
|
|
326
|
+
// // const resolvedEntityData = super.getResolvedData(
|
|
327
|
+
// // loggedInUser,
|
|
328
|
+
// // entityData,
|
|
329
|
+
// // entityType,
|
|
330
|
+
// // );
|
|
331
|
+
// // const attributeItems =
|
|
332
|
+
// // await this.attributeMasterService.findAttributesByMappedEntityType(
|
|
333
|
+
// // entityType,
|
|
334
|
+
// // loggedInUser,
|
|
335
|
+
// // );
|
|
336
|
+
// // const resolvedEntityData = { ...entityData };
|
|
337
|
+
// // for (const attr of attributeItems) {
|
|
338
|
+
// // const field = attr.attribute_key;
|
|
339
|
+
// // const codeValue = entityData[field];
|
|
340
|
+
// // if (!codeValue) continue;
|
|
341
|
+
// // // ---------- ENTITY data_source_type ----------
|
|
342
|
+
// // if (attr.data_source_type === 'entity') {
|
|
343
|
+
// // if (Array.isArray(codeValue)) {
|
|
344
|
+
// // const resolvedValues: string[] = [];
|
|
345
|
+
// // for (const code of codeValue) {
|
|
346
|
+
// // const item = await super.getEntityData(
|
|
347
|
+
// // attr.datasource_list,
|
|
348
|
+
// // code,
|
|
349
|
+
// // loggedInUser,
|
|
350
|
+
// // );
|
|
351
|
+
// // resolvedValues.push(item?.[attr.data_source_attribute] ?? code);
|
|
352
|
+
// // }
|
|
353
|
+
// // resolvedEntityData[field] = resolvedValues;
|
|
354
|
+
// // } else {
|
|
355
|
+
// // const item = await super.getEntityData(
|
|
356
|
+
// // attr.datasource_list,
|
|
357
|
+
// // codeValue,
|
|
358
|
+
// // loggedInUser,
|
|
359
|
+
// // );
|
|
360
|
+
// // resolvedEntityData[field] =
|
|
361
|
+
// // item?.[attr.data_source_attribute] ?? codeValue;
|
|
362
|
+
// // }
|
|
363
|
+
// // }
|
|
364
|
+
// // // ---------- MASTER data_source_type ----------
|
|
365
|
+
// // else if (attr.data_source_type === 'master') {
|
|
366
|
+
// // if (Array.isArray(codeValue)) {
|
|
367
|
+
// // const resolvedValues: string[] = [];
|
|
368
|
+
// // for (const code of codeValue) {
|
|
369
|
+
// // const item = await this.listItemsRepo.findById(code);
|
|
370
|
+
// // resolvedValues.push(item?.[attr.data_source_attribute] ?? code);
|
|
371
|
+
// // }
|
|
372
|
+
// // resolvedEntityData[field] = resolvedValues;
|
|
373
|
+
// // } else {
|
|
374
|
+
// // const item = await this.listItemsRepo.findById(codeValue);
|
|
375
|
+
// // resolvedEntityData[field] =
|
|
376
|
+
// // item?.[attr.data_source_attribute] ?? codeValue;
|
|
377
|
+
// // }
|
|
378
|
+
// // }
|
|
379
|
+
// // }
|
|
380
|
+
// // return resolvedEntityData;
|
|
381
|
+
// }
|
|
382
|
+
}
|