rez_core 5.0.176 → 5.0.178

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.
Files changed (477) hide show
  1. package/.claude/settings.local.json +26 -0
  2. package/.idea/250218_nodejs_core.iml +8 -11
  3. package/.idea/codeStyles/Project.xml +58 -58
  4. package/.idea/codeStyles/codeStyleConfig.xml +4 -4
  5. package/.idea/copilot.data.migration.agent.xml +6 -0
  6. package/.idea/copilot.data.migration.ask.xml +6 -0
  7. package/.idea/copilot.data.migration.ask2agent.xml +6 -0
  8. package/.idea/copilot.data.migration.edit.xml +6 -0
  9. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  10. package/.idea/misc.xml +6 -0
  11. package/.idea/modules.xml +7 -7
  12. package/.idea/prettier.xml +6 -0
  13. package/.idea/vcs.xml +5 -5
  14. package/.prettierrc +3 -3
  15. package/README.md +99 -99
  16. package/dist/module/auth/guards/role.guard.js +3 -3
  17. package/dist/module/dashboard/controller/dashboard.controller.js +2 -0
  18. package/dist/module/dashboard/controller/dashboard.controller.js.map +1 -1
  19. package/dist/module/dashboard/repository/dashboard.repository.d.ts +2 -2
  20. package/dist/module/dashboard/repository/dashboard.repository.js +5 -6
  21. package/dist/module/dashboard/repository/dashboard.repository.js.map +1 -1
  22. package/dist/module/dashboard/service/dashboard.service.js +3 -3
  23. package/dist/module/dashboard/service/dashboard.service.js.map +1 -1
  24. package/dist/module/filter/service/filter.service.js +22 -25
  25. package/dist/module/filter/service/filter.service.js.map +1 -1
  26. package/dist/module/integration/examples/usage.example.js +9 -9
  27. package/dist/module/layout_preference/service/layout_preference.service.js +2 -2
  28. package/dist/module/layout_preference/service/layout_preference.service.js.map +1 -1
  29. package/dist/module/linked_attributes/service/linked_attributes.service.js +7 -8
  30. package/dist/module/linked_attributes/service/linked_attributes.service.js.map +1 -1
  31. package/dist/module/listmaster/repository/list-master-items.repository.d.ts +3 -3
  32. package/dist/module/listmaster/repository/list-master-items.repository.js +7 -7
  33. package/dist/module/listmaster/repository/list-master-items.repository.js.map +1 -1
  34. package/dist/module/listmaster/repository/list-master.repository.d.ts +2 -2
  35. package/dist/module/listmaster/repository/list-master.repository.js +4 -4
  36. package/dist/module/listmaster/repository/list-master.repository.js.map +1 -1
  37. package/dist/module/listmaster/service/list-master-item.service.js +1 -2
  38. package/dist/module/listmaster/service/list-master-item.service.js.map +1 -1
  39. package/dist/module/listmaster/service/list-master.service.d.ts +2 -4
  40. package/dist/module/listmaster/service/list-master.service.js +19 -23
  41. package/dist/module/listmaster/service/list-master.service.js.map +1 -1
  42. package/dist/module/mapper/repository/mapper.repository.d.ts +1 -1
  43. package/dist/module/mapper/repository/mapper.repository.js +2 -2
  44. package/dist/module/mapper/repository/mapper.repository.js.map +1 -1
  45. package/dist/module/mapper/service/mapper.service.d.ts +2 -3
  46. package/dist/module/mapper/service/mapper.service.js +6 -8
  47. package/dist/module/mapper/service/mapper.service.js.map +1 -1
  48. package/dist/module/master/service/master.service.d.ts +4 -5
  49. package/dist/module/master/service/master.service.js +14 -14
  50. package/dist/module/master/service/master.service.js.map +1 -1
  51. package/dist/module/meta/repository/attribute-master.repository.js +8 -8
  52. package/dist/module/meta/repository/entity-master.repository.js +1 -1
  53. package/dist/module/meta/repository/entity-master.repository.js.map +1 -1
  54. package/dist/module/meta/service/attribute-master.service.js +1 -0
  55. package/dist/module/meta/service/attribute-master.service.js.map +1 -1
  56. package/dist/module/meta/service/entity-dynamic.service.js +28 -28
  57. package/dist/module/meta/service/entity-dynamic.service.js.map +1 -1
  58. package/dist/module/meta/service/entity-table.service.js +1 -1
  59. package/dist/module/meta/service/entity-table.service.js.map +1 -1
  60. package/dist/module/meta/service/media-data.service.js +6 -6
  61. package/dist/module/meta/service/resolver.service.js +26 -35
  62. package/dist/module/meta/service/resolver.service.js.map +1 -1
  63. package/dist/module/module/repository/menu.repository.js +4 -4
  64. package/dist/module/notification/service/notification.service.js +6 -6
  65. package/dist/module/user/controller/login.controller.js +18 -18
  66. package/dist/module/workflow/controller/stage-group.controller.js +3 -2
  67. package/dist/module/workflow/controller/stage-group.controller.js.map +1 -1
  68. package/dist/module/workflow/controller/stage.controller.js +5 -4
  69. package/dist/module/workflow/controller/stage.controller.js.map +1 -1
  70. package/dist/module/workflow/repository/action-data.repository.js +3 -2
  71. package/dist/module/workflow/repository/action-data.repository.js.map +1 -1
  72. package/dist/module/workflow/repository/action.repository.js +2 -2
  73. package/dist/module/workflow/repository/stage-group.repository.d.ts +1 -1
  74. package/dist/module/workflow/repository/stage-group.repository.js +4 -4
  75. package/dist/module/workflow/repository/stage-group.repository.js.map +1 -1
  76. package/dist/module/workflow/repository/stage-movement.repository.js +1 -1
  77. package/dist/module/workflow/repository/stage-movement.repository.js.map +1 -1
  78. package/dist/module/workflow/repository/stage.repository.d.ts +3 -3
  79. package/dist/module/workflow/repository/stage.repository.js +17 -17
  80. package/dist/module/workflow/repository/stage.repository.js.map +1 -1
  81. package/dist/module/workflow/repository/task.repository.d.ts +6 -2
  82. package/dist/module/workflow/repository/task.repository.js +13 -12
  83. package/dist/module/workflow/repository/task.repository.js.map +1 -1
  84. package/dist/module/workflow/service/action-template-mapping.service.js +8 -11
  85. package/dist/module/workflow/service/action-template-mapping.service.js.map +1 -1
  86. package/dist/module/workflow/service/action.service.js +5 -5
  87. package/dist/module/workflow/service/comm-template.service.js +1 -0
  88. package/dist/module/workflow/service/comm-template.service.js.map +1 -1
  89. package/dist/module/workflow/service/entity-modification.service.js +2 -2
  90. package/dist/module/workflow/service/stage-group.service.d.ts +1 -1
  91. package/dist/module/workflow/service/stage-group.service.js +4 -4
  92. package/dist/module/workflow/service/stage-group.service.js.map +1 -1
  93. package/dist/module/workflow/service/stage.service.d.ts +3 -6
  94. package/dist/module/workflow/service/stage.service.js +9 -15
  95. package/dist/module/workflow/service/stage.service.js.map +1 -1
  96. package/dist/module/workflow/service/task.service.js +14 -13
  97. package/dist/module/workflow/service/task.service.js.map +1 -1
  98. package/dist/module/workflow/service/workflow-meta.service.js +4 -3
  99. package/dist/module/workflow/service/workflow-meta.service.js.map +1 -1
  100. package/dist/module/workflow-automation/service/schedule-handler.service.js +9 -9
  101. package/dist/module/workflow-automation/service/workflow-automation.service.js +3 -5
  102. package/dist/module/workflow-automation/service/workflow-automation.service.js.map +1 -1
  103. package/dist/module/workflow-schedule/controller/workflow-schedule.controller.d.ts +1 -3
  104. package/dist/module/workflow-schedule/controller/workflow-schedule.controller.js +4 -6
  105. package/dist/module/workflow-schedule/controller/workflow-schedule.controller.js.map +1 -1
  106. package/dist/module/workflow-schedule/service/workflow-schedule.service.d.ts +2 -2
  107. package/dist/module/workflow-schedule/service/workflow-schedule.service.js +9 -10
  108. package/dist/module/workflow-schedule/service/workflow-schedule.service.js.map +1 -1
  109. package/dist/tsconfig.build.tsbuildinfo +1 -1
  110. package/dist/utils/service/reflection-helper.service.js +2 -2
  111. package/docs/modules/event-driven-integration-design.md +91 -91
  112. package/docs/modules/integration.md +250 -250
  113. package/eslint.config.mjs +34 -34
  114. package/nest-cli.json +14 -14
  115. package/package.json +125 -125
  116. package/server.log +850 -0
  117. package/src/app.controller.ts +12 -12
  118. package/src/app.module.ts +68 -68
  119. package/src/app.service.ts +8 -8
  120. package/src/config/bull.config.ts +69 -69
  121. package/src/config/config.module.ts +17 -17
  122. package/src/config/database.config.ts +48 -48
  123. package/src/constant/global.constant.ts +67 -67
  124. package/src/core.module.ts +94 -94
  125. package/src/decorators/roles.decorator.ts +7 -7
  126. package/src/dtos/response.dto.ts +6 -6
  127. package/src/dtos/response.ts +5 -5
  128. package/src/index.ts +1 -1
  129. package/src/module/auth/auth.module.ts +49 -49
  130. package/src/module/auth/controller/auth.controller.ts +28 -28
  131. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  132. package/src/module/auth/guards/jwt.guard.ts +22 -22
  133. package/src/module/auth/guards/role.guard.ts +68 -68
  134. package/src/module/auth/services/auth.service.ts +56 -56
  135. package/src/module/auth/services/jwt.service.ts +11 -11
  136. package/src/module/auth/strategies/google.strategy.ts +54 -54
  137. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  138. package/src/module/auth/strategies/local.strategy.ts +13 -13
  139. package/src/module/dashboard/controller/dashboard.controller.ts +38 -36
  140. package/src/module/dashboard/dashboard.module.ts +21 -21
  141. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  142. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  143. package/src/module/dashboard/repository/dashboard.repository.ts +49 -51
  144. package/src/module/dashboard/service/dashboard.service.ts +72 -73
  145. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  146. package/src/module/enterprise/enterprise.module.ts +45 -45
  147. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  148. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  149. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  150. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  151. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  152. package/src/module/enterprise/repository/school.repository.ts +272 -272
  153. package/src/module/enterprise/service/brand.service.ts +5 -5
  154. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  155. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  156. package/src/module/enterprise/service/organization.service.ts +145 -145
  157. package/src/module/entity_json/controller/entity_json.controller.ts +47 -47
  158. package/src/module/entity_json/entity/entityJson.entity.ts +39 -39
  159. package/src/module/entity_json/entity_json.module.ts +18 -18
  160. package/src/module/entity_json/service/entityJson.repository.ts +37 -37
  161. package/src/module/entity_json/service/entity_json.service.ts +241 -241
  162. package/src/module/export/controller/export.controller.ts +83 -83
  163. package/src/module/export/export.module.ts +14 -14
  164. package/src/module/export/service/export.service.ts +105 -105
  165. package/src/module/filter/controller/filter.controller.ts +87 -87
  166. package/src/module/filter/dto/filter-request.dto.ts +39 -39
  167. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  168. package/src/module/filter/entity/saved-filter-master.entity.ts +32 -32
  169. package/src/module/filter/filter.module.ts +33 -33
  170. package/src/module/filter/repository/saved-filter.repository.ts +258 -258
  171. package/src/module/filter/repository/saved.filter-detail.repository.ts +19 -19
  172. package/src/module/filter/service/filter-evaluator.service.ts +82 -82
  173. package/src/module/filter/service/filter.service.ts +1316 -1319
  174. package/src/module/filter/service/saved-filter.service.ts +164 -164
  175. package/src/module/ics/controller/ics.controller.ts +21 -21
  176. package/src/module/ics/dto/ics.dto.ts +55 -55
  177. package/src/module/ics/ics.module.ts +13 -13
  178. package/src/module/ics/service/ics.service.ts +57 -57
  179. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  180. package/src/module/integration/controller/integration.controller.ts +662 -662
  181. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  182. package/src/module/integration/dto/create-config.dto.ts +526 -526
  183. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  184. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  185. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  186. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  187. package/src/module/integration/examples/usage.example.ts +338 -338
  188. package/src/module/integration/factories/base.factory.ts +7 -7
  189. package/src/module/integration/factories/email.factory.ts +49 -49
  190. package/src/module/integration/factories/integration.factory.ts +121 -121
  191. package/src/module/integration/factories/sms.factory.ts +51 -51
  192. package/src/module/integration/factories/telephone.factory.ts +41 -41
  193. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  194. package/src/module/integration/integration.module.ts +110 -110
  195. package/src/module/integration/service/calendar-event.service.ts +118 -118
  196. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  197. package/src/module/integration/service/integration-queue.service.ts +229 -229
  198. package/src/module/integration/service/integration.service.ts +2634 -2634
  199. package/src/module/integration/service/oauth.service.ts +224 -224
  200. package/src/module/integration/service/wrapper.service.ts +753 -753
  201. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  202. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  203. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  204. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  205. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  206. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  207. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  208. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  209. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  210. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  211. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  212. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  213. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  214. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  215. package/src/module/layout/controller/layout.controller.ts +47 -47
  216. package/src/module/layout/entity/header-items.entity.ts +28 -28
  217. package/src/module/layout/entity/header-section.entity.ts +19 -19
  218. package/src/module/layout/layout.module.ts +21 -21
  219. package/src/module/layout/repository/header-items.repository.ts +18 -18
  220. package/src/module/layout/repository/header-section.repository.ts +22 -22
  221. package/src/module/layout/service/header-section.service.ts +25 -25
  222. package/src/module/layout_preference/controller/layout_preference.controller.ts +76 -76
  223. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  224. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  225. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  226. package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
  227. package/src/module/lead/controller/lead.controller.ts +30 -30
  228. package/src/module/lead/lead.module.ts +14 -14
  229. package/src/module/lead/repository/lead.repository.ts +41 -41
  230. package/src/module/lead/service/lead.service.ts +54 -54
  231. package/src/module/linked_attributes/controller/linked_attributes.controller.ts +37 -37
  232. package/src/module/linked_attributes/entity/linked_attribute.entity.ts +51 -51
  233. package/src/module/linked_attributes/linked_attributes.module.ts +16 -16
  234. package/src/module/linked_attributes/repository/linked_attribute.repository.ts +12 -12
  235. package/src/module/linked_attributes/service/linked_attributes.service.ts +73 -75
  236. package/src/module/listmaster/controller/list-master.controller.ts +230 -230
  237. package/src/module/listmaster/entity/list-master-items.entity.ts +43 -43
  238. package/src/module/listmaster/entity/list-master.entity.ts +33 -33
  239. package/src/module/listmaster/listmaster.module.ts +46 -46
  240. package/src/module/listmaster/repository/list-master-items.repository.ts +173 -173
  241. package/src/module/listmaster/repository/list-master.repository.ts +56 -56
  242. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  243. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  244. package/src/module/listmaster/service/list-master-item.service.ts +280 -281
  245. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  246. package/src/module/listmaster/service/list-master.service.ts +526 -535
  247. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  248. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  249. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  250. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  251. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  252. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  253. package/src/module/mapper/mapper.module.ts +35 -35
  254. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  255. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  256. package/src/module/mapper/repository/mapper.repository.ts +32 -32
  257. package/src/module/mapper/service/field-mapper.service.ts +269 -269
  258. package/src/module/mapper/service/mapper.service.ts +80 -81
  259. package/src/module/master/controller/master.controller.ts +74 -74
  260. package/src/module/master/service/master.service.ts +484 -483
  261. package/src/module/meta/controller/app-master.controller.ts +38 -38
  262. package/src/module/meta/controller/attribute-master.controller.ts +84 -84
  263. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  264. package/src/module/meta/controller/entity-master.controller.ts +41 -41
  265. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  266. package/src/module/meta/controller/entity.controller.ts +308 -308
  267. package/src/module/meta/controller/entity.public.controller.ts +75 -75
  268. package/src/module/meta/controller/media.controller.ts +135 -135
  269. package/src/module/meta/controller/meta.controller.ts +101 -101
  270. package/src/module/meta/controller/view-master.controller.ts +79 -79
  271. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  272. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  273. package/src/module/meta/dto/entity-table.dto.ts +12 -12
  274. package/src/module/meta/entity/app-master.entity.ts +37 -37
  275. package/src/module/meta/entity/attribute-master.entity.ts +92 -92
  276. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  277. package/src/module/meta/entity/entity-master.entity.ts +85 -85
  278. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  279. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  280. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  281. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  282. package/src/module/meta/entity/media-data.entity.ts +32 -32
  283. package/src/module/meta/entity/preference.entity.ts +62 -62
  284. package/src/module/meta/entity/view-master.entity.ts +41 -41
  285. package/src/module/meta/entity.module.ts +165 -165
  286. package/src/module/meta/repository/app-master.repository.ts +20 -20
  287. package/src/module/meta/repository/attribute-master.repository.ts +164 -164
  288. package/src/module/meta/repository/entity-attribute-update.repository.ts +48 -48
  289. package/src/module/meta/repository/entity-master.repository.ts +120 -120
  290. package/src/module/meta/repository/entity-relation.repository.ts +22 -22
  291. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  292. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  293. package/src/module/meta/repository/media-data.repository.ts +50 -50
  294. package/src/module/meta/repository/preference.repository.ts +20 -20
  295. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  296. package/src/module/meta/repository/view-master.repository.ts +42 -42
  297. package/src/module/meta/service/app-master.service.ts +37 -37
  298. package/src/module/meta/service/attribute-master.service.ts +132 -131
  299. package/src/module/meta/service/common.service.ts +9 -9
  300. package/src/module/meta/service/entity-attribute-update.service.ts +26 -26
  301. package/src/module/meta/service/entity-dynamic.service.ts +824 -824
  302. package/src/module/meta/service/entity-master.service.ts +171 -171
  303. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  304. package/src/module/meta/service/entity-relation.service.ts +74 -74
  305. package/src/module/meta/service/entity-service-impl.service.ts +388 -388
  306. package/src/module/meta/service/entity-table-column.service.ts +26 -26
  307. package/src/module/meta/service/entity-table.service.ts +157 -157
  308. package/src/module/meta/service/entity-validation.service.ts +188 -188
  309. package/src/module/meta/service/entity.service.ts +49 -49
  310. package/src/module/meta/service/field-group.service.ts +103 -103
  311. package/src/module/meta/service/media-data.service.ts +591 -591
  312. package/src/module/meta/service/populate-meta.service.ts +222 -222
  313. package/src/module/meta/service/preference.service.ts +16 -16
  314. package/src/module/meta/service/resolver.service.ts +280 -289
  315. package/src/module/meta/service/section-master.service.ts +104 -104
  316. package/src/module/meta/service/update-form-json.service.ts +22 -22
  317. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  318. package/src/module/meta/service/view-master.service.ts +127 -127
  319. package/src/module/microservice-client/microservice-clients.module.ts +13 -13
  320. package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
  321. package/src/module/microservice-client/service/microservice-clients.ts +4 -4
  322. package/src/module/module/controller/menu.controller.ts +15 -15
  323. package/src/module/module/controller/module-access.controller.ts +133 -133
  324. package/src/module/module/entity/menu.entity.ts +43 -43
  325. package/src/module/module/entity/module-access.entity.ts +25 -25
  326. package/src/module/module/entity/module-action.entity.ts +17 -17
  327. package/src/module/module/entity/module.entity.ts +52 -52
  328. package/src/module/module/module.module.ts +42 -42
  329. package/src/module/module/repository/menu.repository.ts +186 -186
  330. package/src/module/module/repository/module-access.repository.ts +344 -344
  331. package/src/module/module/service/menu.service.ts +82 -82
  332. package/src/module/module/service/module-access.service.ts +189 -189
  333. package/src/module/notification/controller/notification.controller.ts +58 -58
  334. package/src/module/notification/controller/otp.controller.ts +117 -117
  335. package/src/module/notification/entity/notification.entity.ts +26 -26
  336. package/src/module/notification/entity/otp.entity.ts +28 -28
  337. package/src/module/notification/firebase-admin.config.ts +22 -22
  338. package/src/module/notification/notification.module.ts +69 -69
  339. package/src/module/notification/repository/otp.repository.ts +27 -27
  340. package/src/module/notification/service/email.service.ts +127 -127
  341. package/src/module/notification/service/notification.service.ts +164 -164
  342. package/src/module/notification/service/otp.service.ts +133 -133
  343. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  344. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  345. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  346. package/src/module/third-party-module/third-party.module.ts +12 -12
  347. package/src/module/user/controller/login.controller.ts +198 -198
  348. package/src/module/user/controller/user.controller.ts +40 -40
  349. package/src/module/user/dto/create-user.dto.ts +62 -62
  350. package/src/module/user/dto/update-user.dto.ts +4 -4
  351. package/src/module/user/entity/role.entity.ts +33 -33
  352. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  353. package/src/module/user/entity/user-session.entity.ts +73 -73
  354. package/src/module/user/entity/user.entity.ts +62 -62
  355. package/src/module/user/repository/role.repository.ts +96 -96
  356. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  357. package/src/module/user/repository/user.repository.ts +50 -50
  358. package/src/module/user/repository/userSession.repository.ts +33 -33
  359. package/src/module/user/service/login.service.ts +326 -326
  360. package/src/module/user/service/role.service.ts +197 -197
  361. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  362. package/src/module/user/service/user-session.service.ts +200 -200
  363. package/src/module/user/service/user.service.ts +368 -368
  364. package/src/module/user/user.module.ts +65 -65
  365. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  366. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  367. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  368. package/src/module/workflow/controller/action.controller.ts +111 -111
  369. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  370. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  371. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  372. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  373. package/src/module/workflow/controller/stage-group.controller.ts +49 -48
  374. package/src/module/workflow/controller/stage.controller.ts +51 -50
  375. package/src/module/workflow/controller/task.controller.ts +77 -77
  376. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  377. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  378. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  379. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  380. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  381. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  382. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  383. package/src/module/workflow/entity/action.entity.ts +53 -53
  384. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  385. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  386. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  387. package/src/module/workflow/entity/form.entity.ts +25 -25
  388. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  389. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  390. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  391. package/src/module/workflow/entity/stage.entity.ts +20 -20
  392. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  393. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  394. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  395. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  396. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  397. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  398. package/src/module/workflow/repository/action-data.repository.ts +347 -346
  399. package/src/module/workflow/repository/action.repository.ts +339 -339
  400. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  401. package/src/module/workflow/repository/comm-template.repository.ts +157 -157
  402. package/src/module/workflow/repository/form-master.repository.ts +50 -50
  403. package/src/module/workflow/repository/stage-group.repository.ts +186 -186
  404. package/src/module/workflow/repository/stage-movement.repository.ts +217 -257
  405. package/src/module/workflow/repository/stage.repository.ts +160 -160
  406. package/src/module/workflow/repository/task.repository.ts +154 -151
  407. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  408. package/src/module/workflow/service/action-category.service.ts +33 -33
  409. package/src/module/workflow/service/action-data.service.ts +62 -62
  410. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  411. package/src/module/workflow/service/action-template-mapping.service.ts +137 -140
  412. package/src/module/workflow/service/action.service.ts +302 -302
  413. package/src/module/workflow/service/activity-log.service.ts +107 -107
  414. package/src/module/workflow/service/comm-template.service.ts +181 -180
  415. package/src/module/workflow/service/entity-modification.service.ts +61 -61
  416. package/src/module/workflow/service/form-master.service.ts +35 -35
  417. package/src/module/workflow/service/populate-workflow.service.ts +320 -320
  418. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  419. package/src/module/workflow/service/stage-group.service.ts +325 -344
  420. package/src/module/workflow/service/stage.service.ts +197 -207
  421. package/src/module/workflow/service/task.service.ts +551 -550
  422. package/src/module/workflow/service/workflow-list-master.service.ts +68 -68
  423. package/src/module/workflow/service/workflow-meta.service.ts +640 -639
  424. package/src/module/workflow/service/workflow.service.ts +213 -213
  425. package/src/module/workflow/workflow.module.ts +180 -180
  426. package/src/module/workflow-automation/SCHEDULING_GUIDE.md +145 -145
  427. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +43 -43
  428. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  429. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +40 -40
  430. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  431. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  432. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  433. package/src/module/workflow-automation/service/schedule-handler.service.ts +168 -168
  434. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +219 -219
  435. package/src/module/workflow-automation/service/workflow-automation.service.ts +476 -519
  436. package/src/module/workflow-automation/workflow-automation.module.ts +54 -54
  437. package/src/module/workflow-schedule/INSTALLATION.md +244 -244
  438. package/src/module/workflow-schedule/MULTI_PROJECT_GUIDE.md +196 -196
  439. package/src/module/workflow-schedule/README.md +422 -422
  440. package/src/module/workflow-schedule/constants/schedule.constants.ts +48 -48
  441. package/src/module/workflow-schedule/controller/workflow-schedule.controller.ts +253 -255
  442. package/src/module/workflow-schedule/docs/CLAUDE_CODE_GUIDE.md +510 -510
  443. package/src/module/workflow-schedule/docs/CLAUDE_CODE_PROMPT.md +362 -362
  444. package/src/module/workflow-schedule/docs/RUN_CLAUDE_CODE.sh +68 -68
  445. package/src/module/workflow-schedule/dto/create-schedule.dto.ts +147 -147
  446. package/src/module/workflow-schedule/dto/get-execution-logs.dto.ts +119 -119
  447. package/src/module/workflow-schedule/dto/update-schedule.dto.ts +96 -96
  448. package/src/module/workflow-schedule/entities/scheduled-workflow.entity.ts +148 -148
  449. package/src/module/workflow-schedule/entities/workflow-execution-log.entity.ts +154 -154
  450. package/src/module/workflow-schedule/interfaces/schedule-job-data.interface.ts +53 -53
  451. package/src/module/workflow-schedule/interfaces/workflow-schedule-options.interface.ts +12 -12
  452. package/src/module/workflow-schedule/processors/schedule.processor.ts +620 -620
  453. package/src/module/workflow-schedule/service/workflow-schedule.service.ts +597 -598
  454. package/src/module/workflow-schedule/workflow-schedule.module.ts +67 -67
  455. package/src/resources/dev.properties.yaml +31 -31
  456. package/src/resources/local.properties.yaml +27 -27
  457. package/src/resources/properties.module.ts +12 -12
  458. package/src/resources/properties.yaml.ts +11 -11
  459. package/src/resources/uat.properties.yaml +31 -31
  460. package/src/table.config.ts +133 -133
  461. package/src/utils/dto/excel-data.dto.ts +14 -14
  462. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  463. package/src/utils/service/base64util.service.ts +18 -18
  464. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  465. package/src/utils/service/codeGenerator.service.ts +22 -22
  466. package/src/utils/service/dateUtil.service.ts +17 -17
  467. package/src/utils/service/encryptUtil.service.ts +97 -97
  468. package/src/utils/service/excel-helper.service.ts +72 -72
  469. package/src/utils/service/excelUtil.service.ts +15 -15
  470. package/src/utils/service/file-util.service.ts +11 -11
  471. package/src/utils/service/json-util.service.ts +23 -23
  472. package/src/utils/service/loggingUtil.service.ts +88 -88
  473. package/src/utils/service/reflection-helper.service.ts +62 -62
  474. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  475. package/src/utils/utils.module.ts +27 -27
  476. package/tsconfig.build.json +4 -4
  477. package/tsconfig.json +24 -24
@@ -1,535 +1,526 @@
1
- import {
2
- BadRequestException,
3
- forwardRef,
4
- Inject,
5
- Injectable,
6
- NotFoundException,
7
- } from '@nestjs/common';
8
- import { ListMasterItemsRepository } from '../repository/list-master-items.repository';
9
- import { ListMasterRepository } from '../repository/list-master.repository';
10
- import { ApiRegistryService } from '../../third-party-module/service/api-registry.service';
11
- import { firstValueFrom } from 'rxjs';
12
- import { HttpService } from '@nestjs/axios';
13
- import { EntityManager } from 'typeorm';
14
- import { EntityMasterService } from 'src/module/meta/service/entity-master.service';
15
- import { UserData } from 'src/module/user/entity/user.entity';
16
- import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
17
- import { STATUS_ACTIVE, STATUS_INACTIVE } from 'src/constant/global.constant';
18
- import { ListMasterExtension } from './list-master-extension.interface';
19
- import { ListMasterEngine } from './list-master-engine';
20
- import { Action } from '../../workflow-automation/interface/action.interface';
21
- import axios from 'axios';
22
- import { ConfigService } from '@nestjs/config';
23
- import { AttributeMasterService } from '../../meta/service/attribute-master.service';
24
- import { IMicroserviceClients } from '../../microservice-client/service/microservice-clients';
25
-
26
- @Injectable()
27
- export class ListMasterService {
28
- constructor(
29
- private readonly entityManager: EntityManager,
30
- @Inject(forwardRef(() => EntityServiceImpl))
31
- private readonly entityServiceImpl: EntityServiceImpl,
32
- @Inject(forwardRef(() => EntityMasterService))
33
- private readonly entityMasterService: EntityMasterService,
34
- private readonly listMasterRepo: ListMasterRepository,
35
- private readonly listItemsRepo: ListMasterItemsRepository,
36
- private readonly apiRegistryService: ApiRegistryService,
37
- private readonly httpService: HttpService,
38
- private readonly listMasterEngine: ListMasterEngine,
39
- private readonly configService: ConfigService,
40
- private readonly attributeMasterService: AttributeMasterService,
41
- @Inject('MICROSERVICE_CLIENT_FACTORY')
42
- private readonly factory: IMicroserviceClients,
43
- ) {}
44
-
45
- private readonly skipLevelFilterEntities = ['BRN', 'USR', 'UPR', 'BRNP'];
46
- private readonly actions = new Map<string, Action>();
47
-
48
- registerAction(actionName: string, actionInstance: Action) {
49
- this.actions.set(actionName, actionInstance);
50
- console.log(
51
- `⚙️ [WorkflowAutomationEngine] Registered action: ${actionName}`,
52
- );
53
- }
54
-
55
- async getResolvedListCode(
56
- code: string,
57
- organization_id: number,
58
- ): Promise<any> {
59
- if (!code) return code;
60
-
61
- // Check if it's a valid list type
62
- const listMaster = await this.listItemsRepo.findItemByCode(
63
- code,
64
- organization_id,
65
- );
66
- if (listMaster) {
67
- return listMaster;
68
- }
69
- }
70
-
71
- async getDropdownOptions(
72
- type: string,
73
- params: Record<string, string>,
74
- inactiveIdsArray?: number[],
75
- loggedInUser?,
76
- publicCall = false,
77
- ) {
78
- const config = await this.listMasterRepo.findByType(
79
- type,
80
- loggedInUser?.organization_id,
81
- );
82
-
83
- if (!config) throw new NotFoundException(`Type ${type} not found`);
84
-
85
- if (
86
- config.appcode != null &&
87
- config.appcode != loggedInUser?.appcode &&
88
- !publicCall
89
- ) {
90
- // Call internal API for appcode mismatch
91
- try {
92
- const baseUrl = this.configService.get<string>('REDIRECT_BE_URL');
93
-
94
- // Prepare the query string
95
- const queryParams = new URLSearchParams({
96
- inactiveIds: inactiveIdsArray?.join(',') || '',
97
- loggedInUser: JSON.stringify(loggedInUser),
98
- ...params, // Spread other params into the query string
99
- }).toString();
100
-
101
- // Make the GET request with query parameters
102
- const response = await axios.get(
103
- `${baseUrl}/list-master/getDropdownDataPublic/${type}?${queryParams}`,
104
- {
105
- headers: {
106
- 'Content-Type': 'application/json',
107
- },
108
- },
109
- );
110
-
111
- return response.data;
112
- } catch (error) {
113
- console.error('⚠️ Internal API call failed:', error.message);
114
- throw new BadRequestException(
115
- `Failed to fetch dropdown for type ${type} from internal API`,
116
- );
117
- }
118
- }
119
-
120
- // Fallback to old logic if no extension exists
121
- switch (config.source) {
122
- case 'entity':
123
- return this.fetchFromEntity(
124
- type,
125
- params,
126
- inactiveIdsArray,
127
- loggedInUser,
128
- );
129
-
130
- case 'master':
131
- return this.listItemsRepo.findItemsByType(
132
- type,
133
- config.sort_by,
134
- inactiveIdsArray,
135
- loggedInUser?.organization_id,
136
- params,
137
- );
138
-
139
- case 'operator':
140
- return this.listItemsRepo.findOperatorsByType(
141
- type,
142
- loggedInUser?.organization_id,
143
- );
144
-
145
- case 'custom':
146
- // If you want Axios call here too:
147
- try {
148
- const response = await axios.get(
149
- `https://external-source.com/${config.custom_source_id}`,
150
- { params },
151
- );
152
- return response.data;
153
- } catch (error) {
154
- console.error('⚠️ Custom source fetch failed:', error.message);
155
- throw new BadRequestException('Failed to fetch custom source');
156
- }
157
-
158
- default:
159
- throw new BadRequestException(`Unknown source: ${config.source}`);
160
- }
161
- }
162
-
163
- private async fetchFromEntity(
164
- sourceList: string,
165
- params: Record<string, any>,
166
- inactiveIdsArray?: number[],
167
- loggedInUser?: UserData,
168
- ) {
169
-
170
- let result: { label: string; value: number }[] = [];
171
- if (!sourceList) return result;
172
-
173
- const entityMaster = await this.entityMasterService.getEntityData(
174
- sourceList,
175
- loggedInUser,
176
- );
177
- const tableName = entityMaster.data_source;
178
-
179
- const applyCommonFilters = (qb: any, status?: number) => {
180
- if (status) {
181
- const isView = tableName.endsWith('_vw'); // auto-detect view
182
- const statusColumn = isView ? 'status_id' : 'status';
183
- qb.andWhere(`${tableName}.${statusColumn} = :status`, { status });
184
- }
185
-
186
- if (loggedInUser?.level_type && loggedInUser?.level_id) {
187
- // Skip level filter for certain entities
188
- if (!this.skipLevelFilterEntities.includes(sourceList)) {
189
- qb.andWhere(
190
- `${tableName}.level_type = :levelType AND ${tableName}.level_id = :levelId AND ${tableName}.organization_id = :organization_id`,
191
- {
192
- levelType: loggedInUser.level_type,
193
- levelId: loggedInUser.level_id,
194
- organization_id: loggedInUser.organization_id,
195
- },
196
- );
197
- }
198
- }
199
-
200
- if (sourceList == 'BRN') {
201
- // IN the case of BRN, we don't filter by level
202
- qb.andWhere(
203
- `${tableName}.parent_id = :organization_id AND ${tableName}.type = 'BRN'`,
204
- { organization_id: loggedInUser?.organization_id },
205
- );
206
- }
207
-
208
- if (sourceList == 'BRNP') {
209
- // IN the case of BRNP, we only filter by organization_id
210
- qb.andWhere(`${tableName}.organization_id = :organization_id`, {
211
- organization_id: loggedInUser?.organization_id,
212
- });
213
- }
214
-
215
- if (sourceList == 'USR' || sourceList == 'UPR') {
216
- // IN the case of USR/UPR, we don't filter by level
217
- qb.andWhere(`${tableName}.organization_id = :organization_id`, {
218
- organization_id: loggedInUser?.organization_id,
219
- });
220
- }
221
-
222
- if (loggedInUser?.appcode && sourceList === 'ROL') {
223
- if (!this.skipLevelFilterEntities.includes(sourceList)) {
224
- qb.andWhere(`${tableName}.appcode = :appcode`, {
225
- appcode: loggedInUser.appcode,
226
- });
227
- }
228
- }
229
-
230
- // Apply dynamic params
231
- for (const key in params) {
232
- qb.andWhere(`${tableName}.${key} = :${key}`, {
233
- [key]: params[key],
234
- });
235
- }
236
-
237
- // New: Exclude customers for USR/UPR
238
- if (sourceList === 'USR' || sourceList === 'UPR') {
239
- qb.andWhere(`${tableName}.is_customer is NULL`);
240
- }
241
-
242
- return qb;
243
- };
244
-
245
- const resolveStatus = await this.getResolvedListCode(
246
- STATUS_ACTIVE,
247
- loggedInUser?.organization_id || 0,
248
- );
249
-
250
- // Fetch active records
251
- const activeQuery = applyCommonFilters(
252
- this.entityManager
253
- .createQueryBuilder()
254
- .select('*')
255
- .from(tableName, tableName),
256
- resolveStatus.id,
257
- );
258
-
259
- const activeResults = await activeQuery.getRawMany();
260
- const activeIds = new Set(activeResults.map((r) => r.id));
261
-
262
- // Add active entries first
263
- activeResults.forEach((r) => {
264
- result.push({ label: r.name, value: r.id });
265
- });
266
-
267
- const resolveInactiveStatus = await this.getResolvedListCode(
268
- STATUS_INACTIVE,
269
- loggedInUser?.organization_id || 0,
270
- );
271
-
272
- // Fetch inactive records (with same filters but without status condition)
273
- if (inactiveIdsArray?.length) {
274
- const inactiveQuery = applyCommonFilters(
275
- this.entityManager
276
- .createQueryBuilder()
277
- .select('*')
278
- .from(tableName, tableName),
279
- resolveInactiveStatus.id,
280
- );
281
-
282
- inactiveQuery.andWhere(`${tableName}.id IN (:...ids)`, {
283
- ids: inactiveIdsArray,
284
- });
285
-
286
- const inactiveResults = await inactiveQuery.getRawMany();
287
-
288
- inactiveResults.forEach((item) => {
289
- if (!activeIds.has(item.id)) {
290
- result.push({
291
- label: `${item.name} [INACTIVE]`,
292
- value: item.id,
293
- });
294
- }
295
- });
296
- }
297
-
298
- return result;
299
- }
300
-
301
- private async fetchFromExternalSource(
302
- customSourceId: number,
303
- params?: Record<string, string>,
304
- ) {
305
- const apiRegistry = await this.apiRegistryService.findById(customSourceId);
306
- if (!apiRegistry) return [];
307
-
308
- const url = `${apiRegistry.base_url}${apiRegistry.endpoint.replace(/{{(.*?)}}/g, (_, key) => params?.[key.trim()] || '')}`;
309
- const payload = this.injectDynamicParams(
310
- apiRegistry.request_payload_schema,
311
- params,
312
- );
313
-
314
- const response = await firstValueFrom(
315
- this.httpService.request({
316
- url,
317
- method: apiRegistry.http_method || 'POST',
318
- data: payload,
319
- headers: apiRegistry.headers ? apiRegistry.headers : undefined,
320
- }),
321
- );
322
-
323
- const data = this.extractByPath(
324
- response.data,
325
- apiRegistry.response_data_path,
326
- );
327
-
328
- if (!Array.isArray(data)) {
329
- return [{ label: data, value: data }];
330
- }
331
-
332
- if (typeof data[0] === 'string') {
333
- return data.map((item: string) => ({ label: item, value: item }));
334
- }
335
-
336
- return data.map((item: any) => ({
337
- label: item[apiRegistry?.label],
338
- value: item[apiRegistry?.value],
339
- }));
340
- }
341
-
342
- private injectDynamicParams(
343
- payload: any,
344
- params?: Record<string, string>,
345
- ): any {
346
- if (params) {
347
- const stringified = JSON.stringify(payload);
348
- const replaced = stringified.replace(
349
- /{{(.*?)}}/g,
350
- (_, key) => params[key.trim()] || '',
351
- );
352
- return JSON.parse(replaced);
353
- }
354
- }
355
-
356
- private extractByPath(obj: any, path: string): any {
357
- if (!path || !obj) return obj;
358
-
359
- return path.split('.').reduce((acc, key) => {
360
- if (acc == null) return undefined;
361
-
362
- // Try to convert to number if it's a numeric string (for array indexes)
363
- const index = Number(key);
364
- if (!isNaN(index) && Array.isArray(acc)) {
365
- return acc[index];
366
- }
367
-
368
- return acc[key];
369
- }, obj);
370
- }
371
-
372
- // createEntity method
373
- async createEntity(entityData: any, loggedInUser: UserData): Promise<any> {
374
- // Trim and validate name and code
375
- const name = entityData.name?.trim();
376
- // const code = entityData.code?.trim();
377
-
378
- if (!name) {
379
- throw new BadRequestException('Name is required and cannot be empty');
380
- }
381
-
382
- entityData.name = name;
383
- entityData.is_factory = entityData.is_factory || 0;
384
- entityData.source = entityData.source || 'master';
385
- entityData.status = entityData.status || 'ACTIVE';
386
- entityData.type = entityData.code;
387
- entityData.sort_by = entityData.sort_by || 'asc';
388
- entityData.organization_id = loggedInUser.organization_id;
389
-
390
- // Check for duplicate name
391
- const nameExists = await this.listMasterRepo.findOneByCondition({
392
- name,
393
- organization_id: loggedInUser.organization_id,
394
- });
395
-
396
- if (nameExists) {
397
- throw new BadRequestException(
398
- 'A List Master with the same name already exists',
399
- );
400
- }
401
-
402
- const createdListMaster = await this.entityServiceImpl.createEntity(
403
- entityData,
404
- loggedInUser,
405
- );
406
-
407
- if (!createdListMaster) {
408
- throw new BadRequestException('Failed to create entity');
409
- }
410
-
411
- return createdListMaster;
412
- }
413
-
414
- async updateEntity(entityData: any, loggedInUser: UserData): Promise<any> {
415
- return await this.entityServiceImpl.updateEntity(entityData, loggedInUser);
416
- }
417
-
418
- async getEntityData(
419
- entity_type: string,
420
- id: number,
421
- loggedInUser,
422
- ): Promise<any> {
423
- return await this.entityServiceImpl.getEntityData(
424
- entity_type,
425
- id,
426
- loggedInUser,
427
- );
428
- }
429
-
430
- async getAllListMasterByOrganization(
431
- enterprise_id: number,
432
- search?: string,
433
- ): Promise<any[]> {
434
- return await this.listMasterRepo.findAllItems(enterprise_id, search);
435
- }
436
-
437
- async getDropDownData(
438
- entity_type: string,
439
- attribute_key: string,
440
- loggedInUser: UserData,
441
- body: Record<string, string>,
442
- ) {
443
- let entityMaster = await this.entityMasterService.getEntityData(
444
- entity_type,
445
- loggedInUser,
446
- );
447
- let appCode = entityMaster.appcode;
448
-
449
- const { inactiveIds, ...params } = body;
450
-
451
- const inactiveIdsArray = inactiveIds
452
- ? inactiveIds.split(',').map((id) => parseInt(id, 10))
453
- : [];
454
-
455
- const currentAppCode = this.configService.get<string>('appcode');
456
-
457
- if (currentAppCode === appCode || !currentAppCode) {
458
- const entityAttribute =
459
- await this.attributeMasterService.findByMappedEntityTypeAndAttributeKey(
460
- entity_type,
461
- attribute_key,
462
- loggedInUser,
463
- );
464
-
465
- if (entityAttribute && entityAttribute.data_source_type) {
466
- const listMaster = await this.listMasterRepo.findByType(
467
- entityAttribute.datasource_list,
468
- loggedInUser?.organization_id,
469
- );
470
-
471
- if (!listMaster) {
472
- return;
473
- }
474
-
475
- switch (listMaster.source) {
476
- case 'entity':
477
- return this.fetchFromEntity(
478
- listMaster.type,
479
- params,
480
- inactiveIdsArray,
481
- loggedInUser,
482
- );
483
-
484
- case 'master':
485
- return this.listItemsRepo.findItemsByType(
486
- listMaster.type,
487
- listMaster.sort_by,
488
- inactiveIdsArray,
489
- loggedInUser.organization_id,
490
- params,
491
- );
492
-
493
- case 'operator':
494
- return this.listItemsRepo.findOperatorsByType(
495
- listMaster?.type,
496
- loggedInUser?.organization_id,
497
- );
498
-
499
- case 'custom':
500
- // If you want Axios call here too:
501
- try {
502
- const response = await axios.get(
503
- `https://external-source.com/${listMaster.custom_source_id}`,
504
- { params },
505
- );
506
- return response.data;
507
- } catch (error) {
508
- console.error('⚠️ Custom source fetch failed:', error.message);
509
- throw new BadRequestException('Failed to fetch custom source');
510
- }
511
-
512
- default:
513
- throw new BadRequestException(
514
- `Unknown source: ${listMaster.source}`,
515
- );
516
- }
517
- }
518
- } else {
519
- const client = this.factory.getClient(appCode);
520
-
521
- if (!client) {
522
- return;
523
- }
524
-
525
- return client
526
- .send('getDropdownData', {
527
- entity_type,
528
- attribute_key,
529
- loggedInUser,
530
- body,
531
- })
532
- .toPromise();
533
- }
534
- }
535
- }
1
+ import { BadRequestException, forwardRef, Inject, Injectable, NotFoundException } from '@nestjs/common';
2
+ import { ListMasterItemsRepository } from '../repository/list-master-items.repository';
3
+ import { ListMasterRepository } from '../repository/list-master.repository';
4
+ import { ApiRegistryService } from '../../third-party-module/service/api-registry.service';
5
+ import { firstValueFrom } from 'rxjs';
6
+ import { HttpService } from '@nestjs/axios';
7
+ import { EntityManager } from 'typeorm';
8
+ import { EntityMasterService } from 'src/module/meta/service/entity-master.service';
9
+ import { UserData } from 'src/module/user/entity/user.entity';
10
+ import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
11
+ import { STATUS_ACTIVE, STATUS_INACTIVE } from 'src/constant/global.constant';
12
+ import { Action } from '../../workflow-automation/interface/action.interface';
13
+ import axios from 'axios';
14
+ import { ConfigService } from '@nestjs/config';
15
+ import { AttributeMasterService } from '../../meta/service/attribute-master.service';
16
+ import { IMicroserviceClients } from '../../microservice-client/service/microservice-clients';
17
+
18
+ @Injectable()
19
+ export class ListMasterService {
20
+ constructor(
21
+ private readonly entityManager: EntityManager,
22
+ @Inject(forwardRef(() => EntityServiceImpl))
23
+ private readonly entityServiceImpl: EntityServiceImpl,
24
+ @Inject(forwardRef(() => EntityMasterService))
25
+ private readonly entityMasterService: EntityMasterService,
26
+ private readonly listMasterRepo: ListMasterRepository,
27
+ private readonly listItemsRepo: ListMasterItemsRepository,
28
+ private readonly apiRegistryService: ApiRegistryService,
29
+ private readonly httpService: HttpService,
30
+ private readonly configService: ConfigService,
31
+ private readonly attributeMasterService: AttributeMasterService,
32
+ @Inject('MICROSERVICE_CLIENT_FACTORY')
33
+ private readonly factory: IMicroserviceClients,
34
+ ) {
35
+ }
36
+
37
+ private readonly skipLevelFilterEntities = ['BRN', 'USR', 'UPR', 'BRNP'];
38
+ private readonly actions = new Map<string, Action>();
39
+
40
+ registerAction(actionName: string, actionInstance: Action) {
41
+ this.actions.set(actionName, actionInstance);
42
+ console.log(
43
+ `⚙️ [WorkflowAutomationEngine] Registered action: ${actionName}`,
44
+ );
45
+ }
46
+
47
+ async getResolvedListCode(
48
+ code: string,
49
+ enterprise_id: number,
50
+ ): Promise<any> {
51
+ if (!code) return code;
52
+
53
+ // Check if it's a valid list type
54
+ const listMaster = await this.listItemsRepo.findItemByCode(
55
+ code,
56
+ enterprise_id,
57
+ );
58
+ if (listMaster) {
59
+ return listMaster;
60
+ }
61
+ }
62
+
63
+ async getDropdownOptions(
64
+ type: string,
65
+ params: Record<string, string>,
66
+ inactiveIdsArray?: number[],
67
+ loggedInUser?,
68
+ publicCall = false,
69
+ ) {
70
+ const config = await this.listMasterRepo.findByType(
71
+ type,
72
+ loggedInUser?.enterprise_id,
73
+ );
74
+
75
+ if (!config) throw new NotFoundException(`Type ${type} not found`);
76
+
77
+ if (
78
+ config.appcode != null &&
79
+ config.appcode != loggedInUser?.appcode &&
80
+ !publicCall
81
+ ) {
82
+ // Call internal API for appcode mismatch
83
+ try {
84
+ const baseUrl = this.configService.get<string>('REDIRECT_BE_URL');
85
+
86
+ // Prepare the query string
87
+ const queryParams = new URLSearchParams({
88
+ inactiveIds: inactiveIdsArray?.join(',') || '',
89
+ loggedInUser: JSON.stringify(loggedInUser),
90
+ ...params, // Spread other params into the query string
91
+ }).toString();
92
+
93
+ // Make the GET request with query parameters
94
+ const response = await axios.get(
95
+ `${baseUrl}/list-master/getDropdownDataPublic/${type}?${queryParams}`,
96
+ {
97
+ headers: {
98
+ 'Content-Type': 'application/json',
99
+ },
100
+ },
101
+ );
102
+
103
+ return response.data;
104
+ } catch (error) {
105
+ console.error('⚠️ Internal API call failed:', error.message);
106
+ throw new BadRequestException(
107
+ `Failed to fetch dropdown for type ${type} from internal API`,
108
+ );
109
+ }
110
+ }
111
+
112
+ // Fallback to old logic if no extension exists
113
+ switch (config.source) {
114
+ case 'entity':
115
+ return this.fetchFromEntity(
116
+ type,
117
+ params,
118
+ inactiveIdsArray,
119
+ loggedInUser,
120
+ );
121
+
122
+ case 'master':
123
+ return this.listItemsRepo.findItemsByType(
124
+ type,
125
+ config.sort_by,
126
+ inactiveIdsArray,
127
+ loggedInUser?.enterprise_id,
128
+ params,
129
+ );
130
+
131
+ case 'operator':
132
+ return this.listItemsRepo.findOperatorsByType(
133
+ type,
134
+ loggedInUser?.enterprise_id,
135
+ );
136
+
137
+ case 'custom':
138
+ // If you want Axios call here too:
139
+ try {
140
+ const response = await axios.get(
141
+ `https://external-source.com/${config.custom_source_id}`,
142
+ { params },
143
+ );
144
+ return response.data;
145
+ } catch (error) {
146
+ console.error('⚠️ Custom source fetch failed:', error.message);
147
+ throw new BadRequestException('Failed to fetch custom source');
148
+ }
149
+
150
+ default:
151
+ throw new BadRequestException(`Unknown source: ${config.source}`);
152
+ }
153
+ }
154
+
155
+ private async fetchFromEntity(
156
+ sourceList: string,
157
+ params: Record<string, any>,
158
+ inactiveIdsArray?: number[],
159
+ loggedInUser?: UserData,
160
+ ) {
161
+
162
+ let result: { label: string; value: number }[] = [];
163
+ if (!sourceList) return result;
164
+
165
+ const entityMaster = await this.entityMasterService.getEntityData(
166
+ sourceList,
167
+ loggedInUser,
168
+ );
169
+ const tableName = entityMaster.data_source;
170
+
171
+ const applyCommonFilters = (qb: any, status?: number) => {
172
+ if (status) {
173
+ const isView = tableName.endsWith('_vw'); // auto-detect view
174
+ const statusColumn = isView ? 'status_id' : 'status';
175
+ qb.andWhere(`${tableName}.${statusColumn} = :status`, { status });
176
+ }
177
+
178
+ if (loggedInUser?.level_type && loggedInUser?.level_id) {
179
+ // Skip level filter for certain entities
180
+ if (!this.skipLevelFilterEntities.includes(sourceList)) {
181
+ qb.andWhere(
182
+ `${tableName}.level_type = :levelType AND ${tableName}.level_id = :levelId AND ${tableName}.enterprise_id = :enterprise_id`,
183
+ {
184
+ levelType: loggedInUser.level_type,
185
+ levelId: loggedInUser.level_id,
186
+ enterprise_id: loggedInUser.enterprise_id,
187
+ },
188
+ );
189
+ }
190
+ }
191
+
192
+ if (sourceList == 'BRN') {
193
+ // IN the case of BRN, we don't filter by level
194
+ qb.andWhere(
195
+ `${tableName}.parent_id = :enterprise_id AND ${tableName}.type = 'BRN'`,
196
+ { enterprise_id: loggedInUser?.enterprise_id },
197
+ );
198
+ }
199
+
200
+ if (sourceList == 'BRNP') {
201
+ // IN the case of BRNP, we only filter by organization_id
202
+ qb.andWhere(`${tableName}.enterprise_id = :enterprise_id`, {
203
+ enterprise_id: loggedInUser?.enterprise_id,
204
+ });
205
+ }
206
+
207
+ if (sourceList == 'USR' || sourceList == 'UPR') {
208
+ // IN the case of USR/UPR, we don't filter by level
209
+ qb.andWhere(`${tableName}.enterprise_id = :enterprise_id`, {
210
+ enterprise_id: loggedInUser?.enterprise_id,
211
+ });
212
+ }
213
+
214
+ if (loggedInUser?.appcode && sourceList === 'ROL') {
215
+ if (!this.skipLevelFilterEntities.includes(sourceList)) {
216
+ qb.andWhere(`${tableName}.appcode = :appcode`, {
217
+ appcode: loggedInUser.appcode,
218
+ });
219
+ }
220
+ }
221
+
222
+ // Apply dynamic params
223
+ for (const key in params) {
224
+ qb.andWhere(`${tableName}.${key} = :${key}`, {
225
+ [key]: params[key],
226
+ });
227
+ }
228
+
229
+ // ✅ New: Exclude customers for USR/UPR
230
+ if (sourceList === 'USR' || sourceList === 'UPR') {
231
+ qb.andWhere(`${tableName}.is_customer is NULL`);
232
+ }
233
+
234
+ return qb;
235
+ };
236
+
237
+ const resolveStatus = await this.getResolvedListCode(
238
+ STATUS_ACTIVE,
239
+ loggedInUser?.enterprise_id || 0,
240
+ );
241
+
242
+ // Fetch active records
243
+ const activeQuery = applyCommonFilters(
244
+ this.entityManager
245
+ .createQueryBuilder()
246
+ .select('*')
247
+ .from(tableName, tableName),
248
+ resolveStatus.id,
249
+ );
250
+
251
+ const activeResults = await activeQuery.getRawMany();
252
+ const activeIds = new Set(activeResults.map((r) => r.id));
253
+
254
+ // Add active entries first
255
+ activeResults.forEach((r) => {
256
+ result.push({ label: r.name, value: r.id });
257
+ });
258
+
259
+ const resolveInactiveStatus = await this.getResolvedListCode(
260
+ STATUS_INACTIVE,
261
+ loggedInUser?.organization_id || 0,
262
+ );
263
+
264
+ // Fetch inactive records (with same filters but without status condition)
265
+ if (inactiveIdsArray?.length) {
266
+ const inactiveQuery = applyCommonFilters(
267
+ this.entityManager
268
+ .createQueryBuilder()
269
+ .select('*')
270
+ .from(tableName, tableName),
271
+ resolveInactiveStatus.id,
272
+ );
273
+
274
+ inactiveQuery.andWhere(`${tableName}.id IN (:...ids)`, {
275
+ ids: inactiveIdsArray,
276
+ });
277
+
278
+ const inactiveResults = await inactiveQuery.getRawMany();
279
+
280
+ inactiveResults.forEach((item) => {
281
+ if (!activeIds.has(item.id)) {
282
+ result.push({
283
+ label: `${item.name} [INACTIVE]`,
284
+ value: item.id,
285
+ });
286
+ }
287
+ });
288
+ }
289
+
290
+ return result;
291
+ }
292
+
293
+ private async fetchFromExternalSource(
294
+ customSourceId: number,
295
+ params?: Record<string, string>,
296
+ ) {
297
+ const apiRegistry = await this.apiRegistryService.findById(customSourceId);
298
+ if (!apiRegistry) return [];
299
+
300
+ const url = `${apiRegistry.base_url}${apiRegistry.endpoint.replace(/{{(.*?)}}/g, (_, key) => params?.[key.trim()] || '')}`;
301
+ const payload = this.injectDynamicParams(
302
+ apiRegistry.request_payload_schema,
303
+ params,
304
+ );
305
+
306
+ const response = await firstValueFrom(
307
+ this.httpService.request({
308
+ url,
309
+ method: apiRegistry.http_method || 'POST',
310
+ data: payload,
311
+ headers: apiRegistry.headers ? apiRegistry.headers : undefined,
312
+ }),
313
+ );
314
+
315
+ const data = this.extractByPath(
316
+ response.data,
317
+ apiRegistry.response_data_path,
318
+ );
319
+
320
+ if (!Array.isArray(data)) {
321
+ return [{ label: data, value: data }];
322
+ }
323
+
324
+ if (typeof data[0] === 'string') {
325
+ return data.map((item: string) => ({ label: item, value: item }));
326
+ }
327
+
328
+ return data.map((item: any) => ({
329
+ label: item[apiRegistry?.label],
330
+ value: item[apiRegistry?.value],
331
+ }));
332
+ }
333
+
334
+ private injectDynamicParams(
335
+ payload: any,
336
+ params?: Record<string, string>,
337
+ ): any {
338
+ if (params) {
339
+ const stringified = JSON.stringify(payload);
340
+ const replaced = stringified.replace(
341
+ /{{(.*?)}}/g,
342
+ (_, key) => params[key.trim()] || '',
343
+ );
344
+ return JSON.parse(replaced);
345
+ }
346
+ }
347
+
348
+ private extractByPath(obj: any, path: string): any {
349
+ if (!path || !obj) return obj;
350
+
351
+ return path.split('.').reduce((acc, key) => {
352
+ if (acc == null) return undefined;
353
+
354
+ // Try to convert to number if it's a numeric string (for array indexes)
355
+ const index = Number(key);
356
+ if (!isNaN(index) && Array.isArray(acc)) {
357
+ return acc[index];
358
+ }
359
+
360
+ return acc[key];
361
+ }, obj);
362
+ }
363
+
364
+ // createEntity method
365
+ async createEntity(entityData: any, loggedInUser: UserData): Promise<any> {
366
+ // Trim and validate name and code
367
+ const name = entityData.name?.trim();
368
+ // const code = entityData.code?.trim();
369
+
370
+ if (!name) {
371
+ throw new BadRequestException('Name is required and cannot be empty');
372
+ }
373
+
374
+ entityData.name = name;
375
+ entityData.is_factory = entityData.is_factory || 0;
376
+ entityData.source = entityData.source || 'master';
377
+ entityData.status = entityData.status || 'ACTIVE';
378
+ entityData.type = entityData.code;
379
+ entityData.sort_by = entityData.sort_by || 'asc';
380
+
381
+ // Check for duplicate name
382
+ const nameExists = await this.listMasterRepo.findOneByCondition({
383
+ name,
384
+ enterprise_id: loggedInUser.enterprise_id,
385
+ });
386
+
387
+ if (nameExists) {
388
+ throw new BadRequestException(
389
+ 'A List Master with the same name already exists',
390
+ );
391
+ }
392
+
393
+ const createdListMaster = await this.entityServiceImpl.createEntity(
394
+ entityData,
395
+ loggedInUser,
396
+ );
397
+
398
+ if (!createdListMaster) {
399
+ throw new BadRequestException('Failed to create entity');
400
+ }
401
+
402
+ return createdListMaster;
403
+ }
404
+
405
+ async updateEntity(entityData: any, loggedInUser: UserData): Promise<any> {
406
+ return await this.entityServiceImpl.updateEntity(entityData, loggedInUser);
407
+ }
408
+
409
+ async getEntityData(
410
+ entity_type: string,
411
+ id: number,
412
+ loggedInUser,
413
+ ): Promise<any> {
414
+ return await this.entityServiceImpl.getEntityData(
415
+ entity_type,
416
+ id,
417
+ loggedInUser,
418
+ );
419
+ }
420
+
421
+ async getAllListMasterByOrganization(
422
+ enterprise_id: number,
423
+ search?: string,
424
+ ): Promise<any[]> {
425
+ return await this.listMasterRepo.findAllItems(enterprise_id, search);
426
+ }
427
+
428
+ async getDropDownData(
429
+ entity_type: string,
430
+ attribute_key: string,
431
+ loggedInUser: UserData,
432
+ body: Record<string, string>,
433
+ ) {
434
+ let entityMaster = await this.entityMasterService.getEntityData(
435
+ entity_type,
436
+ loggedInUser,
437
+ );
438
+ let appCode = entityMaster.appcode;
439
+
440
+ const { inactiveIds, ...params } = body;
441
+
442
+ const inactiveIdsArray = inactiveIds
443
+ ? inactiveIds.split(',').map((id) => parseInt(id, 10))
444
+ : [];
445
+
446
+ const currentAppCode = this.configService.get<string>('appcode');
447
+
448
+ if (currentAppCode === appCode || !currentAppCode) {
449
+ const entityAttribute =
450
+ await this.attributeMasterService.findByMappedEntityTypeAndAttributeKey(
451
+ entity_type,
452
+ attribute_key,
453
+ loggedInUser,
454
+ );
455
+
456
+ if (entityAttribute && entityAttribute.data_source_type) {
457
+ const listMaster = await this.listMasterRepo.findByType(
458
+ entityAttribute.datasource_list,
459
+ loggedInUser?.enterprise_id,
460
+ );
461
+
462
+ if (!listMaster) {
463
+ return;
464
+ }
465
+
466
+ switch (listMaster.source) {
467
+ case 'entity':
468
+ return this.fetchFromEntity(
469
+ listMaster.type,
470
+ params,
471
+ inactiveIdsArray,
472
+ loggedInUser,
473
+ );
474
+
475
+ case 'master':
476
+ return this.listItemsRepo.findItemsByType(
477
+ listMaster.type,
478
+ listMaster.sort_by,
479
+ inactiveIdsArray,
480
+ loggedInUser.enterprise_id,
481
+ params,
482
+ );
483
+
484
+ case 'operator':
485
+ return this.listItemsRepo.findOperatorsByType(
486
+ listMaster?.type,
487
+ loggedInUser?.enterprise_id,
488
+ );
489
+
490
+ case 'custom':
491
+ // If you want Axios call here too:
492
+ try {
493
+ const response = await axios.get(
494
+ `https://external-source.com/${listMaster.custom_source_id}`,
495
+ { params },
496
+ );
497
+ return response.data;
498
+ } catch (error) {
499
+ console.error('⚠️ Custom source fetch failed:', error.message);
500
+ throw new BadRequestException('Failed to fetch custom source');
501
+ }
502
+
503
+ default:
504
+ throw new BadRequestException(
505
+ `Unknown source: ${listMaster.source}`,
506
+ );
507
+ }
508
+ }
509
+ } else {
510
+ const client = this.factory.getClient(appCode);
511
+
512
+ if (!client) {
513
+ return;
514
+ }
515
+
516
+ return client
517
+ .send('getDropdownData', {
518
+ entity_type,
519
+ attribute_key,
520
+ loggedInUser,
521
+ body,
522
+ })
523
+ .toPromise();
524
+ }
525
+ }
526
+ }