rez_core 4.0.198 → 4.0.199

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 (529) hide show
  1. package/.prettierrc +3 -3
  2. package/.vscode/extensions.json +5 -0
  3. package/README.md +99 -99
  4. package/dist/config/config.module.js +2 -2
  5. package/dist/config/config.module.js.map +1 -1
  6. package/dist/config/database.config.d.ts +1 -1
  7. package/dist/config/database.config.js +11 -15
  8. package/dist/config/database.config.js.map +1 -1
  9. package/dist/module/auth/guards/role.guard.js +3 -3
  10. package/dist/module/auth/services/auth.service.js +3 -3
  11. package/dist/module/auth/services/auth.service.js.map +1 -1
  12. package/dist/module/enterprise/entity/organization.entity.js +1 -1
  13. package/dist/module/enterprise/repository/school.repository.js +3 -3
  14. package/dist/module/enterprise/repository/school.repository.js.map +1 -1
  15. package/dist/module/entity_json/service/entity_json.service.js +2 -2
  16. package/dist/module/filter/repository/saved-filter.repository.js +4 -4
  17. package/dist/module/filter/service/filter-evaluator.service.js +3 -3
  18. package/dist/module/filter/service/filter-evaluator.service.js.map +1 -1
  19. package/dist/module/filter/service/filter.service.d.ts +1 -4
  20. package/dist/module/filter/service/filter.service.js +39 -69
  21. package/dist/module/filter/service/filter.service.js.map +1 -1
  22. package/dist/module/integration/entity/integration-config.entity.js +6 -6
  23. package/dist/module/integration/entity/integration-config.entity.js.map +1 -1
  24. package/dist/module/integration/entity/integration-entity-mapper.entity.js +1 -1
  25. package/dist/module/integration/entity/integration-entity-mapper.entity.js.map +1 -1
  26. package/dist/module/integration/entity/integration-source.entity.js +4 -4
  27. package/dist/module/integration/entity/integration-source.entity.js.map +1 -1
  28. package/dist/module/integration/entity/user-integration.entity.js +4 -4
  29. package/dist/module/integration/entity/user-integration.entity.js.map +1 -1
  30. package/dist/module/integration/examples/usage.example.js +9 -9
  31. package/dist/module/integration/service/integration.service.js +1 -1
  32. package/dist/module/integration/service/wrapper.service.js +28 -29
  33. package/dist/module/integration/service/wrapper.service.js.map +1 -1
  34. package/dist/module/linked_attributes/entity/linked_attribute.entity.d.ts +1 -0
  35. package/dist/module/linked_attributes/entity/linked_attribute.entity.js +4 -0
  36. package/dist/module/linked_attributes/entity/linked_attribute.entity.js.map +1 -1
  37. package/dist/module/listmaster/entity/list-master-items.entity.js +3 -3
  38. package/dist/module/listmaster/entity/list-master-items.entity.js.map +1 -1
  39. package/dist/module/listmaster/entity/list-master.entity.js +4 -4
  40. package/dist/module/listmaster/entity/list-master.entity.js.map +1 -1
  41. package/dist/module/listmaster/service/list-master-item.service.js +3 -3
  42. package/dist/module/listmaster/service/list-master-item.service.js.map +1 -1
  43. package/dist/module/mapper/entity/field-mapper.entity.js +6 -6
  44. package/dist/module/mapper/entity/field-mapper.entity.js.map +1 -1
  45. package/dist/module/mapper/service/field-mapper.service.js +5 -5
  46. package/dist/module/mapper/service/field-mapper.service.js.map +1 -1
  47. package/dist/module/mapper/service/mapper.service.js +4 -4
  48. package/dist/module/mapper/service/mapper.service.js.map +1 -1
  49. package/dist/module/meta/entity/app-master.entity.d.ts +2 -2
  50. package/dist/module/meta/entity/app-master.entity.js +4 -4
  51. package/dist/module/meta/entity/entity-master.entity.js +1 -1
  52. package/dist/module/meta/entity/entity-master.entity.js.map +1 -1
  53. package/dist/module/meta/entity/view-master.entity.js +1 -1
  54. package/dist/module/meta/entity/view-master.entity.js.map +1 -1
  55. package/dist/module/meta/repository/attribute-master.repository.js +2 -2
  56. package/dist/module/meta/repository/attribute-master.repository.js.map +1 -1
  57. package/dist/module/meta/repository/entity-attribute-update.repository.js +3 -3
  58. package/dist/module/meta/repository/entity-master.repository.js +2 -2
  59. package/dist/module/meta/repository/entity-master.repository.js.map +1 -1
  60. package/dist/module/meta/service/attribute-master.service.js +1 -1
  61. package/dist/module/meta/service/attribute-master.service.js.map +1 -1
  62. package/dist/module/meta/service/entity-dynamic.service.js +27 -27
  63. package/dist/module/meta/service/entity-dynamic.service.js.map +1 -1
  64. package/dist/module/meta/service/entity-list.service.js +3 -3
  65. package/dist/module/meta/service/entity-master.service.js +4 -4
  66. package/dist/module/meta/service/entity-master.service.js.map +1 -1
  67. package/dist/module/meta/service/entity-relation.service.js +13 -13
  68. package/dist/module/meta/service/entity-relation.service.js.map +1 -1
  69. package/dist/module/meta/service/entity-service-impl.service.js +3 -3
  70. package/dist/module/meta/service/media-data.service.js +9 -9
  71. package/dist/module/meta/service/media-data.service.js.map +1 -1
  72. package/dist/module/meta/service/resolver.service.js +17 -17
  73. package/dist/module/meta/service/resolver.service.js.map +1 -1
  74. package/dist/module/module/repository/menu.repository.js +12 -12
  75. package/dist/module/module/service/module-access.service.js +8 -2
  76. package/dist/module/module/service/module-access.service.js.map +1 -1
  77. package/dist/module/notification/controller/otp.controller.d.ts +1 -31
  78. package/dist/module/notification/entity/otp.entity.js +1 -1
  79. package/dist/module/notification/entity/otp.entity.js.map +1 -1
  80. package/dist/module/notification/service/notification.service.js +22 -26
  81. package/dist/module/notification/service/notification.service.js.map +1 -1
  82. package/dist/module/notification/service/otp.service.d.ts +1 -31
  83. package/dist/module/notification/service/otp.service.js +1 -0
  84. package/dist/module/notification/service/otp.service.js.map +1 -1
  85. package/dist/module/user/controller/login.controller.js +20 -19
  86. package/dist/module/user/controller/login.controller.js.map +1 -1
  87. package/dist/module/user/entity/user-role-mapping.entity.js +1 -1
  88. package/dist/module/user/entity/user-role-mapping.entity.js.map +1 -1
  89. package/dist/module/user/service/login.service.d.ts +3 -57
  90. package/dist/module/user/service/login.service.js +13 -3
  91. package/dist/module/user/service/login.service.js.map +1 -1
  92. package/dist/module/user/service/role.service.js +4 -4
  93. package/dist/module/user/service/user-session.service.js +4 -4
  94. package/dist/module/user/service/user-session.service.js.map +1 -1
  95. package/dist/module/user/service/user.service.js +1 -1
  96. package/dist/module/user/service/user.service.js.map +1 -1
  97. package/dist/module/workflow/entity/action-category.entity.d.ts +1 -1
  98. package/dist/module/workflow/entity/action-category.entity.js +1 -1
  99. package/dist/module/workflow/entity/action-data.entity.js +1 -1
  100. package/dist/module/workflow/entity/action-data.entity.js.map +1 -1
  101. package/dist/module/workflow/entity/action.entity.js +1 -1
  102. package/dist/module/workflow/entity/action.entity.js.map +1 -1
  103. package/dist/module/workflow/entity/comm-template.entity.js +1 -1
  104. package/dist/module/workflow/entity/comm-template.entity.js.map +1 -1
  105. package/dist/module/workflow/entity/template-attach-mapper.entity.js +1 -1
  106. package/dist/module/workflow/entity/template-attach-mapper.entity.js.map +1 -1
  107. package/dist/module/workflow/repository/action-data.repository.js +4 -4
  108. package/dist/module/workflow/repository/action-data.repository.js.map +1 -1
  109. package/dist/module/workflow/repository/action.repository.js +21 -21
  110. package/dist/module/workflow/repository/action.repository.js.map +1 -1
  111. package/dist/module/workflow/repository/comm-template.repository.js +7 -7
  112. package/dist/module/workflow/repository/comm-template.repository.js.map +1 -1
  113. package/dist/module/workflow/repository/form-master.repository.js +3 -3
  114. package/dist/module/workflow/repository/form-master.repository.js.map +1 -1
  115. package/dist/module/workflow/repository/stage-group.repository.js +23 -23
  116. package/dist/module/workflow/repository/stage-movement.repository.js +17 -17
  117. package/dist/module/workflow/repository/stage-movement.repository.js.map +1 -1
  118. package/dist/module/workflow/repository/stage.repository.js +8 -8
  119. package/dist/module/workflow/repository/task.repository.js +4 -4
  120. package/dist/module/workflow/repository/task.repository.js.map +1 -1
  121. package/dist/module/workflow/service/action-template-mapping.service.js +22 -22
  122. package/dist/module/workflow/service/action.service.js +13 -13
  123. package/dist/module/workflow/service/action.service.js.map +1 -1
  124. package/dist/module/workflow/service/entity-modification.service.js +6 -6
  125. package/dist/module/workflow/service/populate-workflow.service.js +8 -8
  126. package/dist/module/workflow/service/populate-workflow.service.js.map +1 -1
  127. package/dist/module/workflow/service/stage-group.service.js +6 -6
  128. package/dist/module/workflow/service/stage-group.service.js.map +1 -1
  129. package/dist/module/workflow/service/stage.service.js +4 -4
  130. package/dist/module/workflow/service/stage.service.js.map +1 -1
  131. package/dist/module/workflow/service/task.service.js +33 -33
  132. package/dist/module/workflow/service/task.service.js.map +1 -1
  133. package/dist/module/workflow/service/workflow-list-master.service.js +16 -16
  134. package/dist/module/workflow/service/workflow-list-master.service.js.map +1 -1
  135. package/dist/module/workflow/service/workflow-meta.service.js +31 -31
  136. package/dist/module/workflow/service/workflow-meta.service.js.map +1 -1
  137. package/dist/module/workflow/service/workflow.service.js +5 -5
  138. package/dist/module/workflow/service/workflow.service.js.map +1 -1
  139. package/dist/module/workflow-automation/entity/workflow-automation-action.entity.d.ts +1 -1
  140. package/dist/module/workflow-automation/entity/workflow-automation-action.entity.js +1 -1
  141. package/dist/module/workflow-automation/service/schedule-handler.service.js +14 -14
  142. package/dist/module/workflow-automation/service/workflow-automation-engine.service.js +1 -1
  143. package/dist/module/workflow-automation/service/workflow-automation-engine.service.js.map +1 -1
  144. package/dist/module/workflow-automation/service/workflow-automation.service.js +4 -4
  145. package/dist/module/workflow-schedule/entities/scheduled-workflow.entity.js +4 -4
  146. package/dist/module/workflow-schedule/entities/scheduled-workflow.entity.js.map +1 -1
  147. package/dist/module/workflow-schedule/entities/workflow-execution-log.entity.js +2 -2
  148. package/dist/module/workflow-schedule/entities/workflow-execution-log.entity.js.map +1 -1
  149. package/dist/module/workflow-schedule/processors/schedule.processor.js +4 -4
  150. package/dist/module/workflow-schedule/service/workflow-schedule.service.js +9 -9
  151. package/dist/tsconfig.build.tsbuildinfo +1 -1
  152. package/dist/utils/service/reflection-helper.service.js +3 -3
  153. package/dist/utils/service/reflection-helper.service.js.map +1 -1
  154. package/docs/modules/event-driven-integration-design.md +91 -91
  155. package/docs/modules/integration.md +250 -250
  156. package/eslint.config.mjs +34 -34
  157. package/nest-cli.json +14 -14
  158. package/package.json +124 -124
  159. package/src/app.controller.ts +12 -12
  160. package/src/app.module.ts +66 -66
  161. package/src/app.service.ts +8 -8
  162. package/src/config/bull.config.ts +69 -69
  163. package/src/config/config.module.ts +18 -17
  164. package/src/config/database.config.ts +23 -48
  165. package/src/constant/global.constant.ts +67 -67
  166. package/src/core.module.ts +88 -88
  167. package/src/decorators/roles.decorator.ts +7 -7
  168. package/src/dtos/response.dto.ts +6 -6
  169. package/src/dtos/response.ts +5 -5
  170. package/src/index.ts +1 -1
  171. package/src/module/auth/auth.module.ts +49 -49
  172. package/src/module/auth/controller/auth.controller.ts +28 -28
  173. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  174. package/src/module/auth/guards/jwt.guard.ts +22 -22
  175. package/src/module/auth/guards/role.guard.ts +68 -68
  176. package/src/module/auth/services/auth.service.ts +50 -50
  177. package/src/module/auth/services/jwt.service.ts +11 -11
  178. package/src/module/auth/strategies/google.strategy.ts +54 -54
  179. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  180. package/src/module/auth/strategies/local.strategy.ts +13 -13
  181. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  182. package/src/module/dashboard/dashboard.module.ts +21 -21
  183. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  184. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  185. package/src/module/dashboard/repository/dashboard.repository.ts +42 -42
  186. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  187. package/src/module/dev/dev.module.ts +12 -12
  188. package/src/module/dev/service/dev.service.ts +7 -7
  189. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  190. package/src/module/enterprise/enterprise.module.ts +30 -30
  191. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  192. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  193. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  194. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  195. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  196. package/src/module/enterprise/repository/school.repository.ts +278 -278
  197. package/src/module/enterprise/service/brand.service.ts +5 -5
  198. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  199. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  200. package/src/module/enterprise/service/organization.service.ts +145 -145
  201. package/src/module/entity_json/controller/entity_json.controller.ts +47 -47
  202. package/src/module/entity_json/entity_json.module.ts +15 -15
  203. package/src/module/entity_json/service/entity_json.service.ts +265 -265
  204. package/src/module/filter/controller/filter.controller.ts +84 -84
  205. package/src/module/filter/dto/filter-request.dto.ts +38 -38
  206. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  207. package/src/module/filter/entity/saved-filter-master.entity.ts +23 -23
  208. package/src/module/filter/filter.module.ts +31 -31
  209. package/src/module/filter/repository/saved-filter.repository.ts +168 -168
  210. package/src/module/filter/service/filter-evaluator.service.ts +86 -86
  211. package/src/module/filter/service/filter.service.ts +1005 -1051
  212. package/src/module/filter/service/saved-filter.service.ts +170 -170
  213. package/src/module/ics/controller/ics.controller.ts +21 -21
  214. package/src/module/ics/dto/ics.dto.ts +55 -55
  215. package/src/module/ics/ics.module.ts +13 -13
  216. package/src/module/ics/service/ics.service.ts +57 -57
  217. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  218. package/src/module/integration/controller/integration.controller.ts +662 -662
  219. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  220. package/src/module/integration/dto/create-config.dto.ts +526 -526
  221. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  222. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  223. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  224. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  225. package/src/module/integration/examples/usage.example.ts +338 -338
  226. package/src/module/integration/factories/base.factory.ts +7 -7
  227. package/src/module/integration/factories/email.factory.ts +49 -49
  228. package/src/module/integration/factories/integration.factory.ts +121 -121
  229. package/src/module/integration/factories/sms.factory.ts +51 -51
  230. package/src/module/integration/factories/telephone.factory.ts +41 -41
  231. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  232. package/src/module/integration/integration.module.ts +110 -110
  233. package/src/module/integration/service/calendar-event.service.ts +118 -118
  234. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  235. package/src/module/integration/service/integration-queue.service.ts +229 -229
  236. package/src/module/integration/service/integration.service.ts +2633 -2633
  237. package/src/module/integration/service/oauth.service.ts +224 -224
  238. package/src/module/integration/service/wrapper.service.ts +700 -701
  239. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  240. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  241. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  242. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  243. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  244. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  245. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  246. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  247. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  248. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  249. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  250. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  251. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  252. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  253. package/src/module/layout/controller/layout.controller.ts +47 -47
  254. package/src/module/layout/entity/header-items.entity.ts +28 -28
  255. package/src/module/layout/entity/header-section.entity.ts +19 -19
  256. package/src/module/layout/layout.module.ts +21 -21
  257. package/src/module/layout/repository/header-items.repository.ts +18 -18
  258. package/src/module/layout/repository/header-section.repository.ts +22 -22
  259. package/src/module/layout/service/header-section.service.ts +25 -25
  260. package/src/module/layout_preference/controller/layout_preference.controller.ts +73 -73
  261. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  262. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  263. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  264. package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
  265. package/src/module/lead/controller/lead.controller.ts +30 -30
  266. package/src/module/lead/lead.module.ts +14 -14
  267. package/src/module/lead/repository/lead.repository.ts +41 -41
  268. package/src/module/lead/service/lead.service.ts +54 -54
  269. package/src/module/linked_attributes/controller/linked_attributes.controller.ts +10 -10
  270. package/src/module/linked_attributes/entity/linked_attribute.entity.ts +51 -48
  271. package/src/module/linked_attributes/linked_attributes.module.ts +16 -16
  272. package/src/module/linked_attributes/repository/linked_attribute.repository.ts +12 -12
  273. package/src/module/linked_attributes/service/linked_attributes.service.ts +22 -22
  274. package/src/module/listmaster/controller/list-master.controller.ts +230 -230
  275. package/src/module/listmaster/entity/list-master-items.entity.ts +43 -43
  276. package/src/module/listmaster/entity/list-master.entity.ts +33 -33
  277. package/src/module/listmaster/listmaster.module.ts +46 -46
  278. package/src/module/listmaster/repository/list-master-items.repository.ts +169 -169
  279. package/src/module/listmaster/repository/list-master.repository.ts +46 -46
  280. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  281. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  282. package/src/module/listmaster/service/list-master-item.service.ts +292 -292
  283. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  284. package/src/module/listmaster/service/list-master.service.ts +535 -535
  285. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  286. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  287. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  288. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  289. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  290. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  291. package/src/module/mapper/mapper.module.ts +34 -34
  292. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  293. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  294. package/src/module/mapper/repository/mapper.repository.ts +15 -15
  295. package/src/module/mapper/service/field-mapper.service.ts +271 -271
  296. package/src/module/mapper/service/mapper.service.ts +79 -79
  297. package/src/module/master/controller/master.controller.ts +74 -74
  298. package/src/module/master/service/master.service.ts +483 -483
  299. package/src/module/meta/controller/app-master.controller.ts +38 -38
  300. package/src/module/meta/controller/attribute-master.controller.ts +86 -86
  301. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  302. package/src/module/meta/controller/entity-master.controller.ts +41 -41
  303. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  304. package/src/module/meta/controller/entity.controller.ts +392 -392
  305. package/src/module/meta/controller/entity.public.controller.ts +75 -75
  306. package/src/module/meta/controller/media.controller.ts +107 -107
  307. package/src/module/meta/controller/meta.controller.ts +96 -96
  308. package/src/module/meta/controller/view-master.controller.ts +86 -86
  309. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  310. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  311. package/src/module/meta/dto/entity-table.dto.ts +9 -9
  312. package/src/module/meta/entity/app-master.entity.ts +34 -34
  313. package/src/module/meta/entity/attribute-master.entity.ts +89 -89
  314. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  315. package/src/module/meta/entity/entity-master.entity.ts +85 -85
  316. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  317. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  318. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  319. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  320. package/src/module/meta/entity/media-data.entity.ts +32 -32
  321. package/src/module/meta/entity/preference.entity.ts +62 -62
  322. package/src/module/meta/entity/view-master.entity.ts +41 -41
  323. package/src/module/meta/entity.module.ts +166 -166
  324. package/src/module/meta/repository/app-master.repository.ts +20 -20
  325. package/src/module/meta/repository/attribute-master.repository.ts +138 -138
  326. package/src/module/meta/repository/entity-attribute-update.repository.ts +44 -44
  327. package/src/module/meta/repository/entity-master.repository.ts +99 -99
  328. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  329. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  330. package/src/module/meta/repository/media-data.repository.ts +50 -50
  331. package/src/module/meta/repository/preference.repository.ts +20 -20
  332. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  333. package/src/module/meta/repository/view-master.repository.ts +42 -42
  334. package/src/module/meta/service/app-master.service.ts +37 -37
  335. package/src/module/meta/service/attribute-master.service.ts +130 -130
  336. package/src/module/meta/service/common.service.ts +9 -9
  337. package/src/module/meta/service/entity-attribute-update.service.ts +28 -28
  338. package/src/module/meta/service/entity-dynamic.service.ts +819 -819
  339. package/src/module/meta/service/entity-list.service.ts +205 -205
  340. package/src/module/meta/service/entity-master.service.ts +175 -175
  341. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  342. package/src/module/meta/service/entity-relation.service.ts +69 -69
  343. package/src/module/meta/service/entity-service-impl.service.ts +525 -525
  344. package/src/module/meta/service/entity-table-column.service.ts +39 -39
  345. package/src/module/meta/service/entity-table.service.ts +150 -150
  346. package/src/module/meta/service/entity-validation.service.ts +187 -187
  347. package/src/module/meta/service/entity.service.ts +67 -67
  348. package/src/module/meta/service/field-group.service.ts +103 -103
  349. package/src/module/meta/service/media-data.service.ts +507 -507
  350. package/src/module/meta/service/populate-meta.service.ts +193 -193
  351. package/src/module/meta/service/preference.service.ts +16 -16
  352. package/src/module/meta/service/resolver.service.ts +267 -267
  353. package/src/module/meta/service/section-master.service.ts +104 -104
  354. package/src/module/meta/service/update-form-json.service.ts +22 -22
  355. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  356. package/src/module/meta/service/view-master.service.ts +127 -127
  357. package/src/module/microservice-client/microservice-clients.module.ts +13 -13
  358. package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
  359. package/src/module/microservice-client/service/microservice-clients.ts +4 -4
  360. package/src/module/module/controller/menu.controller.ts +15 -15
  361. package/src/module/module/controller/module-access.controller.ts +134 -134
  362. package/src/module/module/entity/menu.entity.ts +43 -43
  363. package/src/module/module/entity/module-access.entity.ts +25 -25
  364. package/src/module/module/entity/module-action.entity.ts +17 -17
  365. package/src/module/module/entity/module.entity.ts +52 -52
  366. package/src/module/module/module.module.ts +42 -42
  367. package/src/module/module/repository/menu.repository.ts +184 -184
  368. package/src/module/module/repository/module-access.repository.ts +344 -344
  369. package/src/module/module/service/menu.service.ts +82 -82
  370. package/src/module/module/service/module-access.service.ts +209 -194
  371. package/src/module/notification/controller/notification.controller.ts +58 -58
  372. package/src/module/notification/controller/otp.controller.ts +117 -117
  373. package/src/module/notification/entity/notification.entity.ts +26 -26
  374. package/src/module/notification/entity/otp.entity.ts +28 -28
  375. package/src/module/notification/firebase-admin.config.ts +22 -22
  376. package/src/module/notification/notification.module.ts +69 -69
  377. package/src/module/notification/repository/otp.repository.ts +27 -27
  378. package/src/module/notification/service/email.service.ts +127 -127
  379. package/src/module/notification/service/notification.service.ts +163 -160
  380. package/src/module/notification/service/otp.service.ts +133 -132
  381. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  382. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  383. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  384. package/src/module/third-party-module/third-party.module.ts +12 -12
  385. package/src/module/user/controller/login.controller.ts +198 -197
  386. package/src/module/user/controller/user.controller.ts +40 -40
  387. package/src/module/user/dto/create-user.dto.ts +62 -62
  388. package/src/module/user/dto/update-user.dto.ts +4 -4
  389. package/src/module/user/entity/role.entity.ts +33 -33
  390. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  391. package/src/module/user/entity/user-session.entity.ts +73 -73
  392. package/src/module/user/entity/user.entity.ts +59 -59
  393. package/src/module/user/repository/role.repository.ts +96 -96
  394. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  395. package/src/module/user/repository/user.repository.ts +50 -50
  396. package/src/module/user/repository/userSession.repository.ts +33 -33
  397. package/src/module/user/service/login.service.ts +326 -304
  398. package/src/module/user/service/role.service.ts +189 -189
  399. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  400. package/src/module/user/service/user-session.service.ts +168 -168
  401. package/src/module/user/service/user.service.ts +368 -365
  402. package/src/module/user/user.module.ts +65 -65
  403. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  404. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  405. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  406. package/src/module/workflow/controller/action.controller.ts +111 -111
  407. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  408. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  409. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  410. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  411. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  412. package/src/module/workflow/controller/stage.controller.ts +50 -50
  413. package/src/module/workflow/controller/task.controller.ts +77 -77
  414. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  415. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  416. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  417. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  418. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  419. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  420. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  421. package/src/module/workflow/entity/action.entity.ts +53 -53
  422. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  423. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  424. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  425. package/src/module/workflow/entity/form.entity.ts +25 -25
  426. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  427. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  428. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  429. package/src/module/workflow/entity/stage.entity.ts +20 -20
  430. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  431. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  432. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  433. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  434. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  435. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  436. package/src/module/workflow/repository/action-data.repository.ts +334 -334
  437. package/src/module/workflow/repository/action.repository.ts +323 -323
  438. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  439. package/src/module/workflow/repository/comm-template.repository.ts +149 -149
  440. package/src/module/workflow/repository/form-master.repository.ts +59 -59
  441. package/src/module/workflow/repository/stage-group.repository.ts +176 -176
  442. package/src/module/workflow/repository/stage-movement.repository.ts +244 -244
  443. package/src/module/workflow/repository/stage.repository.ts +172 -172
  444. package/src/module/workflow/repository/task.repository.ts +134 -134
  445. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  446. package/src/module/workflow/service/action-category.service.ts +33 -33
  447. package/src/module/workflow/service/action-data.service.ts +62 -62
  448. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  449. package/src/module/workflow/service/action-template-mapping.service.ts +106 -106
  450. package/src/module/workflow/service/action.service.ts +279 -279
  451. package/src/module/workflow/service/activity-log.service.ts +107 -107
  452. package/src/module/workflow/service/comm-template.service.ts +180 -180
  453. package/src/module/workflow/service/entity-modification.service.ts +67 -67
  454. package/src/module/workflow/service/form-master.service.ts +35 -35
  455. package/src/module/workflow/service/populate-workflow.service.ts +303 -303
  456. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  457. package/src/module/workflow/service/stage-group.service.ts +319 -319
  458. package/src/module/workflow/service/stage.service.ts +199 -199
  459. package/src/module/workflow/service/task.service.ts +569 -569
  460. package/src/module/workflow/service/workflow-list-master.service.ts +60 -60
  461. package/src/module/workflow/service/workflow-meta.service.ts +654 -654
  462. package/src/module/workflow/service/workflow.service.ts +205 -205
  463. package/src/module/workflow/workflow.module.ts +176 -176
  464. package/src/module/workflow-automation/SCHEDULING_GUIDE.md +145 -145
  465. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +43 -43
  466. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  467. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +40 -40
  468. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  469. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  470. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  471. package/src/module/workflow-automation/service/schedule-handler.service.ts +149 -149
  472. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +214 -214
  473. package/src/module/workflow-automation/service/workflow-automation.service.ts +508 -508
  474. package/src/module/workflow-automation/workflow-automation.module.ts +47 -47
  475. package/src/module/workflow-schedule/INSTALLATION.md +244 -244
  476. package/src/module/workflow-schedule/MULTI_PROJECT_GUIDE.md +196 -196
  477. package/src/module/workflow-schedule/README.md +422 -422
  478. package/src/module/workflow-schedule/constants/schedule.constants.ts +48 -48
  479. package/src/module/workflow-schedule/controller/workflow-schedule.controller.ts +255 -255
  480. package/src/module/workflow-schedule/docs/CLAUDE_CODE_GUIDE.md +510 -510
  481. package/src/module/workflow-schedule/docs/CLAUDE_CODE_PROMPT.md +362 -362
  482. package/src/module/workflow-schedule/docs/RUN_CLAUDE_CODE.sh +68 -68
  483. package/src/module/workflow-schedule/dto/create-schedule.dto.ts +147 -147
  484. package/src/module/workflow-schedule/dto/get-execution-logs.dto.ts +119 -119
  485. package/src/module/workflow-schedule/dto/update-schedule.dto.ts +96 -96
  486. package/src/module/workflow-schedule/entities/scheduled-workflow.entity.ts +148 -148
  487. package/src/module/workflow-schedule/entities/workflow-execution-log.entity.ts +154 -154
  488. package/src/module/workflow-schedule/interfaces/schedule-job-data.interface.ts +53 -53
  489. package/src/module/workflow-schedule/interfaces/workflow-schedule-options.interface.ts +12 -12
  490. package/src/module/workflow-schedule/processors/schedule.processor.ts +584 -584
  491. package/src/module/workflow-schedule/service/workflow-schedule.service.ts +600 -600
  492. package/src/module/workflow-schedule/workflow-schedule.module.ts +67 -67
  493. package/src/resources/dev.properties.yaml +30 -31
  494. package/src/resources/local.properties.yaml +27 -27
  495. package/src/resources/properties.module.ts +12 -12
  496. package/src/resources/properties.yaml.ts +11 -11
  497. package/src/resources/uat.properties.yaml +31 -31
  498. package/src/table.config.ts +130 -130
  499. package/src/utils/dto/excel-data.dto.ts +14 -14
  500. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  501. package/src/utils/service/base64util.service.ts +18 -18
  502. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  503. package/src/utils/service/codeGenerator.service.ts +22 -22
  504. package/src/utils/service/dateUtil.service.ts +17 -17
  505. package/src/utils/service/encryptUtil.service.ts +97 -97
  506. package/src/utils/service/excel-helper.service.ts +72 -72
  507. package/src/utils/service/excelUtil.service.ts +15 -15
  508. package/src/utils/service/file-util.service.ts +11 -11
  509. package/src/utils/service/json-util.service.ts +23 -23
  510. package/src/utils/service/loggingUtil.service.ts +88 -88
  511. package/src/utils/service/reflection-helper.service.ts +62 -62
  512. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  513. package/src/utils/utils.module.ts +27 -27
  514. package/tsconfig.build.json +4 -4
  515. package/tsconfig.json +24 -24
  516. package/.claude/settings.local.json +0 -26
  517. package/.idea/250218_nodejs_core.iml +0 -9
  518. package/.idea/codeStyles/Project.xml +0 -59
  519. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  520. package/.idea/copilot.data.migration.agent.xml +0 -6
  521. package/.idea/copilot.data.migration.ask.xml +0 -6
  522. package/.idea/copilot.data.migration.ask2agent.xml +0 -6
  523. package/.idea/copilot.data.migration.edit.xml +0 -6
  524. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  525. package/.idea/misc.xml +0 -6
  526. package/.idea/modules.xml +0 -8
  527. package/.idea/prettier.xml +0 -6
  528. package/.idea/vcs.xml +0 -6
  529. package/server.log +0 -850
@@ -1,584 +1,584 @@
1
- import { Process, Processor, OnQueueActive, OnQueueCompleted, OnQueueFailed } from '@nestjs/bull';
2
- import { Logger, Inject, forwardRef } from '@nestjs/common';
3
- import { Job } from 'bull';
4
- import { InjectRepository } from '@nestjs/typeorm';
5
- import { Repository, DataSource } from 'typeorm';
6
- import { ScheduledWorkflow } from '../entities/scheduled-workflow.entity';
7
- import { WorkflowExecutionLog } from '../entities/workflow-execution-log.entity';
8
- import {
9
- WORKFLOW_SCHEDULE_QUEUE,
10
- EXECUTE_SCHEDULED_WORKFLOW_JOB,
11
- EXECUTION_STATUS_PENDING,
12
- EXECUTION_STATUS_RUNNING,
13
- EXECUTION_STATUS_COMPLETED,
14
- EXECUTION_STATUS_FAILED,
15
- EXECUTION_STATUS_PARTIAL,
16
- DEFAULT_BATCH_SIZE,
17
- ACTION_TYPE_SEND_EMAIL,
18
- ACTION_TYPE_UPDATE_RECORDS,
19
- ACTION_TYPE_CREATE_TASK,
20
- ACTION_TYPE_SEND_NOTIFICATION,
21
- } from '../constants/schedule.constants';
22
- import { ScheduleJobData, BatchProcessingResult } from '../interfaces/schedule-job-data.interface';
23
- import { ScheduleHandlerService } from 'src/module/workflow-automation/service/schedule-handler.service';
24
-
25
- /**
26
- * Schedule Processor
27
- * Processes scheduled workflow execution jobs from Bull queue
28
- */
29
- @Processor(WORKFLOW_SCHEDULE_QUEUE)
30
- export class ScheduleProcessor {
31
- private readonly logger = new Logger(ScheduleProcessor.name);
32
-
33
- constructor(
34
- @InjectRepository(ScheduledWorkflow)
35
- private readonly scheduledWorkflowRepository: Repository<ScheduledWorkflow>,
36
- @InjectRepository(WorkflowExecutionLog)
37
- private readonly executionLogRepository: Repository<WorkflowExecutionLog>,
38
- private readonly dataSource: DataSource,
39
- @Inject('ScheduleHandlerService')
40
- private readonly scheduleHandlerService: ScheduleHandlerService,
41
- ) {}
42
-
43
- /**
44
- * Main job processor for scheduled workflow execution
45
- */
46
- @Process(EXECUTE_SCHEDULED_WORKFLOW_JOB)
47
- async handleScheduledWorkflowExecution(job: Job<ScheduleJobData>) {
48
- const { scheduleId, workflowId, organizationId, triggeredBy, createdBy } = job.data;
49
-
50
- this.logger.log(
51
- `🚀 [handleScheduledWorkflowExecution] Invoked for scheduleId=${scheduleId}, workflowId=${workflowId}`,
52
- );
53
-
54
- // Create execution log entry
55
- const executionLog = this.executionLogRepository.create({
56
- schedule_id: scheduleId,
57
- workflow_id: workflowId,
58
- job_id: job.id.toString(),
59
- execution_status: EXECUTION_STATUS_PENDING,
60
- triggered_by: triggeredBy,
61
- triggered_by_user_id: triggeredBy === 'MANUAL' ? createdBy : null,
62
- organization_id: organizationId,
63
- enterprise_id: job.data.enterpriseId,
64
- created_by: createdBy,
65
- entity_type: 'WFEL',
66
- });
67
-
68
- this.logger.debug(`🧾 Creating execution log for jobId=${job.id}`);
69
- await this.executionLogRepository.save(executionLog);
70
-
71
- try {
72
- // Update status to running
73
- executionLog.execution_status = EXECUTION_STATUS_RUNNING;
74
- executionLog.started_at = new Date();
75
- await this.executionLogRepository.save(executionLog);
76
-
77
- this.logger.log(`🏃 Workflow execution started for scheduleId=${scheduleId}`);
78
-
79
- // Get scheduled workflow details
80
- const schedule = await this.scheduledWorkflowRepository.findOne({
81
- where: { id: scheduleId },
82
- });
83
-
84
- if (!schedule) {
85
- throw new Error(`Scheduled workflow not found: ${scheduleId}`);
86
- }
87
-
88
- this.logger.debug(`📋 Loaded schedule from DB: ${JSON.stringify(schedule)}`);
89
-
90
- // Execute workflow actions
91
- this.logger.log(`⚙️ Executing workflow actions...`);
92
- const result = await this.executeWorkflowActions(schedule, job.data);
93
- this.logger.debug(`🧮 Execution result: ${JSON.stringify(result)}`);
94
-
95
- // Update execution log with results
96
- const completedAt = new Date();
97
- executionLog.execution_status =
98
- result.failedRecords > 0 && result.successfulRecords > 0
99
- ? EXECUTION_STATUS_PARTIAL
100
- : result.failedRecords > 0
101
- ? EXECUTION_STATUS_FAILED
102
- : EXECUTION_STATUS_COMPLETED;
103
- executionLog.completed_at = completedAt;
104
- executionLog.duration_ms = completedAt.getTime() - executionLog.started_at.getTime();
105
- executionLog.total_records = result.totalRecords;
106
- executionLog.successful_records = result.successfulRecords;
107
- executionLog.failed_records = result.failedRecords;
108
- executionLog.execution_details = {
109
- batchesProcessed: Math.ceil(result.totalRecords / DEFAULT_BATCH_SIZE),
110
- errors: result.errors,
111
- };
112
-
113
- await this.executionLogRepository.save(executionLog);
114
-
115
- // Update schedule execution count and last execution time
116
- schedule.execution_count += 1;
117
- schedule.last_execution_at = completedAt;
118
- await this.scheduledWorkflowRepository.save(schedule);
119
-
120
- this.logger.log(
121
- `✅ Workflow execution completed: scheduleId=${scheduleId}, status=${executionLog.execution_status}, processed=${result.totalRecords}`,
122
- );
123
-
124
- return {
125
- success: true,
126
- executionLogId: executionLog.id,
127
- result,
128
- };
129
- } catch (error) {
130
- this.logger.error(
131
- `🔥 Workflow execution failed: scheduleId=${scheduleId}, error=${error.message}`,
132
- error.stack,
133
- );
134
-
135
- // Update execution log with error
136
- executionLog.execution_status = EXECUTION_STATUS_FAILED;
137
- executionLog.completed_at = new Date();
138
- executionLog.duration_ms = executionLog.started_at
139
- ? executionLog.completed_at.getTime() - executionLog.started_at.getTime()
140
- : 0;
141
- executionLog.error_message = error.message;
142
- executionLog.error_stack = error.stack;
143
-
144
- await this.executionLogRepository.save(executionLog);
145
-
146
- throw error;
147
- }
148
- }
149
-
150
- /**
151
- * Execute all actions defined in the workflow
152
- */
153
- private async executeWorkflowActions(
154
- schedule: ScheduledWorkflow,
155
- jobData: ScheduleJobData,
156
- ): Promise<BatchProcessingResult> {
157
- const result: BatchProcessingResult = {
158
- totalRecords: 0,
159
- processedRecords: 0,
160
- successfulRecords: 0,
161
- failedRecords: 0,
162
- errors: [],
163
- };
164
-
165
- const resultData: any = await this.scheduleHandlerService.handleScheduledWorkflow(
166
- jobData.workflowId,
167
- jobData,
168
- );
169
-
170
-
171
- if (!schedule.actions || schedule.actions.length === 0) {
172
- this.logger.warn(`No actions defined for schedule: ${schedule.id}`);
173
- return result;
174
- }
175
-
176
- // Execute each action sequentially
177
- for (const action of schedule.actions) {
178
- try {
179
- const actionResult = await this.executeAction(action, jobData);
180
- result.totalRecords += actionResult.totalRecords;
181
- result.processedRecords += actionResult.processedRecords;
182
- result.successfulRecords += actionResult.successfulRecords;
183
- result.failedRecords += actionResult.failedRecords;
184
- result.errors.push(...actionResult.errors);
185
- } catch (error) {
186
- this.logger.error(
187
- `Action execution failed: actionType=${action.actionType}, error=${error.message}`,
188
- );
189
- result.failedRecords += 1;
190
- result.errors.push({
191
- error: `Action ${action.actionType} failed: ${error.message}`,
192
- });
193
- }
194
- }
195
-
196
- return resultData;
197
- }
198
-
199
- /**
200
- * Execute a single workflow action
201
- */
202
- private async executeAction(action: any, jobData: ScheduleJobData) {
203
- this.logger.log(`🚀 Executing scheduled action: ${action.actionType}`);
204
-
205
- try {
206
- // We’ll assume jobData contains workflowId and user info
207
- const { workflowId, loggedInUser } = jobData;
208
-
209
- // 🧠 Call your handler that performs filtering and workflow execution
210
- const result: any = await this.scheduleHandlerService.handleScheduledWorkflow(
211
- workflowId,
212
- loggedInUser,
213
- );
214
-
215
- this.logger.log(`✅ Scheduled workflow ${workflowId} executed successfully`);
216
- return {
217
- totalRecords: result?.length || 0,
218
- processedRecords: result?.length || 0,
219
- successfulRecords: result?.length || 0,
220
- failedRecords: 0,
221
- errors: [],
222
- };
223
- } catch (error) {
224
- this.logger.error(
225
- `🔥 Error executing scheduled workflow action: ${error.message}`,
226
- error.stack,
227
- );
228
- return {
229
- totalRecords: 0,
230
- processedRecords: 0,
231
- successfulRecords: 0,
232
- failedRecords: 1,
233
- errors: [{ error: error.message }],
234
- };
235
- }
236
- }
237
-
238
-
239
- /**
240
- * Execute send email action
241
- */
242
- private async executeSendEmailAction(
243
- action: any,
244
- jobData: ScheduleJobData,
245
- ): Promise<BatchProcessingResult> {
246
- const result: BatchProcessingResult = {
247
- totalRecords: 0,
248
- processedRecords: 0,
249
- successfulRecords: 0,
250
- failedRecords: 0,
251
- errors: [],
252
- };
253
-
254
- try {
255
- // Get target records based on filter criteria
256
- const records = await this.getTargetRecords(
257
- action.targetEntityType,
258
- action.filterCriteria,
259
- jobData,
260
- );
261
-
262
- result.totalRecords = records.length;
263
-
264
- // Process in batches
265
- const batches = this.chunkArray(records, DEFAULT_BATCH_SIZE);
266
-
267
- for (const batch of batches) {
268
- for (const record of batch) {
269
- try {
270
- // TODO: Integrate with email service
271
- // await this.emailService.sendEmail({
272
- // to: record.email,
273
- // subject: action.actionConfig.subject,
274
- // template: action.actionConfig.template,
275
- // data: record,
276
- // });
277
-
278
- result.processedRecords += 1;
279
- result.successfulRecords += 1;
280
- } catch (error) {
281
- result.processedRecords += 1;
282
- result.failedRecords += 1;
283
- result.errors.push({
284
- recordId: record.id,
285
- error: error.message,
286
- });
287
- }
288
- }
289
- }
290
- } catch (error) {
291
- throw new Error(`Send email action failed: ${error.message}`);
292
- }
293
-
294
- return result;
295
- }
296
-
297
- /**
298
- * Execute update records action
299
- */
300
- private async executeUpdateRecordsAction(
301
- action: any,
302
- jobData: ScheduleJobData,
303
- ): Promise<BatchProcessingResult> {
304
- const result: BatchProcessingResult = {
305
- totalRecords: 0,
306
- processedRecords: 0,
307
- successfulRecords: 0,
308
- failedRecords: 0,
309
- errors: [],
310
- };
311
-
312
- try {
313
- // Get target records
314
- const records = await this.getTargetRecords(
315
- action.targetEntityType,
316
- action.filterCriteria,
317
- jobData,
318
- );
319
-
320
- result.totalRecords = records.length;
321
-
322
- // Process in batches
323
- const batches = this.chunkArray(records, DEFAULT_BATCH_SIZE);
324
-
325
- for (const batch of batches) {
326
- const queryRunner = this.dataSource.createQueryRunner();
327
- await queryRunner.connect();
328
- await queryRunner.startTransaction();
329
-
330
- try {
331
- for (const record of batch) {
332
- // Build update query based on action config
333
- const updateFields = action.actionConfig.updateFields || {};
334
- const updateValues = Object.keys(updateFields).map((key) => {
335
- return `${key} = ?`;
336
- });
337
- const values = Object.values(updateFields);
338
-
339
- if (updateValues.length > 0) {
340
- const tableName = this.getTableNameForEntityType(action.targetEntityType);
341
- await queryRunner.query(
342
- `UPDATE ${tableName} SET ${updateValues.join(', ')} WHERE id = ?`,
343
- [...values, record.id],
344
- );
345
- }
346
-
347
- result.processedRecords += 1;
348
- result.successfulRecords += 1;
349
- }
350
-
351
- await queryRunner.commitTransaction();
352
- } catch (error) {
353
- await queryRunner.rollbackTransaction();
354
- result.failedRecords += batch.length;
355
- result.errors.push({
356
- error: `Batch update failed: ${error.message}`,
357
- });
358
- } finally {
359
- await queryRunner.release();
360
- }
361
- }
362
- } catch (error) {
363
- throw new Error(`Update records action failed: ${error.message}`);
364
- }
365
-
366
- return result;
367
- }
368
-
369
- /**
370
- * Execute create task action
371
- */
372
- private async executeCreateTaskAction(
373
- action: any,
374
- jobData: ScheduleJobData,
375
- ): Promise<BatchProcessingResult> {
376
- const result: BatchProcessingResult = {
377
- totalRecords: 0,
378
- processedRecords: 0,
379
- successfulRecords: 0,
380
- failedRecords: 0,
381
- errors: [],
382
- };
383
-
384
- try {
385
- // Get target records
386
- const records = await this.getTargetRecords(
387
- action.targetEntityType,
388
- action.filterCriteria,
389
- jobData,
390
- );
391
-
392
- result.totalRecords = records.length;
393
-
394
- // Process in batches
395
- const batches = this.chunkArray(records, DEFAULT_BATCH_SIZE);
396
-
397
- for (const batch of batches) {
398
- for (const record of batch) {
399
- try {
400
- // Create task for each record
401
- await this.dataSource.query(
402
- `INSERT INTO cr_wf_task (name, description, status, mapped_entity_id, mapped_entity_type,
403
- organization_id, enterprise_id, created_by, created_date, entity_type)
404
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW(), 'WFTK')`,
405
- [
406
- action.actionConfig.taskName || 'Scheduled Task',
407
- action.actionConfig.taskDescription || '',
408
- 'PENDING',
409
- record.id,
410
- action.targetEntityType,
411
- jobData.organizationId,
412
- jobData.enterpriseId,
413
- jobData.createdBy,
414
- ],
415
- );
416
-
417
- result.processedRecords += 1;
418
- result.successfulRecords += 1;
419
- } catch (error) {
420
- result.processedRecords += 1;
421
- result.failedRecords += 1;
422
- result.errors.push({
423
- recordId: record.id,
424
- error: error.message,
425
- });
426
- }
427
- }
428
- }
429
- } catch (error) {
430
- throw new Error(`Create task action failed: ${error.message}`);
431
- }
432
-
433
- return result;
434
- }
435
-
436
- /**
437
- * Execute send notification action
438
- */
439
- private async executeSendNotificationAction(
440
- action: any,
441
- jobData: ScheduleJobData,
442
- ): Promise<BatchProcessingResult> {
443
- const result: BatchProcessingResult = {
444
- totalRecords: 0,
445
- processedRecords: 0,
446
- successfulRecords: 0,
447
- failedRecords: 0,
448
- errors: [],
449
- };
450
-
451
- try {
452
- // Get target records
453
- const records = await this.getTargetRecords(
454
- action.targetEntityType,
455
- action.filterCriteria,
456
- jobData,
457
- );
458
-
459
- result.totalRecords = records.length;
460
-
461
- // Process in batches
462
- const batches = this.chunkArray(records, DEFAULT_BATCH_SIZE);
463
-
464
- for (const batch of batches) {
465
- for (const record of batch) {
466
- try {
467
- // Create notification
468
- await this.dataSource.query(
469
- `INSERT INTO cr_notification (user_id, event_type, message, mapped_entity_id,
470
- mapped_entity_type, is_read, organization_id, created_date, entity_type, status)
471
- VALUES (?, ?, ?, ?, ?, 0, ?, NOW(), 'NOTF', 'ACTIVE')`,
472
- [
473
- record.user_id || jobData.createdBy,
474
- action.actionConfig.eventType || 'WORKFLOW_SCHEDULED',
475
- action.actionConfig.message || 'Scheduled workflow executed',
476
- record.id,
477
- action.targetEntityType,
478
- jobData.organizationId,
479
- ],
480
- );
481
-
482
- result.processedRecords += 1;
483
- result.successfulRecords += 1;
484
- } catch (error) {
485
- result.processedRecords += 1;
486
- result.failedRecords += 1;
487
- result.errors.push({
488
- recordId: record.id,
489
- error: error.message,
490
- });
491
- }
492
- }
493
- }
494
- } catch (error) {
495
- throw new Error(`Send notification action failed: ${error.message}`);
496
- }
497
-
498
- return result;
499
- }
500
-
501
- /**
502
- * Get target records based on entity type and filter criteria
503
- */
504
- private async getTargetRecords(
505
- entityType: string,
506
- filterCriteria: any,
507
- jobData: ScheduleJobData,
508
- ): Promise<any[]> {
509
- const tableName = this.getTableNameForEntityType(entityType);
510
-
511
- // Build WHERE clause from filter criteria
512
- let whereClause = `organization_id = ${jobData.organizationId}`;
513
- const params: any[] = [];
514
-
515
- if (filterCriteria && Object.keys(filterCriteria).length > 0) {
516
- Object.keys(filterCriteria).forEach((key) => {
517
- whereClause += ` AND ${key} = ?`;
518
- params.push(filterCriteria[key]);
519
- });
520
- }
521
-
522
- const query = `SELECT * FROM ${tableName} WHERE ${whereClause}`;
523
- const records = await this.dataSource.query(query, params);
524
-
525
- return records;
526
- }
527
-
528
- /**
529
- * Get table name for entity type
530
- */
531
- private getTableNameForEntityType(entityType: string): string {
532
- // Map entity types to table names
533
- const entityTypeMap: Record<string, string> = {
534
- USR: 'sso_user',
535
- LEAD: 'cr_lead',
536
- TASK: 'cr_wf_task',
537
- // Add more mappings as needed
538
- };
539
-
540
- return entityTypeMap[entityType] || 'unknown_table';
541
- }
542
-
543
- /**
544
- * Split array into chunks
545
- */
546
- private chunkArray<T>(array: T[], chunkSize: number): T[][] {
547
- const chunks: T[][] = [];
548
- for (let i = 0; i < array.length; i += chunkSize) {
549
- chunks.push(array.slice(i, i + chunkSize));
550
- }
551
- return chunks;
552
- }
553
-
554
- /**
555
- * Event handler for when job becomes active
556
- */
557
- @OnQueueActive()
558
- onActive(job: Job<ScheduleJobData>) {
559
- this.logger.log(
560
- `Processing job ${job.id} of type ${job.name} for schedule ${job.data.scheduleId}`,
561
- );
562
- }
563
-
564
- /**
565
- * Event handler for when job completes
566
- */
567
- @OnQueueCompleted()
568
- onCompleted(job: Job<ScheduleJobData>, result: any) {
569
- this.logger.log(
570
- `Job ${job.id} completed for schedule ${job.data.scheduleId} with result: ${JSON.stringify(result)}`,
571
- );
572
- }
573
-
574
- /**
575
- * Event handler for when job fails
576
- */
577
- @OnQueueFailed()
578
- onFailed(job: Job<ScheduleJobData>, error: Error) {
579
- this.logger.error(
580
- `Job ${job.id} failed for schedule ${job.data.scheduleId} with error: ${error.message}`,
581
- error.stack,
582
- );
583
- }
584
- }
1
+ import { Process, Processor, OnQueueActive, OnQueueCompleted, OnQueueFailed } from '@nestjs/bull';
2
+ import { Logger, Inject, forwardRef } from '@nestjs/common';
3
+ import { Job } from 'bull';
4
+ import { InjectRepository } from '@nestjs/typeorm';
5
+ import { Repository, DataSource } from 'typeorm';
6
+ import { ScheduledWorkflow } from '../entities/scheduled-workflow.entity';
7
+ import { WorkflowExecutionLog } from '../entities/workflow-execution-log.entity';
8
+ import {
9
+ WORKFLOW_SCHEDULE_QUEUE,
10
+ EXECUTE_SCHEDULED_WORKFLOW_JOB,
11
+ EXECUTION_STATUS_PENDING,
12
+ EXECUTION_STATUS_RUNNING,
13
+ EXECUTION_STATUS_COMPLETED,
14
+ EXECUTION_STATUS_FAILED,
15
+ EXECUTION_STATUS_PARTIAL,
16
+ DEFAULT_BATCH_SIZE,
17
+ ACTION_TYPE_SEND_EMAIL,
18
+ ACTION_TYPE_UPDATE_RECORDS,
19
+ ACTION_TYPE_CREATE_TASK,
20
+ ACTION_TYPE_SEND_NOTIFICATION,
21
+ } from '../constants/schedule.constants';
22
+ import { ScheduleJobData, BatchProcessingResult } from '../interfaces/schedule-job-data.interface';
23
+ import { ScheduleHandlerService } from 'src/module/workflow-automation/service/schedule-handler.service';
24
+
25
+ /**
26
+ * Schedule Processor
27
+ * Processes scheduled workflow execution jobs from Bull queue
28
+ */
29
+ @Processor(WORKFLOW_SCHEDULE_QUEUE)
30
+ export class ScheduleProcessor {
31
+ private readonly logger = new Logger(ScheduleProcessor.name);
32
+
33
+ constructor(
34
+ @InjectRepository(ScheduledWorkflow)
35
+ private readonly scheduledWorkflowRepository: Repository<ScheduledWorkflow>,
36
+ @InjectRepository(WorkflowExecutionLog)
37
+ private readonly executionLogRepository: Repository<WorkflowExecutionLog>,
38
+ private readonly dataSource: DataSource,
39
+ @Inject('ScheduleHandlerService')
40
+ private readonly scheduleHandlerService: ScheduleHandlerService,
41
+ ) {}
42
+
43
+ /**
44
+ * Main job processor for scheduled workflow execution
45
+ */
46
+ @Process(EXECUTE_SCHEDULED_WORKFLOW_JOB)
47
+ async handleScheduledWorkflowExecution(job: Job<ScheduleJobData>) {
48
+ const { scheduleId, workflowId, organizationId, triggeredBy, createdBy } = job.data;
49
+
50
+ this.logger.log(
51
+ `🚀 [handleScheduledWorkflowExecution] Invoked for scheduleId=${scheduleId}, workflowId=${workflowId}`,
52
+ );
53
+
54
+ // Create execution log entry
55
+ const executionLog = this.executionLogRepository.create({
56
+ schedule_id: scheduleId,
57
+ workflow_id: workflowId,
58
+ job_id: job.id.toString(),
59
+ execution_status: EXECUTION_STATUS_PENDING,
60
+ triggered_by: triggeredBy,
61
+ triggered_by_user_id: triggeredBy === 'MANUAL' ? createdBy : null,
62
+ organization_id: organizationId,
63
+ enterprise_id: job.data.enterpriseId,
64
+ created_by: createdBy,
65
+ entity_type: 'WFEL',
66
+ });
67
+
68
+ this.logger.debug(`🧾 Creating execution log for jobId=${job.id}`);
69
+ await this.executionLogRepository.save(executionLog);
70
+
71
+ try {
72
+ // Update status to running
73
+ executionLog.execution_status = EXECUTION_STATUS_RUNNING;
74
+ executionLog.started_at = new Date();
75
+ await this.executionLogRepository.save(executionLog);
76
+
77
+ this.logger.log(`🏃 Workflow execution started for scheduleId=${scheduleId}`);
78
+
79
+ // Get scheduled workflow details
80
+ const schedule = await this.scheduledWorkflowRepository.findOne({
81
+ where: { id: scheduleId },
82
+ });
83
+
84
+ if (!schedule) {
85
+ throw new Error(`Scheduled workflow not found: ${scheduleId}`);
86
+ }
87
+
88
+ this.logger.debug(`📋 Loaded schedule from DB: ${JSON.stringify(schedule)}`);
89
+
90
+ // Execute workflow actions
91
+ this.logger.log(`⚙️ Executing workflow actions...`);
92
+ const result = await this.executeWorkflowActions(schedule, job.data);
93
+ this.logger.debug(`🧮 Execution result: ${JSON.stringify(result)}`);
94
+
95
+ // Update execution log with results
96
+ const completedAt = new Date();
97
+ executionLog.execution_status =
98
+ result.failedRecords > 0 && result.successfulRecords > 0
99
+ ? EXECUTION_STATUS_PARTIAL
100
+ : result.failedRecords > 0
101
+ ? EXECUTION_STATUS_FAILED
102
+ : EXECUTION_STATUS_COMPLETED;
103
+ executionLog.completed_at = completedAt;
104
+ executionLog.duration_ms = completedAt.getTime() - executionLog.started_at.getTime();
105
+ executionLog.total_records = result.totalRecords;
106
+ executionLog.successful_records = result.successfulRecords;
107
+ executionLog.failed_records = result.failedRecords;
108
+ executionLog.execution_details = {
109
+ batchesProcessed: Math.ceil(result.totalRecords / DEFAULT_BATCH_SIZE),
110
+ errors: result.errors,
111
+ };
112
+
113
+ await this.executionLogRepository.save(executionLog);
114
+
115
+ // Update schedule execution count and last execution time
116
+ schedule.execution_count += 1;
117
+ schedule.last_execution_at = completedAt;
118
+ await this.scheduledWorkflowRepository.save(schedule);
119
+
120
+ this.logger.log(
121
+ `✅ Workflow execution completed: scheduleId=${scheduleId}, status=${executionLog.execution_status}, processed=${result.totalRecords}`,
122
+ );
123
+
124
+ return {
125
+ success: true,
126
+ executionLogId: executionLog.id,
127
+ result,
128
+ };
129
+ } catch (error) {
130
+ this.logger.error(
131
+ `🔥 Workflow execution failed: scheduleId=${scheduleId}, error=${error.message}`,
132
+ error.stack,
133
+ );
134
+
135
+ // Update execution log with error
136
+ executionLog.execution_status = EXECUTION_STATUS_FAILED;
137
+ executionLog.completed_at = new Date();
138
+ executionLog.duration_ms = executionLog.started_at
139
+ ? executionLog.completed_at.getTime() - executionLog.started_at.getTime()
140
+ : 0;
141
+ executionLog.error_message = error.message;
142
+ executionLog.error_stack = error.stack;
143
+
144
+ await this.executionLogRepository.save(executionLog);
145
+
146
+ throw error;
147
+ }
148
+ }
149
+
150
+ /**
151
+ * Execute all actions defined in the workflow
152
+ */
153
+ private async executeWorkflowActions(
154
+ schedule: ScheduledWorkflow,
155
+ jobData: ScheduleJobData,
156
+ ): Promise<BatchProcessingResult> {
157
+ const result: BatchProcessingResult = {
158
+ totalRecords: 0,
159
+ processedRecords: 0,
160
+ successfulRecords: 0,
161
+ failedRecords: 0,
162
+ errors: [],
163
+ };
164
+
165
+ const resultData: any = await this.scheduleHandlerService.handleScheduledWorkflow(
166
+ jobData.workflowId,
167
+ jobData,
168
+ );
169
+
170
+
171
+ if (!schedule.actions || schedule.actions.length === 0) {
172
+ this.logger.warn(`No actions defined for schedule: ${schedule.id}`);
173
+ return result;
174
+ }
175
+
176
+ // Execute each action sequentially
177
+ for (const action of schedule.actions) {
178
+ try {
179
+ const actionResult = await this.executeAction(action, jobData);
180
+ result.totalRecords += actionResult.totalRecords;
181
+ result.processedRecords += actionResult.processedRecords;
182
+ result.successfulRecords += actionResult.successfulRecords;
183
+ result.failedRecords += actionResult.failedRecords;
184
+ result.errors.push(...actionResult.errors);
185
+ } catch (error) {
186
+ this.logger.error(
187
+ `Action execution failed: actionType=${action.actionType}, error=${error.message}`,
188
+ );
189
+ result.failedRecords += 1;
190
+ result.errors.push({
191
+ error: `Action ${action.actionType} failed: ${error.message}`,
192
+ });
193
+ }
194
+ }
195
+
196
+ return resultData;
197
+ }
198
+
199
+ /**
200
+ * Execute a single workflow action
201
+ */
202
+ private async executeAction(action: any, jobData: ScheduleJobData) {
203
+ this.logger.log(`🚀 Executing scheduled action: ${action.actionType}`);
204
+
205
+ try {
206
+ // We’ll assume jobData contains workflowId and user info
207
+ const { workflowId, loggedInUser } = jobData;
208
+
209
+ // 🧠 Call your handler that performs filtering and workflow execution
210
+ const result: any = await this.scheduleHandlerService.handleScheduledWorkflow(
211
+ workflowId,
212
+ loggedInUser,
213
+ );
214
+
215
+ this.logger.log(`✅ Scheduled workflow ${workflowId} executed successfully`);
216
+ return {
217
+ totalRecords: result?.length || 0,
218
+ processedRecords: result?.length || 0,
219
+ successfulRecords: result?.length || 0,
220
+ failedRecords: 0,
221
+ errors: [],
222
+ };
223
+ } catch (error) {
224
+ this.logger.error(
225
+ `🔥 Error executing scheduled workflow action: ${error.message}`,
226
+ error.stack,
227
+ );
228
+ return {
229
+ totalRecords: 0,
230
+ processedRecords: 0,
231
+ successfulRecords: 0,
232
+ failedRecords: 1,
233
+ errors: [{ error: error.message }],
234
+ };
235
+ }
236
+ }
237
+
238
+
239
+ /**
240
+ * Execute send email action
241
+ */
242
+ private async executeSendEmailAction(
243
+ action: any,
244
+ jobData: ScheduleJobData,
245
+ ): Promise<BatchProcessingResult> {
246
+ const result: BatchProcessingResult = {
247
+ totalRecords: 0,
248
+ processedRecords: 0,
249
+ successfulRecords: 0,
250
+ failedRecords: 0,
251
+ errors: [],
252
+ };
253
+
254
+ try {
255
+ // Get target records based on filter criteria
256
+ const records = await this.getTargetRecords(
257
+ action.targetEntityType,
258
+ action.filterCriteria,
259
+ jobData,
260
+ );
261
+
262
+ result.totalRecords = records.length;
263
+
264
+ // Process in batches
265
+ const batches = this.chunkArray(records, DEFAULT_BATCH_SIZE);
266
+
267
+ for (const batch of batches) {
268
+ for (const record of batch) {
269
+ try {
270
+ // TODO: Integrate with email service
271
+ // await this.emailService.sendEmail({
272
+ // to: record.email,
273
+ // subject: action.actionConfig.subject,
274
+ // template: action.actionConfig.template,
275
+ // data: record,
276
+ // });
277
+
278
+ result.processedRecords += 1;
279
+ result.successfulRecords += 1;
280
+ } catch (error) {
281
+ result.processedRecords += 1;
282
+ result.failedRecords += 1;
283
+ result.errors.push({
284
+ recordId: record.id,
285
+ error: error.message,
286
+ });
287
+ }
288
+ }
289
+ }
290
+ } catch (error) {
291
+ throw new Error(`Send email action failed: ${error.message}`);
292
+ }
293
+
294
+ return result;
295
+ }
296
+
297
+ /**
298
+ * Execute update records action
299
+ */
300
+ private async executeUpdateRecordsAction(
301
+ action: any,
302
+ jobData: ScheduleJobData,
303
+ ): Promise<BatchProcessingResult> {
304
+ const result: BatchProcessingResult = {
305
+ totalRecords: 0,
306
+ processedRecords: 0,
307
+ successfulRecords: 0,
308
+ failedRecords: 0,
309
+ errors: [],
310
+ };
311
+
312
+ try {
313
+ // Get target records
314
+ const records = await this.getTargetRecords(
315
+ action.targetEntityType,
316
+ action.filterCriteria,
317
+ jobData,
318
+ );
319
+
320
+ result.totalRecords = records.length;
321
+
322
+ // Process in batches
323
+ const batches = this.chunkArray(records, DEFAULT_BATCH_SIZE);
324
+
325
+ for (const batch of batches) {
326
+ const queryRunner = this.dataSource.createQueryRunner();
327
+ await queryRunner.connect();
328
+ await queryRunner.startTransaction();
329
+
330
+ try {
331
+ for (const record of batch) {
332
+ // Build update query based on action config
333
+ const updateFields = action.actionConfig.updateFields || {};
334
+ const updateValues = Object.keys(updateFields).map((key) => {
335
+ return `${key} = ?`;
336
+ });
337
+ const values = Object.values(updateFields);
338
+
339
+ if (updateValues.length > 0) {
340
+ const tableName = this.getTableNameForEntityType(action.targetEntityType);
341
+ await queryRunner.query(
342
+ `UPDATE ${tableName} SET ${updateValues.join(', ')} WHERE id = ?`,
343
+ [...values, record.id],
344
+ );
345
+ }
346
+
347
+ result.processedRecords += 1;
348
+ result.successfulRecords += 1;
349
+ }
350
+
351
+ await queryRunner.commitTransaction();
352
+ } catch (error) {
353
+ await queryRunner.rollbackTransaction();
354
+ result.failedRecords += batch.length;
355
+ result.errors.push({
356
+ error: `Batch update failed: ${error.message}`,
357
+ });
358
+ } finally {
359
+ await queryRunner.release();
360
+ }
361
+ }
362
+ } catch (error) {
363
+ throw new Error(`Update records action failed: ${error.message}`);
364
+ }
365
+
366
+ return result;
367
+ }
368
+
369
+ /**
370
+ * Execute create task action
371
+ */
372
+ private async executeCreateTaskAction(
373
+ action: any,
374
+ jobData: ScheduleJobData,
375
+ ): Promise<BatchProcessingResult> {
376
+ const result: BatchProcessingResult = {
377
+ totalRecords: 0,
378
+ processedRecords: 0,
379
+ successfulRecords: 0,
380
+ failedRecords: 0,
381
+ errors: [],
382
+ };
383
+
384
+ try {
385
+ // Get target records
386
+ const records = await this.getTargetRecords(
387
+ action.targetEntityType,
388
+ action.filterCriteria,
389
+ jobData,
390
+ );
391
+
392
+ result.totalRecords = records.length;
393
+
394
+ // Process in batches
395
+ const batches = this.chunkArray(records, DEFAULT_BATCH_SIZE);
396
+
397
+ for (const batch of batches) {
398
+ for (const record of batch) {
399
+ try {
400
+ // Create task for each record
401
+ await this.dataSource.query(
402
+ `INSERT INTO cr_wf_task (name, description, status, mapped_entity_id, mapped_entity_type,
403
+ organization_id, enterprise_id, created_by, created_date, entity_type)
404
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW(), 'WFTK')`,
405
+ [
406
+ action.actionConfig.taskName || 'Scheduled Task',
407
+ action.actionConfig.taskDescription || '',
408
+ 'PENDING',
409
+ record.id,
410
+ action.targetEntityType,
411
+ jobData.organizationId,
412
+ jobData.enterpriseId,
413
+ jobData.createdBy,
414
+ ],
415
+ );
416
+
417
+ result.processedRecords += 1;
418
+ result.successfulRecords += 1;
419
+ } catch (error) {
420
+ result.processedRecords += 1;
421
+ result.failedRecords += 1;
422
+ result.errors.push({
423
+ recordId: record.id,
424
+ error: error.message,
425
+ });
426
+ }
427
+ }
428
+ }
429
+ } catch (error) {
430
+ throw new Error(`Create task action failed: ${error.message}`);
431
+ }
432
+
433
+ return result;
434
+ }
435
+
436
+ /**
437
+ * Execute send notification action
438
+ */
439
+ private async executeSendNotificationAction(
440
+ action: any,
441
+ jobData: ScheduleJobData,
442
+ ): Promise<BatchProcessingResult> {
443
+ const result: BatchProcessingResult = {
444
+ totalRecords: 0,
445
+ processedRecords: 0,
446
+ successfulRecords: 0,
447
+ failedRecords: 0,
448
+ errors: [],
449
+ };
450
+
451
+ try {
452
+ // Get target records
453
+ const records = await this.getTargetRecords(
454
+ action.targetEntityType,
455
+ action.filterCriteria,
456
+ jobData,
457
+ );
458
+
459
+ result.totalRecords = records.length;
460
+
461
+ // Process in batches
462
+ const batches = this.chunkArray(records, DEFAULT_BATCH_SIZE);
463
+
464
+ for (const batch of batches) {
465
+ for (const record of batch) {
466
+ try {
467
+ // Create notification
468
+ await this.dataSource.query(
469
+ `INSERT INTO cr_notification (user_id, event_type, message, mapped_entity_id,
470
+ mapped_entity_type, is_read, organization_id, created_date, entity_type, status)
471
+ VALUES (?, ?, ?, ?, ?, 0, ?, NOW(), 'NOTF', 'ACTIVE')`,
472
+ [
473
+ record.user_id || jobData.createdBy,
474
+ action.actionConfig.eventType || 'WORKFLOW_SCHEDULED',
475
+ action.actionConfig.message || 'Scheduled workflow executed',
476
+ record.id,
477
+ action.targetEntityType,
478
+ jobData.organizationId,
479
+ ],
480
+ );
481
+
482
+ result.processedRecords += 1;
483
+ result.successfulRecords += 1;
484
+ } catch (error) {
485
+ result.processedRecords += 1;
486
+ result.failedRecords += 1;
487
+ result.errors.push({
488
+ recordId: record.id,
489
+ error: error.message,
490
+ });
491
+ }
492
+ }
493
+ }
494
+ } catch (error) {
495
+ throw new Error(`Send notification action failed: ${error.message}`);
496
+ }
497
+
498
+ return result;
499
+ }
500
+
501
+ /**
502
+ * Get target records based on entity type and filter criteria
503
+ */
504
+ private async getTargetRecords(
505
+ entityType: string,
506
+ filterCriteria: any,
507
+ jobData: ScheduleJobData,
508
+ ): Promise<any[]> {
509
+ const tableName = this.getTableNameForEntityType(entityType);
510
+
511
+ // Build WHERE clause from filter criteria
512
+ let whereClause = `organization_id = ${jobData.organizationId}`;
513
+ const params: any[] = [];
514
+
515
+ if (filterCriteria && Object.keys(filterCriteria).length > 0) {
516
+ Object.keys(filterCriteria).forEach((key) => {
517
+ whereClause += ` AND ${key} = ?`;
518
+ params.push(filterCriteria[key]);
519
+ });
520
+ }
521
+
522
+ const query = `SELECT * FROM ${tableName} WHERE ${whereClause}`;
523
+ const records = await this.dataSource.query(query, params);
524
+
525
+ return records;
526
+ }
527
+
528
+ /**
529
+ * Get table name for entity type
530
+ */
531
+ private getTableNameForEntityType(entityType: string): string {
532
+ // Map entity types to table names
533
+ const entityTypeMap: Record<string, string> = {
534
+ USR: 'sso_user',
535
+ LEAD: 'cr_lead',
536
+ TASK: 'cr_wf_task',
537
+ // Add more mappings as needed
538
+ };
539
+
540
+ return entityTypeMap[entityType] || 'unknown_table';
541
+ }
542
+
543
+ /**
544
+ * Split array into chunks
545
+ */
546
+ private chunkArray<T>(array: T[], chunkSize: number): T[][] {
547
+ const chunks: T[][] = [];
548
+ for (let i = 0; i < array.length; i += chunkSize) {
549
+ chunks.push(array.slice(i, i + chunkSize));
550
+ }
551
+ return chunks;
552
+ }
553
+
554
+ /**
555
+ * Event handler for when job becomes active
556
+ */
557
+ @OnQueueActive()
558
+ onActive(job: Job<ScheduleJobData>) {
559
+ this.logger.log(
560
+ `Processing job ${job.id} of type ${job.name} for schedule ${job.data.scheduleId}`,
561
+ );
562
+ }
563
+
564
+ /**
565
+ * Event handler for when job completes
566
+ */
567
+ @OnQueueCompleted()
568
+ onCompleted(job: Job<ScheduleJobData>, result: any) {
569
+ this.logger.log(
570
+ `Job ${job.id} completed for schedule ${job.data.scheduleId} with result: ${JSON.stringify(result)}`,
571
+ );
572
+ }
573
+
574
+ /**
575
+ * Event handler for when job fails
576
+ */
577
+ @OnQueueFailed()
578
+ onFailed(job: Job<ScheduleJobData>, error: Error) {
579
+ this.logger.error(
580
+ `Job ${job.id} failed for schedule ${job.data.scheduleId} with error: ${error.message}`,
581
+ error.stack,
582
+ );
583
+ }
584
+ }