rez_core 5.0.156 → 5.0.157

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 (473) 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/config/bull.config.js +4 -4
  11. package/dist/config/bull.config.js.map +1 -1
  12. package/dist/config/database.config.js +1 -1
  13. package/dist/config/database.config.js.map +1 -1
  14. package/dist/core.module.js +5 -2
  15. package/dist/core.module.js.map +1 -1
  16. package/dist/migrations/1732612800000-AddEntityJsonGinIndex.d.ts +6 -0
  17. package/dist/migrations/1732612800000-AddEntityJsonGinIndex.js +32 -0
  18. package/dist/migrations/1732612800000-AddEntityJsonGinIndex.js.map +1 -0
  19. package/dist/module/auth/guards/role.guard.js +3 -3
  20. package/dist/module/entity_json/controller/entity_json.controller.d.ts +2 -9
  21. package/dist/module/entity_json/entity/entityJson.entity.d.ts +2 -1
  22. package/dist/module/entity_json/entity/entityJson.entity.js +5 -1
  23. package/dist/module/entity_json/entity/entityJson.entity.js.map +1 -1
  24. package/dist/module/entity_json/entity_json.module.js +7 -2
  25. package/dist/module/entity_json/entity_json.module.js.map +1 -1
  26. package/dist/module/entity_json/service/entity_json.service.d.ts +2 -10
  27. package/dist/module/entity_json/service/entity_json.service.js +54 -4
  28. package/dist/module/entity_json/service/entity_json.service.js.map +1 -1
  29. package/dist/module/filter/controller/filter.controller.d.ts +12 -0
  30. package/dist/module/filter/controller/filter.controller.js +1 -1
  31. package/dist/module/filter/controller/filter.controller.js.map +1 -1
  32. package/dist/module/filter/entity/saved-filter-master.entity.d.ts +1 -2
  33. package/dist/module/filter/entity/saved-filter-master.entity.js +2 -6
  34. package/dist/module/filter/entity/saved-filter-master.entity.js.map +1 -1
  35. package/dist/module/filter/filter.module.js +11 -2
  36. package/dist/module/filter/filter.module.js.map +1 -1
  37. package/dist/module/filter/repository/saved-filter.repository.d.ts +5 -1
  38. package/dist/module/filter/repository/saved-filter.repository.js +5 -1
  39. package/dist/module/filter/repository/saved-filter.repository.js.map +1 -1
  40. package/dist/module/filter/service/filter.service.d.ts +37 -1
  41. package/dist/module/filter/service/filter.service.js +51 -63
  42. package/dist/module/filter/service/filter.service.js.map +1 -1
  43. package/dist/module/filter/service/flatjson-filter.service.d.ts +32 -0
  44. package/dist/module/filter/service/flatjson-filter.service.js +626 -0
  45. package/dist/module/filter/service/flatjson-filter.service.js.map +1 -0
  46. package/dist/module/integration/examples/usage.example.js +9 -9
  47. package/dist/module/integration/service/wrapper.service.d.ts +1 -3
  48. package/dist/module/integration/service/wrapper.service.js +2 -24
  49. package/dist/module/integration/service/wrapper.service.js.map +1 -1
  50. package/dist/module/linked_attributes/controller/linked_attributes.controller.d.ts +19 -0
  51. package/dist/module/linked_attributes/controller/linked_attributes.controller.js +77 -0
  52. package/dist/module/linked_attributes/controller/linked_attributes.controller.js.map +1 -1
  53. package/dist/module/linked_attributes/dto/create-linked-attribute-smart.dto.d.ts +13 -0
  54. package/dist/module/linked_attributes/dto/create-linked-attribute-smart.dto.js +64 -0
  55. package/dist/module/linked_attributes/dto/create-linked-attribute-smart.dto.js.map +1 -0
  56. package/dist/module/linked_attributes/linked_attributes.module.js +8 -1
  57. package/dist/module/linked_attributes/linked_attributes.module.js.map +1 -1
  58. package/dist/module/linked_attributes/service/linked_attributes.service.d.ts +41 -1
  59. package/dist/module/linked_attributes/service/linked_attributes.service.js +266 -2
  60. package/dist/module/linked_attributes/service/linked_attributes.service.js.map +1 -1
  61. package/dist/module/meta/dto/entity-table.dto.d.ts +4 -1
  62. package/dist/module/meta/dto/entity-table.dto.js.map +1 -1
  63. package/dist/module/meta/entity.module.js +0 -2
  64. package/dist/module/meta/entity.module.js.map +1 -1
  65. package/dist/module/meta/repository/attribute-master.repository.js +8 -8
  66. package/dist/module/meta/service/entity-dynamic.service.js +15 -15
  67. package/dist/module/meta/service/entity-list.service.js +2 -2
  68. package/dist/module/meta/service/entity-relation.service.d.ts +1 -4
  69. package/dist/module/meta/service/entity-relation.service.js +14 -20
  70. package/dist/module/meta/service/entity-relation.service.js.map +1 -1
  71. package/dist/module/meta/service/media-data.service.js +11 -24
  72. package/dist/module/meta/service/media-data.service.js.map +1 -1
  73. package/dist/module/meta/service/resolver.service.js +15 -15
  74. package/dist/module/module/repository/menu.repository.js +4 -4
  75. package/dist/module/notification/service/notification.service.js +6 -6
  76. package/dist/module/user/controller/login.controller.js +18 -18
  77. package/dist/module/workflow/repository/action.repository.js +2 -2
  78. package/dist/module/workflow/repository/stage.repository.js +8 -8
  79. package/dist/module/workflow/service/action-template-mapping.service.js +2 -2
  80. package/dist/module/workflow/service/action.service.js +15 -7
  81. package/dist/module/workflow/service/action.service.js.map +1 -1
  82. package/dist/module/workflow/service/entity-modification.service.js +2 -2
  83. package/dist/module/workflow/service/task.service.js +13 -12
  84. package/dist/module/workflow/service/task.service.js.map +1 -1
  85. package/dist/module/workflow-automation/service/schedule-handler.service.js +9 -9
  86. package/dist/table.config.d.ts +3 -1
  87. package/dist/table.config.js +2 -0
  88. package/dist/table.config.js.map +1 -1
  89. package/dist/tsconfig.build.tsbuildinfo +1 -1
  90. package/dist/utils/service/reflection-helper.service.js +2 -2
  91. package/docs/modules/event-driven-integration-design.md +91 -91
  92. package/docs/modules/integration.md +250 -250
  93. package/eslint.config.mjs +34 -34
  94. package/nest-cli.json +14 -14
  95. package/package.json +125 -125
  96. package/src/app.controller.ts +12 -12
  97. package/src/app.module.ts +68 -68
  98. package/src/app.service.ts +8 -8
  99. package/src/config/bull.config.ts +69 -69
  100. package/src/config/config.module.ts +17 -17
  101. package/src/config/database.config.ts +48 -48
  102. package/src/constant/global.constant.ts +67 -67
  103. package/src/core.module.ts +97 -94
  104. package/src/decorators/roles.decorator.ts +7 -7
  105. package/src/dtos/response.dto.ts +6 -6
  106. package/src/dtos/response.ts +5 -5
  107. package/src/index.ts +1 -1
  108. package/src/migrations/1732612800000-AddEntityJsonGinIndex.ts +41 -0
  109. package/src/module/auth/auth.module.ts +49 -49
  110. package/src/module/auth/controller/auth.controller.ts +28 -28
  111. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  112. package/src/module/auth/guards/jwt.guard.ts +22 -22
  113. package/src/module/auth/guards/role.guard.ts +68 -68
  114. package/src/module/auth/services/auth.service.ts +56 -56
  115. package/src/module/auth/services/jwt.service.ts +11 -11
  116. package/src/module/auth/strategies/google.strategy.ts +54 -54
  117. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  118. package/src/module/auth/strategies/local.strategy.ts +13 -13
  119. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  120. package/src/module/dashboard/dashboard.module.ts +21 -21
  121. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  122. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  123. package/src/module/dashboard/repository/dashboard.repository.ts +51 -51
  124. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  125. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  126. package/src/module/enterprise/enterprise.module.ts +30 -30
  127. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  128. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  129. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  130. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  131. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  132. package/src/module/enterprise/repository/school.repository.ts +272 -272
  133. package/src/module/enterprise/service/brand.service.ts +5 -5
  134. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  135. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  136. package/src/module/enterprise/service/organization.service.ts +145 -145
  137. package/src/module/entity_json/controller/entity_json.controller.ts +47 -47
  138. package/src/module/entity_json/docs/FlatJson_Filterin_System.md +2804 -0
  139. package/src/module/entity_json/entity/entityJson.entity.ts +42 -39
  140. package/src/module/entity_json/entity_json.module.ts +23 -18
  141. package/src/module/entity_json/service/entityJson.repository.ts +37 -37
  142. package/src/module/entity_json/service/entity_json.service.ts +349 -242
  143. package/src/module/export/controller/export.controller.ts +83 -83
  144. package/src/module/export/export.module.ts +14 -14
  145. package/src/module/export/service/export.service.ts +105 -105
  146. package/src/module/filter/controller/filter.controller.ts +82 -84
  147. package/src/module/filter/dto/filter-request.dto.ts +39 -39
  148. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  149. package/src/module/filter/entity/saved-filter-master.entity.ts +29 -32
  150. package/src/module/filter/filter.module.ts +42 -33
  151. package/src/module/filter/repository/saved-filter.repository.ts +196 -200
  152. package/src/module/filter/repository/saved.filter-detail.repository.ts +19 -19
  153. package/src/module/filter/service/filter-evaluator.service.ts +82 -82
  154. package/src/module/filter/service/filter.service.ts +1365 -1317
  155. package/src/module/filter/service/flatjson-filter.service.ts +902 -0
  156. package/src/module/filter/service/saved-filter.service.ts +164 -164
  157. package/src/module/filter/test/flatjson-filter.service.spec.ts +415 -0
  158. package/src/module/ics/controller/ics.controller.ts +21 -21
  159. package/src/module/ics/dto/ics.dto.ts +55 -55
  160. package/src/module/ics/ics.module.ts +13 -13
  161. package/src/module/ics/service/ics.service.ts +57 -57
  162. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  163. package/src/module/integration/controller/integration.controller.ts +662 -662
  164. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  165. package/src/module/integration/dto/create-config.dto.ts +526 -526
  166. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  167. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  168. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  169. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  170. package/src/module/integration/examples/usage.example.ts +338 -338
  171. package/src/module/integration/factories/base.factory.ts +7 -7
  172. package/src/module/integration/factories/email.factory.ts +49 -49
  173. package/src/module/integration/factories/integration.factory.ts +121 -121
  174. package/src/module/integration/factories/sms.factory.ts +51 -51
  175. package/src/module/integration/factories/telephone.factory.ts +41 -41
  176. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  177. package/src/module/integration/integration.module.ts +110 -110
  178. package/src/module/integration/service/calendar-event.service.ts +118 -118
  179. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  180. package/src/module/integration/service/integration-queue.service.ts +229 -229
  181. package/src/module/integration/service/integration.service.ts +2634 -2634
  182. package/src/module/integration/service/oauth.service.ts +224 -224
  183. package/src/module/integration/service/wrapper.service.ts +716 -753
  184. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  185. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  186. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  187. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  188. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  189. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  190. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  191. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  192. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  193. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  194. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  195. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  196. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  197. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  198. package/src/module/layout/controller/layout.controller.ts +47 -47
  199. package/src/module/layout/entity/header-items.entity.ts +28 -28
  200. package/src/module/layout/entity/header-section.entity.ts +19 -19
  201. package/src/module/layout/layout.module.ts +21 -21
  202. package/src/module/layout/repository/header-items.repository.ts +18 -18
  203. package/src/module/layout/repository/header-section.repository.ts +22 -22
  204. package/src/module/layout/service/header-section.service.ts +25 -25
  205. package/src/module/layout_preference/controller/layout_preference.controller.ts +73 -73
  206. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  207. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  208. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  209. package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
  210. package/src/module/lead/controller/lead.controller.ts +30 -30
  211. package/src/module/lead/lead.module.ts +14 -14
  212. package/src/module/lead/repository/lead.repository.ts +41 -41
  213. package/src/module/lead/service/lead.service.ts +54 -54
  214. package/src/module/linked_attributes/controller/linked_attributes.controller.ts +123 -37
  215. package/src/module/linked_attributes/dto/create-linked-attribute-smart.dto.ts +54 -0
  216. package/src/module/linked_attributes/entity/linked_attribute.entity.ts +51 -51
  217. package/src/module/linked_attributes/linked_attributes.module.ts +23 -16
  218. package/src/module/linked_attributes/repository/linked_attribute.repository.ts +12 -12
  219. package/src/module/linked_attributes/service/linked_attributes.service.ts +620 -75
  220. package/src/module/linked_attributes/test/linked-attributes.service.spec.ts +244 -0
  221. package/src/module/listmaster/controller/list-master.controller.ts +230 -230
  222. package/src/module/listmaster/entity/list-master-items.entity.ts +43 -43
  223. package/src/module/listmaster/entity/list-master.entity.ts +33 -33
  224. package/src/module/listmaster/listmaster.module.ts +46 -46
  225. package/src/module/listmaster/repository/list-master-items.repository.ts +173 -173
  226. package/src/module/listmaster/repository/list-master.repository.ts +56 -56
  227. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  228. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  229. package/src/module/listmaster/service/list-master-item.service.ts +281 -281
  230. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  231. package/src/module/listmaster/service/list-master.service.ts +535 -535
  232. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  233. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  234. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  235. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  236. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  237. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  238. package/src/module/mapper/mapper.module.ts +35 -35
  239. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  240. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  241. package/src/module/mapper/repository/mapper.repository.ts +32 -32
  242. package/src/module/mapper/service/field-mapper.service.ts +269 -269
  243. package/src/module/mapper/service/mapper.service.ts +81 -81
  244. package/src/module/master/controller/master.controller.ts +74 -74
  245. package/src/module/master/service/master.service.ts +483 -483
  246. package/src/module/meta/controller/app-master.controller.ts +38 -38
  247. package/src/module/meta/controller/attribute-master.controller.ts +84 -84
  248. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  249. package/src/module/meta/controller/entity-master.controller.ts +41 -41
  250. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  251. package/src/module/meta/controller/entity.controller.ts +342 -342
  252. package/src/module/meta/controller/entity.public.controller.ts +75 -75
  253. package/src/module/meta/controller/media.controller.ts +135 -135
  254. package/src/module/meta/controller/meta.controller.ts +96 -96
  255. package/src/module/meta/controller/view-master.controller.ts +86 -86
  256. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  257. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  258. package/src/module/meta/dto/entity-table.dto.ts +10 -12
  259. package/src/module/meta/entity/app-master.entity.ts +37 -37
  260. package/src/module/meta/entity/attribute-master.entity.ts +92 -92
  261. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  262. package/src/module/meta/entity/entity-master.entity.ts +85 -85
  263. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  264. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  265. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  266. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  267. package/src/module/meta/entity/media-data.entity.ts +32 -32
  268. package/src/module/meta/entity/preference.entity.ts +62 -62
  269. package/src/module/meta/entity/view-master.entity.ts +41 -41
  270. package/src/module/meta/entity.module.ts +166 -168
  271. package/src/module/meta/repository/app-master.repository.ts +20 -20
  272. package/src/module/meta/repository/attribute-master.repository.ts +156 -156
  273. package/src/module/meta/repository/entity-attribute-update.repository.ts +48 -48
  274. package/src/module/meta/repository/entity-master.repository.ts +110 -110
  275. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  276. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  277. package/src/module/meta/repository/media-data.repository.ts +50 -50
  278. package/src/module/meta/repository/preference.repository.ts +20 -20
  279. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  280. package/src/module/meta/repository/view-master.repository.ts +42 -42
  281. package/src/module/meta/service/app-master.service.ts +37 -37
  282. package/src/module/meta/service/attribute-master.service.ts +130 -130
  283. package/src/module/meta/service/common.service.ts +9 -9
  284. package/src/module/meta/service/entity-attribute-update.service.ts +26 -26
  285. package/src/module/meta/service/entity-dynamic.service.ts +818 -818
  286. package/src/module/meta/service/entity-list.service.ts +201 -201
  287. package/src/module/meta/service/entity-master.service.ts +171 -171
  288. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  289. package/src/module/meta/service/entity-relation.service.ts +69 -74
  290. package/src/module/meta/service/entity-service-impl.service.ts +439 -439
  291. package/src/module/meta/service/entity-table-column.service.ts +39 -39
  292. package/src/module/meta/service/entity-table.service.ts +157 -157
  293. package/src/module/meta/service/entity-validation.service.ts +187 -187
  294. package/src/module/meta/service/entity.service.ts +59 -59
  295. package/src/module/meta/service/field-group.service.ts +103 -103
  296. package/src/module/meta/service/media-data.service.ts +573 -591
  297. package/src/module/meta/service/populate-meta.service.ts +222 -222
  298. package/src/module/meta/service/preference.service.ts +16 -16
  299. package/src/module/meta/service/resolver.service.ts +291 -291
  300. package/src/module/meta/service/section-master.service.ts +104 -104
  301. package/src/module/meta/service/update-form-json.service.ts +22 -22
  302. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  303. package/src/module/meta/service/view-master.service.ts +127 -127
  304. package/src/module/microservice-client/microservice-clients.module.ts +13 -13
  305. package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
  306. package/src/module/microservice-client/service/microservice-clients.ts +4 -4
  307. package/src/module/module/controller/menu.controller.ts +15 -15
  308. package/src/module/module/controller/module-access.controller.ts +134 -134
  309. package/src/module/module/entity/menu.entity.ts +43 -43
  310. package/src/module/module/entity/module-access.entity.ts +25 -25
  311. package/src/module/module/entity/module-action.entity.ts +17 -17
  312. package/src/module/module/entity/module.entity.ts +52 -52
  313. package/src/module/module/module.module.ts +42 -42
  314. package/src/module/module/repository/menu.repository.ts +186 -186
  315. package/src/module/module/repository/module-access.repository.ts +344 -344
  316. package/src/module/module/service/menu.service.ts +82 -82
  317. package/src/module/module/service/module-access.service.ts +199 -199
  318. package/src/module/notification/controller/notification.controller.ts +58 -58
  319. package/src/module/notification/controller/otp.controller.ts +117 -117
  320. package/src/module/notification/entity/notification.entity.ts +26 -26
  321. package/src/module/notification/entity/otp.entity.ts +28 -28
  322. package/src/module/notification/firebase-admin.config.ts +22 -22
  323. package/src/module/notification/notification.module.ts +69 -69
  324. package/src/module/notification/repository/otp.repository.ts +27 -27
  325. package/src/module/notification/service/email.service.ts +127 -127
  326. package/src/module/notification/service/notification.service.ts +164 -164
  327. package/src/module/notification/service/otp.service.ts +133 -133
  328. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  329. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  330. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  331. package/src/module/third-party-module/third-party.module.ts +12 -12
  332. package/src/module/user/controller/login.controller.ts +198 -198
  333. package/src/module/user/controller/user.controller.ts +40 -40
  334. package/src/module/user/dto/create-user.dto.ts +62 -62
  335. package/src/module/user/dto/update-user.dto.ts +4 -4
  336. package/src/module/user/entity/role.entity.ts +33 -33
  337. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  338. package/src/module/user/entity/user-session.entity.ts +73 -73
  339. package/src/module/user/entity/user.entity.ts +59 -59
  340. package/src/module/user/repository/role.repository.ts +96 -96
  341. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  342. package/src/module/user/repository/user.repository.ts +50 -50
  343. package/src/module/user/repository/userSession.repository.ts +33 -33
  344. package/src/module/user/service/login.service.ts +326 -326
  345. package/src/module/user/service/role.service.ts +197 -197
  346. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  347. package/src/module/user/service/user-session.service.ts +200 -200
  348. package/src/module/user/service/user.service.ts +368 -368
  349. package/src/module/user/user.module.ts +65 -65
  350. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  351. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  352. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  353. package/src/module/workflow/controller/action.controller.ts +111 -111
  354. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  355. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  356. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  357. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  358. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  359. package/src/module/workflow/controller/stage.controller.ts +50 -50
  360. package/src/module/workflow/controller/task.controller.ts +77 -77
  361. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  362. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  363. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  364. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  365. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  366. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  367. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  368. package/src/module/workflow/entity/action.entity.ts +53 -53
  369. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  370. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  371. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  372. package/src/module/workflow/entity/form.entity.ts +25 -25
  373. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  374. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  375. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  376. package/src/module/workflow/entity/stage.entity.ts +20 -20
  377. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  378. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  379. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  380. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  381. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  382. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  383. package/src/module/workflow/repository/action-data.repository.ts +346 -346
  384. package/src/module/workflow/repository/action.repository.ts +339 -339
  385. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  386. package/src/module/workflow/repository/comm-template.repository.ts +157 -157
  387. package/src/module/workflow/repository/form-master.repository.ts +50 -50
  388. package/src/module/workflow/repository/stage-group.repository.ts +186 -186
  389. package/src/module/workflow/repository/stage-movement.repository.ts +257 -257
  390. package/src/module/workflow/repository/stage.repository.ts +160 -160
  391. package/src/module/workflow/repository/task.repository.ts +151 -151
  392. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  393. package/src/module/workflow/service/action-category.service.ts +33 -33
  394. package/src/module/workflow/service/action-data.service.ts +62 -62
  395. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  396. package/src/module/workflow/service/action-template-mapping.service.ts +140 -140
  397. package/src/module/workflow/service/action.service.ts +306 -302
  398. package/src/module/workflow/service/activity-log.service.ts +107 -107
  399. package/src/module/workflow/service/comm-template.service.ts +180 -180
  400. package/src/module/workflow/service/entity-modification.service.ts +61 -61
  401. package/src/module/workflow/service/form-master.service.ts +35 -35
  402. package/src/module/workflow/service/populate-workflow.service.ts +320 -320
  403. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  404. package/src/module/workflow/service/stage-group.service.ts +344 -344
  405. package/src/module/workflow/service/stage.service.ts +207 -207
  406. package/src/module/workflow/service/task.service.ts +549 -550
  407. package/src/module/workflow/service/workflow-list-master.service.ts +68 -68
  408. package/src/module/workflow/service/workflow-meta.service.ts +639 -639
  409. package/src/module/workflow/service/workflow.service.ts +213 -213
  410. package/src/module/workflow/workflow.module.ts +180 -180
  411. package/src/module/workflow-automation/SCHEDULING_GUIDE.md +145 -145
  412. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +43 -43
  413. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  414. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +40 -40
  415. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  416. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  417. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  418. package/src/module/workflow-automation/service/schedule-handler.service.ts +168 -168
  419. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +219 -219
  420. package/src/module/workflow-automation/service/workflow-automation.service.ts +515 -515
  421. package/src/module/workflow-automation/workflow-automation.module.ts +54 -54
  422. package/src/module/workflow-schedule/INSTALLATION.md +244 -244
  423. package/src/module/workflow-schedule/MULTI_PROJECT_GUIDE.md +196 -196
  424. package/src/module/workflow-schedule/README.md +422 -422
  425. package/src/module/workflow-schedule/constants/schedule.constants.ts +48 -48
  426. package/src/module/workflow-schedule/controller/workflow-schedule.controller.ts +255 -255
  427. package/src/module/workflow-schedule/docs/CLAUDE_CODE_GUIDE.md +510 -510
  428. package/src/module/workflow-schedule/docs/CLAUDE_CODE_PROMPT.md +362 -362
  429. package/src/module/workflow-schedule/docs/RUN_CLAUDE_CODE.sh +68 -68
  430. package/src/module/workflow-schedule/dto/create-schedule.dto.ts +147 -147
  431. package/src/module/workflow-schedule/dto/get-execution-logs.dto.ts +119 -119
  432. package/src/module/workflow-schedule/dto/update-schedule.dto.ts +96 -96
  433. package/src/module/workflow-schedule/entities/scheduled-workflow.entity.ts +148 -148
  434. package/src/module/workflow-schedule/entities/workflow-execution-log.entity.ts +154 -154
  435. package/src/module/workflow-schedule/interfaces/schedule-job-data.interface.ts +53 -53
  436. package/src/module/workflow-schedule/interfaces/workflow-schedule-options.interface.ts +12 -12
  437. package/src/module/workflow-schedule/processors/schedule.processor.ts +620 -620
  438. package/src/module/workflow-schedule/service/workflow-schedule.service.ts +598 -598
  439. package/src/module/workflow-schedule/workflow-schedule.module.ts +67 -67
  440. package/src/resources/dev.properties.yaml +31 -31
  441. package/src/resources/local.properties.yaml +27 -27
  442. package/src/resources/properties.module.ts +12 -12
  443. package/src/resources/properties.yaml.ts +11 -11
  444. package/src/resources/uat.properties.yaml +31 -31
  445. package/src/table.config.ts +135 -133
  446. package/src/utils/dto/excel-data.dto.ts +14 -14
  447. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  448. package/src/utils/service/base64util.service.ts +18 -18
  449. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  450. package/src/utils/service/codeGenerator.service.ts +22 -22
  451. package/src/utils/service/dateUtil.service.ts +17 -17
  452. package/src/utils/service/encryptUtil.service.ts +97 -97
  453. package/src/utils/service/excel-helper.service.ts +72 -72
  454. package/src/utils/service/excelUtil.service.ts +15 -15
  455. package/src/utils/service/file-util.service.ts +11 -11
  456. package/src/utils/service/json-util.service.ts +23 -23
  457. package/src/utils/service/loggingUtil.service.ts +88 -88
  458. package/src/utils/service/reflection-helper.service.ts +62 -62
  459. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  460. package/src/utils/utils.module.ts +27 -27
  461. package/tsconfig.build.json +4 -4
  462. package/tsconfig.json +24 -24
  463. package/.claude/settings.local.json +0 -26
  464. package/.idea/copilot.data.migration.agent.xml +0 -6
  465. package/.idea/copilot.data.migration.ask.xml +0 -6
  466. package/.idea/copilot.data.migration.ask2agent.xml +0 -6
  467. package/.idea/copilot.data.migration.edit.xml +0 -6
  468. package/.idea/misc.xml +0 -6
  469. package/dist/module/meta/repository/entity-relation.repository.d.ts +0 -7
  470. package/dist/module/meta/repository/entity-relation.repository.js +0 -39
  471. package/dist/module/meta/repository/entity-relation.repository.js.map +0 -1
  472. package/server.log +0 -850
  473. package/src/module/meta/repository/entity-relation.repository.ts +0 -23
@@ -1,753 +1,716 @@
1
- import { Injectable, Logger } from '@nestjs/common';
2
- import { GenericMessageDto, IntegrationService } from './integration.service';
3
- import { IcsMeetingService } from 'src/module/ics/service/ics.service';
4
- import { LoggingService } from 'src/utils/service/loggingUtil.service';
5
- import { ReflectionHelper } from '../../../utils/service/reflection-helper.service';
6
- 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
- }
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
+ }