rez_core 5.0.127 → 5.0.128

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 (404) 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/inspectionProfiles/Project_Default.xml +1 -1
  5. package/.idea/modules.xml +7 -7
  6. package/.idea/prettier.xml +5 -5
  7. package/.idea/vcs.xml +5 -5
  8. package/.prettierrc +3 -3
  9. package/README.md +99 -99
  10. package/dist/module/auth/guards/role.guard.js +3 -3
  11. package/dist/module/filter/service/filter.service.js +20 -20
  12. package/dist/module/integration/examples/usage.example.js +9 -9
  13. package/dist/module/meta/repository/attribute-master.repository.js +8 -8
  14. package/dist/module/meta/service/entity-dynamic.service.js +19 -19
  15. package/dist/module/meta/service/entity-list.service.js +3 -3
  16. package/dist/module/meta/service/entity-service-impl.service.js +3 -3
  17. package/dist/module/meta/service/media-data.service.js +7 -6
  18. package/dist/module/meta/service/media-data.service.js.map +1 -1
  19. package/dist/module/meta/service/resolver.service.js +15 -15
  20. package/dist/module/module/repository/menu.repository.js +4 -4
  21. package/dist/module/notification/service/notification.service.js +6 -6
  22. package/dist/module/user/controller/login.controller.js +18 -18
  23. package/dist/module/workflow/repository/action.repository.js +2 -2
  24. package/dist/module/workflow/repository/stage.repository.js +8 -8
  25. package/dist/module/workflow/service/action-template-mapping.service.js +2 -2
  26. package/dist/module/workflow/service/action.service.js +10 -10
  27. package/dist/module/workflow/service/entity-modification.service.js +2 -2
  28. package/dist/module/workflow/service/task.service.js +8 -8
  29. package/dist/module/workflow-automation/service/schedule-handler.service.js +9 -9
  30. package/dist/tsconfig.build.tsbuildinfo +1 -1
  31. package/dist/utils/service/reflection-helper.service.js +2 -2
  32. package/docs/modules/event-driven-integration-design.md +91 -91
  33. package/docs/modules/integration.md +250 -250
  34. package/eslint.config.mjs +34 -34
  35. package/nest-cli.json +14 -14
  36. package/package.json +125 -125
  37. package/src/app.controller.ts +12 -12
  38. package/src/app.module.ts +68 -68
  39. package/src/app.service.ts +8 -8
  40. package/src/config/bull.config.ts +69 -69
  41. package/src/config/config.module.ts +17 -17
  42. package/src/config/database.config.ts +48 -48
  43. package/src/constant/global.constant.ts +67 -67
  44. package/src/core.module.ts +94 -94
  45. package/src/decorators/roles.decorator.ts +7 -7
  46. package/src/dtos/response.dto.ts +6 -6
  47. package/src/dtos/response.ts +5 -5
  48. package/src/index.ts +1 -1
  49. package/src/module/auth/auth.module.ts +49 -49
  50. package/src/module/auth/controller/auth.controller.ts +28 -28
  51. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  52. package/src/module/auth/guards/jwt.guard.ts +22 -22
  53. package/src/module/auth/guards/role.guard.ts +68 -68
  54. package/src/module/auth/services/auth.service.ts +56 -56
  55. package/src/module/auth/services/jwt.service.ts +11 -11
  56. package/src/module/auth/strategies/google.strategy.ts +54 -54
  57. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  58. package/src/module/auth/strategies/local.strategy.ts +13 -13
  59. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  60. package/src/module/dashboard/dashboard.module.ts +21 -21
  61. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  62. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  63. package/src/module/dashboard/repository/dashboard.repository.ts +51 -51
  64. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  65. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  66. package/src/module/enterprise/enterprise.module.ts +30 -30
  67. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  68. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  69. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  70. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  71. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  72. package/src/module/enterprise/repository/school.repository.ts +272 -272
  73. package/src/module/enterprise/service/brand.service.ts +5 -5
  74. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  75. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  76. package/src/module/enterprise/service/organization.service.ts +145 -145
  77. package/src/module/entity_json/controller/entity_json.controller.ts +47 -47
  78. package/src/module/entity_json/entity/entityJson.entity.ts +39 -39
  79. package/src/module/entity_json/entity_json.module.ts +18 -18
  80. package/src/module/entity_json/service/entityJson.repository.ts +37 -37
  81. package/src/module/entity_json/service/entity_json.service.ts +242 -242
  82. package/src/module/export/controller/export.controller.ts +81 -81
  83. package/src/module/export/export.module.ts +12 -12
  84. package/src/module/export/service/export.service.ts +85 -85
  85. package/src/module/filter/controller/filter.controller.ts +84 -84
  86. package/src/module/filter/dto/filter-request.dto.ts +38 -38
  87. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  88. package/src/module/filter/entity/saved-filter-master.entity.ts +29 -29
  89. package/src/module/filter/filter.module.ts +33 -33
  90. package/src/module/filter/repository/saved-filter.repository.ts +196 -196
  91. package/src/module/filter/repository/saved.filter-detail.repository.ts +19 -19
  92. package/src/module/filter/service/filter-evaluator.service.ts +82 -82
  93. package/src/module/filter/service/filter.service.ts +1317 -1317
  94. package/src/module/filter/service/saved-filter.service.ts +164 -164
  95. package/src/module/ics/controller/ics.controller.ts +21 -21
  96. package/src/module/ics/dto/ics.dto.ts +55 -55
  97. package/src/module/ics/ics.module.ts +13 -13
  98. package/src/module/ics/service/ics.service.ts +57 -57
  99. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  100. package/src/module/integration/controller/integration.controller.ts +662 -662
  101. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  102. package/src/module/integration/dto/create-config.dto.ts +526 -526
  103. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  104. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  105. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  106. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  107. package/src/module/integration/examples/usage.example.ts +338 -338
  108. package/src/module/integration/factories/base.factory.ts +7 -7
  109. package/src/module/integration/factories/email.factory.ts +49 -49
  110. package/src/module/integration/factories/integration.factory.ts +121 -121
  111. package/src/module/integration/factories/sms.factory.ts +51 -51
  112. package/src/module/integration/factories/telephone.factory.ts +41 -41
  113. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  114. package/src/module/integration/integration.module.ts +110 -110
  115. package/src/module/integration/service/calendar-event.service.ts +118 -118
  116. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  117. package/src/module/integration/service/integration-queue.service.ts +229 -229
  118. package/src/module/integration/service/integration.service.ts +2634 -2634
  119. package/src/module/integration/service/oauth.service.ts +224 -224
  120. package/src/module/integration/service/wrapper.service.ts +716 -716
  121. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  122. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  123. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  124. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  125. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  126. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  127. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  128. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  129. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  130. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  131. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  132. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  133. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  134. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  135. package/src/module/layout/controller/layout.controller.ts +47 -47
  136. package/src/module/layout/entity/header-items.entity.ts +28 -28
  137. package/src/module/layout/entity/header-section.entity.ts +19 -19
  138. package/src/module/layout/layout.module.ts +21 -21
  139. package/src/module/layout/repository/header-items.repository.ts +18 -18
  140. package/src/module/layout/repository/header-section.repository.ts +22 -22
  141. package/src/module/layout/service/header-section.service.ts +25 -25
  142. package/src/module/layout_preference/controller/layout_preference.controller.ts +73 -73
  143. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  144. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  145. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  146. package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
  147. package/src/module/lead/controller/lead.controller.ts +30 -30
  148. package/src/module/lead/lead.module.ts +14 -14
  149. package/src/module/lead/repository/lead.repository.ts +41 -41
  150. package/src/module/lead/service/lead.service.ts +54 -54
  151. package/src/module/linked_attributes/controller/linked_attributes.controller.ts +37 -37
  152. package/src/module/linked_attributes/entity/linked_attribute.entity.ts +51 -51
  153. package/src/module/linked_attributes/linked_attributes.module.ts +16 -16
  154. package/src/module/linked_attributes/repository/linked_attribute.repository.ts +12 -12
  155. package/src/module/linked_attributes/service/linked_attributes.service.ts +75 -75
  156. package/src/module/listmaster/controller/list-master.controller.ts +230 -230
  157. package/src/module/listmaster/entity/list-master-items.entity.ts +43 -43
  158. package/src/module/listmaster/entity/list-master.entity.ts +33 -33
  159. package/src/module/listmaster/listmaster.module.ts +46 -46
  160. package/src/module/listmaster/repository/list-master-items.repository.ts +173 -173
  161. package/src/module/listmaster/repository/list-master.repository.ts +56 -56
  162. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  163. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  164. package/src/module/listmaster/service/list-master-item.service.ts +281 -281
  165. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  166. package/src/module/listmaster/service/list-master.service.ts +535 -535
  167. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  168. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  169. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  170. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  171. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  172. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  173. package/src/module/mapper/mapper.module.ts +35 -35
  174. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  175. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  176. package/src/module/mapper/repository/mapper.repository.ts +32 -32
  177. package/src/module/mapper/service/field-mapper.service.ts +269 -269
  178. package/src/module/mapper/service/mapper.service.ts +81 -81
  179. package/src/module/master/controller/master.controller.ts +74 -74
  180. package/src/module/master/service/master.service.ts +483 -483
  181. package/src/module/meta/controller/app-master.controller.ts +38 -38
  182. package/src/module/meta/controller/attribute-master.controller.ts +84 -84
  183. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  184. package/src/module/meta/controller/entity-master.controller.ts +41 -41
  185. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  186. package/src/module/meta/controller/entity.controller.ts +342 -342
  187. package/src/module/meta/controller/entity.public.controller.ts +75 -75
  188. package/src/module/meta/controller/media.controller.ts +107 -107
  189. package/src/module/meta/controller/meta.controller.ts +96 -96
  190. package/src/module/meta/controller/view-master.controller.ts +86 -86
  191. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  192. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  193. package/src/module/meta/dto/entity-table.dto.ts +10 -10
  194. package/src/module/meta/entity/app-master.entity.ts +34 -34
  195. package/src/module/meta/entity/attribute-master.entity.ts +92 -92
  196. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  197. package/src/module/meta/entity/entity-master.entity.ts +85 -85
  198. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  199. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  200. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  201. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  202. package/src/module/meta/entity/media-data.entity.ts +32 -32
  203. package/src/module/meta/entity/preference.entity.ts +62 -62
  204. package/src/module/meta/entity/view-master.entity.ts +41 -41
  205. package/src/module/meta/entity.module.ts +166 -166
  206. package/src/module/meta/repository/app-master.repository.ts +20 -20
  207. package/src/module/meta/repository/attribute-master.repository.ts +156 -156
  208. package/src/module/meta/repository/entity-attribute-update.repository.ts +48 -48
  209. package/src/module/meta/repository/entity-master.repository.ts +110 -110
  210. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  211. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  212. package/src/module/meta/repository/media-data.repository.ts +50 -50
  213. package/src/module/meta/repository/preference.repository.ts +20 -20
  214. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  215. package/src/module/meta/repository/view-master.repository.ts +42 -42
  216. package/src/module/meta/service/app-master.service.ts +37 -37
  217. package/src/module/meta/service/attribute-master.service.ts +130 -130
  218. package/src/module/meta/service/common.service.ts +9 -9
  219. package/src/module/meta/service/entity-attribute-update.service.ts +28 -28
  220. package/src/module/meta/service/entity-dynamic.service.ts +818 -818
  221. package/src/module/meta/service/entity-list.service.ts +205 -205
  222. package/src/module/meta/service/entity-master.service.ts +171 -171
  223. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  224. package/src/module/meta/service/entity-relation.service.ts +69 -69
  225. package/src/module/meta/service/entity-service-impl.service.ts +435 -435
  226. package/src/module/meta/service/entity-table-column.service.ts +39 -39
  227. package/src/module/meta/service/entity-table.service.ts +157 -157
  228. package/src/module/meta/service/entity-validation.service.ts +187 -187
  229. package/src/module/meta/service/entity.service.ts +59 -59
  230. package/src/module/meta/service/field-group.service.ts +103 -103
  231. package/src/module/meta/service/media-data.service.ts +511 -510
  232. package/src/module/meta/service/populate-meta.service.ts +222 -222
  233. package/src/module/meta/service/preference.service.ts +16 -16
  234. package/src/module/meta/service/resolver.service.ts +293 -293
  235. package/src/module/meta/service/section-master.service.ts +104 -104
  236. package/src/module/meta/service/update-form-json.service.ts +22 -22
  237. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  238. package/src/module/meta/service/view-master.service.ts +127 -127
  239. package/src/module/microservice-client/microservice-clients.module.ts +13 -13
  240. package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
  241. package/src/module/microservice-client/service/microservice-clients.ts +4 -4
  242. package/src/module/module/controller/menu.controller.ts +15 -15
  243. package/src/module/module/controller/module-access.controller.ts +134 -134
  244. package/src/module/module/entity/menu.entity.ts +43 -43
  245. package/src/module/module/entity/module-access.entity.ts +25 -25
  246. package/src/module/module/entity/module-action.entity.ts +17 -17
  247. package/src/module/module/entity/module.entity.ts +52 -52
  248. package/src/module/module/module.module.ts +42 -42
  249. package/src/module/module/repository/menu.repository.ts +186 -186
  250. package/src/module/module/repository/module-access.repository.ts +344 -344
  251. package/src/module/module/service/menu.service.ts +82 -82
  252. package/src/module/module/service/module-access.service.ts +199 -199
  253. package/src/module/notification/controller/notification.controller.ts +58 -58
  254. package/src/module/notification/controller/otp.controller.ts +117 -117
  255. package/src/module/notification/entity/notification.entity.ts +26 -26
  256. package/src/module/notification/entity/otp.entity.ts +28 -28
  257. package/src/module/notification/firebase-admin.config.ts +22 -22
  258. package/src/module/notification/notification.module.ts +69 -69
  259. package/src/module/notification/repository/otp.repository.ts +27 -27
  260. package/src/module/notification/service/email.service.ts +127 -127
  261. package/src/module/notification/service/notification.service.ts +164 -164
  262. package/src/module/notification/service/otp.service.ts +133 -133
  263. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  264. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  265. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  266. package/src/module/third-party-module/third-party.module.ts +12 -12
  267. package/src/module/user/controller/login.controller.ts +198 -198
  268. package/src/module/user/controller/user.controller.ts +40 -40
  269. package/src/module/user/dto/create-user.dto.ts +62 -62
  270. package/src/module/user/dto/update-user.dto.ts +4 -4
  271. package/src/module/user/entity/role.entity.ts +33 -33
  272. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  273. package/src/module/user/entity/user-session.entity.ts +73 -73
  274. package/src/module/user/entity/user.entity.ts +59 -59
  275. package/src/module/user/repository/role.repository.ts +96 -96
  276. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  277. package/src/module/user/repository/user.repository.ts +50 -50
  278. package/src/module/user/repository/userSession.repository.ts +33 -33
  279. package/src/module/user/service/login.service.ts +326 -326
  280. package/src/module/user/service/role.service.ts +197 -197
  281. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  282. package/src/module/user/service/user-session.service.ts +177 -177
  283. package/src/module/user/service/user.service.ts +368 -368
  284. package/src/module/user/user.module.ts +65 -65
  285. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  286. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  287. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  288. package/src/module/workflow/controller/action.controller.ts +111 -111
  289. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  290. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  291. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  292. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  293. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  294. package/src/module/workflow/controller/stage.controller.ts +50 -50
  295. package/src/module/workflow/controller/task.controller.ts +77 -77
  296. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  297. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  298. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  299. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  300. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  301. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  302. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  303. package/src/module/workflow/entity/action.entity.ts +53 -53
  304. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  305. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  306. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  307. package/src/module/workflow/entity/form.entity.ts +25 -25
  308. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  309. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  310. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  311. package/src/module/workflow/entity/stage.entity.ts +20 -20
  312. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  313. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  314. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  315. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  316. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  317. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  318. package/src/module/workflow/repository/action-data.repository.ts +346 -346
  319. package/src/module/workflow/repository/action.repository.ts +339 -339
  320. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  321. package/src/module/workflow/repository/comm-template.repository.ts +157 -157
  322. package/src/module/workflow/repository/form-master.repository.ts +50 -50
  323. package/src/module/workflow/repository/stage-group.repository.ts +186 -186
  324. package/src/module/workflow/repository/stage-movement.repository.ts +257 -257
  325. package/src/module/workflow/repository/stage.repository.ts +160 -160
  326. package/src/module/workflow/repository/task.repository.ts +151 -151
  327. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  328. package/src/module/workflow/service/action-category.service.ts +33 -33
  329. package/src/module/workflow/service/action-data.service.ts +62 -62
  330. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  331. package/src/module/workflow/service/action-template-mapping.service.ts +140 -140
  332. package/src/module/workflow/service/action.service.ts +306 -306
  333. package/src/module/workflow/service/activity-log.service.ts +107 -107
  334. package/src/module/workflow/service/comm-template.service.ts +180 -180
  335. package/src/module/workflow/service/entity-modification.service.ts +61 -61
  336. package/src/module/workflow/service/form-master.service.ts +35 -35
  337. package/src/module/workflow/service/populate-workflow.service.ts +320 -320
  338. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  339. package/src/module/workflow/service/stage-group.service.ts +344 -344
  340. package/src/module/workflow/service/stage.service.ts +207 -207
  341. package/src/module/workflow/service/task.service.ts +549 -549
  342. package/src/module/workflow/service/workflow-list-master.service.ts +68 -68
  343. package/src/module/workflow/service/workflow-meta.service.ts +639 -639
  344. package/src/module/workflow/service/workflow.service.ts +213 -213
  345. package/src/module/workflow/workflow.module.ts +180 -180
  346. package/src/module/workflow-automation/SCHEDULING_GUIDE.md +145 -145
  347. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +43 -43
  348. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  349. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +40 -40
  350. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  351. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  352. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  353. package/src/module/workflow-automation/service/schedule-handler.service.ts +168 -168
  354. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +219 -219
  355. package/src/module/workflow-automation/service/workflow-automation.service.ts +515 -515
  356. package/src/module/workflow-automation/workflow-automation.module.ts +54 -54
  357. package/src/module/workflow-schedule/INSTALLATION.md +244 -244
  358. package/src/module/workflow-schedule/MULTI_PROJECT_GUIDE.md +196 -196
  359. package/src/module/workflow-schedule/README.md +422 -422
  360. package/src/module/workflow-schedule/constants/schedule.constants.ts +48 -48
  361. package/src/module/workflow-schedule/controller/workflow-schedule.controller.ts +255 -255
  362. package/src/module/workflow-schedule/docs/CLAUDE_CODE_GUIDE.md +510 -510
  363. package/src/module/workflow-schedule/docs/CLAUDE_CODE_PROMPT.md +362 -362
  364. package/src/module/workflow-schedule/docs/RUN_CLAUDE_CODE.sh +68 -68
  365. package/src/module/workflow-schedule/dto/create-schedule.dto.ts +147 -147
  366. package/src/module/workflow-schedule/dto/get-execution-logs.dto.ts +119 -119
  367. package/src/module/workflow-schedule/dto/update-schedule.dto.ts +96 -96
  368. package/src/module/workflow-schedule/entities/scheduled-workflow.entity.ts +148 -148
  369. package/src/module/workflow-schedule/entities/workflow-execution-log.entity.ts +154 -154
  370. package/src/module/workflow-schedule/interfaces/schedule-job-data.interface.ts +53 -53
  371. package/src/module/workflow-schedule/interfaces/workflow-schedule-options.interface.ts +12 -12
  372. package/src/module/workflow-schedule/processors/schedule.processor.ts +620 -620
  373. package/src/module/workflow-schedule/service/workflow-schedule.service.ts +598 -598
  374. package/src/module/workflow-schedule/workflow-schedule.module.ts +67 -67
  375. package/src/resources/dev.properties.yaml +31 -31
  376. package/src/resources/local.properties.yaml +27 -27
  377. package/src/resources/properties.module.ts +12 -12
  378. package/src/resources/properties.yaml.ts +11 -11
  379. package/src/resources/uat.properties.yaml +31 -31
  380. package/src/table.config.ts +133 -133
  381. package/src/utils/dto/excel-data.dto.ts +14 -14
  382. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  383. package/src/utils/service/base64util.service.ts +18 -18
  384. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  385. package/src/utils/service/codeGenerator.service.ts +22 -22
  386. package/src/utils/service/dateUtil.service.ts +17 -17
  387. package/src/utils/service/encryptUtil.service.ts +97 -97
  388. package/src/utils/service/excel-helper.service.ts +72 -72
  389. package/src/utils/service/excelUtil.service.ts +15 -15
  390. package/src/utils/service/file-util.service.ts +11 -11
  391. package/src/utils/service/json-util.service.ts +23 -23
  392. package/src/utils/service/loggingUtil.service.ts +88 -88
  393. package/src/utils/service/reflection-helper.service.ts +62 -62
  394. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  395. package/src/utils/utils.module.ts +27 -27
  396. package/tsconfig.build.json +4 -4
  397. package/tsconfig.json +24 -24
  398. package/.claude/settings.local.json +0 -26
  399. package/.idea/copilot.data.migration.agent.xml +0 -6
  400. package/.idea/copilot.data.migration.ask.xml +0 -6
  401. package/.idea/copilot.data.migration.ask2agent.xml +0 -6
  402. package/.idea/copilot.data.migration.edit.xml +0 -6
  403. package/.idea/misc.xml +0 -6
  404. package/server.log +0 -850
@@ -1,716 +1,716 @@
1
- import { Injectable, Logger } from '@nestjs/common';
2
- import { GenericMessageDto, IntegrationService } from './integration.service';
3
- import { IcsMeetingService } from 'src/module/ics/service/ics.service';
4
- import { LoggingService } from 'src/utils/service/loggingUtil.service';
5
- import { ReflectionHelper } from '../../../utils/service/reflection-helper.service';
6
-
7
- @Injectable()
8
- export class WrapperService {
9
- private readonly logger = new Logger(WrapperService.name);
10
-
11
- constructor(
12
- private readonly integrationService: IntegrationService,
13
- private readonly icsService: IcsMeetingService,
14
- private readonly loggingService: LoggingService,
15
- private readonly reflectionHelper: ReflectionHelper,
16
- ) {}
17
-
18
- /**
19
- * Wrapper for sending mail
20
- */
21
- async sendMailWrapper(payload: any, loggedInUser: any) {
22
- try {
23
- this.loggingService.log(
24
- 'debug',
25
- 'wrapperService',
26
- 'sendMailWrapper',
27
- `sendMailWrapper called. User: ${JSON.stringify(
28
- loggedInUser,
29
- )}, Payload: ${JSON.stringify(payload)}`,
30
- [],
31
- [],
32
- );
33
-
34
- const { level_id, level_type, organization_id } = loggedInUser;
35
-
36
- // 1. Check for config at user’s level
37
- this.loggingService.log(
38
- 'debug',
39
- 'wrapperService',
40
- 'sendMailWrapper',
41
- `Fetching configs for level_id=${level_id}, level_type=${level_type}`,
42
- [],
43
- [],
44
- );
45
- const intergrationConfigRepo =
46
- this.reflectionHelper.getRepoService('IntegrationConfig');
47
- const configs = await intergrationConfigRepo.find({
48
- where: {
49
- level_id: level_id,
50
- level_type: level_type,
51
- status: 1,
52
- integration_type: 'EMAIL',
53
- },
54
- });
55
-
56
- this.loggingService.log(
57
- 'debug',
58
- 'wrapperService',
59
- 'sendMailWrapper',
60
- `Configs found: ${JSON.stringify(configs)}`,
61
- [],
62
- [],
63
- );
64
-
65
- let templateCode: string | undefined;
66
-
67
- if (payload.templateCode) {
68
- this.loggingService.log(
69
- 'debug',
70
- 'wrapperService',
71
- 'sendMailWrapper',
72
- `Looking up templateCode=${payload.templateCode} for current level`,
73
- [],
74
- [],
75
- );
76
-
77
- const templateRepo =
78
- this.reflectionHelper.getRepoService('CommTemplate');
79
-
80
- const template = await templateRepo.findOne({
81
- where: {
82
- code: payload.templateCode,
83
- level_id: level_id,
84
- level_type: level_type,
85
- },
86
- });
87
-
88
- this.loggingService.log(
89
- 'debug',
90
- 'wrapperService',
91
- 'sendMailWrapper',
92
- `Template lookup result: ${JSON.stringify(template)}`,
93
- [],
94
- [],
95
- );
96
-
97
- if (template) {
98
- templateCode = template.rich_text;
99
- } else {
100
- this.loggingService.log(
101
- 'warn',
102
- 'wrapperService',
103
- 'sendMailWrapper',
104
- `No template found for templateCode=${payload.templateCode} and current level`,
105
- [],
106
- [],
107
- );
108
- }
109
- }
110
-
111
- let payloadSendMail: GenericMessageDto;
112
-
113
- if (configs && configs.length > 0) {
114
- this.loggingService.log(
115
- 'debug',
116
- 'wrapperService',
117
- 'sendMailWrapper',
118
- `Using user-level configs`,
119
- [],
120
- [],
121
- );
122
-
123
- payloadSendMail = {
124
- levelId: level_id,
125
- levelType: level_type,
126
- app_code: 'DEFAULT', // Legacy wrapper default
127
- to: payload.to,
128
- message: payload.message,
129
- subject: payload.subject,
130
- type: 'EMAIL',
131
- cc: payload.cc,
132
- bcc: payload.bcc,
133
- html: payload.html,
134
- // attachments: payload.attachments,
135
- templateId: payload.templateId,
136
- variables: payload.variables,
137
- organization_id: loggedInUser.organization_id,
138
- };
139
- } else {
140
- this.loggingService.log(
141
- 'warn',
142
- 'wrapperService',
143
- 'sendMailWrapper',
144
- `No user-level configs found. Falling back to ORG-level`,
145
- [],
146
- [],
147
- );
148
-
149
- const fallbackConfigs = await intergrationConfigRepo.find({
150
- where: {
151
- level_type: 'ORG',
152
- integration_type: 'EMAIL',
153
- status: 1,
154
- },
155
- });
156
-
157
- this.loggingService.log(
158
- 'debug',
159
- 'wrapperService',
160
- 'sendMailWrapper',
161
- `ORG-level configs: ${JSON.stringify(fallbackConfigs)}`,
162
- [],
163
- [],
164
- );
165
-
166
- if (!fallbackConfigs || fallbackConfigs.length === 0) {
167
- this.loggingService.log(
168
- 'warn',
169
- 'wrapperService',
170
- 'sendMailWrapper',
171
- 'No active email communication config found',
172
- [],
173
- [],
174
- );
175
- }
176
-
177
- payloadSendMail = {
178
- levelId: 1,
179
- levelType: 'ORG',
180
- app_code: 'DEFAULT', // Legacy wrapper default
181
- to: payload.to,
182
- message: payload.message,
183
- subject: payload.subject,
184
- type: 'EMAIL',
185
- cc: payload.cc,
186
- bcc: payload.bcc,
187
- html: payload.html,
188
- // attachments: payload.attachments,
189
- // templateId: payload.templateId,
190
- variables: payload.variables,
191
- organization_id: loggedInUser.organization_id,
192
- };
193
- }
194
-
195
- this.loggingService.log(
196
- 'debug',
197
- 'wrapperService',
198
- 'sendMailWrapper',
199
- `Final payload for IntegrationService: ${JSON.stringify(
200
- payloadSendMail,
201
- )}`,
202
- [],
203
- [],
204
- );
205
-
206
- const result =
207
- await this.integrationService.sendGenericMessage(payloadSendMail);
208
-
209
- this.loggingService.log(
210
- 'log',
211
- 'wrapperService',
212
- 'sendMailWrapper',
213
- `sendMailWrapper SUCCESS. Result: ${JSON.stringify(result)}`,
214
- [],
215
- [],
216
- );
217
-
218
- return {
219
- success: true,
220
- data: result,
221
- };
222
- } catch (error: any) {
223
- this.loggingService.log(
224
- 'error',
225
- 'wrapperService',
226
- 'sendMailWrapper',
227
- `sendMailWrapper ERROR: ${error.message}`,
228
- [],
229
- [error.stack], // Sending stack trace as additional data
230
- );
231
- return {
232
- success: false,
233
- error: error.message,
234
- };
235
- }
236
- }
237
-
238
- /**
239
- * Wrapper for sending communication
240
- */
241
-
242
- async sendCommunicationWrapperService(entity: any, loggedInUser: any) {
243
- try {
244
- this.loggingService.log(
245
- 'log',
246
- 'wrapperService',
247
- 'sendCommunicationWrapperService',
248
- `sendCommunicationWrapper called. User: ${JSON.stringify(
249
- loggedInUser,
250
- )}, Payload: ${JSON.stringify(entity)}`,
251
- [],
252
- [],
253
- );
254
-
255
- const { level_id, level_type, appcode, organization_id } = loggedInUser;
256
-
257
- // Check if active configs exist for current user's level
258
- this.loggingService.log(
259
- 'debug',
260
- 'wrapperService',
261
- 'sendCommunicationWrapperService',
262
- `Checking active ${
263
- entity.type || 'EMAIL'
264
- } configs for level_id=${level_id}, level_type=${level_type}, app_code=${appcode}`,
265
- [],
266
- [],
267
- );
268
-
269
- let configs = await this.integrationService.getActiveConfigs(
270
- level_id,
271
- level_type,
272
- appcode,
273
- entity.type || 'EMAIL',
274
- );
275
-
276
- let effectiveLevelId = level_id;
277
- let effectiveLevelType = level_type;
278
-
279
- // Fallback to ORG-level if no configs found
280
- if (!configs || configs.length === 0) {
281
- this.loggingService.log(
282
- 'warn',
283
- 'wrapperService',
284
- 'sendCommunicationWrapperService',
285
- `No active configs found for ${level_type}:${level_id}, falling back to ORG-level`,
286
- [],
287
- [],
288
- );
289
-
290
- configs = await this.integrationService.getActiveConfigs(
291
- 1,
292
- 'ORG',
293
- appcode,
294
- entity.type || 'EMAIL',
295
- );
296
-
297
- effectiveLevelId = 1;
298
- effectiveLevelType = 'ORG';
299
- }
300
-
301
- if (!configs || configs.length === 0) {
302
- this.loggingService.log(
303
- 'error',
304
- 'wrapperService',
305
- 'sendCommunicationWrapperService',
306
- 'No active configurations found at any level.',
307
- [],
308
- [],
309
- );
310
- throw new Error('No active configurations found.');
311
- }
312
-
313
- // Template lookup if templateCode is provided
314
- let resolvedTemplateId = entity?.templateId;
315
-
316
- if (entity.template_code) {
317
- this.loggingService.log(
318
- 'debug',
319
- 'wrapperService',
320
- 'sendCommunicationWrapperService',
321
- `Looking up template for code=${entity.template_code}, level_id=${level_id}, level_type=${level_type}`,
322
- [],
323
- [],
324
- );
325
-
326
- // Try to find template at user's level first
327
- const commTemplateRepo =
328
- this.reflectionHelper.getRepoService('CommTemplate');
329
- let templates = await commTemplateRepo.find({
330
- where: {
331
- code: entity.template_code,
332
- level_id: level_id,
333
- level_type: level_type,
334
- },
335
- });
336
-
337
- // Fallback to ORG + organization_id if not found
338
- if (!templates || templates.length === 0) {
339
- this.loggingService.log(
340
- 'warn',
341
- 'wrapperService',
342
- 'sendCommunicationWrapperService',
343
- `No template found for ${entity.template_code} at provided level. Falling back to ORG-level.`,
344
- [],
345
- [],
346
- );
347
-
348
- templates = await commTemplateRepo.find({
349
- where: {
350
- code: entity.template_code,
351
- organization_id: organization_id,
352
- },
353
- });
354
- }
355
-
356
- if (templates && templates.length > 0) {
357
- resolvedTemplateId = templates[0]?.id;
358
- this.loggingService.log(
359
- 'debug',
360
- 'wrapperService',
361
- 'sendCommunicationWrapperService',
362
- `Template resolved for code=${entity.template_code}, id=${resolvedTemplateId}`,
363
- [],
364
- [],
365
- );
366
- } else {
367
- this.loggingService.log(
368
- 'warn',
369
- 'wrapperService',
370
- 'sendCommunicationWrapperService',
371
- `No template found for code=${entity.template_code} at any level.`,
372
- [],
373
- [],
374
- );
375
- }
376
- }
377
-
378
- // Step Prepare payload for Integration Service
379
- const mailPayload = {
380
- to: entity.to,
381
- subject: entity.subject,
382
- html: entity.message,
383
- cc: entity?.cc,
384
- bcc: entity?.bcc,
385
- templateId: resolvedTemplateId, // updated with resolved ID
386
- message: entity.message,
387
- type: entity.type || 'EMAIL',
388
- levelId: effectiveLevelId,
389
- levelType: effectiveLevelType,
390
- app_code: appcode,
391
- user_id: loggedInUser.id,
392
- entity_type: entity.entity_type,
393
- entity_id: entity.entity_id,
394
- attachments: entity.attachments,
395
- mediaUrl: entity.mediaUrl,
396
- organization_id: organization_id,
397
- } as any;
398
-
399
- this.loggingService.log(
400
- 'debug',
401
- 'wrapperService',
402
- 'sendCommunicationWrapperService',
403
- `Final payload for sendGenericMessage: ${JSON.stringify(mailPayload)}`,
404
- [],
405
- [],
406
- );
407
-
408
- // Step 5️⃣ Send via Integration Service
409
- const result =
410
- await this.integrationService.sendGenericMessage(mailPayload);
411
-
412
- this.loggingService.log(
413
- 'log',
414
- 'wrapperService',
415
- 'sendCommunicationWrapperService',
416
- `sendCommunicationWrapper SUCCESS. Result: ${JSON.stringify(result)}`,
417
- [],
418
- [],
419
- );
420
-
421
- return result;
422
- } catch (error: any) {
423
- this.loggingService.log(
424
- 'error',
425
- 'wrapperService',
426
- 'sendCommunicationWrapperService',
427
- `sendCommunicationWrapper ERROR: ${error.message}`,
428
- [],
429
- [error.stack],
430
- );
431
- return {
432
- success: false,
433
- error: error.message,
434
- };
435
- }
436
- }
437
-
438
- /**
439
- * Wrapper for scheduling meeting
440
- */
441
-
442
- async scheduleMeetingWrapper(
443
- payload: any,
444
- loggedInUser: any,
445
- mapped_entities?: any,
446
- ) {
447
- try {
448
- this.loggingService.log(
449
- 'log',
450
- 'wrapperService',
451
- 'scheduleMeetingWrapper',
452
- `scheduleMeetingWrapper called by user=${
453
- loggedInUser?.id || 'unknown'
454
- } Payload=${JSON.stringify(payload)}`,
455
- [],
456
- [],
457
- );
458
-
459
- // Normalize emails (to, cc, bcc → attendees)
460
- const cleanEmails = (arr: string[] = []) =>
461
- arr.filter((e) => e && e.trim() !== '').map((e) => e.trim());
462
-
463
- const toList = Array.isArray(payload.to) ? cleanEmails(payload.to) : [];
464
-
465
- payload.attendees = [
466
- ...toList.map((e) => ({ email: e })),
467
- ...(payload.attendees || []).flatMap((a) =>
468
- typeof a === 'string'
469
- ? [{ email: a }]
470
- : Array.isArray(a?.email)
471
- ? a.email.map((e) => ({ email: e }))
472
- : a?.email
473
- ? [{ email: a.email }]
474
- : [],
475
- ),
476
- ];
477
-
478
- let integrationConfig =
479
- await this.integrationService.getSingleActiveConfig(
480
- payload.level_id,
481
- payload.level_type,
482
- payload.app_code,
483
- 'EMAIL',
484
- );
485
-
486
- if (integrationConfig) {
487
- return {
488
- success: true,
489
- data: await this.sendIcsInvite(
490
- payload,
491
- payload.level_id,
492
- payload.level_type,
493
- payload.app_code,
494
- loggedInUser.organization_id,
495
- mapped_entities,
496
- ),
497
- };
498
- }
499
-
500
- // ---- Step 2: Check ORG-level configs ----
501
- this.loggingService.log(
502
- 'log',
503
- 'wrapperService',
504
- 'scheduleMeetingWrapper',
505
- `No user-level config found, checking ORG-level...`,
506
- [],
507
- [],
508
- );
509
-
510
- const integrationConfigRepo =
511
- this.reflectionHelper.getRepoService('IntegrationConfig');
512
-
513
- const orgConfigs = await integrationConfigRepo.find({
514
- where: {
515
- level_id: 1,
516
- level_type: 'ORG',
517
- integration_type: 'EMAIL',
518
- app_code: 'DEFAULT',
519
- status: 1,
520
- },
521
- });
522
-
523
- integrationConfig = await this.integrationService.getSingleActiveConfig(
524
- 1,
525
- 'ORG',
526
- 'DEFAULT',
527
- 'EMAIL',
528
- );
529
-
530
- this.loggingService.log(
531
- 'debug',
532
- 'wrapperService',
533
- 'scheduleMeetingWrapper',
534
- `ORG configs found: ${JSON.stringify(orgConfigs)}`,
535
- [],
536
- [],
537
- );
538
-
539
- if (integrationConfig) {
540
- return {
541
- success: true,
542
- data: await this.sendIcsInvite(
543
- payload,
544
- 1,
545
- 'ORG',
546
- 'DEFAULT',
547
- loggedInUser.organization_id,
548
- mapped_entities,
549
- ),
550
- };
551
- }
552
- } catch (error: any) {
553
- this.loggingService.log(
554
- 'error',
555
- 'wrapperService',
556
- 'scheduleMeetingWrapper',
557
- `scheduleMeetingWrapper ERROR: ${error.message}`,
558
- [],
559
- [error.stack],
560
- );
561
- return { success: false, error: error.message };
562
- }
563
- }
564
-
565
- /**
566
- * Fetch credentials JSON by config ID
567
- */
568
- private async getConfigCred(configId: number) {
569
- this.loggingService.log(
570
- 'debug',
571
- 'wrapperService',
572
- 'getConfigCred',
573
- `Fetching config JSON for configId=${configId}`,
574
- [],
575
- [],
576
- );
577
-
578
- const integrationConfigRepo =
579
- this.reflectionHelper.getRepoService('IntegrationConfig');
580
-
581
- const configRes = await integrationConfigRepo.findOne({
582
- where: {
583
- id: configId,
584
- },
585
- });
586
-
587
- this.loggingService.log(
588
- 'debug',
589
- 'wrapperService',
590
- 'getConfigCred',
591
- `Config fetch result: ${JSON.stringify(configRes)}`,
592
- [],
593
- [],
594
- );
595
- return configRes?.config_json || null;
596
- }
597
-
598
- private async sendIcsInvite(
599
- payload: any,
600
- levelId: number,
601
- levelType: string,
602
- appCode: string,
603
- organizationId: number,
604
- mapped_entities?: any,
605
- ) {
606
- this.loggingService.log(
607
- 'log',
608
- 'wrapperService',
609
- 'sendIcsInvite',
610
- `Generating ICS file. Payload: ${JSON.stringify(payload)}`,
611
- [],
612
- [],
613
- );
614
-
615
- if (payload.template_code) {
616
- const commTemplateRepo =
617
- this.reflectionHelper.getRepoService('CommTemplate');
618
- let templates = await commTemplateRepo.find({
619
- where: {
620
- code: payload.template_code,
621
- level_id: levelId,
622
- level_type: levelType,
623
- },
624
- });
625
-
626
- if (templates && templates.length > 0) {
627
- payload['templateId'] = templates[0].id;
628
- }
629
- }
630
-
631
- let activeConfig = await this.integrationService.getSingleActiveConfig(
632
- levelId,
633
- levelType,
634
- appCode,
635
- 'EMAIL',
636
- );
637
- const base64String = await this.icsService.generateIcs(
638
- payload,
639
- activeConfig?.config_json,
640
- );
641
- this.loggingService.log(
642
- 'debug',
643
- 'wrapperService',
644
- 'sendIcsInvite',
645
- `ICS generated (base64 length: ${base64String?.length})`,
646
- [],
647
- [],
648
- );
649
-
650
- // Normalize attendees
651
- const attendeeEmails =
652
- payload.attendees?.flatMap((a) =>
653
- Array.isArray(a.email) ? a.email : [a.email],
654
- ) || [];
655
-
656
- // Combine into one list (to + attendees)
657
- const toList = Array.from(
658
- new Set(
659
- [
660
- ...(Array.isArray(payload.to)
661
- ? payload.to
662
- : payload.to
663
- ? [payload.to]
664
- : []),
665
- ...attendeeEmails,
666
- ].map((email) => email.toLowerCase().trim()),
667
- ),
668
- );
669
-
670
- const payloadSendMail: GenericMessageDto = {
671
- levelId,
672
- levelType,
673
- app_code: appCode,
674
- to: toList,
675
- message: payload.message,
676
- subject: payload.subject,
677
- type: 'EMAIL',
678
- cc: payload.cc,
679
- bcc: payload.bcc,
680
- html: payload.html,
681
- attachments: [
682
- {
683
- content: base64String,
684
- type: 'text/calendar',
685
- filename: 'invite.ics',
686
- disposition: 'attachment',
687
- },
688
- ],
689
- templateId: payload.templateId,
690
- entity_id: payload.entity_id,
691
- entity_type: payload.entity_type,
692
- organization_id: organizationId,
693
- mapped_entities,
694
- };
695
-
696
- this.loggingService.log(
697
- 'debug',
698
- 'wrapperService',
699
- 'sendIcsInvite',
700
- `Final payload for ICS send: ${JSON.stringify(payloadSendMail)}`,
701
- [],
702
- [],
703
- );
704
- const result =
705
- await this.integrationService.sendGenericMessage(payloadSendMail);
706
- this.loggingService.log(
707
- 'log',
708
- 'wrapperService',
709
- 'sendIcsInvite',
710
- `ICS mail send result: ${JSON.stringify(result)}`,
711
- [],
712
- [],
713
- );
714
- return result;
715
- }
716
- }
1
+ import { Injectable, Logger } from '@nestjs/common';
2
+ import { GenericMessageDto, IntegrationService } from './integration.service';
3
+ import { IcsMeetingService } from 'src/module/ics/service/ics.service';
4
+ import { LoggingService } from 'src/utils/service/loggingUtil.service';
5
+ import { ReflectionHelper } from '../../../utils/service/reflection-helper.service';
6
+
7
+ @Injectable()
8
+ export class WrapperService {
9
+ private readonly logger = new Logger(WrapperService.name);
10
+
11
+ constructor(
12
+ private readonly integrationService: IntegrationService,
13
+ private readonly icsService: IcsMeetingService,
14
+ private readonly loggingService: LoggingService,
15
+ private readonly reflectionHelper: ReflectionHelper,
16
+ ) {}
17
+
18
+ /**
19
+ * Wrapper for sending mail
20
+ */
21
+ async sendMailWrapper(payload: any, loggedInUser: any) {
22
+ try {
23
+ this.loggingService.log(
24
+ 'debug',
25
+ 'wrapperService',
26
+ 'sendMailWrapper',
27
+ `sendMailWrapper called. User: ${JSON.stringify(
28
+ loggedInUser,
29
+ )}, Payload: ${JSON.stringify(payload)}`,
30
+ [],
31
+ [],
32
+ );
33
+
34
+ const { level_id, level_type, organization_id } = loggedInUser;
35
+
36
+ // 1. Check for config at user’s level
37
+ this.loggingService.log(
38
+ 'debug',
39
+ 'wrapperService',
40
+ 'sendMailWrapper',
41
+ `Fetching configs for level_id=${level_id}, level_type=${level_type}`,
42
+ [],
43
+ [],
44
+ );
45
+ const intergrationConfigRepo =
46
+ this.reflectionHelper.getRepoService('IntegrationConfig');
47
+ const configs = await intergrationConfigRepo.find({
48
+ where: {
49
+ level_id: level_id,
50
+ level_type: level_type,
51
+ status: 1,
52
+ integration_type: 'EMAIL',
53
+ },
54
+ });
55
+
56
+ this.loggingService.log(
57
+ 'debug',
58
+ 'wrapperService',
59
+ 'sendMailWrapper',
60
+ `Configs found: ${JSON.stringify(configs)}`,
61
+ [],
62
+ [],
63
+ );
64
+
65
+ let templateCode: string | undefined;
66
+
67
+ if (payload.templateCode) {
68
+ this.loggingService.log(
69
+ 'debug',
70
+ 'wrapperService',
71
+ 'sendMailWrapper',
72
+ `Looking up templateCode=${payload.templateCode} for current level`,
73
+ [],
74
+ [],
75
+ );
76
+
77
+ const templateRepo =
78
+ this.reflectionHelper.getRepoService('CommTemplate');
79
+
80
+ const template = await templateRepo.findOne({
81
+ where: {
82
+ code: payload.templateCode,
83
+ level_id: level_id,
84
+ level_type: level_type,
85
+ },
86
+ });
87
+
88
+ this.loggingService.log(
89
+ 'debug',
90
+ 'wrapperService',
91
+ 'sendMailWrapper',
92
+ `Template lookup result: ${JSON.stringify(template)}`,
93
+ [],
94
+ [],
95
+ );
96
+
97
+ if (template) {
98
+ templateCode = template.rich_text;
99
+ } else {
100
+ this.loggingService.log(
101
+ 'warn',
102
+ 'wrapperService',
103
+ 'sendMailWrapper',
104
+ `No template found for templateCode=${payload.templateCode} and current level`,
105
+ [],
106
+ [],
107
+ );
108
+ }
109
+ }
110
+
111
+ let payloadSendMail: GenericMessageDto;
112
+
113
+ if (configs && configs.length > 0) {
114
+ this.loggingService.log(
115
+ 'debug',
116
+ 'wrapperService',
117
+ 'sendMailWrapper',
118
+ `Using user-level configs`,
119
+ [],
120
+ [],
121
+ );
122
+
123
+ payloadSendMail = {
124
+ levelId: level_id,
125
+ levelType: level_type,
126
+ app_code: 'DEFAULT', // Legacy wrapper default
127
+ to: payload.to,
128
+ message: payload.message,
129
+ subject: payload.subject,
130
+ type: 'EMAIL',
131
+ cc: payload.cc,
132
+ bcc: payload.bcc,
133
+ html: payload.html,
134
+ // attachments: payload.attachments,
135
+ templateId: payload.templateId,
136
+ variables: payload.variables,
137
+ organization_id: loggedInUser.organization_id,
138
+ };
139
+ } else {
140
+ this.loggingService.log(
141
+ 'warn',
142
+ 'wrapperService',
143
+ 'sendMailWrapper',
144
+ `No user-level configs found. Falling back to ORG-level`,
145
+ [],
146
+ [],
147
+ );
148
+
149
+ const fallbackConfigs = await intergrationConfigRepo.find({
150
+ where: {
151
+ level_type: 'ORG',
152
+ integration_type: 'EMAIL',
153
+ status: 1,
154
+ },
155
+ });
156
+
157
+ this.loggingService.log(
158
+ 'debug',
159
+ 'wrapperService',
160
+ 'sendMailWrapper',
161
+ `ORG-level configs: ${JSON.stringify(fallbackConfigs)}`,
162
+ [],
163
+ [],
164
+ );
165
+
166
+ if (!fallbackConfigs || fallbackConfigs.length === 0) {
167
+ this.loggingService.log(
168
+ 'warn',
169
+ 'wrapperService',
170
+ 'sendMailWrapper',
171
+ 'No active email communication config found',
172
+ [],
173
+ [],
174
+ );
175
+ }
176
+
177
+ payloadSendMail = {
178
+ levelId: 1,
179
+ levelType: 'ORG',
180
+ app_code: 'DEFAULT', // Legacy wrapper default
181
+ to: payload.to,
182
+ message: payload.message,
183
+ subject: payload.subject,
184
+ type: 'EMAIL',
185
+ cc: payload.cc,
186
+ bcc: payload.bcc,
187
+ html: payload.html,
188
+ // attachments: payload.attachments,
189
+ // templateId: payload.templateId,
190
+ variables: payload.variables,
191
+ organization_id: loggedInUser.organization_id,
192
+ };
193
+ }
194
+
195
+ this.loggingService.log(
196
+ 'debug',
197
+ 'wrapperService',
198
+ 'sendMailWrapper',
199
+ `Final payload for IntegrationService: ${JSON.stringify(
200
+ payloadSendMail,
201
+ )}`,
202
+ [],
203
+ [],
204
+ );
205
+
206
+ const result =
207
+ await this.integrationService.sendGenericMessage(payloadSendMail);
208
+
209
+ this.loggingService.log(
210
+ 'log',
211
+ 'wrapperService',
212
+ 'sendMailWrapper',
213
+ `sendMailWrapper SUCCESS. Result: ${JSON.stringify(result)}`,
214
+ [],
215
+ [],
216
+ );
217
+
218
+ return {
219
+ success: true,
220
+ data: result,
221
+ };
222
+ } catch (error: any) {
223
+ this.loggingService.log(
224
+ 'error',
225
+ 'wrapperService',
226
+ 'sendMailWrapper',
227
+ `sendMailWrapper ERROR: ${error.message}`,
228
+ [],
229
+ [error.stack], // Sending stack trace as additional data
230
+ );
231
+ return {
232
+ success: false,
233
+ error: error.message,
234
+ };
235
+ }
236
+ }
237
+
238
+ /**
239
+ * Wrapper for sending communication
240
+ */
241
+
242
+ async sendCommunicationWrapperService(entity: any, loggedInUser: any) {
243
+ try {
244
+ this.loggingService.log(
245
+ 'log',
246
+ 'wrapperService',
247
+ 'sendCommunicationWrapperService',
248
+ `sendCommunicationWrapper called. User: ${JSON.stringify(
249
+ loggedInUser,
250
+ )}, Payload: ${JSON.stringify(entity)}`,
251
+ [],
252
+ [],
253
+ );
254
+
255
+ const { level_id, level_type, appcode, organization_id } = loggedInUser;
256
+
257
+ // Check if active configs exist for current user's level
258
+ this.loggingService.log(
259
+ 'debug',
260
+ 'wrapperService',
261
+ 'sendCommunicationWrapperService',
262
+ `Checking active ${
263
+ entity.type || 'EMAIL'
264
+ } configs for level_id=${level_id}, level_type=${level_type}, app_code=${appcode}`,
265
+ [],
266
+ [],
267
+ );
268
+
269
+ let configs = await this.integrationService.getActiveConfigs(
270
+ level_id,
271
+ level_type,
272
+ appcode,
273
+ entity.type || 'EMAIL',
274
+ );
275
+
276
+ let effectiveLevelId = level_id;
277
+ let effectiveLevelType = level_type;
278
+
279
+ // Fallback to ORG-level if no configs found
280
+ if (!configs || configs.length === 0) {
281
+ this.loggingService.log(
282
+ 'warn',
283
+ 'wrapperService',
284
+ 'sendCommunicationWrapperService',
285
+ `No active configs found for ${level_type}:${level_id}, falling back to ORG-level`,
286
+ [],
287
+ [],
288
+ );
289
+
290
+ configs = await this.integrationService.getActiveConfigs(
291
+ 1,
292
+ 'ORG',
293
+ appcode,
294
+ entity.type || 'EMAIL',
295
+ );
296
+
297
+ effectiveLevelId = 1;
298
+ effectiveLevelType = 'ORG';
299
+ }
300
+
301
+ if (!configs || configs.length === 0) {
302
+ this.loggingService.log(
303
+ 'error',
304
+ 'wrapperService',
305
+ 'sendCommunicationWrapperService',
306
+ 'No active configurations found at any level.',
307
+ [],
308
+ [],
309
+ );
310
+ throw new Error('No active configurations found.');
311
+ }
312
+
313
+ // Template lookup if templateCode is provided
314
+ let resolvedTemplateId = entity?.templateId;
315
+
316
+ if (entity.template_code) {
317
+ this.loggingService.log(
318
+ 'debug',
319
+ 'wrapperService',
320
+ 'sendCommunicationWrapperService',
321
+ `Looking up template for code=${entity.template_code}, level_id=${level_id}, level_type=${level_type}`,
322
+ [],
323
+ [],
324
+ );
325
+
326
+ // Try to find template at user's level first
327
+ const commTemplateRepo =
328
+ this.reflectionHelper.getRepoService('CommTemplate');
329
+ let templates = await commTemplateRepo.find({
330
+ where: {
331
+ code: entity.template_code,
332
+ level_id: level_id,
333
+ level_type: level_type,
334
+ },
335
+ });
336
+
337
+ // Fallback to ORG + organization_id if not found
338
+ if (!templates || templates.length === 0) {
339
+ this.loggingService.log(
340
+ 'warn',
341
+ 'wrapperService',
342
+ 'sendCommunicationWrapperService',
343
+ `No template found for ${entity.template_code} at provided level. Falling back to ORG-level.`,
344
+ [],
345
+ [],
346
+ );
347
+
348
+ templates = await commTemplateRepo.find({
349
+ where: {
350
+ code: entity.template_code,
351
+ organization_id: organization_id,
352
+ },
353
+ });
354
+ }
355
+
356
+ if (templates && templates.length > 0) {
357
+ resolvedTemplateId = templates[0]?.id;
358
+ this.loggingService.log(
359
+ 'debug',
360
+ 'wrapperService',
361
+ 'sendCommunicationWrapperService',
362
+ `Template resolved for code=${entity.template_code}, id=${resolvedTemplateId}`,
363
+ [],
364
+ [],
365
+ );
366
+ } else {
367
+ this.loggingService.log(
368
+ 'warn',
369
+ 'wrapperService',
370
+ 'sendCommunicationWrapperService',
371
+ `No template found for code=${entity.template_code} at any level.`,
372
+ [],
373
+ [],
374
+ );
375
+ }
376
+ }
377
+
378
+ // Step Prepare payload for Integration Service
379
+ const mailPayload = {
380
+ to: entity.to,
381
+ subject: entity.subject,
382
+ html: entity.message,
383
+ cc: entity?.cc,
384
+ bcc: entity?.bcc,
385
+ templateId: resolvedTemplateId, // updated with resolved ID
386
+ message: entity.message,
387
+ type: entity.type || 'EMAIL',
388
+ levelId: effectiveLevelId,
389
+ levelType: effectiveLevelType,
390
+ app_code: appcode,
391
+ user_id: loggedInUser.id,
392
+ entity_type: entity.entity_type,
393
+ entity_id: entity.entity_id,
394
+ attachments: entity.attachments,
395
+ mediaUrl: entity.mediaUrl,
396
+ organization_id: organization_id,
397
+ } as any;
398
+
399
+ this.loggingService.log(
400
+ 'debug',
401
+ 'wrapperService',
402
+ 'sendCommunicationWrapperService',
403
+ `Final payload for sendGenericMessage: ${JSON.stringify(mailPayload)}`,
404
+ [],
405
+ [],
406
+ );
407
+
408
+ // Step 5️⃣ Send via Integration Service
409
+ const result =
410
+ await this.integrationService.sendGenericMessage(mailPayload);
411
+
412
+ this.loggingService.log(
413
+ 'log',
414
+ 'wrapperService',
415
+ 'sendCommunicationWrapperService',
416
+ `sendCommunicationWrapper SUCCESS. Result: ${JSON.stringify(result)}`,
417
+ [],
418
+ [],
419
+ );
420
+
421
+ return result;
422
+ } catch (error: any) {
423
+ this.loggingService.log(
424
+ 'error',
425
+ 'wrapperService',
426
+ 'sendCommunicationWrapperService',
427
+ `sendCommunicationWrapper ERROR: ${error.message}`,
428
+ [],
429
+ [error.stack],
430
+ );
431
+ return {
432
+ success: false,
433
+ error: error.message,
434
+ };
435
+ }
436
+ }
437
+
438
+ /**
439
+ * Wrapper for scheduling meeting
440
+ */
441
+
442
+ async scheduleMeetingWrapper(
443
+ payload: any,
444
+ loggedInUser: any,
445
+ mapped_entities?: any,
446
+ ) {
447
+ try {
448
+ this.loggingService.log(
449
+ 'log',
450
+ 'wrapperService',
451
+ 'scheduleMeetingWrapper',
452
+ `scheduleMeetingWrapper called by user=${
453
+ loggedInUser?.id || 'unknown'
454
+ } Payload=${JSON.stringify(payload)}`,
455
+ [],
456
+ [],
457
+ );
458
+
459
+ // Normalize emails (to, cc, bcc → attendees)
460
+ const cleanEmails = (arr: string[] = []) =>
461
+ arr.filter((e) => e && e.trim() !== '').map((e) => e.trim());
462
+
463
+ const toList = Array.isArray(payload.to) ? cleanEmails(payload.to) : [];
464
+
465
+ payload.attendees = [
466
+ ...toList.map((e) => ({ email: e })),
467
+ ...(payload.attendees || []).flatMap((a) =>
468
+ typeof a === 'string'
469
+ ? [{ email: a }]
470
+ : Array.isArray(a?.email)
471
+ ? a.email.map((e) => ({ email: e }))
472
+ : a?.email
473
+ ? [{ email: a.email }]
474
+ : [],
475
+ ),
476
+ ];
477
+
478
+ let integrationConfig =
479
+ await this.integrationService.getSingleActiveConfig(
480
+ payload.level_id,
481
+ payload.level_type,
482
+ payload.app_code,
483
+ 'EMAIL',
484
+ );
485
+
486
+ if (integrationConfig) {
487
+ return {
488
+ success: true,
489
+ data: await this.sendIcsInvite(
490
+ payload,
491
+ payload.level_id,
492
+ payload.level_type,
493
+ payload.app_code,
494
+ loggedInUser.organization_id,
495
+ mapped_entities,
496
+ ),
497
+ };
498
+ }
499
+
500
+ // ---- Step 2: Check ORG-level configs ----
501
+ this.loggingService.log(
502
+ 'log',
503
+ 'wrapperService',
504
+ 'scheduleMeetingWrapper',
505
+ `No user-level config found, checking ORG-level...`,
506
+ [],
507
+ [],
508
+ );
509
+
510
+ const integrationConfigRepo =
511
+ this.reflectionHelper.getRepoService('IntegrationConfig');
512
+
513
+ const orgConfigs = await integrationConfigRepo.find({
514
+ where: {
515
+ level_id: 1,
516
+ level_type: 'ORG',
517
+ integration_type: 'EMAIL',
518
+ app_code: 'DEFAULT',
519
+ status: 1,
520
+ },
521
+ });
522
+
523
+ integrationConfig = await this.integrationService.getSingleActiveConfig(
524
+ 1,
525
+ 'ORG',
526
+ 'DEFAULT',
527
+ 'EMAIL',
528
+ );
529
+
530
+ this.loggingService.log(
531
+ 'debug',
532
+ 'wrapperService',
533
+ 'scheduleMeetingWrapper',
534
+ `ORG configs found: ${JSON.stringify(orgConfigs)}`,
535
+ [],
536
+ [],
537
+ );
538
+
539
+ if (integrationConfig) {
540
+ return {
541
+ success: true,
542
+ data: await this.sendIcsInvite(
543
+ payload,
544
+ 1,
545
+ 'ORG',
546
+ 'DEFAULT',
547
+ loggedInUser.organization_id,
548
+ mapped_entities,
549
+ ),
550
+ };
551
+ }
552
+ } catch (error: any) {
553
+ this.loggingService.log(
554
+ 'error',
555
+ 'wrapperService',
556
+ 'scheduleMeetingWrapper',
557
+ `scheduleMeetingWrapper ERROR: ${error.message}`,
558
+ [],
559
+ [error.stack],
560
+ );
561
+ return { success: false, error: error.message };
562
+ }
563
+ }
564
+
565
+ /**
566
+ * Fetch credentials JSON by config ID
567
+ */
568
+ private async getConfigCred(configId: number) {
569
+ this.loggingService.log(
570
+ 'debug',
571
+ 'wrapperService',
572
+ 'getConfigCred',
573
+ `Fetching config JSON for configId=${configId}`,
574
+ [],
575
+ [],
576
+ );
577
+
578
+ const integrationConfigRepo =
579
+ this.reflectionHelper.getRepoService('IntegrationConfig');
580
+
581
+ const configRes = await integrationConfigRepo.findOne({
582
+ where: {
583
+ id: configId,
584
+ },
585
+ });
586
+
587
+ this.loggingService.log(
588
+ 'debug',
589
+ 'wrapperService',
590
+ 'getConfigCred',
591
+ `Config fetch result: ${JSON.stringify(configRes)}`,
592
+ [],
593
+ [],
594
+ );
595
+ return configRes?.config_json || null;
596
+ }
597
+
598
+ private async sendIcsInvite(
599
+ payload: any,
600
+ levelId: number,
601
+ levelType: string,
602
+ appCode: string,
603
+ organizationId: number,
604
+ mapped_entities?: any,
605
+ ) {
606
+ this.loggingService.log(
607
+ 'log',
608
+ 'wrapperService',
609
+ 'sendIcsInvite',
610
+ `Generating ICS file. Payload: ${JSON.stringify(payload)}`,
611
+ [],
612
+ [],
613
+ );
614
+
615
+ if (payload.template_code) {
616
+ const commTemplateRepo =
617
+ this.reflectionHelper.getRepoService('CommTemplate');
618
+ let templates = await commTemplateRepo.find({
619
+ where: {
620
+ code: payload.template_code,
621
+ level_id: levelId,
622
+ level_type: levelType,
623
+ },
624
+ });
625
+
626
+ if (templates && templates.length > 0) {
627
+ payload['templateId'] = templates[0].id;
628
+ }
629
+ }
630
+
631
+ let activeConfig = await this.integrationService.getSingleActiveConfig(
632
+ levelId,
633
+ levelType,
634
+ appCode,
635
+ 'EMAIL',
636
+ );
637
+ const base64String = await this.icsService.generateIcs(
638
+ payload,
639
+ activeConfig?.config_json,
640
+ );
641
+ this.loggingService.log(
642
+ 'debug',
643
+ 'wrapperService',
644
+ 'sendIcsInvite',
645
+ `ICS generated (base64 length: ${base64String?.length})`,
646
+ [],
647
+ [],
648
+ );
649
+
650
+ // Normalize attendees
651
+ const attendeeEmails =
652
+ payload.attendees?.flatMap((a) =>
653
+ Array.isArray(a.email) ? a.email : [a.email],
654
+ ) || [];
655
+
656
+ // Combine into one list (to + attendees)
657
+ const toList = Array.from(
658
+ new Set(
659
+ [
660
+ ...(Array.isArray(payload.to)
661
+ ? payload.to
662
+ : payload.to
663
+ ? [payload.to]
664
+ : []),
665
+ ...attendeeEmails,
666
+ ].map((email) => email.toLowerCase().trim()),
667
+ ),
668
+ );
669
+
670
+ const payloadSendMail: GenericMessageDto = {
671
+ levelId,
672
+ levelType,
673
+ app_code: appCode,
674
+ to: toList,
675
+ message: payload.message,
676
+ subject: payload.subject,
677
+ type: 'EMAIL',
678
+ cc: payload.cc,
679
+ bcc: payload.bcc,
680
+ html: payload.html,
681
+ attachments: [
682
+ {
683
+ content: base64String,
684
+ type: 'text/calendar',
685
+ filename: 'invite.ics',
686
+ disposition: 'attachment',
687
+ },
688
+ ],
689
+ templateId: payload.templateId,
690
+ entity_id: payload.entity_id,
691
+ entity_type: payload.entity_type,
692
+ organization_id: organizationId,
693
+ mapped_entities,
694
+ };
695
+
696
+ this.loggingService.log(
697
+ 'debug',
698
+ 'wrapperService',
699
+ 'sendIcsInvite',
700
+ `Final payload for ICS send: ${JSON.stringify(payloadSendMail)}`,
701
+ [],
702
+ [],
703
+ );
704
+ const result =
705
+ await this.integrationService.sendGenericMessage(payloadSendMail);
706
+ this.loggingService.log(
707
+ 'log',
708
+ 'wrapperService',
709
+ 'sendIcsInvite',
710
+ `ICS mail send result: ${JSON.stringify(result)}`,
711
+ [],
712
+ [],
713
+ );
714
+ return result;
715
+ }
716
+ }