rez_core 5.0.84 → 5.0.86

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