rez_core 5.0.157 → 5.0.158

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