rez_core 5.0.211 → 6.1.1

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