rez_core 4.0.103 → 4.0.105

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 (401) 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/module/auth/guards/role.guard.js +3 -3
  17. package/dist/module/auth/services/auth.service.js +2 -2
  18. package/dist/module/filter/repository/saved-filter.repository.js +4 -4
  19. package/dist/module/filter/service/filter-evaluator.service.js +2 -2
  20. package/dist/module/filter/service/filter.service.js +22 -22
  21. package/dist/module/integration/examples/usage.example.js +9 -9
  22. package/dist/module/integration/service/integration.service.js +1 -1
  23. package/dist/module/integration/service/wrapper.service.js +25 -25
  24. package/dist/module/listmaster/controller/list-master.controller.d.ts +2 -1
  25. package/dist/module/listmaster/controller/list-master.controller.js +20 -2
  26. package/dist/module/listmaster/controller/list-master.controller.js.map +1 -1
  27. package/dist/module/listmaster/service/list-master-item.service.js +2 -2
  28. package/dist/module/listmaster/service/list-master.service.d.ts +4 -1
  29. package/dist/module/listmaster/service/list-master.service.js +59 -3
  30. package/dist/module/listmaster/service/list-master.service.js.map +1 -1
  31. package/dist/module/mapper/service/field-mapper.service.js +4 -4
  32. package/dist/module/mapper/service/mapper.service.js +2 -2
  33. package/dist/module/meta/repository/attribute-master.repository.d.ts +1 -0
  34. package/dist/module/meta/repository/attribute-master.repository.js +7 -0
  35. package/dist/module/meta/repository/attribute-master.repository.js.map +1 -1
  36. package/dist/module/meta/service/attribute-master.service.d.ts +1 -0
  37. package/dist/module/meta/service/attribute-master.service.js +3 -0
  38. package/dist/module/meta/service/attribute-master.service.js.map +1 -1
  39. package/dist/module/meta/service/entity-dynamic.service.js +9 -9
  40. package/dist/module/meta/service/entity-list.service.js +3 -3
  41. package/dist/module/meta/service/entity-master.service.js +3 -3
  42. package/dist/module/meta/service/entity-relation.service.js +11 -11
  43. package/dist/module/meta/service/entity-service-impl.service.js +3 -3
  44. package/dist/module/meta/service/resolver.service.js +3 -3
  45. package/dist/module/module/repository/menu.repository.js +12 -12
  46. package/dist/module/notification/service/notification.service.js +9 -9
  47. package/dist/module/notification/service/otp.service.js +1 -1
  48. package/dist/module/notification/service/otp.service.js.map +1 -1
  49. package/dist/module/user/controller/login.controller.js +19 -19
  50. package/dist/module/user/controller/login.controller.js.map +1 -1
  51. package/dist/module/user/service/login.service.d.ts +1 -1
  52. package/dist/module/user/service/login.service.js +11 -5
  53. package/dist/module/user/service/login.service.js.map +1 -1
  54. package/dist/module/user/service/role.service.js +4 -4
  55. package/dist/module/user/service/user-session.service.js +2 -2
  56. package/dist/module/workflow/repository/action.repository.js +20 -20
  57. package/dist/module/workflow/repository/comm-template.repository.js +6 -6
  58. package/dist/module/workflow/repository/form-master.repository.js +2 -2
  59. package/dist/module/workflow/repository/stage-group.repository.js +23 -23
  60. package/dist/module/workflow/repository/stage-movement.repository.js +15 -15
  61. package/dist/module/workflow/repository/stage.repository.js +8 -8
  62. package/dist/module/workflow/service/action-template-mapping.service.js +22 -22
  63. package/dist/module/workflow/service/action.service.js +7 -7
  64. package/dist/module/workflow/service/entity-modification.service.js +6 -6
  65. package/dist/module/workflow/service/stage-group.service.js +2 -2
  66. package/dist/module/workflow/service/stage.service.js +2 -2
  67. package/dist/module/workflow/service/task.service.js +28 -28
  68. package/dist/module/workflow/service/workflow-list-master.service.js +15 -15
  69. package/dist/module/workflow/service/workflow-meta.service.js +35 -35
  70. package/dist/module/workflow/service/workflow.service.js +2 -2
  71. package/dist/tsconfig.build.tsbuildinfo +1 -1
  72. package/dist/utils/service/reflection-helper.service.js +2 -2
  73. package/docs/modules/event-driven-integration-design.md +91 -91
  74. package/docs/modules/integration.md +250 -250
  75. package/eslint.config.mjs +34 -34
  76. package/nest-cli.json +14 -14
  77. package/package.json +118 -118
  78. package/server.log +850 -0
  79. package/src/app.controller.ts +12 -12
  80. package/src/app.module.ts +49 -49
  81. package/src/app.service.ts +8 -8
  82. package/src/config/config.module.ts +18 -18
  83. package/src/config/database.config.ts +23 -23
  84. package/src/constant/global.constant.ts +67 -67
  85. package/src/core.module.ts +81 -81
  86. package/src/decorators/roles.decorator.ts +7 -7
  87. package/src/dtos/response.dto.ts +6 -6
  88. package/src/dtos/response.ts +5 -5
  89. package/src/index.ts +1 -1
  90. package/src/module/auth/auth.module.ts +49 -49
  91. package/src/module/auth/controller/auth.controller.ts +28 -28
  92. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  93. package/src/module/auth/guards/jwt.guard.ts +22 -22
  94. package/src/module/auth/guards/role.guard.ts +68 -68
  95. package/src/module/auth/services/auth.service.ts +50 -50
  96. package/src/module/auth/services/jwt.service.ts +11 -11
  97. package/src/module/auth/strategies/google.strategy.ts +54 -54
  98. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  99. package/src/module/auth/strategies/local.strategy.ts +13 -13
  100. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  101. package/src/module/dashboard/dashboard.module.ts +21 -21
  102. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  103. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  104. package/src/module/dashboard/repository/dashboard.repository.ts +42 -42
  105. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  106. package/src/module/dev/dev.module.ts +12 -12
  107. package/src/module/dev/service/dev.service.ts +7 -7
  108. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  109. package/src/module/enterprise/enterprise.module.ts +30 -30
  110. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  111. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  112. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  113. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  114. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  115. package/src/module/enterprise/repository/school.repository.ts +278 -278
  116. package/src/module/enterprise/service/brand.service.ts +5 -5
  117. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  118. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  119. package/src/module/enterprise/service/organization.service.ts +145 -145
  120. package/src/module/filter/controller/filter.controller.ts +84 -84
  121. package/src/module/filter/dto/filter-request.dto.ts +38 -38
  122. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  123. package/src/module/filter/entity/saved-filter-master.entity.ts +23 -23
  124. package/src/module/filter/filter.module.ts +31 -31
  125. package/src/module/filter/repository/saved-filter.repository.ts +168 -168
  126. package/src/module/filter/service/filter-evaluator.service.ts +86 -86
  127. package/src/module/filter/service/filter.service.ts +965 -965
  128. package/src/module/filter/service/saved-filter.service.ts +170 -170
  129. package/src/module/ics/controller/ics.controller.ts +21 -21
  130. package/src/module/ics/dto/ics.dto.ts +55 -55
  131. package/src/module/ics/ics.module.ts +13 -13
  132. package/src/module/ics/service/ics.service.ts +57 -57
  133. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  134. package/src/module/integration/controller/integration.controller.ts +662 -662
  135. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  136. package/src/module/integration/dto/create-config.dto.ts +526 -526
  137. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  138. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  139. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  140. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  141. package/src/module/integration/examples/usage.example.ts +338 -338
  142. package/src/module/integration/factories/base.factory.ts +7 -7
  143. package/src/module/integration/factories/email.factory.ts +49 -49
  144. package/src/module/integration/factories/integration.factory.ts +121 -121
  145. package/src/module/integration/factories/sms.factory.ts +51 -51
  146. package/src/module/integration/factories/telephone.factory.ts +41 -41
  147. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  148. package/src/module/integration/integration.module.ts +110 -110
  149. package/src/module/integration/service/calendar-event.service.ts +118 -118
  150. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  151. package/src/module/integration/service/integration-queue.service.ts +229 -229
  152. package/src/module/integration/service/integration.service.ts +2633 -2633
  153. package/src/module/integration/service/oauth.service.ts +224 -224
  154. package/src/module/integration/service/wrapper.service.ts +493 -493
  155. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  156. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  157. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  158. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  159. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  160. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  161. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  162. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  163. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  164. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  165. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  166. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  167. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  168. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  169. package/src/module/layout/controller/layout.controller.ts +47 -47
  170. package/src/module/layout/entity/header-items.entity.ts +28 -28
  171. package/src/module/layout/entity/header-section.entity.ts +19 -19
  172. package/src/module/layout/layout.module.ts +21 -21
  173. package/src/module/layout/repository/header-items.repository.ts +18 -18
  174. package/src/module/layout/repository/header-section.repository.ts +22 -22
  175. package/src/module/layout/service/header-section.service.ts +25 -25
  176. package/src/module/layout_preference/controller/layout_preference.controller.ts +73 -73
  177. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  178. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  179. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  180. package/src/module/layout_preference/service/layout_preference.service.ts +192 -192
  181. package/src/module/lead/controller/lead.controller.ts +30 -30
  182. package/src/module/lead/lead.module.ts +14 -14
  183. package/src/module/lead/repository/lead.repository.ts +41 -41
  184. package/src/module/lead/service/lead.service.ts +54 -54
  185. package/src/module/listmaster/controller/list-master.controller.ts +210 -187
  186. package/src/module/listmaster/entity/list-master-items.entity.ts +43 -43
  187. package/src/module/listmaster/entity/list-master.entity.ts +33 -33
  188. package/src/module/listmaster/listmaster.module.ts +44 -44
  189. package/src/module/listmaster/repository/list-master-items.repository.ts +169 -169
  190. package/src/module/listmaster/repository/list-master.repository.ts +46 -46
  191. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  192. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  193. package/src/module/listmaster/service/list-master-item.service.ts +292 -292
  194. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  195. package/src/module/listmaster/service/list-master.service.ts +542 -441
  196. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  197. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  198. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  199. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  200. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  201. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  202. package/src/module/mapper/mapper.module.ts +34 -34
  203. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  204. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  205. package/src/module/mapper/repository/mapper.repository.ts +15 -15
  206. package/src/module/mapper/service/field-mapper.service.ts +266 -266
  207. package/src/module/mapper/service/mapper.service.ts +79 -79
  208. package/src/module/master/controller/master.controller.ts +74 -74
  209. package/src/module/master/service/master.service.ts +483 -483
  210. package/src/module/meta/controller/app-master.controller.ts +38 -38
  211. package/src/module/meta/controller/attribute-master.controller.ts +66 -66
  212. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  213. package/src/module/meta/controller/entity-master.controller.ts +28 -28
  214. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  215. package/src/module/meta/controller/entity.controller.ts +392 -392
  216. package/src/module/meta/controller/entity.public.controller.ts +75 -75
  217. package/src/module/meta/controller/media.controller.ts +107 -107
  218. package/src/module/meta/controller/meta.controller.ts +96 -96
  219. package/src/module/meta/controller/view-master.controller.ts +86 -86
  220. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  221. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  222. package/src/module/meta/dto/entity-table.dto.ts +9 -9
  223. package/src/module/meta/entity/app-master.entity.ts +34 -34
  224. package/src/module/meta/entity/attribute-master.entity.ts +89 -89
  225. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  226. package/src/module/meta/entity/entity-master.entity.ts +85 -85
  227. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  228. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  229. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  230. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  231. package/src/module/meta/entity/media-data.entity.ts +32 -32
  232. package/src/module/meta/entity/preference.entity.ts +62 -62
  233. package/src/module/meta/entity/view-master.entity.ts +41 -41
  234. package/src/module/meta/entity.module.ts +158 -158
  235. package/src/module/meta/repository/app-master.repository.ts +20 -20
  236. package/src/module/meta/repository/attribute-master.repository.ts +118 -110
  237. package/src/module/meta/repository/entity-master.repository.ts +69 -69
  238. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  239. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  240. package/src/module/meta/repository/media-data.repository.ts +50 -50
  241. package/src/module/meta/repository/preference.repository.ts +20 -20
  242. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  243. package/src/module/meta/repository/view-master.repository.ts +42 -42
  244. package/src/module/meta/service/app-master.service.ts +37 -37
  245. package/src/module/meta/service/attribute-master.service.ts +126 -117
  246. package/src/module/meta/service/common.service.ts +9 -9
  247. package/src/module/meta/service/entity-dynamic.service.ts +819 -819
  248. package/src/module/meta/service/entity-list.service.ts +205 -205
  249. package/src/module/meta/service/entity-master.service.ts +169 -169
  250. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  251. package/src/module/meta/service/entity-relation.service.ts +69 -69
  252. package/src/module/meta/service/entity-service-impl.service.ts +525 -525
  253. package/src/module/meta/service/entity-table-column.service.ts +39 -39
  254. package/src/module/meta/service/entity-table.service.ts +150 -150
  255. package/src/module/meta/service/entity-validation.service.ts +187 -187
  256. package/src/module/meta/service/entity.service.ts +67 -67
  257. package/src/module/meta/service/field-group.service.ts +103 -103
  258. package/src/module/meta/service/media-data.service.ts +507 -507
  259. package/src/module/meta/service/populate-meta.service.ts +193 -193
  260. package/src/module/meta/service/preference.service.ts +16 -16
  261. package/src/module/meta/service/resolver.service.ts +267 -267
  262. package/src/module/meta/service/section-master.service.ts +104 -104
  263. package/src/module/meta/service/update-form-json.service.ts +22 -22
  264. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  265. package/src/module/meta/service/view-master.service.ts +127 -127
  266. package/src/module/module/controller/menu.controller.ts +15 -15
  267. package/src/module/module/controller/module-access.controller.ts +134 -134
  268. package/src/module/module/entity/menu.entity.ts +43 -43
  269. package/src/module/module/entity/module-access.entity.ts +25 -25
  270. package/src/module/module/entity/module-action.entity.ts +17 -17
  271. package/src/module/module/entity/module.entity.ts +52 -52
  272. package/src/module/module/module.module.ts +42 -42
  273. package/src/module/module/repository/menu.repository.ts +184 -184
  274. package/src/module/module/repository/module-access.repository.ts +344 -344
  275. package/src/module/module/service/menu.service.ts +82 -82
  276. package/src/module/module/service/module-access.service.ts +209 -209
  277. package/src/module/notification/controller/notification.controller.ts +58 -58
  278. package/src/module/notification/controller/otp.controller.ts +117 -117
  279. package/src/module/notification/entity/notification.entity.ts +26 -26
  280. package/src/module/notification/entity/otp.entity.ts +28 -28
  281. package/src/module/notification/firebase-admin.config.ts +22 -22
  282. package/src/module/notification/notification.module.ts +69 -69
  283. package/src/module/notification/repository/otp.repository.ts +27 -27
  284. package/src/module/notification/service/email.service.ts +127 -127
  285. package/src/module/notification/service/notification.service.ts +163 -163
  286. package/src/module/notification/service/otp.service.ts +132 -132
  287. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  288. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  289. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  290. package/src/module/third-party-module/third-party.module.ts +12 -12
  291. package/src/module/user/controller/login.controller.ts +197 -197
  292. package/src/module/user/controller/user.controller.ts +40 -40
  293. package/src/module/user/dto/create-user.dto.ts +62 -62
  294. package/src/module/user/dto/update-user.dto.ts +4 -4
  295. package/src/module/user/entity/role.entity.ts +33 -33
  296. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  297. package/src/module/user/entity/user-session.entity.ts +73 -73
  298. package/src/module/user/entity/user.entity.ts +59 -59
  299. package/src/module/user/repository/role.repository.ts +96 -96
  300. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  301. package/src/module/user/repository/user.repository.ts +50 -50
  302. package/src/module/user/repository/userSession.repository.ts +33 -33
  303. package/src/module/user/service/login.service.ts +290 -284
  304. package/src/module/user/service/role.service.ts +189 -189
  305. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  306. package/src/module/user/service/user-session.service.ts +168 -168
  307. package/src/module/user/service/user.service.ts +365 -365
  308. package/src/module/user/user.module.ts +65 -65
  309. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  310. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  311. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  312. package/src/module/workflow/controller/action.controller.ts +111 -111
  313. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  314. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  315. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  316. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  317. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  318. package/src/module/workflow/controller/stage.controller.ts +50 -50
  319. package/src/module/workflow/controller/task.controller.ts +77 -77
  320. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  321. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  322. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  323. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  324. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  325. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  326. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  327. package/src/module/workflow/entity/action.entity.ts +50 -50
  328. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  329. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  330. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  331. package/src/module/workflow/entity/form.entity.ts +25 -25
  332. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  333. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  334. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  335. package/src/module/workflow/entity/stage.entity.ts +20 -20
  336. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  337. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  338. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  339. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  340. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  341. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  342. package/src/module/workflow/repository/action-data.repository.ts +333 -333
  343. package/src/module/workflow/repository/action.repository.ts +323 -323
  344. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  345. package/src/module/workflow/repository/comm-template.repository.ts +149 -149
  346. package/src/module/workflow/repository/form-master.repository.ts +59 -59
  347. package/src/module/workflow/repository/stage-group.repository.ts +176 -176
  348. package/src/module/workflow/repository/stage-movement.repository.ts +244 -244
  349. package/src/module/workflow/repository/stage.repository.ts +172 -172
  350. package/src/module/workflow/repository/task.repository.ts +127 -127
  351. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  352. package/src/module/workflow/service/action-category.service.ts +33 -33
  353. package/src/module/workflow/service/action-data.service.ts +62 -62
  354. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  355. package/src/module/workflow/service/action-template-mapping.service.ts +106 -106
  356. package/src/module/workflow/service/action.service.ts +279 -279
  357. package/src/module/workflow/service/activity-log.service.ts +107 -107
  358. package/src/module/workflow/service/comm-template.service.ts +180 -180
  359. package/src/module/workflow/service/entity-modification.service.ts +67 -67
  360. package/src/module/workflow/service/form-master.service.ts +35 -35
  361. package/src/module/workflow/service/populate-workflow.service.ts +303 -303
  362. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  363. package/src/module/workflow/service/stage-group.service.ts +319 -319
  364. package/src/module/workflow/service/stage.service.ts +199 -199
  365. package/src/module/workflow/service/task.service.ts +560 -560
  366. package/src/module/workflow/service/workflow-list-master.service.ts +60 -60
  367. package/src/module/workflow/service/workflow-meta.service.ts +640 -640
  368. package/src/module/workflow/service/workflow.service.ts +205 -205
  369. package/src/module/workflow/workflow.module.ts +176 -176
  370. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +21 -21
  371. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  372. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +35 -35
  373. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  374. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  375. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  376. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +214 -214
  377. package/src/module/workflow-automation/service/workflow-automation.service.ts +347 -347
  378. package/src/module/workflow-automation/workflow-automation.module.ts +34 -34
  379. package/src/resources/dev.properties.yaml +30 -30
  380. package/src/resources/local.properties.yaml +27 -27
  381. package/src/resources/properties.module.ts +12 -12
  382. package/src/resources/properties.yaml.ts +11 -11
  383. package/src/resources/uat.properties.yaml +31 -31
  384. package/src/table.config.ts +126 -126
  385. package/src/utils/dto/excel-data.dto.ts +14 -14
  386. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  387. package/src/utils/service/base64util.service.ts +18 -18
  388. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  389. package/src/utils/service/codeGenerator.service.ts +22 -22
  390. package/src/utils/service/dateUtil.service.ts +17 -17
  391. package/src/utils/service/encryptUtil.service.ts +97 -97
  392. package/src/utils/service/excel-helper.service.ts +72 -72
  393. package/src/utils/service/excelUtil.service.ts +15 -15
  394. package/src/utils/service/file-util.service.ts +11 -11
  395. package/src/utils/service/json-util.service.ts +23 -23
  396. package/src/utils/service/loggingUtil.service.ts +34 -34
  397. package/src/utils/service/reflection-helper.service.ts +62 -62
  398. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  399. package/src/utils/utils.module.ts +25 -25
  400. package/tsconfig.build.json +4 -4
  401. package/tsconfig.json +24 -24
@@ -1,662 +1,662 @@
1
- import {
2
- BadRequestException,
3
- Body,
4
- Controller,
5
- Get,
6
- HttpCode,
7
- HttpStatus,
8
- Param,
9
- ParseIntPipe,
10
- Post,
11
- Query,
12
- Req,
13
- UseGuards,
14
- } from '@nestjs/common';
15
- import { IntegrationService } from '../service/integration.service';
16
- import {
17
- BulkMessageDto,
18
- CheckAgentStatusDto,
19
- CreateConfigDto,
20
- CreateUserIntegrationDto,
21
- GenericSendMessageDto,
22
- GetIntegrationTemplatesDto,
23
- SendGridTemplatesDto,
24
- SendGridVerifiedSendersDto,
25
- UpdateConfigDto,
26
- UpdateUserIntegrationDto,
27
- } from '../dto/create-config.dto';
28
- import { JwtAuthGuard } from 'src/module/auth/guards/jwt.guard';
29
-
30
- export class ScheduledMessageDto extends GenericSendMessageDto {
31
- scheduleFor: Date;
32
- timezone?: string;
33
- }
34
-
35
- @Controller('integration')
36
- export class IntegrationController {
37
- constructor(private readonly integrationService: IntegrationService) {}
38
-
39
- @Post('send')
40
- @HttpCode(HttpStatus.OK)
41
- async sendMessage(@Body() sendMessageDto: GenericSendMessageDto) {
42
- try {
43
- return await this.integrationService.sendGenericMessage(sendMessageDto);
44
- } catch (error) {
45
- throw new BadRequestException({
46
- success: false,
47
- error: 'SEND_MESSAGE_ERROR',
48
- message: error.message || 'Failed to send message',
49
- code: 'MESSAGE_SEND_ERROR',
50
- });
51
- }
52
- }
53
-
54
- @Post('send/bulk')
55
- @HttpCode(HttpStatus.OK)
56
- async sendBulkMessage(@Body() bulkMessageDto: BulkMessageDto) {
57
- try {
58
- return await this.integrationService.sendBulkMessage(bulkMessageDto);
59
- } catch (error) {
60
- throw new BadRequestException({
61
- success: false,
62
- error: 'SEND_BULK_MESSAGE_ERROR',
63
- message: error.message || 'Failed to send bulk messages',
64
- code: 'BULK_MESSAGE_SEND_ERROR',
65
- });
66
- }
67
- }
68
-
69
- @Post('send/scheduled')
70
- @HttpCode(HttpStatus.OK)
71
- async scheduleMessage(@Body() scheduledMessageDto: ScheduledMessageDto) {
72
- try {
73
- return await this.integrationService.scheduleMessage(scheduledMessageDto);
74
- } catch (error) {
75
- throw new BadRequestException({
76
- success: false,
77
- error: 'SCHEDULE_MESSAGE_ERROR',
78
- message: error.message || 'Failed to schedule message',
79
- code: 'MESSAGE_SCHEDULE_ERROR',
80
- });
81
- }
82
- }
83
-
84
- @Post('send/template')
85
- @HttpCode(HttpStatus.OK)
86
- async sendTemplateMessage(
87
- @Body()
88
- templateMessage: {
89
- levelId: number;
90
- levelType: string;
91
- app_code: string;
92
- to: string | string[];
93
- templateId: string;
94
- variables: Record<string, any>;
95
- type?: 'EMAIL' | 'SMS' | 'WA' | 'TELEPHONE';
96
- },
97
- ) {
98
- try {
99
- return await this.integrationService.sendTemplateMessage(templateMessage);
100
- } catch (error) {
101
- throw new BadRequestException({
102
- success: false,
103
- error: 'SEND_TEMPLATE_MESSAGE_ERROR',
104
- message: error.message || 'Failed to send template message',
105
- code: 'TEMPLATE_MESSAGE_SEND_ERROR',
106
- });
107
- }
108
- }
109
-
110
- @Post('check-agent-status')
111
- @HttpCode(HttpStatus.OK)
112
- async checkAgentStatus(@Body() checkAgentStatusDto: CheckAgentStatusDto) {
113
- try {
114
- const result = await this.integrationService.checkAgentStatus(
115
- checkAgentStatusDto.levelId,
116
- checkAgentStatusDto.levelType,
117
- checkAgentStatusDto.app_code,
118
- checkAgentStatusDto.user_id,
119
- checkAgentStatusDto.type || 'TELEPHONE',
120
- );
121
-
122
- return result;
123
- } catch (error) {
124
- throw new BadRequestException({
125
- success: false,
126
- error: 'CHECK_AGENT_STATUS_ERROR',
127
- message: error.message || 'Failed to check agent status',
128
- code: 'AGENT_STATUS_ERROR',
129
- });
130
- }
131
- }
132
-
133
- @Post('config')
134
- @HttpCode(HttpStatus.OK)
135
- async createConfig(@Body() createConfigDto: CreateConfigDto) {
136
- try {
137
- const result = await this.integrationService.createIntegrationConfig(
138
- createConfigDto.levelId,
139
- createConfigDto.levelType,
140
- createConfigDto.app_code,
141
- createConfigDto.integration_type as
142
- | 'EMAIL'
143
- | 'SMS'
144
- | 'WA'
145
- | 'TELEPHONE',
146
- createConfigDto.integration_provider,
147
- createConfigDto.integration_source_id,
148
- createConfigDto.config,
149
- createConfigDto.priority,
150
- createConfigDto.is_default,
151
- );
152
-
153
- return result;
154
- } catch (error) {
155
- // Handle validation errors with BadRequest status
156
- if (
157
- error.message?.includes('active') &&
158
- error.message?.includes('configuration already exists')
159
- ) {
160
- throw new BadRequestException({
161
- success: false,
162
- error: 'DUPLICATE_CONFIGURATION',
163
- message: error.message,
164
- code: 'VALIDATION_ERROR',
165
- });
166
- }
167
-
168
- // Handle unsupported combination errors
169
- if (error.message?.includes('Unsupported combination')) {
170
- throw new BadRequestException({
171
- success: false,
172
- error: 'UNSUPPORTED_COMBINATION',
173
- message: error.message,
174
- code: 'VALIDATION_ERROR',
175
- });
176
- }
177
-
178
- // Handle OAuth redirect responses (return as success with OAuth info)
179
- if (error.authUrl && error.state) {
180
- return {
181
- success: false,
182
- requiresOAuth: true,
183
- authUrl: error.authUrl,
184
- state: error.state,
185
- message: error.message || 'OAuth authorization required',
186
- };
187
- }
188
-
189
- // Handle other errors as BadRequest
190
- throw new BadRequestException({
191
- success: false,
192
- error: 'CONFIGURATION_ERROR',
193
- message:
194
- error.message || 'Failed to create communication configuration',
195
- code: 'INTERNAL_ERROR',
196
- });
197
- }
198
- }
199
-
200
- @Get('supported-combinations')
201
- async getSupportedCombinations() {
202
- try {
203
- return await this.integrationService.getSupportedCombinations();
204
- } catch (error) {
205
- throw new BadRequestException({
206
- success: false,
207
- error: 'GET_COMBINATIONS_ERROR',
208
- message: error.message || 'Failed to get supported combinations',
209
- code: 'FETCH_ERROR',
210
- });
211
- }
212
- }
213
-
214
- @Get('level/:id/:type/configs')
215
- async getLevelConfigs(
216
- @Param('id', ParseIntPipe) levelId: number,
217
- @Param('type') levelType: string,
218
- @Query('app_code') app_code?: string,
219
- @Query('communication_config_type')
220
- configType?: 'WA' | 'SMS' | 'EMAIL' | 'TELEPHONE',
221
- @Query('provider') provider?: string,
222
- ) {
223
- try {
224
- return await this.integrationService.getLevelConfigs(levelId, levelType, {
225
- app_code,
226
- integration_type: configType,
227
- integration_provider: provider,
228
- });
229
- } catch (error) {
230
- throw new BadRequestException({
231
- success: false,
232
- error: 'GET_LEVEL_CONFIGS_ERROR',
233
- message: error.message || 'Failed to get level configurations',
234
- code: 'FETCH_ERROR',
235
- });
236
- }
237
- }
238
-
239
- @Get('config/:id')
240
- async getIntegrationConfigById(@Param('id', ParseIntPipe) hubId: number) {
241
- try {
242
- const config =
243
- await this.integrationService.getIntegrationConfigById(hubId);
244
-
245
- if (!config) {
246
- throw new BadRequestException({
247
- success: false,
248
- error: 'NOT_FOUND',
249
- message: 'Communication configuration not found',
250
- code: 'CONFIGURATION_NOT_FOUND',
251
- });
252
- }
253
-
254
- return {
255
- success: true,
256
- data: config,
257
- };
258
- } catch (error) {
259
- if (error instanceof BadRequestException) {
260
- throw error;
261
- }
262
-
263
- throw new BadRequestException({
264
- success: false,
265
- error: 'FETCH_ERROR',
266
- message: error.message || 'Failed to fetch communication configuration',
267
- code: 'INTERNAL_ERROR',
268
- });
269
- }
270
- }
271
-
272
- @Post('config/:id/update')
273
- @HttpCode(HttpStatus.OK)
274
- async activateConfig(
275
- @Param('id', ParseIntPipe) hubId: number,
276
- @Query('status') status: string,
277
- ) {
278
- try {
279
- const statusNumber = parseInt(status, 10);
280
- if (isNaN(statusNumber) || (statusNumber !== 0 && statusNumber !== 1)) {
281
- throw new BadRequestException('Status must be 0 or 1');
282
- }
283
-
284
- await this.integrationService.updateConfigStatus(hubId, statusNumber);
285
- return {
286
- success: true,
287
- message: 'Configuration updated successfully',
288
- };
289
- } catch (error) {
290
- throw new BadRequestException({
291
- success: false,
292
- error: 'UPDATE_STATUS_ERROR',
293
- });
294
- }
295
- }
296
-
297
- @Post('sendgrid/verified-senders')
298
- @HttpCode(HttpStatus.OK)
299
- async getSendGridVerifiedSenders(@Body() dto: SendGridVerifiedSendersDto) {
300
- try {
301
- return await this.integrationService.getSendGridVerifiedSenders(dto.apiKey);
302
- } catch (error) {
303
- throw new BadRequestException({
304
- success: false,
305
- error: 'GET_SENDGRID_SENDERS_ERROR',
306
- message: error.message || 'Failed to get SendGrid verified senders',
307
- code: 'SENDGRID_ERROR',
308
- });
309
- }
310
- }
311
-
312
- @Post('sendgrid/templates')
313
- @HttpCode(HttpStatus.OK)
314
- async getSendGridTemplates(@Body() dto: SendGridTemplatesDto) {
315
- try {
316
- return await this.integrationService.getSendGridTemplates(
317
- dto.levelId,
318
- dto.levelType,
319
- dto.app_code,
320
- );
321
- } catch (error) {
322
- throw new BadRequestException({
323
- success: false,
324
- error: 'GET_SENDGRID_TEMPLATES_ERROR',
325
- message: error.message || 'Failed to get SendGrid templates',
326
- code: 'SENDGRID_ERROR',
327
- });
328
- }
329
- }
330
-
331
- @Post('templates')
332
- @HttpCode(HttpStatus.OK)
333
- async getIntegrationTemplates(@Body() dto: GetIntegrationTemplatesDto) {
334
- try {
335
- return await this.integrationService.getIntegrationTemplates(
336
- dto.levelId,
337
- dto.levelType,
338
- dto.app_code,
339
- dto.integration_type,
340
- );
341
- } catch (error) {
342
- throw new BadRequestException({
343
- success: false,
344
- error: 'GET_TEMPLATES_ERROR',
345
- message: error.message || 'Failed to get templates',
346
- code: 'INTEGRATION_TEMPLATES_ERROR',
347
- });
348
- }
349
- }
350
-
351
- @Post('config/delete/:configId')
352
- @HttpCode(HttpStatus.OK)
353
- async disconnectConfig(@Param('configId', ParseIntPipe) configId: number) {
354
- try {
355
- await this.integrationService.deleteConfiguration(configId);
356
-
357
- return {
358
- success: true,
359
- message: 'Communication configuration deleted successfully',
360
- };
361
- } catch (error) {
362
- throw new BadRequestException({
363
- success: false,
364
- error: 'DELETE_ERROR',
365
- message:
366
- error.message || 'Failed to delete communication configuration',
367
- code: 'CONFIGURATION_ERROR',
368
- });
369
- }
370
- }
371
-
372
- @Post('config/update/:hubId')
373
- @HttpCode(HttpStatus.OK)
374
- async updateConfig(
375
- @Param('hubId', ParseIntPipe) hubId: number,
376
- @Body() updateDto: UpdateConfigDto,
377
- ) {
378
- try {
379
- const result = await this.integrationService.updateConfiguration(
380
- hubId,
381
- updateDto,
382
- );
383
-
384
- return {
385
- success: true,
386
- message: 'Communication configuration updated successfully',
387
- data: result,
388
- };
389
- } catch (error) {
390
- throw new BadRequestException({
391
- success: false,
392
- error: 'UPDATE_ERROR',
393
- message:
394
- error.message || 'Failed to update communication configuration',
395
- code: 'CONFIGURATION_ERROR',
396
- });
397
- }
398
- }
399
-
400
- // UserIntegration Management Endpoints
401
-
402
- @Post('user-integration')
403
- @HttpCode(HttpStatus.OK)
404
- async createUserIntegration(@Body() createDto: CreateUserIntegrationDto) {
405
- try {
406
- const result =
407
- await this.integrationService.createUserIntegration(createDto);
408
- return {
409
- success: true,
410
- message: 'User integration mapping created successfully',
411
- data: result,
412
- };
413
- } catch (error) {
414
- throw new BadRequestException({
415
- success: false,
416
- error: 'CREATE_USER_INTEGRATION_ERROR',
417
- message: error.message || 'Failed to create user integration mapping',
418
- code: 'USER_INTEGRATION_ERROR',
419
- });
420
- }
421
- }
422
-
423
- @Post('user-integration/bulk')
424
- @HttpCode(HttpStatus.OK)
425
- async bulkCreateUserIntegration(@Body() userIntegrations: CreateUserIntegrationDto[]) {
426
- try {
427
- const result =
428
- await this.integrationService.bulkCreateUserIntegration({ user_integrations: userIntegrations });
429
- return {
430
- success: true,
431
- message: `Bulk user integration completed: ${result.summary.created} created, ${result.summary.updated} updated, ${result.summary.failed} failed`,
432
- data: result,
433
- };
434
- } catch (error) {
435
- throw new BadRequestException({
436
- success: false,
437
- error: 'BULK_CREATE_USER_INTEGRATION_ERROR',
438
- message: error.message || 'Failed to bulk create user integration mappings',
439
- code: 'USER_INTEGRATION_ERROR',
440
- });
441
- }
442
- }
443
-
444
- @Get('user-integration/user/:userId')
445
- async getUserIntegrations(@Param('userId', ParseIntPipe) userId: number) {
446
- try {
447
- const result = await this.integrationService.getUserIntegrations(userId);
448
- return {
449
- success: true,
450
- data: result,
451
- };
452
- } catch (error) {
453
- throw new BadRequestException({
454
- success: false,
455
- error: 'GET_USER_INTEGRATIONS_ERROR',
456
- message: error.message || 'Failed to fetch user integrations',
457
- code: 'USER_INTEGRATION_ERROR',
458
- });
459
- }
460
- }
461
-
462
- @Get('user-integration/config/:configId')
463
- async getConfigUserIntegrations(
464
- @Param('configId', ParseIntPipe) configId: number,
465
- ) {
466
- try {
467
- const result =
468
- await this.integrationService.getConfigUserIntegrations(configId);
469
- return {
470
- success: true,
471
- data: result,
472
- };
473
- } catch (error) {
474
- throw new BadRequestException({
475
- success: false,
476
- error: 'GET_CONFIG_USER_INTEGRATIONS_ERROR',
477
- message: error.message || 'Failed to fetch config user integrations',
478
- code: 'USER_INTEGRATION_ERROR',
479
- });
480
- }
481
- }
482
-
483
- @Post('user-integration/:id')
484
- @HttpCode(HttpStatus.OK)
485
- async updateUserIntegration(
486
- @Param('id', ParseIntPipe) id: number,
487
- @Body() updateDto: UpdateUserIntegrationDto,
488
- ) {
489
- try {
490
- const result = await this.integrationService.updateUserIntegration(
491
- id,
492
- updateDto,
493
- );
494
- return {
495
- success: true,
496
- message: 'User integration mapping updated successfully',
497
- data: result,
498
- };
499
- } catch (error) {
500
- throw new BadRequestException({
501
- success: false,
502
- error: 'UPDATE_USER_INTEGRATION_ERROR',
503
- message: error.message || 'Failed to update user integration mapping',
504
- code: 'USER_INTEGRATION_ERROR',
505
- });
506
- }
507
- }
508
-
509
- @Post('user-integration/delete/:id')
510
- @HttpCode(HttpStatus.OK)
511
- async deleteUserIntegration(@Param('id', ParseIntPipe) id: number) {
512
- try {
513
- await this.integrationService.deleteUserIntegration(id);
514
- return {
515
- success: true,
516
- message: 'User integration mapping deleted successfully',
517
- };
518
- } catch (error) {
519
- throw new BadRequestException({
520
- success: false,
521
- error: 'DELETE_USER_INTEGRATION_ERROR',
522
- message: error.message || 'Failed to delete user integration mapping',
523
- code: 'USER_INTEGRATION_ERROR',
524
- });
525
- }
526
- }
527
-
528
- @Get('user-integration/:userId/:configId')
529
- async getUserIntegrationByUserAndConfig(
530
- @Param('userId', ParseIntPipe) userId: number,
531
- @Param('configId', ParseIntPipe) configId: number,
532
- ) {
533
- try {
534
- const result =
535
- await this.integrationService.getUserIntegrationByUserAndConfig(
536
- userId,
537
- configId,
538
- );
539
- return {
540
- success: true,
541
- data: result,
542
- };
543
- } catch (error) {
544
- throw new BadRequestException({
545
- success: false,
546
- error: 'GET_USER_INTEGRATION_ERROR',
547
- message: error.message || 'Failed to fetch user integration mapping',
548
- code: 'USER_INTEGRATION_ERROR',
549
- });
550
- }
551
- }
552
-
553
- @Get('getAll')
554
- @UseGuards(JwtAuthGuard)
555
- async getAllIntegration(
556
- @Req() req: Request & { user: any },
557
- @Query('integration_type')
558
- integration_type?: 'EMAIL' | 'SMS' | 'WA' | 'TELEPHONE',
559
- ) {
560
- try {
561
- const loggedInUser = req.user.userData;
562
-
563
- const allIntegrationData =
564
- await this.integrationService.getAllIntegrationData(
565
- loggedInUser,
566
- integration_type,
567
- );
568
-
569
- return allIntegrationData;
570
- } catch (error) {
571
- throw new BadRequestException({
572
- success: false,
573
- error: 'GET_ALL_INTEGRATIONS_ERROR',
574
- message: error.message || 'Failed to get all integrations',
575
- code: 'FETCH_ERROR',
576
- });
577
- }
578
- }
579
-
580
- @Get('provider-urls')
581
- getProviderUrls(
582
- @Query('integration_type')
583
- integration_type?: 'EMAIL' | 'SMS' | 'WA' | 'TELEPHONE',
584
- @Query('integration_provider') integration_provider?: string,
585
- ) {
586
- if (integration_type === 'TELEPHONE' && integration_provider) {
587
- if (integration_provider.toLowerCase() == 'ozonetel') {
588
- return {
589
- success: true,
590
- data: {
591
- baseUrl: 'https://in1-ccaas-api.ozonetel.com',
592
- agentLoginUrl: 'https://agent.cloudagent.ozonetel.com/login',
593
- },
594
- };
595
- } else if (integration_provider.toLowerCase() == 'tubelight') {
596
- return {
597
- success: true,
598
- data: {
599
- baseUrl: 'https://portal.tubelightcommunications.com',
600
- agentLoginUrl: 'https://dashboard.hellotubelight.com/sign-in',
601
- },
602
- };
603
- }
604
- } else if (integration_type === 'WA' && integration_provider) {
605
- if (integration_provider.toLowerCase() == 'tubelight') {
606
- return {
607
- success: true,
608
- data: {
609
- baseUrl: 'https://portal.tubelightcommunications.com',
610
- agentLoginUrl: 'https://dashboard.hellotubelight.com/sign-in',
611
- },
612
- };
613
- } else if (integration_provider.toLowerCase() == 'gupshup') {
614
- return {
615
- success: true,
616
- data: {
617
- baseUrl: 'https://api.gupshup.io',
618
- agentLoginUrl: 'https://login.gupshup.io/u/login',
619
- },
620
- };
621
- }
622
- }
623
- }
624
-
625
- @Get('active-config')
626
- async getActiveConfig(
627
- @Query('level_id', ParseIntPipe) levelId: number,
628
- @Query('level_type') levelType: string,
629
- @Query('app_code') appCode: string,
630
- @Query('integration_type')
631
- integrationType: 'EMAIL' | 'SMS' | 'WA' | 'TELEPHONE',
632
- ) {
633
- try {
634
- const config = await this.integrationService.getSingleActiveConfig(
635
- levelId,
636
- levelType,
637
- appCode,
638
- integrationType,
639
- );
640
-
641
- if (!config) {
642
- return {
643
- success: false,
644
- message: 'No active configuration found',
645
- data: null,
646
- };
647
- }
648
-
649
- return {
650
- success: true,
651
- data: config,
652
- };
653
- } catch (error) {
654
- throw new BadRequestException({
655
- success: false,
656
- error: 'GET_ACTIVE_CONFIG_ERROR',
657
- message: error.message || 'Failed to fetch active configuration',
658
- code: 'FETCH_ERROR',
659
- });
660
- }
661
- }
662
- }
1
+ import {
2
+ BadRequestException,
3
+ Body,
4
+ Controller,
5
+ Get,
6
+ HttpCode,
7
+ HttpStatus,
8
+ Param,
9
+ ParseIntPipe,
10
+ Post,
11
+ Query,
12
+ Req,
13
+ UseGuards,
14
+ } from '@nestjs/common';
15
+ import { IntegrationService } from '../service/integration.service';
16
+ import {
17
+ BulkMessageDto,
18
+ CheckAgentStatusDto,
19
+ CreateConfigDto,
20
+ CreateUserIntegrationDto,
21
+ GenericSendMessageDto,
22
+ GetIntegrationTemplatesDto,
23
+ SendGridTemplatesDto,
24
+ SendGridVerifiedSendersDto,
25
+ UpdateConfigDto,
26
+ UpdateUserIntegrationDto,
27
+ } from '../dto/create-config.dto';
28
+ import { JwtAuthGuard } from 'src/module/auth/guards/jwt.guard';
29
+
30
+ export class ScheduledMessageDto extends GenericSendMessageDto {
31
+ scheduleFor: Date;
32
+ timezone?: string;
33
+ }
34
+
35
+ @Controller('integration')
36
+ export class IntegrationController {
37
+ constructor(private readonly integrationService: IntegrationService) {}
38
+
39
+ @Post('send')
40
+ @HttpCode(HttpStatus.OK)
41
+ async sendMessage(@Body() sendMessageDto: GenericSendMessageDto) {
42
+ try {
43
+ return await this.integrationService.sendGenericMessage(sendMessageDto);
44
+ } catch (error) {
45
+ throw new BadRequestException({
46
+ success: false,
47
+ error: 'SEND_MESSAGE_ERROR',
48
+ message: error.message || 'Failed to send message',
49
+ code: 'MESSAGE_SEND_ERROR',
50
+ });
51
+ }
52
+ }
53
+
54
+ @Post('send/bulk')
55
+ @HttpCode(HttpStatus.OK)
56
+ async sendBulkMessage(@Body() bulkMessageDto: BulkMessageDto) {
57
+ try {
58
+ return await this.integrationService.sendBulkMessage(bulkMessageDto);
59
+ } catch (error) {
60
+ throw new BadRequestException({
61
+ success: false,
62
+ error: 'SEND_BULK_MESSAGE_ERROR',
63
+ message: error.message || 'Failed to send bulk messages',
64
+ code: 'BULK_MESSAGE_SEND_ERROR',
65
+ });
66
+ }
67
+ }
68
+
69
+ @Post('send/scheduled')
70
+ @HttpCode(HttpStatus.OK)
71
+ async scheduleMessage(@Body() scheduledMessageDto: ScheduledMessageDto) {
72
+ try {
73
+ return await this.integrationService.scheduleMessage(scheduledMessageDto);
74
+ } catch (error) {
75
+ throw new BadRequestException({
76
+ success: false,
77
+ error: 'SCHEDULE_MESSAGE_ERROR',
78
+ message: error.message || 'Failed to schedule message',
79
+ code: 'MESSAGE_SCHEDULE_ERROR',
80
+ });
81
+ }
82
+ }
83
+
84
+ @Post('send/template')
85
+ @HttpCode(HttpStatus.OK)
86
+ async sendTemplateMessage(
87
+ @Body()
88
+ templateMessage: {
89
+ levelId: number;
90
+ levelType: string;
91
+ app_code: string;
92
+ to: string | string[];
93
+ templateId: string;
94
+ variables: Record<string, any>;
95
+ type?: 'EMAIL' | 'SMS' | 'WA' | 'TELEPHONE';
96
+ },
97
+ ) {
98
+ try {
99
+ return await this.integrationService.sendTemplateMessage(templateMessage);
100
+ } catch (error) {
101
+ throw new BadRequestException({
102
+ success: false,
103
+ error: 'SEND_TEMPLATE_MESSAGE_ERROR',
104
+ message: error.message || 'Failed to send template message',
105
+ code: 'TEMPLATE_MESSAGE_SEND_ERROR',
106
+ });
107
+ }
108
+ }
109
+
110
+ @Post('check-agent-status')
111
+ @HttpCode(HttpStatus.OK)
112
+ async checkAgentStatus(@Body() checkAgentStatusDto: CheckAgentStatusDto) {
113
+ try {
114
+ const result = await this.integrationService.checkAgentStatus(
115
+ checkAgentStatusDto.levelId,
116
+ checkAgentStatusDto.levelType,
117
+ checkAgentStatusDto.app_code,
118
+ checkAgentStatusDto.user_id,
119
+ checkAgentStatusDto.type || 'TELEPHONE',
120
+ );
121
+
122
+ return result;
123
+ } catch (error) {
124
+ throw new BadRequestException({
125
+ success: false,
126
+ error: 'CHECK_AGENT_STATUS_ERROR',
127
+ message: error.message || 'Failed to check agent status',
128
+ code: 'AGENT_STATUS_ERROR',
129
+ });
130
+ }
131
+ }
132
+
133
+ @Post('config')
134
+ @HttpCode(HttpStatus.OK)
135
+ async createConfig(@Body() createConfigDto: CreateConfigDto) {
136
+ try {
137
+ const result = await this.integrationService.createIntegrationConfig(
138
+ createConfigDto.levelId,
139
+ createConfigDto.levelType,
140
+ createConfigDto.app_code,
141
+ createConfigDto.integration_type as
142
+ | 'EMAIL'
143
+ | 'SMS'
144
+ | 'WA'
145
+ | 'TELEPHONE',
146
+ createConfigDto.integration_provider,
147
+ createConfigDto.integration_source_id,
148
+ createConfigDto.config,
149
+ createConfigDto.priority,
150
+ createConfigDto.is_default,
151
+ );
152
+
153
+ return result;
154
+ } catch (error) {
155
+ // Handle validation errors with BadRequest status
156
+ if (
157
+ error.message?.includes('active') &&
158
+ error.message?.includes('configuration already exists')
159
+ ) {
160
+ throw new BadRequestException({
161
+ success: false,
162
+ error: 'DUPLICATE_CONFIGURATION',
163
+ message: error.message,
164
+ code: 'VALIDATION_ERROR',
165
+ });
166
+ }
167
+
168
+ // Handle unsupported combination errors
169
+ if (error.message?.includes('Unsupported combination')) {
170
+ throw new BadRequestException({
171
+ success: false,
172
+ error: 'UNSUPPORTED_COMBINATION',
173
+ message: error.message,
174
+ code: 'VALIDATION_ERROR',
175
+ });
176
+ }
177
+
178
+ // Handle OAuth redirect responses (return as success with OAuth info)
179
+ if (error.authUrl && error.state) {
180
+ return {
181
+ success: false,
182
+ requiresOAuth: true,
183
+ authUrl: error.authUrl,
184
+ state: error.state,
185
+ message: error.message || 'OAuth authorization required',
186
+ };
187
+ }
188
+
189
+ // Handle other errors as BadRequest
190
+ throw new BadRequestException({
191
+ success: false,
192
+ error: 'CONFIGURATION_ERROR',
193
+ message:
194
+ error.message || 'Failed to create communication configuration',
195
+ code: 'INTERNAL_ERROR',
196
+ });
197
+ }
198
+ }
199
+
200
+ @Get('supported-combinations')
201
+ async getSupportedCombinations() {
202
+ try {
203
+ return await this.integrationService.getSupportedCombinations();
204
+ } catch (error) {
205
+ throw new BadRequestException({
206
+ success: false,
207
+ error: 'GET_COMBINATIONS_ERROR',
208
+ message: error.message || 'Failed to get supported combinations',
209
+ code: 'FETCH_ERROR',
210
+ });
211
+ }
212
+ }
213
+
214
+ @Get('level/:id/:type/configs')
215
+ async getLevelConfigs(
216
+ @Param('id', ParseIntPipe) levelId: number,
217
+ @Param('type') levelType: string,
218
+ @Query('app_code') app_code?: string,
219
+ @Query('communication_config_type')
220
+ configType?: 'WA' | 'SMS' | 'EMAIL' | 'TELEPHONE',
221
+ @Query('provider') provider?: string,
222
+ ) {
223
+ try {
224
+ return await this.integrationService.getLevelConfigs(levelId, levelType, {
225
+ app_code,
226
+ integration_type: configType,
227
+ integration_provider: provider,
228
+ });
229
+ } catch (error) {
230
+ throw new BadRequestException({
231
+ success: false,
232
+ error: 'GET_LEVEL_CONFIGS_ERROR',
233
+ message: error.message || 'Failed to get level configurations',
234
+ code: 'FETCH_ERROR',
235
+ });
236
+ }
237
+ }
238
+
239
+ @Get('config/:id')
240
+ async getIntegrationConfigById(@Param('id', ParseIntPipe) hubId: number) {
241
+ try {
242
+ const config =
243
+ await this.integrationService.getIntegrationConfigById(hubId);
244
+
245
+ if (!config) {
246
+ throw new BadRequestException({
247
+ success: false,
248
+ error: 'NOT_FOUND',
249
+ message: 'Communication configuration not found',
250
+ code: 'CONFIGURATION_NOT_FOUND',
251
+ });
252
+ }
253
+
254
+ return {
255
+ success: true,
256
+ data: config,
257
+ };
258
+ } catch (error) {
259
+ if (error instanceof BadRequestException) {
260
+ throw error;
261
+ }
262
+
263
+ throw new BadRequestException({
264
+ success: false,
265
+ error: 'FETCH_ERROR',
266
+ message: error.message || 'Failed to fetch communication configuration',
267
+ code: 'INTERNAL_ERROR',
268
+ });
269
+ }
270
+ }
271
+
272
+ @Post('config/:id/update')
273
+ @HttpCode(HttpStatus.OK)
274
+ async activateConfig(
275
+ @Param('id', ParseIntPipe) hubId: number,
276
+ @Query('status') status: string,
277
+ ) {
278
+ try {
279
+ const statusNumber = parseInt(status, 10);
280
+ if (isNaN(statusNumber) || (statusNumber !== 0 && statusNumber !== 1)) {
281
+ throw new BadRequestException('Status must be 0 or 1');
282
+ }
283
+
284
+ await this.integrationService.updateConfigStatus(hubId, statusNumber);
285
+ return {
286
+ success: true,
287
+ message: 'Configuration updated successfully',
288
+ };
289
+ } catch (error) {
290
+ throw new BadRequestException({
291
+ success: false,
292
+ error: 'UPDATE_STATUS_ERROR',
293
+ });
294
+ }
295
+ }
296
+
297
+ @Post('sendgrid/verified-senders')
298
+ @HttpCode(HttpStatus.OK)
299
+ async getSendGridVerifiedSenders(@Body() dto: SendGridVerifiedSendersDto) {
300
+ try {
301
+ return await this.integrationService.getSendGridVerifiedSenders(dto.apiKey);
302
+ } catch (error) {
303
+ throw new BadRequestException({
304
+ success: false,
305
+ error: 'GET_SENDGRID_SENDERS_ERROR',
306
+ message: error.message || 'Failed to get SendGrid verified senders',
307
+ code: 'SENDGRID_ERROR',
308
+ });
309
+ }
310
+ }
311
+
312
+ @Post('sendgrid/templates')
313
+ @HttpCode(HttpStatus.OK)
314
+ async getSendGridTemplates(@Body() dto: SendGridTemplatesDto) {
315
+ try {
316
+ return await this.integrationService.getSendGridTemplates(
317
+ dto.levelId,
318
+ dto.levelType,
319
+ dto.app_code,
320
+ );
321
+ } catch (error) {
322
+ throw new BadRequestException({
323
+ success: false,
324
+ error: 'GET_SENDGRID_TEMPLATES_ERROR',
325
+ message: error.message || 'Failed to get SendGrid templates',
326
+ code: 'SENDGRID_ERROR',
327
+ });
328
+ }
329
+ }
330
+
331
+ @Post('templates')
332
+ @HttpCode(HttpStatus.OK)
333
+ async getIntegrationTemplates(@Body() dto: GetIntegrationTemplatesDto) {
334
+ try {
335
+ return await this.integrationService.getIntegrationTemplates(
336
+ dto.levelId,
337
+ dto.levelType,
338
+ dto.app_code,
339
+ dto.integration_type,
340
+ );
341
+ } catch (error) {
342
+ throw new BadRequestException({
343
+ success: false,
344
+ error: 'GET_TEMPLATES_ERROR',
345
+ message: error.message || 'Failed to get templates',
346
+ code: 'INTEGRATION_TEMPLATES_ERROR',
347
+ });
348
+ }
349
+ }
350
+
351
+ @Post('config/delete/:configId')
352
+ @HttpCode(HttpStatus.OK)
353
+ async disconnectConfig(@Param('configId', ParseIntPipe) configId: number) {
354
+ try {
355
+ await this.integrationService.deleteConfiguration(configId);
356
+
357
+ return {
358
+ success: true,
359
+ message: 'Communication configuration deleted successfully',
360
+ };
361
+ } catch (error) {
362
+ throw new BadRequestException({
363
+ success: false,
364
+ error: 'DELETE_ERROR',
365
+ message:
366
+ error.message || 'Failed to delete communication configuration',
367
+ code: 'CONFIGURATION_ERROR',
368
+ });
369
+ }
370
+ }
371
+
372
+ @Post('config/update/:hubId')
373
+ @HttpCode(HttpStatus.OK)
374
+ async updateConfig(
375
+ @Param('hubId', ParseIntPipe) hubId: number,
376
+ @Body() updateDto: UpdateConfigDto,
377
+ ) {
378
+ try {
379
+ const result = await this.integrationService.updateConfiguration(
380
+ hubId,
381
+ updateDto,
382
+ );
383
+
384
+ return {
385
+ success: true,
386
+ message: 'Communication configuration updated successfully',
387
+ data: result,
388
+ };
389
+ } catch (error) {
390
+ throw new BadRequestException({
391
+ success: false,
392
+ error: 'UPDATE_ERROR',
393
+ message:
394
+ error.message || 'Failed to update communication configuration',
395
+ code: 'CONFIGURATION_ERROR',
396
+ });
397
+ }
398
+ }
399
+
400
+ // UserIntegration Management Endpoints
401
+
402
+ @Post('user-integration')
403
+ @HttpCode(HttpStatus.OK)
404
+ async createUserIntegration(@Body() createDto: CreateUserIntegrationDto) {
405
+ try {
406
+ const result =
407
+ await this.integrationService.createUserIntegration(createDto);
408
+ return {
409
+ success: true,
410
+ message: 'User integration mapping created successfully',
411
+ data: result,
412
+ };
413
+ } catch (error) {
414
+ throw new BadRequestException({
415
+ success: false,
416
+ error: 'CREATE_USER_INTEGRATION_ERROR',
417
+ message: error.message || 'Failed to create user integration mapping',
418
+ code: 'USER_INTEGRATION_ERROR',
419
+ });
420
+ }
421
+ }
422
+
423
+ @Post('user-integration/bulk')
424
+ @HttpCode(HttpStatus.OK)
425
+ async bulkCreateUserIntegration(@Body() userIntegrations: CreateUserIntegrationDto[]) {
426
+ try {
427
+ const result =
428
+ await this.integrationService.bulkCreateUserIntegration({ user_integrations: userIntegrations });
429
+ return {
430
+ success: true,
431
+ message: `Bulk user integration completed: ${result.summary.created} created, ${result.summary.updated} updated, ${result.summary.failed} failed`,
432
+ data: result,
433
+ };
434
+ } catch (error) {
435
+ throw new BadRequestException({
436
+ success: false,
437
+ error: 'BULK_CREATE_USER_INTEGRATION_ERROR',
438
+ message: error.message || 'Failed to bulk create user integration mappings',
439
+ code: 'USER_INTEGRATION_ERROR',
440
+ });
441
+ }
442
+ }
443
+
444
+ @Get('user-integration/user/:userId')
445
+ async getUserIntegrations(@Param('userId', ParseIntPipe) userId: number) {
446
+ try {
447
+ const result = await this.integrationService.getUserIntegrations(userId);
448
+ return {
449
+ success: true,
450
+ data: result,
451
+ };
452
+ } catch (error) {
453
+ throw new BadRequestException({
454
+ success: false,
455
+ error: 'GET_USER_INTEGRATIONS_ERROR',
456
+ message: error.message || 'Failed to fetch user integrations',
457
+ code: 'USER_INTEGRATION_ERROR',
458
+ });
459
+ }
460
+ }
461
+
462
+ @Get('user-integration/config/:configId')
463
+ async getConfigUserIntegrations(
464
+ @Param('configId', ParseIntPipe) configId: number,
465
+ ) {
466
+ try {
467
+ const result =
468
+ await this.integrationService.getConfigUserIntegrations(configId);
469
+ return {
470
+ success: true,
471
+ data: result,
472
+ };
473
+ } catch (error) {
474
+ throw new BadRequestException({
475
+ success: false,
476
+ error: 'GET_CONFIG_USER_INTEGRATIONS_ERROR',
477
+ message: error.message || 'Failed to fetch config user integrations',
478
+ code: 'USER_INTEGRATION_ERROR',
479
+ });
480
+ }
481
+ }
482
+
483
+ @Post('user-integration/:id')
484
+ @HttpCode(HttpStatus.OK)
485
+ async updateUserIntegration(
486
+ @Param('id', ParseIntPipe) id: number,
487
+ @Body() updateDto: UpdateUserIntegrationDto,
488
+ ) {
489
+ try {
490
+ const result = await this.integrationService.updateUserIntegration(
491
+ id,
492
+ updateDto,
493
+ );
494
+ return {
495
+ success: true,
496
+ message: 'User integration mapping updated successfully',
497
+ data: result,
498
+ };
499
+ } catch (error) {
500
+ throw new BadRequestException({
501
+ success: false,
502
+ error: 'UPDATE_USER_INTEGRATION_ERROR',
503
+ message: error.message || 'Failed to update user integration mapping',
504
+ code: 'USER_INTEGRATION_ERROR',
505
+ });
506
+ }
507
+ }
508
+
509
+ @Post('user-integration/delete/:id')
510
+ @HttpCode(HttpStatus.OK)
511
+ async deleteUserIntegration(@Param('id', ParseIntPipe) id: number) {
512
+ try {
513
+ await this.integrationService.deleteUserIntegration(id);
514
+ return {
515
+ success: true,
516
+ message: 'User integration mapping deleted successfully',
517
+ };
518
+ } catch (error) {
519
+ throw new BadRequestException({
520
+ success: false,
521
+ error: 'DELETE_USER_INTEGRATION_ERROR',
522
+ message: error.message || 'Failed to delete user integration mapping',
523
+ code: 'USER_INTEGRATION_ERROR',
524
+ });
525
+ }
526
+ }
527
+
528
+ @Get('user-integration/:userId/:configId')
529
+ async getUserIntegrationByUserAndConfig(
530
+ @Param('userId', ParseIntPipe) userId: number,
531
+ @Param('configId', ParseIntPipe) configId: number,
532
+ ) {
533
+ try {
534
+ const result =
535
+ await this.integrationService.getUserIntegrationByUserAndConfig(
536
+ userId,
537
+ configId,
538
+ );
539
+ return {
540
+ success: true,
541
+ data: result,
542
+ };
543
+ } catch (error) {
544
+ throw new BadRequestException({
545
+ success: false,
546
+ error: 'GET_USER_INTEGRATION_ERROR',
547
+ message: error.message || 'Failed to fetch user integration mapping',
548
+ code: 'USER_INTEGRATION_ERROR',
549
+ });
550
+ }
551
+ }
552
+
553
+ @Get('getAll')
554
+ @UseGuards(JwtAuthGuard)
555
+ async getAllIntegration(
556
+ @Req() req: Request & { user: any },
557
+ @Query('integration_type')
558
+ integration_type?: 'EMAIL' | 'SMS' | 'WA' | 'TELEPHONE',
559
+ ) {
560
+ try {
561
+ const loggedInUser = req.user.userData;
562
+
563
+ const allIntegrationData =
564
+ await this.integrationService.getAllIntegrationData(
565
+ loggedInUser,
566
+ integration_type,
567
+ );
568
+
569
+ return allIntegrationData;
570
+ } catch (error) {
571
+ throw new BadRequestException({
572
+ success: false,
573
+ error: 'GET_ALL_INTEGRATIONS_ERROR',
574
+ message: error.message || 'Failed to get all integrations',
575
+ code: 'FETCH_ERROR',
576
+ });
577
+ }
578
+ }
579
+
580
+ @Get('provider-urls')
581
+ getProviderUrls(
582
+ @Query('integration_type')
583
+ integration_type?: 'EMAIL' | 'SMS' | 'WA' | 'TELEPHONE',
584
+ @Query('integration_provider') integration_provider?: string,
585
+ ) {
586
+ if (integration_type === 'TELEPHONE' && integration_provider) {
587
+ if (integration_provider.toLowerCase() == 'ozonetel') {
588
+ return {
589
+ success: true,
590
+ data: {
591
+ baseUrl: 'https://in1-ccaas-api.ozonetel.com',
592
+ agentLoginUrl: 'https://agent.cloudagent.ozonetel.com/login',
593
+ },
594
+ };
595
+ } else if (integration_provider.toLowerCase() == 'tubelight') {
596
+ return {
597
+ success: true,
598
+ data: {
599
+ baseUrl: 'https://portal.tubelightcommunications.com',
600
+ agentLoginUrl: 'https://dashboard.hellotubelight.com/sign-in',
601
+ },
602
+ };
603
+ }
604
+ } else if (integration_type === 'WA' && integration_provider) {
605
+ if (integration_provider.toLowerCase() == 'tubelight') {
606
+ return {
607
+ success: true,
608
+ data: {
609
+ baseUrl: 'https://portal.tubelightcommunications.com',
610
+ agentLoginUrl: 'https://dashboard.hellotubelight.com/sign-in',
611
+ },
612
+ };
613
+ } else if (integration_provider.toLowerCase() == 'gupshup') {
614
+ return {
615
+ success: true,
616
+ data: {
617
+ baseUrl: 'https://api.gupshup.io',
618
+ agentLoginUrl: 'https://login.gupshup.io/u/login',
619
+ },
620
+ };
621
+ }
622
+ }
623
+ }
624
+
625
+ @Get('active-config')
626
+ async getActiveConfig(
627
+ @Query('level_id', ParseIntPipe) levelId: number,
628
+ @Query('level_type') levelType: string,
629
+ @Query('app_code') appCode: string,
630
+ @Query('integration_type')
631
+ integrationType: 'EMAIL' | 'SMS' | 'WA' | 'TELEPHONE',
632
+ ) {
633
+ try {
634
+ const config = await this.integrationService.getSingleActiveConfig(
635
+ levelId,
636
+ levelType,
637
+ appCode,
638
+ integrationType,
639
+ );
640
+
641
+ if (!config) {
642
+ return {
643
+ success: false,
644
+ message: 'No active configuration found',
645
+ data: null,
646
+ };
647
+ }
648
+
649
+ return {
650
+ success: true,
651
+ data: config,
652
+ };
653
+ } catch (error) {
654
+ throw new BadRequestException({
655
+ success: false,
656
+ error: 'GET_ACTIVE_CONFIG_ERROR',
657
+ message: error.message || 'Failed to fetch active configuration',
658
+ code: 'FETCH_ERROR',
659
+ });
660
+ }
661
+ }
662
+ }