rez_core 3.1.158 → 3.1.161

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 (393) hide show
  1. package/.prettierrc +3 -3
  2. package/.vscode/extensions.json +5 -0
  3. package/README.md +99 -99
  4. package/dist/module/auth/guards/role.guard.js +3 -3
  5. package/dist/module/auth/services/auth.service.js +2 -2
  6. package/dist/module/filter/repository/saved-filter.repository.js +4 -4
  7. package/dist/module/filter/service/filter-evaluator.service.js +2 -2
  8. package/dist/module/filter/service/filter.service.js +7 -7
  9. package/dist/module/integration/examples/usage.example.js +9 -9
  10. package/dist/module/integration/service/integration.service.js +1 -1
  11. package/dist/module/integration/service/wrapper.service.js +22 -22
  12. package/dist/module/listmaster/controller/list-master.controller.d.ts +4 -1
  13. package/dist/module/listmaster/service/list-master-item.service.js +2 -2
  14. package/dist/module/listmaster/service/list-master.service.d.ts +7 -1
  15. package/dist/module/listmaster/service/list-master.service.js +12 -14
  16. package/dist/module/listmaster/service/list-master.service.js.map +1 -1
  17. package/dist/module/mapper/service/field-mapper.service.js +4 -4
  18. package/dist/module/mapper/service/mapper.service.js +2 -2
  19. package/dist/module/meta/controller/meta.controller.d.ts +24 -6
  20. package/dist/module/meta/repository/entity-master.repository.d.ts +24 -6
  21. package/dist/module/meta/service/entity-dynamic.service.js +18 -18
  22. package/dist/module/meta/service/entity-list.service.js +3 -3
  23. package/dist/module/meta/service/entity-master.service.d.ts +24 -6
  24. package/dist/module/meta/service/entity-master.service.js +3 -3
  25. package/dist/module/meta/service/entity-relation.service.js +11 -11
  26. package/dist/module/meta/service/entity-service-impl.service.js +3 -3
  27. package/dist/module/meta/service/resolver.service.js +3 -3
  28. package/dist/module/module/repository/menu.repository.js +12 -12
  29. package/dist/module/notification/controller/otp.controller.d.ts +3 -0
  30. package/dist/module/notification/service/notification.service.js +12 -12
  31. package/dist/module/notification/service/otp.service.d.ts +3 -0
  32. package/dist/module/notification/service/otp.service.js +4 -1
  33. package/dist/module/notification/service/otp.service.js.map +1 -1
  34. package/dist/module/user/controller/login.controller.js +18 -18
  35. package/dist/module/user/service/role.service.js +4 -4
  36. package/dist/module/user/service/user-session.service.js +2 -2
  37. package/dist/module/workflow/repository/action.repository.js +16 -16
  38. package/dist/module/workflow/repository/comm-template.repository.js +6 -6
  39. package/dist/module/workflow/repository/form-master.repository.js +2 -2
  40. package/dist/module/workflow/repository/stage-group.repository.js +23 -23
  41. package/dist/module/workflow/repository/stage-movement.repository.js +11 -11
  42. package/dist/module/workflow/repository/stage.repository.js +8 -8
  43. package/dist/module/workflow/service/action-template-mapping.service.js +10 -10
  44. package/dist/module/workflow/service/action.service.js +7 -7
  45. package/dist/module/workflow/service/entity-modification.service.js +6 -6
  46. package/dist/module/workflow/service/stage-group.service.js +5 -5
  47. package/dist/module/workflow/service/stage.service.js +2 -2
  48. package/dist/module/workflow/service/task.service.js +33 -33
  49. package/dist/module/workflow/service/workflow-list-master.service.js +15 -15
  50. package/dist/module/workflow/service/workflow-meta.service.js +50 -50
  51. package/dist/module/workflow/service/workflow.service.js +2 -2
  52. package/dist/tsconfig.build.tsbuildinfo +1 -1
  53. package/dist/utils/service/reflection-helper.service.js +2 -2
  54. package/docs/modules/event-driven-integration-design.md +91 -91
  55. package/docs/modules/integration.md +250 -250
  56. package/eslint.config.mjs +34 -34
  57. package/nest-cli.json +14 -14
  58. package/package.json +118 -118
  59. package/src/app.controller.ts +12 -12
  60. package/src/app.module.ts +49 -49
  61. package/src/app.service.ts +8 -8
  62. package/src/config/config.module.ts +18 -18
  63. package/src/config/database.config.ts +23 -23
  64. package/src/constant/global.constant.ts +67 -67
  65. package/src/core.module.ts +81 -81
  66. package/src/decorators/roles.decorator.ts +7 -7
  67. package/src/dtos/response.dto.ts +6 -6
  68. package/src/dtos/response.ts +5 -5
  69. package/src/index.ts +1 -1
  70. package/src/module/auth/auth.module.ts +49 -49
  71. package/src/module/auth/controller/auth.controller.ts +28 -28
  72. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  73. package/src/module/auth/guards/jwt.guard.ts +22 -22
  74. package/src/module/auth/guards/role.guard.ts +68 -68
  75. package/src/module/auth/services/auth.service.ts +50 -50
  76. package/src/module/auth/services/jwt.service.ts +11 -11
  77. package/src/module/auth/strategies/google.strategy.ts +54 -54
  78. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  79. package/src/module/auth/strategies/local.strategy.ts +13 -13
  80. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  81. package/src/module/dashboard/dashboard.module.ts +21 -21
  82. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  83. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  84. package/src/module/dashboard/repository/dashboard.repository.ts +42 -42
  85. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  86. package/src/module/dev/dev.module.ts +12 -12
  87. package/src/module/dev/service/dev.service.ts +7 -7
  88. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  89. package/src/module/enterprise/enterprise.module.ts +30 -30
  90. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  91. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  92. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  93. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  94. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  95. package/src/module/enterprise/repository/school.repository.ts +281 -281
  96. package/src/module/enterprise/service/brand.service.ts +5 -5
  97. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  98. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  99. package/src/module/enterprise/service/organization.service.ts +145 -145
  100. package/src/module/filter/controller/filter.controller.ts +84 -84
  101. package/src/module/filter/dto/filter-request.dto.ts +38 -38
  102. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  103. package/src/module/filter/entity/saved-filter-master.entity.ts +23 -23
  104. package/src/module/filter/filter.module.ts +31 -31
  105. package/src/module/filter/repository/saved-filter.repository.ts +168 -168
  106. package/src/module/filter/service/filter-evaluator.service.ts +86 -86
  107. package/src/module/filter/service/filter.service.ts +841 -841
  108. package/src/module/filter/service/saved-filter.service.ts +170 -170
  109. package/src/module/ics/controller/ics.controller.ts +21 -21
  110. package/src/module/ics/dto/ics.dto.ts +55 -55
  111. package/src/module/ics/ics.module.ts +13 -13
  112. package/src/module/ics/service/ics.service.ts +57 -57
  113. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  114. package/src/module/integration/controller/integration.controller.ts +662 -662
  115. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  116. package/src/module/integration/dto/create-config.dto.ts +526 -526
  117. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  118. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  119. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  120. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  121. package/src/module/integration/examples/usage.example.ts +338 -338
  122. package/src/module/integration/factories/base.factory.ts +7 -7
  123. package/src/module/integration/factories/email.factory.ts +49 -49
  124. package/src/module/integration/factories/integration.factory.ts +121 -121
  125. package/src/module/integration/factories/sms.factory.ts +51 -51
  126. package/src/module/integration/factories/telephone.factory.ts +41 -41
  127. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  128. package/src/module/integration/integration.module.ts +110 -110
  129. package/src/module/integration/service/calendar-event.service.ts +118 -118
  130. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  131. package/src/module/integration/service/integration-queue.service.ts +229 -229
  132. package/src/module/integration/service/integration.service.ts +2572 -2572
  133. package/src/module/integration/service/oauth.service.ts +224 -224
  134. package/src/module/integration/service/wrapper.service.ts +439 -439
  135. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  136. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  137. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  138. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  139. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  140. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  141. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  142. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  143. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  144. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  145. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  146. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  147. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  148. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  149. package/src/module/layout/controller/layout.controller.ts +47 -47
  150. package/src/module/layout/entity/header-items.entity.ts +28 -28
  151. package/src/module/layout/entity/header-section.entity.ts +19 -19
  152. package/src/module/layout/layout.module.ts +21 -21
  153. package/src/module/layout/repository/header-items.repository.ts +18 -18
  154. package/src/module/layout/repository/header-section.repository.ts +22 -22
  155. package/src/module/layout/service/header-section.service.ts +25 -25
  156. package/src/module/layout_preference/controller/layout_preference.controller.ts +47 -47
  157. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  158. package/src/module/layout_preference/layout_preference.module.ts +18 -18
  159. package/src/module/layout_preference/repository/layout_preference.repository.ts +30 -30
  160. package/src/module/layout_preference/service/layout_preference.service.ts +172 -172
  161. package/src/module/lead/controller/lead.controller.ts +30 -30
  162. package/src/module/lead/lead.module.ts +14 -14
  163. package/src/module/lead/repository/lead.repository.ts +41 -41
  164. package/src/module/lead/service/lead.service.ts +54 -54
  165. package/src/module/listmaster/controller/list-master.controller.ts +143 -143
  166. package/src/module/listmaster/entity/list-master-items.entity.ts +41 -41
  167. package/src/module/listmaster/entity/list-master.entity.ts +32 -32
  168. package/src/module/listmaster/listmaster.module.ts +44 -44
  169. package/src/module/listmaster/repository/list-master-items.repository.ts +169 -169
  170. package/src/module/listmaster/repository/list-master.repository.ts +46 -46
  171. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  172. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  173. package/src/module/listmaster/service/list-master-item.service.ts +292 -292
  174. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  175. package/src/module/listmaster/service/list-master.service.ts +388 -375
  176. package/src/module/mapper/controller/field-mapper.controller.ts +69 -69
  177. package/src/module/mapper/controller/mapper.controller.ts +14 -14
  178. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  179. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  180. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  181. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  182. package/src/module/mapper/mapper.module.ts +34 -34
  183. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  184. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  185. package/src/module/mapper/repository/mapper.repository.ts +15 -15
  186. package/src/module/mapper/service/field-mapper.service.ts +223 -223
  187. package/src/module/mapper/service/mapper.service.ts +72 -72
  188. package/src/module/master/controller/master.controller.ts +74 -74
  189. package/src/module/master/service/master.service.ts +483 -483
  190. package/src/module/meta/controller/app-master.controller.ts +38 -38
  191. package/src/module/meta/controller/attribute-master.controller.ts +66 -66
  192. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  193. package/src/module/meta/controller/entity-master.controller.ts +28 -28
  194. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  195. package/src/module/meta/controller/entity.controller.ts +385 -385
  196. package/src/module/meta/controller/media.controller.ts +82 -82
  197. package/src/module/meta/controller/meta.controller.ts +96 -96
  198. package/src/module/meta/controller/view-master.controller.ts +86 -86
  199. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  200. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  201. package/src/module/meta/dto/entity-table.dto.ts +9 -9
  202. package/src/module/meta/entity/app-master.entity.ts +34 -34
  203. package/src/module/meta/entity/attribute-master.entity.ts +87 -87
  204. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  205. package/src/module/meta/entity/entity-master.entity.ts +78 -78
  206. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  207. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  208. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  209. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  210. package/src/module/meta/entity/media-data.entity.ts +32 -32
  211. package/src/module/meta/entity/preference.entity.ts +62 -62
  212. package/src/module/meta/entity/view-master.entity.ts +41 -41
  213. package/src/module/meta/entity.module.ts +156 -156
  214. package/src/module/meta/repository/app-master.repository.ts +20 -20
  215. package/src/module/meta/repository/attribute-master.repository.ts +110 -110
  216. package/src/module/meta/repository/entity-master.repository.ts +69 -69
  217. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  218. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  219. package/src/module/meta/repository/media-data.repository.ts +50 -50
  220. package/src/module/meta/repository/preference.repository.ts +20 -20
  221. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  222. package/src/module/meta/repository/view-master.repository.ts +42 -42
  223. package/src/module/meta/service/app-master.service.ts +37 -37
  224. package/src/module/meta/service/attribute-master.service.ts +117 -117
  225. package/src/module/meta/service/common.service.ts +9 -9
  226. package/src/module/meta/service/entity-dynamic.service.ts +762 -762
  227. package/src/module/meta/service/entity-list.service.ts +205 -205
  228. package/src/module/meta/service/entity-master.service.ts +164 -164
  229. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  230. package/src/module/meta/service/entity-relation.service.ts +69 -69
  231. package/src/module/meta/service/entity-service-impl.service.ts +524 -524
  232. package/src/module/meta/service/entity-table-column.service.ts +39 -39
  233. package/src/module/meta/service/entity-table.service.ts +150 -150
  234. package/src/module/meta/service/entity-validation.service.ts +185 -185
  235. package/src/module/meta/service/entity.service.ts +67 -67
  236. package/src/module/meta/service/field-group.service.ts +103 -103
  237. package/src/module/meta/service/media-data.service.ts +140 -140
  238. package/src/module/meta/service/populate-meta.service.ts +173 -173
  239. package/src/module/meta/service/preference.service.ts +16 -16
  240. package/src/module/meta/service/resolver.service.ts +274 -274
  241. package/src/module/meta/service/section-master.service.ts +104 -104
  242. package/src/module/meta/service/update-form-json.service.ts +22 -22
  243. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  244. package/src/module/meta/service/view-master.service.ts +111 -111
  245. package/src/module/module/controller/menu.controller.ts +15 -15
  246. package/src/module/module/controller/module-access.controller.ts +132 -132
  247. package/src/module/module/entity/menu.entity.ts +43 -43
  248. package/src/module/module/entity/module-access.entity.ts +25 -25
  249. package/src/module/module/entity/module-action.entity.ts +17 -17
  250. package/src/module/module/entity/module.entity.ts +52 -52
  251. package/src/module/module/module.module.ts +42 -42
  252. package/src/module/module/repository/menu.repository.ts +184 -184
  253. package/src/module/module/repository/module-access.repository.ts +331 -331
  254. package/src/module/module/service/menu.service.ts +82 -82
  255. package/src/module/module/service/module-access.service.ts +209 -209
  256. package/src/module/notification/controller/notification.controller.ts +58 -58
  257. package/src/module/notification/controller/otp.controller.ts +117 -117
  258. package/src/module/notification/entity/notification.entity.ts +23 -23
  259. package/src/module/notification/entity/otp.entity.ts +28 -28
  260. package/src/module/notification/firebase-admin.config.ts +22 -22
  261. package/src/module/notification/notification.module.ts +69 -69
  262. package/src/module/notification/repository/otp.repository.ts +27 -27
  263. package/src/module/notification/service/email.service.ts +127 -127
  264. package/src/module/notification/service/notification.service.ts +138 -138
  265. package/src/module/notification/service/otp.service.ts +125 -121
  266. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  267. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  268. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  269. package/src/module/third-party-module/third-party.module.ts +12 -12
  270. package/src/module/user/controller/login.controller.ts +197 -197
  271. package/src/module/user/controller/user.controller.ts +40 -40
  272. package/src/module/user/dto/create-user.dto.ts +62 -62
  273. package/src/module/user/dto/update-user.dto.ts +4 -4
  274. package/src/module/user/entity/role.entity.ts +33 -33
  275. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  276. package/src/module/user/entity/user-session.entity.ts +61 -61
  277. package/src/module/user/entity/user.entity.ts +68 -68
  278. package/src/module/user/repository/role.repository.ts +96 -96
  279. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  280. package/src/module/user/repository/user.repository.ts +50 -50
  281. package/src/module/user/repository/userSession.repository.ts +33 -33
  282. package/src/module/user/service/login.service.ts +280 -280
  283. package/src/module/user/service/role.service.ts +189 -189
  284. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  285. package/src/module/user/service/user-session.service.ts +168 -168
  286. package/src/module/user/service/user.service.ts +353 -353
  287. package/src/module/user/user.module.ts +65 -65
  288. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  289. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  290. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  291. package/src/module/workflow/controller/action.controller.ts +95 -95
  292. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  293. package/src/module/workflow/controller/comm-template.controller.ts +34 -34
  294. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  295. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  296. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  297. package/src/module/workflow/controller/stage.controller.ts +50 -50
  298. package/src/module/workflow/controller/task.controller.ts +77 -77
  299. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  300. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  301. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  302. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  303. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  304. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  305. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  306. package/src/module/workflow/entity/action.entity.ts +50 -50
  307. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  308. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  309. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  310. package/src/module/workflow/entity/form.entity.ts +25 -25
  311. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  312. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  313. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  314. package/src/module/workflow/entity/stage.entity.ts +20 -20
  315. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  316. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  317. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  318. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  319. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  320. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  321. package/src/module/workflow/repository/action-data.repository.ts +219 -219
  322. package/src/module/workflow/repository/action.repository.ts +277 -277
  323. package/src/module/workflow/repository/activity-log.repository.ts +121 -121
  324. package/src/module/workflow/repository/comm-template.repository.ts +142 -142
  325. package/src/module/workflow/repository/form-master.repository.ts +59 -59
  326. package/src/module/workflow/repository/stage-group.repository.ts +176 -176
  327. package/src/module/workflow/repository/stage-movement.repository.ts +227 -227
  328. package/src/module/workflow/repository/stage.repository.ts +172 -172
  329. package/src/module/workflow/repository/task.repository.ts +113 -113
  330. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  331. package/src/module/workflow/service/action-category.service.ts +33 -33
  332. package/src/module/workflow/service/action-data.service.ts +62 -62
  333. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  334. package/src/module/workflow/service/action-template-mapping.service.ts +55 -55
  335. package/src/module/workflow/service/action.service.ts +263 -263
  336. package/src/module/workflow/service/activity-log.service.ts +107 -107
  337. package/src/module/workflow/service/comm-template.service.ts +121 -121
  338. package/src/module/workflow/service/entity-modification.service.ts +67 -67
  339. package/src/module/workflow/service/form-master.service.ts +35 -35
  340. package/src/module/workflow/service/populate-workflow.service.ts +303 -303
  341. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  342. package/src/module/workflow/service/stage-group.service.ts +300 -300
  343. package/src/module/workflow/service/stage.service.ts +199 -199
  344. package/src/module/workflow/service/task.service.ts +504 -504
  345. package/src/module/workflow/service/workflow-list-master.service.ts +60 -60
  346. package/src/module/workflow/service/workflow-meta.service.ts +581 -581
  347. package/src/module/workflow/service/workflow.service.ts +205 -205
  348. package/src/module/workflow/workflow.module.ts +172 -172
  349. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +21 -21
  350. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  351. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +35 -35
  352. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  353. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  354. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  355. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +214 -214
  356. package/src/module/workflow-automation/service/workflow-automation.service.ts +345 -345
  357. package/src/module/workflow-automation/workflow-automation.module.ts +34 -34
  358. package/src/resources/dev.properties.yaml +30 -30
  359. package/src/resources/local.properties.yaml +27 -27
  360. package/src/resources/properties.module.ts +12 -12
  361. package/src/resources/properties.yaml.ts +11 -11
  362. package/src/resources/uat.properties.yaml +15 -15
  363. package/src/utils/dto/excel-data.dto.ts +14 -14
  364. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  365. package/src/utils/service/base64util.service.ts +18 -18
  366. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  367. package/src/utils/service/codeGenerator.service.ts +22 -22
  368. package/src/utils/service/dateUtil.service.ts +17 -17
  369. package/src/utils/service/encryptUtil.service.ts +97 -97
  370. package/src/utils/service/excel-helper.service.ts +72 -72
  371. package/src/utils/service/excelUtil.service.ts +15 -15
  372. package/src/utils/service/file-util.service.ts +11 -11
  373. package/src/utils/service/json-util.service.ts +23 -23
  374. package/src/utils/service/loggingUtil.service.ts +34 -34
  375. package/src/utils/service/reflection-helper.service.ts +62 -62
  376. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  377. package/src/utils/utils.module.ts +25 -25
  378. package/tsconfig.build.json +4 -4
  379. package/tsconfig.json +24 -24
  380. package/.claude/settings.local.json +0 -26
  381. package/.idea/250218_nodejs_core.iml +0 -9
  382. package/.idea/codeStyles/Project.xml +0 -59
  383. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  384. package/.idea/copilot.data.migration.agent.xml +0 -6
  385. package/.idea/copilot.data.migration.ask.xml +0 -6
  386. package/.idea/copilot.data.migration.ask2agent.xml +0 -6
  387. package/.idea/copilot.data.migration.edit.xml +0 -6
  388. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  389. package/.idea/misc.xml +0 -6
  390. package/.idea/modules.xml +0 -8
  391. package/.idea/prettier.xml +0 -6
  392. package/.idea/vcs.xml +0 -6
  393. package/server.log +0 -850
@@ -1,375 +1,388 @@
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
-
21
- @Injectable()
22
- export class ListMasterService {
23
- constructor(
24
- private readonly entityManager: EntityManager,
25
- @Inject(forwardRef(() => EntityServiceImpl))
26
- private readonly entityServiceImpl: EntityServiceImpl,
27
- @Inject(forwardRef(() => EntityMasterService))
28
- private readonly entityMasterService: EntityMasterService,
29
- private readonly listMasterRepo: ListMasterRepository,
30
- private readonly listItemsRepo: ListMasterItemsRepository,
31
- private readonly apiRegistryService: ApiRegistryService,
32
- private readonly httpService: HttpService,
33
- private readonly listMasterEngine: ListMasterEngine,
34
- ) {}
35
-
36
- private readonly skipLevelFilterEntities = ['BRN'];
37
-
38
- async getResolvedListCode(
39
- code: string,
40
- organization_id: number,
41
- ): Promise<any> {
42
- if (!code) return code;
43
-
44
- // Check if it's a valid list type
45
- const listMaster = await this.listItemsRepo.findItemByCode(
46
- code,
47
- organization_id,
48
- );
49
- if (listMaster) {
50
- return listMaster;
51
- }
52
- }
53
-
54
- async getDropdownOptions(
55
- type: string,
56
- params: Record<string, string>,
57
- inactiveIdsArray?: number[],
58
- loggedInUser?,
59
- ) {
60
- const config = await this.listMasterRepo.findByType(
61
- type,
62
- loggedInUser?.organization_id,
63
- );
64
-
65
- if (!config) throw new NotFoundException(`Type ${type} not found`);
66
-
67
- // Check if a dynamic extension exists for this type
68
- try {
69
- const extensionResult = await this.listMasterEngine.execute(type, {
70
- params,
71
- inactiveIdsArray,
72
- loggedInUser,
73
- config,
74
- });
75
-
76
- if (extensionResult !== undefined) return extensionResult;
77
- } catch (err) {
78
- console.warn(`No extension found for type ${type}, falling back to default logic`);
79
- }
80
-
81
- // Fallback to old logic if no extension exists
82
- switch (config.source) {
83
- case 'entity':
84
- return this.fetchFromEntity(type, params, inactiveIdsArray, loggedInUser);
85
-
86
- case 'master':
87
- return this.listItemsRepo.findItemsByType(
88
- type,
89
- config.sort_by,
90
- inactiveIdsArray,
91
- loggedInUser?.organization_id,
92
- params,
93
- );
94
-
95
- case 'operator':
96
- return this.listItemsRepo.findOperatorsByType(
97
- type,
98
- loggedInUser?.organization_id,
99
- );
100
-
101
- case 'custom':
102
- return this.fetchFromExternalSource(config.custom_source_id, params);
103
-
104
- default:
105
- throw new BadRequestException(`Unknown source: ${config.source}`);
106
- }
107
- }
108
-
109
-
110
- private async fetchFromEntity(
111
- sourceList: string,
112
- params: Record<string, any>,
113
- inactiveIdsArray?: number[],
114
- loggedInUser?: UserData,
115
- ) {
116
- console.log(
117
- sourceList,
118
- 'sourceList',
119
- params,
120
- 'params',
121
- inactiveIdsArray,
122
- 'inactiveIdsArray',
123
- loggedInUser,
124
- 'loggedInUser',
125
- );
126
- let result: { label: string; value: number }[] = [];
127
- if (!sourceList) return result;
128
-
129
- const entityMaster = await this.entityMasterService.getEntityData(
130
- sourceList,
131
- loggedInUser,
132
- );
133
- const tableName = entityMaster.data_source;
134
-
135
- const applyCommonFilters = (qb: any, status?: number) => {
136
- if (status) {
137
- const isView = tableName.endsWith('_vw'); // auto-detect view
138
- const statusColumn = isView ? 'status_id' : 'status';
139
- qb.andWhere(`${tableName}.${statusColumn} = :status`, { status });
140
- }
141
-
142
- if (loggedInUser?.level_type && loggedInUser?.level_id) {
143
- // Skip level filter for certain entities
144
- if (!this.skipLevelFilterEntities.includes(sourceList)) {
145
- qb.andWhere(
146
- `${tableName}.level_type = :levelType AND ${tableName}.level_id = :levelId AND ${tableName}.organization_id = :organization_id`,
147
- {
148
- levelType: loggedInUser.level_type,
149
- levelId: loggedInUser.level_id,
150
- organization_id: loggedInUser.organization_id,
151
- },
152
- );
153
- } else {
154
- // IN the case of BRN, we don't filter by level
155
- qb.andWhere(
156
- `${tableName}.parent_id = :organization_id
157
- AND ${tableName}.type = 'BRN'
158
- `,
159
- {
160
- organization_id: loggedInUser.organization_id,
161
- },
162
- );
163
- }
164
- }
165
-
166
- if (loggedInUser?.appcode && sourceList === 'ROL') {
167
- if (!this.skipLevelFilterEntities.includes(sourceList)) {
168
- qb.andWhere(`${tableName}.appcode = :appcode`, {
169
- appcode: loggedInUser.appcode,
170
- });
171
- }
172
- }
173
-
174
- for (const key in params) {
175
- qb.andWhere(`${tableName}.${key} = :${key}`, {
176
- [key]: params[key],
177
- });
178
- }
179
-
180
- return qb;
181
- };
182
-
183
- const resolveStatus = await this.getResolvedListCode(
184
- STATUS_ACTIVE,
185
- loggedInUser?.organization_id || 0,
186
- );
187
-
188
- // Fetpords
189
- const activeQuery = applyCommonFilters(
190
- this.entityManager
191
- .createQueryBuilder()
192
- .select('*')
193
- .from(tableName, tableName),
194
- resolveStatus.id,
195
- );
196
-
197
- const activeResults = await activeQuery.getRawMany();
198
- const activeIds = new Set(activeResults.map((r) => r.id));
199
-
200
- // Add active entries first
201
- activeResults.forEach((r) => {
202
- result.push({ label: r.name, value: r.id });
203
- });
204
-
205
- const resolveInactiveStatus = await this.getResolvedListCode(
206
- STATUS_INACTIVE,
207
- loggedInUser?.organization_id || 0,
208
- );
209
-
210
- // Fetch inactive records (with same filters but without status condition)
211
- if (inactiveIdsArray?.length) {
212
- const inactiveQuery = applyCommonFilters(
213
- this.entityManager
214
- .createQueryBuilder()
215
- .select('*')
216
- .from(tableName, tableName),
217
- resolveInactiveStatus.id,
218
- );
219
-
220
- inactiveQuery.andWhere(`${tableName}.id IN (:...ids)`, {
221
- ids: inactiveIdsArray,
222
- });
223
-
224
- const inactiveResults = await inactiveQuery.getRawMany();
225
-
226
- // Add only those inactive records not already present in active
227
- inactiveResults.forEach((item) => {
228
- if (!activeIds.has(item.id)) {
229
- result.push({
230
- label: `${item.name} [INACTIVE]`,
231
- value: item.id,
232
- });
233
- }
234
- });
235
- }
236
-
237
- return result;
238
- }
239
-
240
- private async fetchFromExternalSource(
241
- customSourceId: number,
242
- params?: Record<string, string>,
243
- ) {
244
- const apiRegistry = await this.apiRegistryService.findById(customSourceId);
245
- if (!apiRegistry) return [];
246
-
247
- const url = `${apiRegistry.base_url}${apiRegistry.endpoint.replace(/{{(.*?)}}/g, (_, key) => params?.[key.trim()] || '')}`;
248
- const payload = this.injectDynamicParams(
249
- apiRegistry.request_payload_schema,
250
- params,
251
- );
252
-
253
- const response = await firstValueFrom(
254
- this.httpService.request({
255
- url,
256
- method: apiRegistry.http_method || 'POST',
257
- data: payload,
258
- headers: apiRegistry.headers ? apiRegistry.headers : undefined,
259
- }),
260
- );
261
-
262
- const data = this.extractByPath(
263
- response.data,
264
- apiRegistry.response_data_path,
265
- );
266
-
267
- if (!Array.isArray(data)) {
268
- return [{ label: data, value: data }];
269
- }
270
-
271
- if (typeof data[0] === 'string') {
272
- return data.map((item: string) => ({ label: item, value: item }));
273
- }
274
-
275
- return data.map((item: any) => ({
276
- label: item[apiRegistry?.label],
277
- value: item[apiRegistry?.value],
278
- }));
279
- }
280
-
281
- private injectDynamicParams(
282
- payload: any,
283
- params?: Record<string, string>,
284
- ): any {
285
- if (params) {
286
- const stringified = JSON.stringify(payload);
287
- const replaced = stringified.replace(
288
- /{{(.*?)}}/g,
289
- (_, key) => params[key.trim()] || '',
290
- );
291
- return JSON.parse(replaced);
292
- }
293
- }
294
-
295
- private extractByPath(obj: any, path: string): any {
296
- if (!path || !obj) return obj;
297
-
298
- return path.split('.').reduce((acc, key) => {
299
- if (acc == null) return undefined;
300
-
301
- // Try to convert to number if it's a numeric string (for array indexes)
302
- const index = Number(key);
303
- if (!isNaN(index) && Array.isArray(acc)) {
304
- return acc[index];
305
- }
306
-
307
- return acc[key];
308
- }, obj);
309
- }
310
-
311
- // createEntity method
312
- async createEntity(entityData: any, loggedInUser: UserData): Promise<any> {
313
- // Trim and validate name and code
314
- const name = entityData.name?.trim();
315
- // const code = entityData.code?.trim();
316
-
317
- if (!name) {
318
- throw new BadRequestException('Name is required and cannot be empty');
319
- }
320
-
321
- entityData.name = name;
322
- entityData.is_factory = entityData.is_factory || 0;
323
- entityData.source = entityData.source || 'master';
324
- entityData.status = entityData.status || 'ACTIVE';
325
- entityData.type = entityData.code;
326
- entityData.sort_by = entityData.sort_by || 'asc';
327
- entityData.organization_id = loggedInUser.organization_id;
328
-
329
- // Check for duplicate name
330
- const nameExists = await this.listMasterRepo.findOneByCondition({
331
- name,
332
- organization_id: loggedInUser.organization_id,
333
- });
334
-
335
- if (nameExists) {
336
- throw new BadRequestException(
337
- 'A List Master with the same name already exists',
338
- );
339
- }
340
-
341
- const createdListMaster = await this.entityServiceImpl.createEntity(
342
- entityData,
343
- loggedInUser,
344
- );
345
-
346
- if (!createdListMaster) {
347
- throw new BadRequestException('Failed to create entity');
348
- }
349
-
350
- return createdListMaster;
351
- }
352
-
353
- async updateEntity(entityData: any, loggedInUser: UserData): Promise<any> {
354
- return await this.entityServiceImpl.updateEntity(entityData, loggedInUser);
355
- }
356
-
357
- async getEntityData(
358
- entity_type: string,
359
- id: number,
360
- loggedInUser,
361
- ): Promise<any> {
362
- return await this.entityServiceImpl.getEntityData(
363
- entity_type,
364
- id,
365
- loggedInUser,
366
- );
367
- }
368
-
369
- async getAllListMasterByOrganization(
370
- organizationId: number,
371
- search?: string,
372
- ): Promise<any[]> {
373
- return await this.listMasterRepo.findAllItems(organizationId, search);
374
- }
375
- }
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
+
22
+
23
+ @Injectable()
24
+ export class ListMasterService {
25
+ constructor(
26
+ private readonly entityManager: EntityManager,
27
+ @Inject(forwardRef(() => EntityServiceImpl))
28
+ private readonly entityServiceImpl: EntityServiceImpl,
29
+ @Inject(forwardRef(() => EntityMasterService))
30
+ private readonly entityMasterService: EntityMasterService,
31
+ private readonly listMasterRepo: ListMasterRepository,
32
+ private readonly listItemsRepo: ListMasterItemsRepository,
33
+ private readonly apiRegistryService: ApiRegistryService,
34
+ private readonly httpService: HttpService,
35
+ private readonly listMasterEngine: ListMasterEngine,
36
+ ) {}
37
+
38
+ private readonly skipLevelFilterEntities = ['BRN'];
39
+ private readonly actions = new Map<string, Action>();
40
+
41
+
42
+ registerAction(actionName: string, actionInstance: Action) {
43
+ this.actions.set(actionName, actionInstance);
44
+ console.log(
45
+ `⚙️ [WorkflowAutomationEngine] Registered action: ${actionName}`,
46
+ );
47
+ }
48
+
49
+
50
+ async getResolvedListCode(
51
+ code: string,
52
+ organization_id: number,
53
+ ): Promise<any> {
54
+ if (!code) return code;
55
+
56
+ // Check if it's a valid list type
57
+ const listMaster = await this.listItemsRepo.findItemByCode(
58
+ code,
59
+ organization_id,
60
+ );
61
+ if (listMaster) {
62
+ return listMaster;
63
+ }
64
+ }
65
+
66
+ async getDropdownOptions(
67
+ type: string,
68
+ params: Record<string, string>,
69
+ inactiveIdsArray?: number[],
70
+ loggedInUser?,
71
+ ) {
72
+ const config = await this.listMasterRepo.findByType(
73
+ type,
74
+ loggedInUser?.organization_id,
75
+ );
76
+
77
+ if (!config) throw new NotFoundException(`Type ${type} not found`);
78
+
79
+ if (config.appcode!=loggedInUser?.appcode) {
80
+
81
+ const impl = this.actions.get("LIST_MASTER")
82
+
83
+
84
+
85
+ if(impl) {
86
+ await impl.execute("HEY");
87
+ }
88
+
89
+
90
+
91
+ }
92
+ // Check if a dynamic extension exists for this type
93
+
94
+ // Fallback to old logic if no extension exists
95
+ switch (config.source) {
96
+ case 'entity':
97
+ return this.fetchFromEntity(type, params, inactiveIdsArray, loggedInUser);
98
+
99
+ case 'master':
100
+ return this.listItemsRepo.findItemsByType(
101
+ type,
102
+ config.sort_by,
103
+ inactiveIdsArray,
104
+ loggedInUser?.organization_id,
105
+ params,
106
+ );
107
+
108
+ case 'operator':
109
+ return this.listItemsRepo.findOperatorsByType(
110
+ type,
111
+ loggedInUser?.organization_id,
112
+ );
113
+
114
+ case 'custom':
115
+ return this.fetchFromExternalSource(config.custom_source_id, params);
116
+
117
+ default:
118
+ throw new BadRequestException(`Unknown source: ${config.source}`);
119
+ }
120
+ }
121
+
122
+
123
+ private async fetchFromEntity(
124
+ sourceList: string,
125
+ params: Record<string, any>,
126
+ inactiveIdsArray?: number[],
127
+ loggedInUser?: UserData,
128
+ ) {
129
+ console.log(
130
+ sourceList,
131
+ 'sourceList',
132
+ params,
133
+ 'params',
134
+ inactiveIdsArray,
135
+ 'inactiveIdsArray',
136
+ loggedInUser,
137
+ 'loggedInUser',
138
+ );
139
+ let result: { label: string; value: number }[] = [];
140
+ if (!sourceList) return result;
141
+
142
+ const entityMaster = await this.entityMasterService.getEntityData(
143
+ sourceList,
144
+ loggedInUser,
145
+ );
146
+ const tableName = entityMaster.data_source;
147
+
148
+ const applyCommonFilters = (qb: any, status?: number) => {
149
+ if (status) {
150
+ const isView = tableName.endsWith('_vw'); // auto-detect view
151
+ const statusColumn = isView ? 'status_id' : 'status';
152
+ qb.andWhere(`${tableName}.${statusColumn} = :status`, { status });
153
+ }
154
+
155
+ if (loggedInUser?.level_type && loggedInUser?.level_id) {
156
+ // Skip level filter for certain entities
157
+ if (!this.skipLevelFilterEntities.includes(sourceList)) {
158
+ qb.andWhere(
159
+ `${tableName}.level_type = :levelType AND ${tableName}.level_id = :levelId AND ${tableName}.organization_id = :organization_id`,
160
+ {
161
+ levelType: loggedInUser.level_type,
162
+ levelId: loggedInUser.level_id,
163
+ organization_id: loggedInUser.organization_id,
164
+ },
165
+ );
166
+ } else {
167
+ // IN the case of BRN, we don't filter by level
168
+ qb.andWhere(
169
+ `${tableName}.parent_id = :organization_id
170
+ AND ${tableName}.type = 'BRN'
171
+ `,
172
+ {
173
+ organization_id: loggedInUser.organization_id,
174
+ },
175
+ );
176
+ }
177
+ }
178
+
179
+ if (loggedInUser?.appcode && sourceList === 'ROL') {
180
+ if (!this.skipLevelFilterEntities.includes(sourceList)) {
181
+ qb.andWhere(`${tableName}.appcode = :appcode`, {
182
+ appcode: loggedInUser.appcode,
183
+ });
184
+ }
185
+ }
186
+
187
+ for (const key in params) {
188
+ qb.andWhere(`${tableName}.${key} = :${key}`, {
189
+ [key]: params[key],
190
+ });
191
+ }
192
+
193
+ return qb;
194
+ };
195
+
196
+ const resolveStatus = await this.getResolvedListCode(
197
+ STATUS_ACTIVE,
198
+ loggedInUser?.organization_id || 0,
199
+ );
200
+
201
+ // Fetpords
202
+ const activeQuery = applyCommonFilters(
203
+ this.entityManager
204
+ .createQueryBuilder()
205
+ .select('*')
206
+ .from(tableName, tableName),
207
+ resolveStatus.id,
208
+ );
209
+
210
+ const activeResults = await activeQuery.getRawMany();
211
+ const activeIds = new Set(activeResults.map((r) => r.id));
212
+
213
+ // Add active entries first
214
+ activeResults.forEach((r) => {
215
+ result.push({ label: r.name, value: r.id });
216
+ });
217
+
218
+ const resolveInactiveStatus = await this.getResolvedListCode(
219
+ STATUS_INACTIVE,
220
+ loggedInUser?.organization_id || 0,
221
+ );
222
+
223
+ // Fetch inactive records (with same filters but without status condition)
224
+ if (inactiveIdsArray?.length) {
225
+ const inactiveQuery = applyCommonFilters(
226
+ this.entityManager
227
+ .createQueryBuilder()
228
+ .select('*')
229
+ .from(tableName, tableName),
230
+ resolveInactiveStatus.id,
231
+ );
232
+
233
+ inactiveQuery.andWhere(`${tableName}.id IN (:...ids)`, {
234
+ ids: inactiveIdsArray,
235
+ });
236
+
237
+ const inactiveResults = await inactiveQuery.getRawMany();
238
+
239
+ // Add only those inactive records not already present in active
240
+ inactiveResults.forEach((item) => {
241
+ if (!activeIds.has(item.id)) {
242
+ result.push({
243
+ label: `${item.name} [INACTIVE]`,
244
+ value: item.id,
245
+ });
246
+ }
247
+ });
248
+ }
249
+
250
+ return result;
251
+ }
252
+
253
+ private async fetchFromExternalSource(
254
+ customSourceId: number,
255
+ params?: Record<string, string>,
256
+ ) {
257
+ const apiRegistry = await this.apiRegistryService.findById(customSourceId);
258
+ if (!apiRegistry) return [];
259
+
260
+ const url = `${apiRegistry.base_url}${apiRegistry.endpoint.replace(/{{(.*?)}}/g, (_, key) => params?.[key.trim()] || '')}`;
261
+ const payload = this.injectDynamicParams(
262
+ apiRegistry.request_payload_schema,
263
+ params,
264
+ );
265
+
266
+ const response = await firstValueFrom(
267
+ this.httpService.request({
268
+ url,
269
+ method: apiRegistry.http_method || 'POST',
270
+ data: payload,
271
+ headers: apiRegistry.headers ? apiRegistry.headers : undefined,
272
+ }),
273
+ );
274
+
275
+ const data = this.extractByPath(
276
+ response.data,
277
+ apiRegistry.response_data_path,
278
+ );
279
+
280
+ if (!Array.isArray(data)) {
281
+ return [{ label: data, value: data }];
282
+ }
283
+
284
+ if (typeof data[0] === 'string') {
285
+ return data.map((item: string) => ({ label: item, value: item }));
286
+ }
287
+
288
+ return data.map((item: any) => ({
289
+ label: item[apiRegistry?.label],
290
+ value: item[apiRegistry?.value],
291
+ }));
292
+ }
293
+
294
+ private injectDynamicParams(
295
+ payload: any,
296
+ params?: Record<string, string>,
297
+ ): any {
298
+ if (params) {
299
+ const stringified = JSON.stringify(payload);
300
+ const replaced = stringified.replace(
301
+ /{{(.*?)}}/g,
302
+ (_, key) => params[key.trim()] || '',
303
+ );
304
+ return JSON.parse(replaced);
305
+ }
306
+ }
307
+
308
+ private extractByPath(obj: any, path: string): any {
309
+ if (!path || !obj) return obj;
310
+
311
+ return path.split('.').reduce((acc, key) => {
312
+ if (acc == null) return undefined;
313
+
314
+ // Try to convert to number if it's a numeric string (for array indexes)
315
+ const index = Number(key);
316
+ if (!isNaN(index) && Array.isArray(acc)) {
317
+ return acc[index];
318
+ }
319
+
320
+ return acc[key];
321
+ }, obj);
322
+ }
323
+
324
+ // createEntity method
325
+ async createEntity(entityData: any, loggedInUser: UserData): Promise<any> {
326
+ // Trim and validate name and code
327
+ const name = entityData.name?.trim();
328
+ // const code = entityData.code?.trim();
329
+
330
+ if (!name) {
331
+ throw new BadRequestException('Name is required and cannot be empty');
332
+ }
333
+
334
+ entityData.name = name;
335
+ entityData.is_factory = entityData.is_factory || 0;
336
+ entityData.source = entityData.source || 'master';
337
+ entityData.status = entityData.status || 'ACTIVE';
338
+ entityData.type = entityData.code;
339
+ entityData.sort_by = entityData.sort_by || 'asc';
340
+ entityData.organization_id = loggedInUser.organization_id;
341
+
342
+ // Check for duplicate name
343
+ const nameExists = await this.listMasterRepo.findOneByCondition({
344
+ name,
345
+ organization_id: loggedInUser.organization_id,
346
+ });
347
+
348
+ if (nameExists) {
349
+ throw new BadRequestException(
350
+ 'A List Master with the same name already exists',
351
+ );
352
+ }
353
+
354
+ const createdListMaster = await this.entityServiceImpl.createEntity(
355
+ entityData,
356
+ loggedInUser,
357
+ );
358
+
359
+ if (!createdListMaster) {
360
+ throw new BadRequestException('Failed to create entity');
361
+ }
362
+
363
+ return createdListMaster;
364
+ }
365
+
366
+ async updateEntity(entityData: any, loggedInUser: UserData): Promise<any> {
367
+ return await this.entityServiceImpl.updateEntity(entityData, loggedInUser);
368
+ }
369
+
370
+ async getEntityData(
371
+ entity_type: string,
372
+ id: number,
373
+ loggedInUser,
374
+ ): Promise<any> {
375
+ return await this.entityServiceImpl.getEntityData(
376
+ entity_type,
377
+ id,
378
+ loggedInUser,
379
+ );
380
+ }
381
+
382
+ async getAllListMasterByOrganization(
383
+ organizationId: number,
384
+ search?: string,
385
+ ): Promise<any[]> {
386
+ return await this.listMasterRepo.findAllItems(organizationId, search);
387
+ }
388
+ }