rez_core 5.0.169 → 5.0.172

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 (451) hide show
  1. package/.idea/250218_nodejs_core.iml +11 -8
  2. package/.idea/codeStyles/Project.xml +58 -58
  3. package/.idea/codeStyles/codeStyleConfig.xml +4 -4
  4. package/.idea/modules.xml +7 -7
  5. package/.idea/vcs.xml +5 -5
  6. package/.prettierrc +3 -3
  7. package/README.md +99 -99
  8. package/dist/module/auth/guards/role.guard.js +3 -3
  9. package/dist/module/filter/repository/saved-filter.repository.js +5 -3
  10. package/dist/module/filter/repository/saved-filter.repository.js.map +1 -1
  11. package/dist/module/filter/service/filter.service.js +19 -19
  12. package/dist/module/integration/examples/usage.example.js +9 -9
  13. package/dist/module/layout_preference/controller/layout_preference.controller.js +3 -0
  14. package/dist/module/layout_preference/controller/layout_preference.controller.js.map +1 -1
  15. package/dist/module/layout_preference/service/layout_preference.service.js +1 -1
  16. package/dist/module/layout_preference/service/layout_preference.service.js.map +1 -1
  17. package/dist/module/meta/controller/entity.controller.d.ts +0 -2
  18. package/dist/module/meta/controller/entity.controller.js +0 -23
  19. package/dist/module/meta/controller/entity.controller.js.map +1 -1
  20. package/dist/module/meta/controller/meta.controller.js +5 -0
  21. package/dist/module/meta/controller/meta.controller.js.map +1 -1
  22. package/dist/module/meta/controller/view-master.controller.js +2 -0
  23. package/dist/module/meta/controller/view-master.controller.js.map +1 -1
  24. package/dist/module/meta/entity.module.js +0 -3
  25. package/dist/module/meta/entity.module.js.map +1 -1
  26. package/dist/module/meta/repository/attribute-master.repository.js +8 -8
  27. package/dist/module/meta/repository/entity-master.repository.d.ts +1 -0
  28. package/dist/module/meta/repository/entity-master.repository.js +15 -3
  29. package/dist/module/meta/repository/entity-master.repository.js.map +1 -1
  30. package/dist/module/meta/repository/entity-table-column.repository.d.ts +1 -1
  31. package/dist/module/meta/repository/entity-table-column.repository.js +3 -3
  32. package/dist/module/meta/repository/entity-table-column.repository.js.map +1 -1
  33. package/dist/module/meta/repository/entity-table.repository.d.ts +2 -2
  34. package/dist/module/meta/repository/entity-table.repository.js +4 -4
  35. package/dist/module/meta/repository/entity-table.repository.js.map +1 -1
  36. package/dist/module/meta/repository/view-master.repository.d.ts +1 -1
  37. package/dist/module/meta/repository/view-master.repository.js +2 -2
  38. package/dist/module/meta/repository/view-master.repository.js.map +1 -1
  39. package/dist/module/meta/service/entity-dynamic.service.js +24 -27
  40. package/dist/module/meta/service/entity-dynamic.service.js.map +1 -1
  41. package/dist/module/meta/service/entity-service-impl.service.d.ts +0 -4
  42. package/dist/module/meta/service/entity-service-impl.service.js +10 -15
  43. package/dist/module/meta/service/entity-service-impl.service.js.map +1 -1
  44. package/dist/module/meta/service/entity-table-column.service.d.ts +1 -2
  45. package/dist/module/meta/service/entity-table-column.service.js +2 -10
  46. package/dist/module/meta/service/entity-table-column.service.js.map +1 -1
  47. package/dist/module/meta/service/entity-table.service.d.ts +1 -1
  48. package/dist/module/meta/service/entity-table.service.js +5 -5
  49. package/dist/module/meta/service/entity-table.service.js.map +1 -1
  50. package/dist/module/meta/service/entity-validation.service.d.ts +6 -5
  51. package/dist/module/meta/service/entity-validation.service.js +11 -12
  52. package/dist/module/meta/service/entity-validation.service.js.map +1 -1
  53. package/dist/module/meta/service/entity.service.d.ts +0 -2
  54. package/dist/module/meta/service/media-data.service.js +6 -6
  55. package/dist/module/meta/service/resolver.service.js +18 -19
  56. package/dist/module/meta/service/resolver.service.js.map +1 -1
  57. package/dist/module/meta/service/view-master.service.js +1 -1
  58. package/dist/module/meta/service/view-master.service.js.map +1 -1
  59. package/dist/module/module/repository/menu.repository.js +4 -4
  60. package/dist/module/notification/service/notification.service.js +6 -6
  61. package/dist/module/user/controller/login.controller.js +18 -18
  62. package/dist/module/workflow/repository/action.repository.js +2 -2
  63. package/dist/module/workflow/repository/stage.repository.js +8 -8
  64. package/dist/module/workflow/service/action-template-mapping.service.js +2 -2
  65. package/dist/module/workflow/service/action.service.js +5 -5
  66. package/dist/module/workflow/service/entity-modification.service.js +2 -2
  67. package/dist/module/workflow/service/task.service.js +8 -8
  68. package/dist/module/workflow-automation/service/schedule-handler.service.js +9 -9
  69. package/dist/module/workflow-automation/service/workflow-automation.service.js +4 -2
  70. package/dist/module/workflow-automation/service/workflow-automation.service.js.map +1 -1
  71. package/dist/tsconfig.build.tsbuildinfo +1 -1
  72. package/dist/utils/service/reflection-helper.service.js +2 -2
  73. package/docs/modules/event-driven-integration-design.md +91 -91
  74. package/docs/modules/integration.md +250 -250
  75. package/eslint.config.mjs +34 -34
  76. package/nest-cli.json +14 -14
  77. package/package.json +125 -125
  78. package/src/app.controller.ts +12 -12
  79. package/src/app.module.ts +68 -68
  80. package/src/app.service.ts +8 -8
  81. package/src/config/bull.config.ts +69 -69
  82. package/src/config/config.module.ts +17 -17
  83. package/src/config/database.config.ts +48 -48
  84. package/src/constant/global.constant.ts +67 -67
  85. package/src/core.module.ts +94 -94
  86. package/src/decorators/roles.decorator.ts +7 -7
  87. package/src/dtos/response.dto.ts +6 -6
  88. package/src/dtos/response.ts +5 -5
  89. package/src/index.ts +1 -1
  90. package/src/module/auth/auth.module.ts +49 -49
  91. package/src/module/auth/controller/auth.controller.ts +28 -28
  92. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  93. package/src/module/auth/guards/jwt.guard.ts +22 -22
  94. package/src/module/auth/guards/role.guard.ts +68 -68
  95. package/src/module/auth/services/auth.service.ts +56 -56
  96. package/src/module/auth/services/jwt.service.ts +11 -11
  97. package/src/module/auth/strategies/google.strategy.ts +54 -54
  98. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  99. package/src/module/auth/strategies/local.strategy.ts +13 -13
  100. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  101. package/src/module/dashboard/dashboard.module.ts +21 -21
  102. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  103. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  104. package/src/module/dashboard/repository/dashboard.repository.ts +51 -51
  105. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  106. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  107. package/src/module/enterprise/enterprise.module.ts +30 -30
  108. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  109. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  110. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  111. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  112. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  113. package/src/module/enterprise/repository/school.repository.ts +272 -272
  114. package/src/module/enterprise/service/brand.service.ts +5 -5
  115. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  116. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  117. package/src/module/enterprise/service/organization.service.ts +145 -145
  118. package/src/module/entity_json/controller/entity_json.controller.ts +47 -47
  119. package/src/module/entity_json/entity/entityJson.entity.ts +39 -39
  120. package/src/module/entity_json/entity_json.module.ts +18 -18
  121. package/src/module/entity_json/service/entityJson.repository.ts +37 -37
  122. package/src/module/entity_json/service/entity_json.service.ts +242 -242
  123. package/src/module/export/controller/export.controller.ts +83 -83
  124. package/src/module/export/export.module.ts +14 -14
  125. package/src/module/export/service/export.service.ts +105 -105
  126. package/src/module/filter/controller/filter.controller.ts +84 -84
  127. package/src/module/filter/dto/filter-request.dto.ts +39 -39
  128. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  129. package/src/module/filter/entity/saved-filter-master.entity.ts +32 -32
  130. package/src/module/filter/filter.module.ts +33 -33
  131. package/src/module/filter/repository/saved-filter.repository.ts +258 -256
  132. package/src/module/filter/repository/saved.filter-detail.repository.ts +19 -19
  133. package/src/module/filter/service/filter-evaluator.service.ts +82 -82
  134. package/src/module/filter/service/filter.service.ts +1319 -1319
  135. package/src/module/filter/service/saved-filter.service.ts +164 -164
  136. package/src/module/ics/controller/ics.controller.ts +21 -21
  137. package/src/module/ics/dto/ics.dto.ts +55 -55
  138. package/src/module/ics/ics.module.ts +13 -13
  139. package/src/module/ics/service/ics.service.ts +57 -57
  140. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  141. package/src/module/integration/controller/integration.controller.ts +662 -662
  142. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  143. package/src/module/integration/dto/create-config.dto.ts +526 -526
  144. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  145. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  146. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  147. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  148. package/src/module/integration/examples/usage.example.ts +338 -338
  149. package/src/module/integration/factories/base.factory.ts +7 -7
  150. package/src/module/integration/factories/email.factory.ts +49 -49
  151. package/src/module/integration/factories/integration.factory.ts +121 -121
  152. package/src/module/integration/factories/sms.factory.ts +51 -51
  153. package/src/module/integration/factories/telephone.factory.ts +41 -41
  154. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  155. package/src/module/integration/integration.module.ts +110 -110
  156. package/src/module/integration/service/calendar-event.service.ts +118 -118
  157. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  158. package/src/module/integration/service/integration-queue.service.ts +229 -229
  159. package/src/module/integration/service/integration.service.ts +2634 -2634
  160. package/src/module/integration/service/oauth.service.ts +224 -224
  161. package/src/module/integration/service/wrapper.service.ts +753 -753
  162. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  163. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  164. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  165. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  166. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  167. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  168. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  169. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  170. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  171. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  172. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  173. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  174. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  175. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  176. package/src/module/layout/controller/layout.controller.ts +47 -47
  177. package/src/module/layout/entity/header-items.entity.ts +28 -28
  178. package/src/module/layout/entity/header-section.entity.ts +19 -19
  179. package/src/module/layout/layout.module.ts +21 -21
  180. package/src/module/layout/repository/header-items.repository.ts +18 -18
  181. package/src/module/layout/repository/header-section.repository.ts +22 -22
  182. package/src/module/layout/service/header-section.service.ts +25 -25
  183. package/src/module/layout_preference/controller/layout_preference.controller.ts +76 -73
  184. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  185. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  186. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  187. package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
  188. package/src/module/lead/controller/lead.controller.ts +30 -30
  189. package/src/module/lead/lead.module.ts +14 -14
  190. package/src/module/lead/repository/lead.repository.ts +41 -41
  191. package/src/module/lead/service/lead.service.ts +54 -54
  192. package/src/module/linked_attributes/controller/linked_attributes.controller.ts +37 -37
  193. package/src/module/linked_attributes/entity/linked_attribute.entity.ts +51 -51
  194. package/src/module/linked_attributes/linked_attributes.module.ts +16 -16
  195. package/src/module/linked_attributes/repository/linked_attribute.repository.ts +12 -12
  196. package/src/module/linked_attributes/service/linked_attributes.service.ts +75 -75
  197. package/src/module/listmaster/controller/list-master.controller.ts +230 -230
  198. package/src/module/listmaster/entity/list-master-items.entity.ts +43 -43
  199. package/src/module/listmaster/entity/list-master.entity.ts +33 -33
  200. package/src/module/listmaster/listmaster.module.ts +46 -46
  201. package/src/module/listmaster/repository/list-master-items.repository.ts +173 -173
  202. package/src/module/listmaster/repository/list-master.repository.ts +56 -56
  203. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  204. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  205. package/src/module/listmaster/service/list-master-item.service.ts +281 -281
  206. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  207. package/src/module/listmaster/service/list-master.service.ts +535 -535
  208. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  209. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  210. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  211. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  212. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  213. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  214. package/src/module/mapper/mapper.module.ts +35 -35
  215. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  216. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  217. package/src/module/mapper/repository/mapper.repository.ts +32 -32
  218. package/src/module/mapper/service/field-mapper.service.ts +269 -269
  219. package/src/module/mapper/service/mapper.service.ts +81 -81
  220. package/src/module/master/controller/master.controller.ts +74 -74
  221. package/src/module/master/service/master.service.ts +483 -483
  222. package/src/module/meta/controller/app-master.controller.ts +38 -38
  223. package/src/module/meta/controller/attribute-master.controller.ts +84 -84
  224. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  225. package/src/module/meta/controller/entity-master.controller.ts +41 -41
  226. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  227. package/src/module/meta/controller/entity.controller.ts +308 -342
  228. package/src/module/meta/controller/entity.public.controller.ts +75 -75
  229. package/src/module/meta/controller/media.controller.ts +135 -135
  230. package/src/module/meta/controller/meta.controller.ts +101 -96
  231. package/src/module/meta/controller/view-master.controller.ts +79 -86
  232. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  233. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  234. package/src/module/meta/dto/entity-table.dto.ts +12 -12
  235. package/src/module/meta/entity/app-master.entity.ts +37 -37
  236. package/src/module/meta/entity/attribute-master.entity.ts +92 -92
  237. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  238. package/src/module/meta/entity/entity-master.entity.ts +85 -85
  239. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  240. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  241. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  242. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  243. package/src/module/meta/entity/media-data.entity.ts +32 -32
  244. package/src/module/meta/entity/preference.entity.ts +62 -62
  245. package/src/module/meta/entity/view-master.entity.ts +41 -41
  246. package/src/module/meta/entity.module.ts +165 -168
  247. package/src/module/meta/repository/app-master.repository.ts +20 -20
  248. package/src/module/meta/repository/attribute-master.repository.ts +164 -164
  249. package/src/module/meta/repository/entity-attribute-update.repository.ts +48 -48
  250. package/src/module/meta/repository/entity-master.repository.ts +120 -106
  251. package/src/module/meta/repository/entity-relation.repository.ts +22 -22
  252. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  253. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  254. package/src/module/meta/repository/media-data.repository.ts +50 -50
  255. package/src/module/meta/repository/preference.repository.ts +20 -20
  256. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  257. package/src/module/meta/repository/view-master.repository.ts +42 -42
  258. package/src/module/meta/service/app-master.service.ts +37 -37
  259. package/src/module/meta/service/attribute-master.service.ts +131 -131
  260. package/src/module/meta/service/common.service.ts +9 -9
  261. package/src/module/meta/service/entity-attribute-update.service.ts +26 -26
  262. package/src/module/meta/service/entity-dynamic.service.ts +824 -826
  263. package/src/module/meta/service/entity-master.service.ts +171 -171
  264. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  265. package/src/module/meta/service/entity-relation.service.ts +74 -74
  266. package/src/module/meta/service/entity-service-impl.service.ts +388 -439
  267. package/src/module/meta/service/entity-table-column.service.ts +26 -39
  268. package/src/module/meta/service/entity-table.service.ts +157 -157
  269. package/src/module/meta/service/entity-validation.service.ts +188 -187
  270. package/src/module/meta/service/entity.service.ts +49 -59
  271. package/src/module/meta/service/field-group.service.ts +103 -103
  272. package/src/module/meta/service/media-data.service.ts +591 -591
  273. package/src/module/meta/service/populate-meta.service.ts +222 -222
  274. package/src/module/meta/service/preference.service.ts +16 -16
  275. package/src/module/meta/service/resolver.service.ts +289 -291
  276. package/src/module/meta/service/section-master.service.ts +104 -104
  277. package/src/module/meta/service/update-form-json.service.ts +22 -22
  278. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  279. package/src/module/meta/service/view-master.service.ts +127 -127
  280. package/src/module/microservice-client/microservice-clients.module.ts +13 -13
  281. package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
  282. package/src/module/microservice-client/service/microservice-clients.ts +4 -4
  283. package/src/module/module/controller/menu.controller.ts +15 -15
  284. package/src/module/module/controller/module-access.controller.ts +133 -133
  285. package/src/module/module/entity/menu.entity.ts +43 -43
  286. package/src/module/module/entity/module-access.entity.ts +25 -25
  287. package/src/module/module/entity/module-action.entity.ts +17 -17
  288. package/src/module/module/entity/module.entity.ts +52 -52
  289. package/src/module/module/module.module.ts +42 -42
  290. package/src/module/module/repository/menu.repository.ts +186 -186
  291. package/src/module/module/repository/module-access.repository.ts +344 -344
  292. package/src/module/module/service/menu.service.ts +82 -82
  293. package/src/module/module/service/module-access.service.ts +189 -189
  294. package/src/module/notification/controller/notification.controller.ts +58 -58
  295. package/src/module/notification/controller/otp.controller.ts +117 -117
  296. package/src/module/notification/entity/notification.entity.ts +26 -26
  297. package/src/module/notification/entity/otp.entity.ts +28 -28
  298. package/src/module/notification/firebase-admin.config.ts +22 -22
  299. package/src/module/notification/notification.module.ts +69 -69
  300. package/src/module/notification/repository/otp.repository.ts +27 -27
  301. package/src/module/notification/service/email.service.ts +127 -127
  302. package/src/module/notification/service/notification.service.ts +164 -164
  303. package/src/module/notification/service/otp.service.ts +133 -133
  304. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  305. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  306. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  307. package/src/module/third-party-module/third-party.module.ts +12 -12
  308. package/src/module/user/controller/login.controller.ts +198 -198
  309. package/src/module/user/controller/user.controller.ts +40 -40
  310. package/src/module/user/dto/create-user.dto.ts +62 -62
  311. package/src/module/user/dto/update-user.dto.ts +4 -4
  312. package/src/module/user/entity/role.entity.ts +33 -33
  313. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  314. package/src/module/user/entity/user-session.entity.ts +73 -73
  315. package/src/module/user/entity/user.entity.ts +59 -59
  316. package/src/module/user/repository/role.repository.ts +96 -96
  317. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  318. package/src/module/user/repository/user.repository.ts +50 -50
  319. package/src/module/user/repository/userSession.repository.ts +33 -33
  320. package/src/module/user/service/login.service.ts +326 -326
  321. package/src/module/user/service/role.service.ts +197 -197
  322. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  323. package/src/module/user/service/user-session.service.ts +200 -200
  324. package/src/module/user/service/user.service.ts +368 -368
  325. package/src/module/user/user.module.ts +65 -65
  326. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  327. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  328. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  329. package/src/module/workflow/controller/action.controller.ts +111 -111
  330. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  331. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  332. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  333. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  334. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  335. package/src/module/workflow/controller/stage.controller.ts +50 -50
  336. package/src/module/workflow/controller/task.controller.ts +77 -77
  337. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  338. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  339. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  340. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  341. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  342. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  343. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  344. package/src/module/workflow/entity/action.entity.ts +53 -53
  345. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  346. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  347. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  348. package/src/module/workflow/entity/form.entity.ts +25 -25
  349. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  350. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  351. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  352. package/src/module/workflow/entity/stage.entity.ts +20 -20
  353. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  354. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  355. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  356. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  357. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  358. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  359. package/src/module/workflow/repository/action-data.repository.ts +346 -346
  360. package/src/module/workflow/repository/action.repository.ts +339 -339
  361. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  362. package/src/module/workflow/repository/comm-template.repository.ts +157 -157
  363. package/src/module/workflow/repository/form-master.repository.ts +50 -50
  364. package/src/module/workflow/repository/stage-group.repository.ts +186 -186
  365. package/src/module/workflow/repository/stage-movement.repository.ts +257 -257
  366. package/src/module/workflow/repository/stage.repository.ts +160 -160
  367. package/src/module/workflow/repository/task.repository.ts +151 -151
  368. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  369. package/src/module/workflow/service/action-category.service.ts +33 -33
  370. package/src/module/workflow/service/action-data.service.ts +62 -62
  371. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  372. package/src/module/workflow/service/action-template-mapping.service.ts +140 -140
  373. package/src/module/workflow/service/action.service.ts +302 -302
  374. package/src/module/workflow/service/activity-log.service.ts +107 -107
  375. package/src/module/workflow/service/comm-template.service.ts +180 -180
  376. package/src/module/workflow/service/entity-modification.service.ts +61 -61
  377. package/src/module/workflow/service/form-master.service.ts +35 -35
  378. package/src/module/workflow/service/populate-workflow.service.ts +320 -320
  379. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  380. package/src/module/workflow/service/stage-group.service.ts +344 -344
  381. package/src/module/workflow/service/stage.service.ts +207 -207
  382. package/src/module/workflow/service/task.service.ts +550 -550
  383. package/src/module/workflow/service/workflow-list-master.service.ts +68 -68
  384. package/src/module/workflow/service/workflow-meta.service.ts +639 -639
  385. package/src/module/workflow/service/workflow.service.ts +213 -213
  386. package/src/module/workflow/workflow.module.ts +180 -180
  387. package/src/module/workflow-automation/SCHEDULING_GUIDE.md +145 -145
  388. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +43 -43
  389. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  390. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +40 -40
  391. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  392. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  393. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  394. package/src/module/workflow-automation/service/schedule-handler.service.ts +168 -168
  395. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +219 -219
  396. package/src/module/workflow-automation/service/workflow-automation.service.ts +519 -515
  397. package/src/module/workflow-automation/workflow-automation.module.ts +54 -54
  398. package/src/module/workflow-schedule/INSTALLATION.md +244 -244
  399. package/src/module/workflow-schedule/MULTI_PROJECT_GUIDE.md +196 -196
  400. package/src/module/workflow-schedule/README.md +422 -422
  401. package/src/module/workflow-schedule/constants/schedule.constants.ts +48 -48
  402. package/src/module/workflow-schedule/controller/workflow-schedule.controller.ts +255 -255
  403. package/src/module/workflow-schedule/docs/CLAUDE_CODE_GUIDE.md +510 -510
  404. package/src/module/workflow-schedule/docs/CLAUDE_CODE_PROMPT.md +362 -362
  405. package/src/module/workflow-schedule/docs/RUN_CLAUDE_CODE.sh +68 -68
  406. package/src/module/workflow-schedule/dto/create-schedule.dto.ts +147 -147
  407. package/src/module/workflow-schedule/dto/get-execution-logs.dto.ts +119 -119
  408. package/src/module/workflow-schedule/dto/update-schedule.dto.ts +96 -96
  409. package/src/module/workflow-schedule/entities/scheduled-workflow.entity.ts +148 -148
  410. package/src/module/workflow-schedule/entities/workflow-execution-log.entity.ts +154 -154
  411. package/src/module/workflow-schedule/interfaces/schedule-job-data.interface.ts +53 -53
  412. package/src/module/workflow-schedule/interfaces/workflow-schedule-options.interface.ts +12 -12
  413. package/src/module/workflow-schedule/processors/schedule.processor.ts +620 -620
  414. package/src/module/workflow-schedule/service/workflow-schedule.service.ts +598 -598
  415. package/src/module/workflow-schedule/workflow-schedule.module.ts +67 -67
  416. package/src/resources/dev.properties.yaml +31 -31
  417. package/src/resources/local.properties.yaml +27 -27
  418. package/src/resources/properties.module.ts +12 -12
  419. package/src/resources/properties.yaml.ts +11 -11
  420. package/src/resources/uat.properties.yaml +31 -31
  421. package/src/table.config.ts +133 -133
  422. package/src/utils/dto/excel-data.dto.ts +14 -14
  423. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  424. package/src/utils/service/base64util.service.ts +18 -18
  425. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  426. package/src/utils/service/codeGenerator.service.ts +22 -22
  427. package/src/utils/service/dateUtil.service.ts +17 -17
  428. package/src/utils/service/encryptUtil.service.ts +97 -97
  429. package/src/utils/service/excel-helper.service.ts +72 -72
  430. package/src/utils/service/excelUtil.service.ts +15 -15
  431. package/src/utils/service/file-util.service.ts +11 -11
  432. package/src/utils/service/json-util.service.ts +23 -23
  433. package/src/utils/service/loggingUtil.service.ts +88 -88
  434. package/src/utils/service/reflection-helper.service.ts +62 -62
  435. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  436. package/src/utils/utils.module.ts +27 -27
  437. package/tsconfig.build.json +4 -4
  438. package/tsconfig.json +24 -24
  439. package/.claude/settings.local.json +0 -26
  440. package/.idea/copilot.data.migration.agent.xml +0 -6
  441. package/.idea/copilot.data.migration.ask.xml +0 -6
  442. package/.idea/copilot.data.migration.ask2agent.xml +0 -6
  443. package/.idea/copilot.data.migration.edit.xml +0 -6
  444. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  445. package/.idea/misc.xml +0 -6
  446. package/.idea/prettier.xml +0 -6
  447. package/dist/module/meta/service/entity-list.service.d.ts +0 -17
  448. package/dist/module/meta/service/entity-list.service.js +0 -142
  449. package/dist/module/meta/service/entity-list.service.js.map +0 -1
  450. package/server.log +0 -850
  451. package/src/module/meta/service/entity-list.service.ts +0 -201
@@ -1,515 +1,519 @@
1
- import {
2
- BadRequestException,
3
- Inject,
4
- Injectable,
5
- Logger,
6
- NotFoundException,
7
- } from '@nestjs/common';
8
- import { InjectRepository } from '@nestjs/typeorm';
9
- import { DataSource, Repository } from 'typeorm';
10
- import { WorkflowAutomation } from '../entity/workflow-automation.entity';
11
- import { WorkflowAutomationActionEntity } from '../entity/workflow-automation-action.entity';
12
- import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
13
- import { UserData } from 'src/module/user/entity/user.entity';
14
- import { SavedFilterService } from 'src/module/filter/service/saved-filter.service';
15
- import { ENTITYTYPE_SAVEDFILTERMASTER } from 'src/constant/global.constant';
16
- import { ScheduledWorkflow } from 'src/module/workflow-schedule/entities/scheduled-workflow.entity';
17
- import { WorkflowScheduleService } from 'src/module/workflow-schedule/service/workflow-schedule.service';
18
- import * as moment from 'moment';
19
- import { Update } from 'aws-sdk/clients/dynamodb';
20
- import { UpdateScheduleDto } from 'src/module/workflow-schedule/dto/update-schedule.dto';
21
-
22
- @Injectable()
23
- export class WorkflowAutomationService extends EntityServiceImpl {
24
- private readonly logger = new Logger(WorkflowAutomationService.name);
25
- constructor(
26
- @InjectRepository(WorkflowAutomation)
27
- private readonly wfRepo: Repository<WorkflowAutomation>,
28
- @InjectRepository(WorkflowAutomationActionEntity)
29
- private readonly actionRepo: Repository<WorkflowAutomationActionEntity>,
30
- @Inject('SavedFilterService')
31
- private readonly savedFilterService: SavedFilterService,
32
- private readonly dataSource: DataSource,
33
- @InjectRepository(ScheduledWorkflow)
34
- private readonly scheduledWorkflowRepository: Repository<ScheduledWorkflow>,
35
- private readonly workflowScheduleService: WorkflowScheduleService,
36
- ) {
37
- super();
38
- }
39
-
40
- async createRule(
41
- data: Partial<WorkflowAutomation>,
42
- ): Promise<WorkflowAutomation> {
43
- const rule = this.wfRepo.create(data);
44
- return this.wfRepo.save(rule);
45
- }
46
-
47
- async updateRule(
48
- id: number,
49
- data: Partial<WorkflowAutomation>,
50
- ): Promise<WorkflowAutomation | null> {
51
- await this.wfRepo.update(id, data);
52
- return this.wfRepo.findOneBy({ id });
53
- }
54
-
55
- async deleteRule(id: number): Promise<void> {
56
- await this.wfRepo.delete(id);
57
- }
58
-
59
- async getRule(id: number): Promise<WorkflowAutomation | null> {
60
- return this.wfRepo.findOneBy({ id });
61
- }
62
-
63
- async getActiveRules(
64
- entityType: string,
65
- event: string,
66
- loggedInUser: UserData,
67
- ): Promise<WorkflowAutomation[]> {
68
- return this.wfRepo.find({
69
- where: {
70
- applicable_entity_type: entityType,
71
- trigger_event: event,
72
- organization_id: loggedInUser.organization_id,
73
- },
74
- });
75
- }
76
-
77
- async getActionsForRule(
78
- workflow_automation_id: number,
79
- ): Promise<WorkflowAutomationActionEntity[]> {
80
- return this.actionRepo.find({
81
- where: { workflow_automation_id },
82
- });
83
- }
84
-
85
- async updateEntity(entityData: any, loggedInUser: UserData) {
86
- this.logger.debug(
87
- `Updating WorkflowAutomation with data: ${JSON.stringify(entityData)}`,
88
- );
89
-
90
- const { event, filter, action, ...workflowData } = entityData;
91
-
92
- // 1. Update core workflow columns first
93
- this.logger.log(`Updating core workflow fields for workflow...`);
94
- let workflow = await super.updateEntity(workflowData, loggedInUser);
95
- this.logger.debug(`Workflow updated (id=${workflow.id})`);
96
-
97
- // 2. EVENT FILTER
98
- if (event?.triggerType) {
99
- this.logger.log(`Processing EVENT filter for workflow ${workflow.id}`);
100
-
101
- if (event.triggerType === 'on_event') {
102
- const eventFilterMaster = {
103
- entity_type: 'SFM',
104
- name: `Event_Filter_${workflow.id}`,
105
- filterDetails: event?.eventFilterJson ?? [],
106
- filter_scope: 'RULE',
107
- organization_id: loggedInUser.organization_id,
108
- enterprise_id: loggedInUser.enterprise_id,
109
- };
110
-
111
- if (workflow.condition_filter_code) {
112
- this.logger.debug(
113
- `Existing event filter found: ${workflow.condition_filter_code}`,
114
- );
115
- const existing = await this.savedFilterService.getEntityDataByCode(
116
- ENTITYTYPE_SAVEDFILTERMASTER,
117
- workflow.condition_filter_code,
118
- loggedInUser,
119
- );
120
-
121
- if (existing) {
122
- eventFilterMaster['id'] = existing.id;
123
- const updatedEvent = await this.savedFilterService.updateEntity(
124
- eventFilterMaster as any,
125
- loggedInUser,
126
- );
127
- workflow.condition_filter_code = updatedEvent.code;
128
- this.logger.log(
129
- `Updated existing event filter: ${updatedEvent.code}`,
130
- );
131
- }
132
- } else {
133
- const savedEvent = await this.savedFilterService.createEntity(
134
- eventFilterMaster,
135
- loggedInUser,
136
- );
137
- workflow.condition_filter_code = savedEvent.code;
138
- this.logger.log(`Created new event filter: ${savedEvent.code}`);
139
- }
140
-
141
- workflow.trigger_event = event?.event ?? null;
142
- }
143
-
144
- if (event.triggerType === 'on_schedule') {
145
- // just store JSON directly into schedule column
146
- workflow.schedule = event?.scheduleJson ?? null;
147
- workflow.trigger_type = 'on_schedule';
148
- this.logger.log(
149
- `Stored schedule JSON for workflow ${workflow.id}: ${JSON.stringify(
150
- workflow.schedule,
151
- )}`,
152
- );
153
- await this.registerScheduleAutomation(workflow, loggedInUser);
154
- }
155
-
156
- workflow.trigger_type = event.triggerType;
157
- }
158
-
159
- // 3. CRITERIA FILTER
160
- if (filter) {
161
- this.logger.log(`Processing CRITERIA filter for workflow ${workflow.id}`);
162
-
163
- // const criteriaFilterMaster = {
164
- // entity_type: 'SFM',
165
- // name: `Criteria_Filter_${workflow.id}`,
166
- // filterDetails: criteria?.criteriaFilterJson ?? [],
167
- // filter_scope: 'RULE',
168
- // organization_id: loggedInUser.organization_id,
169
- // enterprise_id: loggedInUser.enterprise_id,
170
- // };
171
-
172
- // if (workflow.criteria_filter_code) {
173
- // this.logger.debug(
174
- // `Existing criteria filter found: ${workflow.criteria_filter_code}`,
175
- // );
176
- // const existing = await this.savedFilterService.getEntityDataByCode(
177
- // ENTITYTYPE_SAVEDFILTERMASTER,
178
- // workflow.criteria_filter_code,
179
- // loggedInUser,
180
- // );
181
-
182
- // if (existing) {
183
- // criteriaFilterMaster['id'] = existing.id;
184
- // const updatedCriteria = await this.savedFilterService.updateEntity(
185
- // criteriaFilterMaster as any,
186
- // loggedInUser,
187
- // );
188
- // workflow.criteria_filter_code = updatedCriteria.code;
189
- // this.logger.log(
190
- // `Updated existing criteria filter: ${updatedCriteria.code}`,
191
- // );
192
- // }
193
- // } else {
194
- // const savedCriteria = await this.savedFilterService.createEntity(
195
- // criteriaFilterMaster,
196
- // loggedInUser,
197
- // );
198
- // workflow.criteria_filter_code = savedCriteria.code;
199
- // this.logger.log(`Created new criteria filter: ${savedCriteria.code}`);
200
- // }
201
-
202
- workflow.criteria_filter_code = filter.filter_code ?? null;
203
- }
204
-
205
- // 4. ACTIONS
206
- if (Array.isArray(action) && action.length) {
207
- this.logger.log(
208
- `Processing ${action.length} actions for workflow ${workflow.id}`,
209
- );
210
-
211
- const existingActions = await this.dataSource
212
- .getRepository(WorkflowAutomationActionEntity)
213
- .find({
214
- where: { workflow_automation_id: workflow.id },
215
- });
216
-
217
- const existingMap = new Map(
218
- existingActions.map((a) => [a.action_category_id, a]),
219
- );
220
-
221
- // 2. Upsert actions
222
- for (const a of action) {
223
- if (!a?.actionCategory) {
224
- this.logger.warn(
225
- `Skipping action without category: ${JSON.stringify(a)}`,
226
- );
227
- continue;
228
- }
229
-
230
- const existing = existingMap.get(a.actionCategory);
231
-
232
- if (existing) {
233
- // update
234
- existing.payload = a.actionPayload ?? {};
235
- existing.actioncategoryname =
236
- a.actionCategoryName ?? existing.actioncategoryname;
237
- existing.status = a.status ?? existing.status;
238
- await this.dataSource
239
- .getRepository(WorkflowAutomationActionEntity)
240
- .save(existing);
241
- this.logger.log(`Updated action: ${a.actionCategory}`);
242
- } else {
243
- // insert
244
- const actionEntity = new WorkflowAutomationActionEntity();
245
- actionEntity.entity_type = 'WFAA';
246
- actionEntity.workflow_automation_id = workflow.id;
247
- actionEntity.action_category_id = a.actionCategory;
248
- actionEntity.actioncategoryname = a.actionCategoryName;
249
- actionEntity.payload = a.actionPayload ?? {};
250
- actionEntity.name = a.name;
251
- actionEntity.status = a.status;
252
-
253
- await this.dataSource
254
- .getRepository(WorkflowAutomationActionEntity)
255
- .save(actionEntity);
256
- this.logger.log(`Created new action: ${a.actionCategory}`);
257
- }
258
- }
259
- const incomingCategories = action.map((a) => a.actionCategory);
260
- const toDelete = existingActions.filter(
261
- (a) => !incomingCategories.includes(a.action_category_id),
262
- );
263
-
264
- if (toDelete.length) {
265
- await this.dataSource
266
- .getRepository(WorkflowAutomationActionEntity)
267
- .remove(toDelete);
268
- this.logger.log(
269
- `Deleted ${toDelete.length} actions not present in request.`,
270
- );
271
- }
272
- }
273
-
274
- // 5. Save workflow again with updated codes
275
- workflow = await super.updateEntity(workflow, loggedInUser);
276
- this.logger.debug(`Final workflow updated (id=${workflow.id})`);
277
-
278
- return workflow;
279
- }
280
-
281
- async getEntityData(entity_type: string, id: number, loggedInUser: UserData) {
282
- this.logger.log(`Fetching WorkflowAutomation by id=${id}`);
283
-
284
- // 1. Get workflow automation entity
285
- const workflowAutomation = await this.dataSource
286
- .getRepository(WorkflowAutomation)
287
- .findOne({
288
- where: { id },
289
- });
290
-
291
- if (!workflowAutomation) {
292
- throw new NotFoundException(`WorkflowAutomation not found with id=${id}`);
293
- }
294
-
295
- // 2. EVENT FILTER
296
- let event: any = null;
297
-
298
- if (workflowAutomation.trigger_type === 'on_event') {
299
- if (workflowAutomation.condition_filter_code) {
300
- const eventFilterMaster: any =
301
- await this.savedFilterService.getEntityDataByCode(
302
- ENTITYTYPE_SAVEDFILTERMASTER,
303
- workflowAutomation.condition_filter_code,
304
- loggedInUser,
305
- );
306
-
307
- if (eventFilterMaster) {
308
- // 🔑 fetch filter details using mapped_filter_code
309
- const eventFilterDetails =
310
- await this.savedFilterService.getDetailsByCode(
311
- eventFilterMaster.code,
312
- );
313
-
314
- event = {
315
- eventFilterJson: eventFilterDetails ?? [],
316
- triggerType: workflowAutomation.trigger_type,
317
- event: workflowAutomation.trigger_event,
318
- };
319
- }
320
- }
321
- }
322
-
323
- if (workflowAutomation.trigger_type === 'on_schedule') {
324
- event = {
325
- triggerType: workflowAutomation.trigger_type,
326
- scheduleJson: workflowAutomation.schedule,
327
- };
328
- }
329
-
330
- // 3. CRITERIA FILTER
331
- let filter: any = null;
332
-
333
- filter = {
334
- filter_code: workflowAutomation.criteria_filter_code,
335
- };
336
-
337
- // 4. ACTIONS
338
- const actions = await this.dataSource
339
- .getRepository(WorkflowAutomationActionEntity)
340
- .find({
341
- where: { workflow_automation_id: workflowAutomation.id },
342
- });
343
-
344
- const action = actions.map((a) => ({
345
- actionCategory: a.action_category_id,
346
- actionCategoryName: a.actioncategoryname,
347
- actionPayload: a.payload,
348
- name: a.name,
349
- status: a.status,
350
- }));
351
-
352
- // 5. Final response
353
- const response = {
354
- ...workflowAutomation,
355
- event,
356
- filter,
357
- action,
358
- };
359
-
360
- this.logger.debug(`Fetched WorkflowAutomation (id=${id}) with relations`);
361
- return response;
362
- }
363
-
364
- async registerScheduleAutomation(workflow: any, loggedInUser: UserData) {
365
- this.logger.log(
366
- `Registering schedule automation for workflow ${workflow.id}`,
367
- );
368
-
369
- const scheduleJson = workflow.schedule;
370
- if (!scheduleJson) {
371
- this.logger.warn(`No schedule JSON provided for workflow ${workflow.id}`);
372
- return;
373
- }
374
-
375
- // Try to find an existing scheduled workflow by workflow_id
376
- const existingSchedule = await this.scheduledWorkflowRepository.findOne({
377
- where: { workflow_id: workflow.id },
378
- });
379
-
380
- const cronExpression = await this.generateDailyCron(scheduleJson.fixedTime);
381
-
382
- const payload = {
383
- id: Number(existingSchedule?.id ?? null),
384
- workflow_id: workflow.id,
385
- workflow_name: workflow.name,
386
- name: scheduleJson.name ?? `Schedule_${workflow.id}`,
387
- description: scheduleJson.description ?? '',
388
- cron_expression: cronExpression,
389
- timezone: scheduleJson.timezone ?? 'Asia/Kolkata',
390
- start_date: scheduleJson.start_date ?? null,
391
- end_date: scheduleJson.end_date ?? null,
392
- max_executions: scheduleJson.max_executions ?? null,
393
- retry_config: scheduleJson.retry_config ?? {},
394
- actions: scheduleJson.actions ?? [],
395
- metadata: scheduleJson.metadata ?? {},
396
- is_enabled: scheduleJson.is_enabled ?? true,
397
- organization_id: loggedInUser.organization_id,
398
- enterprise_id: loggedInUser.enterprise_id,
399
- level_id: loggedInUser.level_id,
400
- level_type: loggedInUser.level_type,
401
- appcode: loggedInUser.appcode,
402
- };
403
-
404
- if (existingSchedule) {
405
- this.logger.log(
406
- `Existing schedule found (id=${existingSchedule.id}), updating...`,
407
- );
408
- // payload['id'] = existingSchedule.id;
409
- return await this.workflowScheduleService.updateSchedule(
410
- payload,
411
- loggedInUser,
412
- );
413
- } else {
414
- this.logger.log(`No existing schedule found, creating new one...`);
415
- return await this.workflowScheduleService.createSchedule(
416
- payload,
417
- loggedInUser,
418
- );
419
- }
420
- }
421
-
422
- // CRON
423
-
424
- async generateDailyCron(executionTime: string): Promise<string> {
425
- const time = moment(executionTime, 'HH:mm');
426
-
427
- if (!time.isValid()) {
428
- throw new Error('Invalid executionTime format (expected HH:mm)');
429
- }
430
-
431
- const minute = time.minute();
432
- const hour = time.hour();
433
-
434
- // Ensure cron has 5 fields: minute hour day month weekday
435
- const cron = `${minute} ${hour} * * *`;
436
-
437
- // ✅ Validate against your regex before returning
438
- const cronRegex =
439
- /^(\*|([0-5]?\d)) (\*|([01]?\d|2[0-3])) (\*|([01]?\d|2\d|3[01])) (\*|([1-9]|1[0-2])) (\*|([0-6]))$/;
440
- if (!cronRegex.test(cron)) {
441
- throw new Error(
442
- `Generated cron expression "${cron}" does not match expected format`,
443
- );
444
- }
445
-
446
- return cron;
447
- }
448
- /**
449
- * Updates the sequence of multiple workflow automations.
450
- */
451
- async updateSequence(
452
- body: any[],
453
- loggedInUser: any,
454
- ): Promise<{ updated: number; results: any[] }> {
455
- if (!Array.isArray(body) || body.length === 0) {
456
- throw new BadRequestException(
457
- 'Invalid input. Expected a non-empty array.',
458
- );
459
- }
460
-
461
- const results: {
462
- id: number | string | null;
463
- success: boolean;
464
- result?: any;
465
- error?: string;
466
- }[] = [];
467
-
468
- for (const item of body) {
469
- const { id, sequence } = item;
470
-
471
- // Validate required fields
472
- if (!id || sequence === undefined || sequence === null) {
473
- results.push({
474
- id: id || null,
475
- success: false,
476
- error: 'Missing id or sequence',
477
- });
478
- continue;
479
- }
480
-
481
- try {
482
- // Check if workflow exists
483
- const existing = await this.wfRepo.findOne({ where: { id } });
484
- if (!existing) {
485
- results.push({
486
- id,
487
- success: false,
488
- error: `Workflow with id ${id} not found`,
489
- });
490
- continue;
491
- }
492
-
493
- // Update sequence + audit fields
494
- existing.sequence = Number(sequence);
495
- existing.modified_by =
496
- loggedInUser?.id || loggedInUser?.user_id || null;
497
- existing.modified_date = new Date();
498
-
499
- const saved = await this.wfRepo.save(existing);
500
- results.push({ id, success: true, result: saved });
501
- } catch (err) {
502
- results.push({
503
- id,
504
- success: false,
505
- error: err.message || 'Unknown error occurred',
506
- });
507
- }
508
- }
509
-
510
- return {
511
- updated: results.filter((r) => r.success).length,
512
- results,
513
- };
514
- }
515
- }
1
+ import {
2
+ BadRequestException,
3
+ Inject,
4
+ Injectable,
5
+ Logger,
6
+ NotFoundException,
7
+ } from '@nestjs/common';
8
+ import { InjectRepository } from '@nestjs/typeorm';
9
+ import { DataSource, Repository } from 'typeorm';
10
+ import { WorkflowAutomation } from '../entity/workflow-automation.entity';
11
+ import { WorkflowAutomationActionEntity } from '../entity/workflow-automation-action.entity';
12
+ import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
13
+ import { UserData } from 'src/module/user/entity/user.entity';
14
+ import { SavedFilterService } from 'src/module/filter/service/saved-filter.service';
15
+ import { ENTITYTYPE_SAVEDFILTERMASTER } from 'src/constant/global.constant';
16
+ import { ScheduledWorkflow } from 'src/module/workflow-schedule/entities/scheduled-workflow.entity';
17
+ import { WorkflowScheduleService } from 'src/module/workflow-schedule/service/workflow-schedule.service';
18
+ import * as moment from 'moment';
19
+ import { Update } from 'aws-sdk/clients/dynamodb';
20
+ import { UpdateScheduleDto } from 'src/module/workflow-schedule/dto/update-schedule.dto';
21
+
22
+ @Injectable()
23
+ export class WorkflowAutomationService extends EntityServiceImpl {
24
+ private readonly logger = new Logger(WorkflowAutomationService.name);
25
+ constructor(
26
+ @InjectRepository(WorkflowAutomation)
27
+ private readonly wfRepo: Repository<WorkflowAutomation>,
28
+ @InjectRepository(WorkflowAutomationActionEntity)
29
+ private readonly actionRepo: Repository<WorkflowAutomationActionEntity>,
30
+ @Inject('SavedFilterService')
31
+ private readonly savedFilterService: SavedFilterService,
32
+ private readonly dataSource: DataSource,
33
+ @InjectRepository(ScheduledWorkflow)
34
+ private readonly scheduledWorkflowRepository: Repository<ScheduledWorkflow>,
35
+ private readonly workflowScheduleService: WorkflowScheduleService,
36
+ ) {
37
+ super();
38
+ }
39
+
40
+ async createRule(
41
+ data: Partial<WorkflowAutomation>,
42
+ ): Promise<WorkflowAutomation> {
43
+ const rule = this.wfRepo.create(data);
44
+ return this.wfRepo.save(rule);
45
+ }
46
+
47
+ async updateRule(
48
+ id: number,
49
+ data: Partial<WorkflowAutomation>,
50
+ ): Promise<WorkflowAutomation | null> {
51
+ await this.wfRepo.update(id, data);
52
+ return this.wfRepo.findOneBy({ id });
53
+ }
54
+
55
+ async deleteRule(id: number): Promise<void> {
56
+ await this.wfRepo.delete(id);
57
+ }
58
+
59
+ async getRule(id: number): Promise<WorkflowAutomation | null> {
60
+ return this.wfRepo.findOneBy({ id });
61
+ }
62
+
63
+ async getActiveRules(
64
+ entityType: string,
65
+ event: string,
66
+ loggedInUser: UserData,
67
+ ): Promise<WorkflowAutomation[]> {
68
+ return this.wfRepo.find({
69
+ where: {
70
+ applicable_entity_type: entityType,
71
+ trigger_event: event,
72
+ organization_id: loggedInUser.organization_id,
73
+ },
74
+ });
75
+ }
76
+
77
+ async getActionsForRule(
78
+ workflow_automation_id: number,
79
+ ): Promise<WorkflowAutomationActionEntity[]> {
80
+ return this.actionRepo.find({
81
+ where: { workflow_automation_id },
82
+ });
83
+ }
84
+
85
+ async updateEntity(entityData: any, loggedInUser: UserData) {
86
+ this.logger.debug(
87
+ `Updating WorkflowAutomation with data: ${JSON.stringify(entityData)}`,
88
+ );
89
+
90
+ const { event, filter, action, ...workflowData } = entityData;
91
+
92
+ // 1. Update core workflow columns first
93
+ this.logger.log(`Updating core workflow fields for workflow...`);
94
+ let workflow = await super.updateEntity(workflowData, loggedInUser);
95
+ this.logger.debug(`Workflow updated (id=${workflow.id})`);
96
+
97
+ // 2. EVENT FILTER
98
+ if (event?.triggerType) {
99
+ this.logger.log(`Processing EVENT filter for workflow ${workflow.id}`);
100
+
101
+ if (event.triggerType === 'on_event') {
102
+ const eventFilterMaster = {
103
+ entity_type: 'SFM',
104
+ name: `Event_Filter_${workflow.id}`,
105
+ filterDetails: event?.eventFilterJson ?? [],
106
+ filter_scope: 'RULE',
107
+ organization_id: loggedInUser.organization_id,
108
+ enterprise_id: loggedInUser.enterprise_id,
109
+ };
110
+
111
+ if (workflow.condition_filter_code) {
112
+ this.logger.debug(
113
+ `Existing event filter found: ${workflow.condition_filter_code}`,
114
+ );
115
+ const existing = await this.savedFilterService.getEntityDataByCode(
116
+ ENTITYTYPE_SAVEDFILTERMASTER,
117
+ workflow.condition_filter_code,
118
+ loggedInUser,
119
+ );
120
+
121
+ if (existing) {
122
+ eventFilterMaster['id'] = existing.id;
123
+ const updatedEvent = await this.savedFilterService.updateEntity(
124
+ eventFilterMaster as any,
125
+ loggedInUser,
126
+ );
127
+ workflow.condition_filter_code = updatedEvent.code;
128
+ this.logger.log(
129
+ `Updated existing event filter: ${updatedEvent.code}`,
130
+ );
131
+ }
132
+ } else {
133
+ const savedEvent = await this.savedFilterService.createEntity(
134
+ eventFilterMaster,
135
+ loggedInUser,
136
+ );
137
+ workflow.condition_filter_code = savedEvent.code;
138
+ this.logger.log(`Created new event filter: ${savedEvent.code}`);
139
+ }
140
+
141
+ workflow.trigger_event = event?.event ?? null;
142
+ }
143
+
144
+ if (event.triggerType === 'on_schedule') {
145
+ // just store JSON directly into schedule column
146
+ workflow.schedule = event?.scheduleJson ?? null;
147
+ workflow.trigger_type = 'on_schedule';
148
+ this.logger.log(
149
+ `Stored schedule JSON for workflow ${workflow.id}: ${JSON.stringify(
150
+ workflow.schedule,
151
+ )}`,
152
+ );
153
+ await this.registerScheduleAutomation(workflow, loggedInUser);
154
+ }
155
+
156
+ workflow.trigger_type = event.triggerType;
157
+ }
158
+
159
+ // 3. CRITERIA FILTER
160
+ if (filter) {
161
+ this.logger.log(`Processing CRITERIA filter for workflow ${workflow.id}`);
162
+
163
+ // const criteriaFilterMaster = {
164
+ // entity_type: 'SFM',
165
+ // name: `Criteria_Filter_${workflow.id}`,
166
+ // filterDetails: criteria?.criteriaFilterJson ?? [],
167
+ // filter_scope: 'RULE',
168
+ // organization_id: loggedInUser.organization_id,
169
+ // enterprise_id: loggedInUser.enterprise_id,
170
+ // };
171
+
172
+ // if (workflow.criteria_filter_code) {
173
+ // this.logger.debug(
174
+ // `Existing criteria filter found: ${workflow.criteria_filter_code}`,
175
+ // );
176
+ // const existing = await this.savedFilterService.getEntityDataByCode(
177
+ // ENTITYTYPE_SAVEDFILTERMASTER,
178
+ // workflow.criteria_filter_code,
179
+ // loggedInUser,
180
+ // );
181
+
182
+ // if (existing) {
183
+ // criteriaFilterMaster['id'] = existing.id;
184
+ // const updatedCriteria = await this.savedFilterService.updateEntity(
185
+ // criteriaFilterMaster as any,
186
+ // loggedInUser,
187
+ // );
188
+ // workflow.criteria_filter_code = updatedCriteria.code;
189
+ // this.logger.log(
190
+ // `Updated existing criteria filter: ${updatedCriteria.code}`,
191
+ // );
192
+ // }
193
+ // } else {
194
+ // const savedCriteria = await this.savedFilterService.createEntity(
195
+ // criteriaFilterMaster,
196
+ // loggedInUser,
197
+ // );
198
+ // workflow.criteria_filter_code = savedCriteria.code;
199
+ // this.logger.log(`Created new criteria filter: ${savedCriteria.code}`);
200
+ // }
201
+
202
+ workflow.criteria_filter_code = filter.filter_code ?? null;
203
+ }
204
+
205
+ // 4. ACTIONS
206
+ if (Array.isArray(action) && action.length) {
207
+ this.logger.log(
208
+ `Processing ${action.length} actions for workflow ${workflow.id}`,
209
+ );
210
+
211
+ const existingActions = await this.dataSource
212
+ .getRepository(WorkflowAutomationActionEntity)
213
+ .find({
214
+ where: { workflow_automation_id: workflow.id },
215
+ });
216
+
217
+ const existingMap = new Map(
218
+ existingActions.map((a) => [a.action_category_id, a]),
219
+ );
220
+
221
+ // 2. Upsert actions
222
+ for (const a of action) {
223
+ if (!a?.actionCategory) {
224
+ this.logger.warn(
225
+ `Skipping action without category: ${JSON.stringify(a)}`,
226
+ );
227
+ continue;
228
+ }
229
+
230
+ const existing = existingMap.get(a.actionCategory);
231
+
232
+ if (existing) {
233
+ // update
234
+ existing.payload = a.actionPayload ?? {};
235
+ existing.actioncategoryname =
236
+ a.actionCategoryName ?? existing.actioncategoryname;
237
+ // existing.status = a.status ?? existing.status;
238
+ if (a.status !== undefined && a.status !== null) {
239
+ existing.status = a.status.toUpperCase();
240
+ }
241
+ await this.dataSource
242
+ .getRepository(WorkflowAutomationActionEntity)
243
+ .save(existing);
244
+ this.logger.log(`Updated action: ${a.actionCategory}`);
245
+ } else {
246
+ // insert
247
+ const actionEntity = new WorkflowAutomationActionEntity();
248
+ actionEntity.entity_type = 'WFAA';
249
+ actionEntity.workflow_automation_id = workflow.id;
250
+ actionEntity.action_category_id = a.actionCategory;
251
+ actionEntity.actioncategoryname = a.actionCategoryName;
252
+ actionEntity.payload = a.actionPayload ?? {};
253
+ actionEntity.name = a.name;
254
+ // actionEntity.status = a.status;
255
+ actionEntity.status = a.status?.toUpperCase() ?? 'ACTIVE';
256
+
257
+ await this.dataSource
258
+ .getRepository(WorkflowAutomationActionEntity)
259
+ .save(actionEntity);
260
+ this.logger.log(`Created new action: ${a.actionCategory}`);
261
+ }
262
+ }
263
+ const incomingCategories = action.map((a) => a.actionCategory);
264
+ const toDelete = existingActions.filter(
265
+ (a) => !incomingCategories.includes(a.action_category_id),
266
+ );
267
+
268
+ if (toDelete.length) {
269
+ await this.dataSource
270
+ .getRepository(WorkflowAutomationActionEntity)
271
+ .remove(toDelete);
272
+ this.logger.log(
273
+ `Deleted ${toDelete.length} actions not present in request.`,
274
+ );
275
+ }
276
+ }
277
+
278
+ // 5. Save workflow again with updated codes
279
+ workflow = await super.updateEntity(workflow, loggedInUser);
280
+ this.logger.debug(`Final workflow updated (id=${workflow.id})`);
281
+
282
+ return workflow;
283
+ }
284
+
285
+ async getEntityData(entity_type: string, id: number, loggedInUser: UserData) {
286
+ this.logger.log(`Fetching WorkflowAutomation by id=${id}`);
287
+
288
+ // 1. Get workflow automation entity
289
+ const workflowAutomation = await this.dataSource
290
+ .getRepository(WorkflowAutomation)
291
+ .findOne({
292
+ where: { id },
293
+ });
294
+
295
+ if (!workflowAutomation) {
296
+ throw new NotFoundException(`WorkflowAutomation not found with id=${id}`);
297
+ }
298
+
299
+ // 2. EVENT FILTER
300
+ let event: any = null;
301
+
302
+ if (workflowAutomation.trigger_type === 'on_event') {
303
+ if (workflowAutomation.condition_filter_code) {
304
+ const eventFilterMaster: any =
305
+ await this.savedFilterService.getEntityDataByCode(
306
+ ENTITYTYPE_SAVEDFILTERMASTER,
307
+ workflowAutomation.condition_filter_code,
308
+ loggedInUser,
309
+ );
310
+
311
+ if (eventFilterMaster) {
312
+ // 🔑 fetch filter details using mapped_filter_code
313
+ const eventFilterDetails =
314
+ await this.savedFilterService.getDetailsByCode(
315
+ eventFilterMaster.code,
316
+ );
317
+
318
+ event = {
319
+ eventFilterJson: eventFilterDetails ?? [],
320
+ triggerType: workflowAutomation.trigger_type,
321
+ event: workflowAutomation.trigger_event,
322
+ };
323
+ }
324
+ }
325
+ }
326
+
327
+ if (workflowAutomation.trigger_type === 'on_schedule') {
328
+ event = {
329
+ triggerType: workflowAutomation.trigger_type,
330
+ scheduleJson: workflowAutomation.schedule,
331
+ };
332
+ }
333
+
334
+ // 3. CRITERIA FILTER
335
+ let filter: any = null;
336
+
337
+ filter = {
338
+ filter_code: workflowAutomation.criteria_filter_code,
339
+ };
340
+
341
+ // 4. ACTIONS
342
+ const actions = await this.dataSource
343
+ .getRepository(WorkflowAutomationActionEntity)
344
+ .find({
345
+ where: { workflow_automation_id: workflowAutomation.id },
346
+ });
347
+
348
+ const action = actions.map((a) => ({
349
+ actionCategory: a.action_category_id,
350
+ actionCategoryName: a.actioncategoryname,
351
+ actionPayload: a.payload,
352
+ name: a.name,
353
+ status: a.status,
354
+ }));
355
+
356
+ // 5. Final response
357
+ const response = {
358
+ ...workflowAutomation,
359
+ event,
360
+ filter,
361
+ action,
362
+ };
363
+
364
+ this.logger.debug(`Fetched WorkflowAutomation (id=${id}) with relations`);
365
+ return response;
366
+ }
367
+
368
+ async registerScheduleAutomation(workflow: any, loggedInUser: UserData) {
369
+ this.logger.log(
370
+ `Registering schedule automation for workflow ${workflow.id}`,
371
+ );
372
+
373
+ const scheduleJson = workflow.schedule;
374
+ if (!scheduleJson) {
375
+ this.logger.warn(`No schedule JSON provided for workflow ${workflow.id}`);
376
+ return;
377
+ }
378
+
379
+ // Try to find an existing scheduled workflow by workflow_id
380
+ const existingSchedule = await this.scheduledWorkflowRepository.findOne({
381
+ where: { workflow_id: workflow.id },
382
+ });
383
+
384
+ const cronExpression = await this.generateDailyCron(scheduleJson.fixedTime);
385
+
386
+ const payload = {
387
+ id: Number(existingSchedule?.id ?? null),
388
+ workflow_id: workflow.id,
389
+ workflow_name: workflow.name,
390
+ name: scheduleJson.name ?? `Schedule_${workflow.id}`,
391
+ description: scheduleJson.description ?? '',
392
+ cron_expression: cronExpression,
393
+ timezone: scheduleJson.timezone ?? 'Asia/Kolkata',
394
+ start_date: scheduleJson.start_date ?? null,
395
+ end_date: scheduleJson.end_date ?? null,
396
+ max_executions: scheduleJson.max_executions ?? null,
397
+ retry_config: scheduleJson.retry_config ?? {},
398
+ actions: scheduleJson.actions ?? [],
399
+ metadata: scheduleJson.metadata ?? {},
400
+ is_enabled: scheduleJson.is_enabled ?? true,
401
+ organization_id: loggedInUser.organization_id,
402
+ enterprise_id: loggedInUser.enterprise_id,
403
+ level_id: loggedInUser.level_id,
404
+ level_type: loggedInUser.level_type,
405
+ appcode: loggedInUser.appcode,
406
+ };
407
+
408
+ if (existingSchedule) {
409
+ this.logger.log(
410
+ `Existing schedule found (id=${existingSchedule.id}), updating...`,
411
+ );
412
+ // payload['id'] = existingSchedule.id;
413
+ return await this.workflowScheduleService.updateSchedule(
414
+ payload,
415
+ loggedInUser,
416
+ );
417
+ } else {
418
+ this.logger.log(`No existing schedule found, creating new one...`);
419
+ return await this.workflowScheduleService.createSchedule(
420
+ payload,
421
+ loggedInUser,
422
+ );
423
+ }
424
+ }
425
+
426
+ // CRON
427
+
428
+ async generateDailyCron(executionTime: string): Promise<string> {
429
+ const time = moment(executionTime, 'HH:mm');
430
+
431
+ if (!time.isValid()) {
432
+ throw new Error('Invalid executionTime format (expected HH:mm)');
433
+ }
434
+
435
+ const minute = time.minute();
436
+ const hour = time.hour();
437
+
438
+ // Ensure cron has 5 fields: minute hour day month weekday
439
+ const cron = `${minute} ${hour} * * *`;
440
+
441
+ // Validate against your regex before returning
442
+ const cronRegex =
443
+ /^(\*|([0-5]?\d)) (\*|([01]?\d|2[0-3])) (\*|([01]?\d|2\d|3[01])) (\*|([1-9]|1[0-2])) (\*|([0-6]))$/;
444
+ if (!cronRegex.test(cron)) {
445
+ throw new Error(
446
+ `Generated cron expression "${cron}" does not match expected format`,
447
+ );
448
+ }
449
+
450
+ return cron;
451
+ }
452
+ /**
453
+ * Updates the sequence of multiple workflow automations.
454
+ */
455
+ async updateSequence(
456
+ body: any[],
457
+ loggedInUser: any,
458
+ ): Promise<{ updated: number; results: any[] }> {
459
+ if (!Array.isArray(body) || body.length === 0) {
460
+ throw new BadRequestException(
461
+ 'Invalid input. Expected a non-empty array.',
462
+ );
463
+ }
464
+
465
+ const results: {
466
+ id: number | string | null;
467
+ success: boolean;
468
+ result?: any;
469
+ error?: string;
470
+ }[] = [];
471
+
472
+ for (const item of body) {
473
+ const { id, sequence } = item;
474
+
475
+ // Validate required fields
476
+ if (!id || sequence === undefined || sequence === null) {
477
+ results.push({
478
+ id: id || null,
479
+ success: false,
480
+ error: 'Missing id or sequence',
481
+ });
482
+ continue;
483
+ }
484
+
485
+ try {
486
+ // Check if workflow exists
487
+ const existing = await this.wfRepo.findOne({ where: { id } });
488
+ if (!existing) {
489
+ results.push({
490
+ id,
491
+ success: false,
492
+ error: `Workflow with id ${id} not found`,
493
+ });
494
+ continue;
495
+ }
496
+
497
+ // Update sequence + audit fields
498
+ existing.sequence = Number(sequence);
499
+ existing.modified_by =
500
+ loggedInUser?.id || loggedInUser?.user_id || null;
501
+ existing.modified_date = new Date();
502
+
503
+ const saved = await this.wfRepo.save(existing);
504
+ results.push({ id, success: true, result: saved });
505
+ } catch (err) {
506
+ results.push({
507
+ id,
508
+ success: false,
509
+ error: err.message || 'Unknown error occurred',
510
+ });
511
+ }
512
+ }
513
+
514
+ return {
515
+ updated: results.filter((r) => r.success).length,
516
+ results,
517
+ };
518
+ }
519
+ }