rez_core 4.0.126 → 4.0.128

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/.prettierrc +3 -3
  2. package/.vscode/extensions.json +5 -0
  3. package/README.md +99 -99
  4. package/dist/config/config.module.js +2 -2
  5. package/dist/config/config.module.js.map +1 -1
  6. package/dist/config/database.config.d.ts +1 -1
  7. package/dist/config/database.config.js +12 -15
  8. package/dist/config/database.config.js.map +1 -1
  9. package/dist/module/auth/guards/role.guard.js +3 -3
  10. package/dist/module/auth/services/auth.service.js +2 -2
  11. package/dist/module/enterprise/entity/organization.entity.js +1 -1
  12. package/dist/module/filter/repository/saved-filter.repository.js +4 -4
  13. package/dist/module/filter/service/filter-evaluator.service.js +2 -2
  14. package/dist/module/filter/service/filter.service.js +22 -22
  15. package/dist/module/integration/entity/integration-config.entity.js +3 -3
  16. package/dist/module/integration/entity/integration-config.entity.js.map +1 -1
  17. package/dist/module/integration/entity/user-integration.entity.js +3 -3
  18. package/dist/module/integration/entity/user-integration.entity.js.map +1 -1
  19. package/dist/module/integration/examples/usage.example.js +9 -9
  20. package/dist/module/integration/service/integration.service.js +1 -1
  21. package/dist/module/integration/service/wrapper.service.js +25 -25
  22. package/dist/module/listmaster/entity/list-master.entity.js +4 -4
  23. package/dist/module/listmaster/entity/list-master.entity.js.map +1 -1
  24. package/dist/module/listmaster/service/list-master-item.service.js +2 -2
  25. package/dist/module/mapper/entity/field-mapper.entity.js +1 -1
  26. package/dist/module/mapper/entity/field-mapper.entity.js.map +1 -1
  27. package/dist/module/mapper/service/field-mapper.service.js +4 -4
  28. package/dist/module/mapper/service/mapper.service.js +2 -2
  29. package/dist/module/meta/entity/entity-master.entity.js +1 -1
  30. package/dist/module/meta/entity/entity-master.entity.js.map +1 -1
  31. package/dist/module/meta/service/attribute-master.service.js +1 -1
  32. package/dist/module/meta/service/attribute-master.service.js.map +1 -1
  33. package/dist/module/meta/service/entity-dynamic.service.js +9 -9
  34. package/dist/module/meta/service/entity-list.service.js +3 -3
  35. package/dist/module/meta/service/entity-master.service.js +3 -3
  36. package/dist/module/meta/service/entity-relation.service.js +11 -11
  37. package/dist/module/meta/service/entity-service-impl.service.js +3 -3
  38. package/dist/module/meta/service/resolver.service.js +5 -5
  39. package/dist/module/meta/service/resolver.service.js.map +1 -1
  40. package/dist/module/module/repository/menu.repository.js +12 -12
  41. package/dist/module/notification/service/notification.service.js +9 -9
  42. package/dist/module/user/controller/login.controller.js +18 -18
  43. package/dist/module/user/entity/user-role-mapping.entity.js +1 -1
  44. package/dist/module/user/entity/user-role-mapping.entity.js.map +1 -1
  45. package/dist/module/user/service/role.service.js +4 -4
  46. package/dist/module/user/service/user-session.service.js +2 -2
  47. package/dist/module/workflow/entity/comm-template.entity.js +1 -1
  48. package/dist/module/workflow/entity/comm-template.entity.js.map +1 -1
  49. package/dist/module/workflow/repository/action.repository.js +20 -20
  50. package/dist/module/workflow/repository/comm-template.repository.js +6 -6
  51. package/dist/module/workflow/repository/form-master.repository.js +2 -2
  52. package/dist/module/workflow/repository/stage-group.repository.js +23 -23
  53. package/dist/module/workflow/repository/stage-movement.repository.js +15 -15
  54. package/dist/module/workflow/repository/stage.repository.js +8 -8
  55. package/dist/module/workflow/service/action-template-mapping.service.js +22 -22
  56. package/dist/module/workflow/service/action.service.js +7 -7
  57. package/dist/module/workflow/service/entity-modification.service.js +6 -6
  58. package/dist/module/workflow/service/stage-group.service.js +2 -2
  59. package/dist/module/workflow/service/stage.service.js +2 -2
  60. package/dist/module/workflow/service/task.service.js +28 -28
  61. package/dist/module/workflow/service/workflow-list-master.service.js +15 -15
  62. package/dist/module/workflow/service/workflow-meta.service.js +41 -39
  63. package/dist/module/workflow/service/workflow-meta.service.js.map +1 -1
  64. package/dist/module/workflow/service/workflow.service.js +2 -2
  65. package/dist/tsconfig.build.tsbuildinfo +1 -1
  66. package/dist/utils/service/reflection-helper.service.js +2 -2
  67. package/docs/modules/event-driven-integration-design.md +91 -91
  68. package/docs/modules/integration.md +250 -250
  69. package/eslint.config.mjs +34 -34
  70. package/nest-cli.json +14 -14
  71. package/package.json +119 -120
  72. package/src/app.controller.ts +12 -12
  73. package/src/app.module.ts +52 -52
  74. package/src/app.service.ts +8 -8
  75. package/src/config/config.module.ts +18 -17
  76. package/src/config/database.config.ts +23 -47
  77. package/src/constant/global.constant.ts +67 -67
  78. package/src/core.module.ts +81 -81
  79. package/src/decorators/roles.decorator.ts +7 -7
  80. package/src/dtos/response.dto.ts +6 -6
  81. package/src/dtos/response.ts +5 -5
  82. package/src/index.ts +1 -1
  83. package/src/module/auth/auth.module.ts +49 -49
  84. package/src/module/auth/controller/auth.controller.ts +28 -28
  85. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  86. package/src/module/auth/guards/jwt.guard.ts +22 -22
  87. package/src/module/auth/guards/role.guard.ts +68 -68
  88. package/src/module/auth/services/auth.service.ts +50 -50
  89. package/src/module/auth/services/jwt.service.ts +11 -11
  90. package/src/module/auth/strategies/google.strategy.ts +54 -54
  91. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  92. package/src/module/auth/strategies/local.strategy.ts +13 -13
  93. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  94. package/src/module/dashboard/dashboard.module.ts +21 -21
  95. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  96. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  97. package/src/module/dashboard/repository/dashboard.repository.ts +42 -42
  98. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  99. package/src/module/dev/dev.module.ts +12 -12
  100. package/src/module/dev/service/dev.service.ts +7 -7
  101. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  102. package/src/module/enterprise/enterprise.module.ts +30 -30
  103. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  104. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  105. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  106. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  107. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  108. package/src/module/enterprise/repository/school.repository.ts +278 -278
  109. package/src/module/enterprise/service/brand.service.ts +5 -5
  110. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  111. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  112. package/src/module/enterprise/service/organization.service.ts +145 -145
  113. package/src/module/filter/controller/filter.controller.ts +84 -84
  114. package/src/module/filter/dto/filter-request.dto.ts +38 -38
  115. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  116. package/src/module/filter/entity/saved-filter-master.entity.ts +23 -23
  117. package/src/module/filter/filter.module.ts +31 -31
  118. package/src/module/filter/repository/saved-filter.repository.ts +168 -168
  119. package/src/module/filter/service/filter-evaluator.service.ts +86 -86
  120. package/src/module/filter/service/filter.service.ts +1005 -1005
  121. package/src/module/filter/service/saved-filter.service.ts +170 -170
  122. package/src/module/ics/controller/ics.controller.ts +21 -21
  123. package/src/module/ics/dto/ics.dto.ts +55 -55
  124. package/src/module/ics/ics.module.ts +13 -13
  125. package/src/module/ics/service/ics.service.ts +57 -57
  126. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  127. package/src/module/integration/controller/integration.controller.ts +662 -662
  128. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  129. package/src/module/integration/dto/create-config.dto.ts +526 -526
  130. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  131. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  132. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  133. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  134. package/src/module/integration/examples/usage.example.ts +338 -338
  135. package/src/module/integration/factories/base.factory.ts +7 -7
  136. package/src/module/integration/factories/email.factory.ts +49 -49
  137. package/src/module/integration/factories/integration.factory.ts +121 -121
  138. package/src/module/integration/factories/sms.factory.ts +51 -51
  139. package/src/module/integration/factories/telephone.factory.ts +41 -41
  140. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  141. package/src/module/integration/integration.module.ts +110 -110
  142. package/src/module/integration/service/calendar-event.service.ts +118 -118
  143. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  144. package/src/module/integration/service/integration-queue.service.ts +229 -229
  145. package/src/module/integration/service/integration.service.ts +2633 -2633
  146. package/src/module/integration/service/oauth.service.ts +224 -224
  147. package/src/module/integration/service/wrapper.service.ts +493 -493
  148. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  149. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  150. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  151. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  152. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  153. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  154. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  155. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  156. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  157. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  158. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  159. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  160. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  161. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  162. package/src/module/layout/controller/layout.controller.ts +47 -47
  163. package/src/module/layout/entity/header-items.entity.ts +28 -28
  164. package/src/module/layout/entity/header-section.entity.ts +19 -19
  165. package/src/module/layout/layout.module.ts +21 -21
  166. package/src/module/layout/repository/header-items.repository.ts +18 -18
  167. package/src/module/layout/repository/header-section.repository.ts +22 -22
  168. package/src/module/layout/service/header-section.service.ts +25 -25
  169. package/src/module/layout_preference/controller/layout_preference.controller.ts +73 -73
  170. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  171. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  172. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  173. package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
  174. package/src/module/lead/controller/lead.controller.ts +30 -30
  175. package/src/module/lead/lead.module.ts +14 -14
  176. package/src/module/lead/repository/lead.repository.ts +41 -41
  177. package/src/module/lead/service/lead.service.ts +54 -54
  178. package/src/module/listmaster/controller/list-master.controller.ts +230 -230
  179. package/src/module/listmaster/entity/list-master-items.entity.ts +43 -43
  180. package/src/module/listmaster/entity/list-master.entity.ts +33 -33
  181. package/src/module/listmaster/listmaster.module.ts +46 -46
  182. package/src/module/listmaster/repository/list-master-items.repository.ts +169 -169
  183. package/src/module/listmaster/repository/list-master.repository.ts +46 -46
  184. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  185. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  186. package/src/module/listmaster/service/list-master-item.service.ts +292 -292
  187. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  188. package/src/module/listmaster/service/list-master.service.ts +535 -535
  189. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  190. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  191. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  192. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  193. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  194. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  195. package/src/module/mapper/mapper.module.ts +34 -34
  196. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  197. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  198. package/src/module/mapper/repository/mapper.repository.ts +15 -15
  199. package/src/module/mapper/service/field-mapper.service.ts +266 -266
  200. package/src/module/mapper/service/mapper.service.ts +79 -79
  201. package/src/module/master/controller/master.controller.ts +74 -74
  202. package/src/module/master/service/master.service.ts +483 -483
  203. package/src/module/meta/controller/app-master.controller.ts +38 -38
  204. package/src/module/meta/controller/attribute-master.controller.ts +66 -66
  205. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  206. package/src/module/meta/controller/entity-master.controller.ts +28 -28
  207. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  208. package/src/module/meta/controller/entity.controller.ts +392 -392
  209. package/src/module/meta/controller/entity.public.controller.ts +75 -75
  210. package/src/module/meta/controller/media.controller.ts +107 -107
  211. package/src/module/meta/controller/meta.controller.ts +96 -96
  212. package/src/module/meta/controller/view-master.controller.ts +86 -86
  213. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  214. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  215. package/src/module/meta/dto/entity-table.dto.ts +9 -9
  216. package/src/module/meta/entity/app-master.entity.ts +34 -34
  217. package/src/module/meta/entity/attribute-master.entity.ts +89 -89
  218. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  219. package/src/module/meta/entity/entity-master.entity.ts +85 -85
  220. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  221. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  222. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  223. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  224. package/src/module/meta/entity/media-data.entity.ts +32 -32
  225. package/src/module/meta/entity/preference.entity.ts +62 -62
  226. package/src/module/meta/entity/view-master.entity.ts +41 -41
  227. package/src/module/meta/entity.module.ts +158 -158
  228. package/src/module/meta/repository/app-master.repository.ts +20 -20
  229. package/src/module/meta/repository/attribute-master.repository.ts +118 -118
  230. package/src/module/meta/repository/entity-master.repository.ts +69 -69
  231. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  232. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  233. package/src/module/meta/repository/media-data.repository.ts +50 -50
  234. package/src/module/meta/repository/preference.repository.ts +20 -20
  235. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  236. package/src/module/meta/repository/view-master.repository.ts +42 -42
  237. package/src/module/meta/service/app-master.service.ts +37 -37
  238. package/src/module/meta/service/attribute-master.service.ts +126 -126
  239. package/src/module/meta/service/common.service.ts +9 -9
  240. package/src/module/meta/service/entity-dynamic.service.ts +819 -819
  241. package/src/module/meta/service/entity-list.service.ts +205 -205
  242. package/src/module/meta/service/entity-master.service.ts +169 -169
  243. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  244. package/src/module/meta/service/entity-relation.service.ts +69 -69
  245. package/src/module/meta/service/entity-service-impl.service.ts +525 -525
  246. package/src/module/meta/service/entity-table-column.service.ts +39 -39
  247. package/src/module/meta/service/entity-table.service.ts +150 -150
  248. package/src/module/meta/service/entity-validation.service.ts +187 -187
  249. package/src/module/meta/service/entity.service.ts +67 -67
  250. package/src/module/meta/service/field-group.service.ts +103 -103
  251. package/src/module/meta/service/media-data.service.ts +507 -507
  252. package/src/module/meta/service/populate-meta.service.ts +193 -193
  253. package/src/module/meta/service/preference.service.ts +16 -16
  254. package/src/module/meta/service/resolver.service.ts +267 -267
  255. package/src/module/meta/service/section-master.service.ts +104 -104
  256. package/src/module/meta/service/update-form-json.service.ts +22 -22
  257. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  258. package/src/module/meta/service/view-master.service.ts +127 -127
  259. package/src/module/microservice-client/microservice-clients.module.ts +13 -13
  260. package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
  261. package/src/module/microservice-client/service/microservice-clients.ts +4 -4
  262. package/src/module/module/controller/menu.controller.ts +15 -15
  263. package/src/module/module/controller/module-access.controller.ts +134 -134
  264. package/src/module/module/entity/menu.entity.ts +43 -43
  265. package/src/module/module/entity/module-access.entity.ts +25 -25
  266. package/src/module/module/entity/module-action.entity.ts +17 -17
  267. package/src/module/module/entity/module.entity.ts +52 -52
  268. package/src/module/module/module.module.ts +42 -42
  269. package/src/module/module/repository/menu.repository.ts +184 -184
  270. package/src/module/module/repository/module-access.repository.ts +344 -344
  271. package/src/module/module/service/menu.service.ts +82 -82
  272. package/src/module/module/service/module-access.service.ts +209 -209
  273. package/src/module/notification/controller/notification.controller.ts +58 -58
  274. package/src/module/notification/controller/otp.controller.ts +117 -117
  275. package/src/module/notification/entity/notification.entity.ts +26 -26
  276. package/src/module/notification/entity/otp.entity.ts +28 -28
  277. package/src/module/notification/firebase-admin.config.ts +22 -22
  278. package/src/module/notification/notification.module.ts +69 -69
  279. package/src/module/notification/repository/otp.repository.ts +27 -27
  280. package/src/module/notification/service/email.service.ts +127 -127
  281. package/src/module/notification/service/notification.service.ts +163 -163
  282. package/src/module/notification/service/otp.service.ts +132 -132
  283. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  284. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  285. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  286. package/src/module/third-party-module/third-party.module.ts +12 -12
  287. package/src/module/user/controller/login.controller.ts +197 -197
  288. package/src/module/user/controller/user.controller.ts +40 -40
  289. package/src/module/user/dto/create-user.dto.ts +62 -62
  290. package/src/module/user/dto/update-user.dto.ts +4 -4
  291. package/src/module/user/entity/role.entity.ts +33 -33
  292. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  293. package/src/module/user/entity/user-session.entity.ts +73 -73
  294. package/src/module/user/entity/user.entity.ts +59 -59
  295. package/src/module/user/repository/role.repository.ts +96 -96
  296. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  297. package/src/module/user/repository/user.repository.ts +50 -50
  298. package/src/module/user/repository/userSession.repository.ts +33 -33
  299. package/src/module/user/service/login.service.ts +304 -304
  300. package/src/module/user/service/role.service.ts +189 -189
  301. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  302. package/src/module/user/service/user-session.service.ts +168 -168
  303. package/src/module/user/service/user.service.ts +365 -365
  304. package/src/module/user/user.module.ts +65 -65
  305. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  306. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  307. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  308. package/src/module/workflow/controller/action.controller.ts +111 -111
  309. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  310. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  311. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  312. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  313. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  314. package/src/module/workflow/controller/stage.controller.ts +50 -50
  315. package/src/module/workflow/controller/task.controller.ts +77 -77
  316. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  317. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  318. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  319. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  320. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  321. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  322. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  323. package/src/module/workflow/entity/action.entity.ts +50 -50
  324. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  325. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  326. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  327. package/src/module/workflow/entity/form.entity.ts +25 -25
  328. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  329. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  330. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  331. package/src/module/workflow/entity/stage.entity.ts +20 -20
  332. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  333. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  334. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  335. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  336. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  337. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  338. package/src/module/workflow/repository/action-data.repository.ts +333 -333
  339. package/src/module/workflow/repository/action.repository.ts +323 -323
  340. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  341. package/src/module/workflow/repository/comm-template.repository.ts +149 -149
  342. package/src/module/workflow/repository/form-master.repository.ts +59 -59
  343. package/src/module/workflow/repository/stage-group.repository.ts +176 -176
  344. package/src/module/workflow/repository/stage-movement.repository.ts +244 -244
  345. package/src/module/workflow/repository/stage.repository.ts +172 -172
  346. package/src/module/workflow/repository/task.repository.ts +127 -127
  347. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  348. package/src/module/workflow/service/action-category.service.ts +33 -33
  349. package/src/module/workflow/service/action-data.service.ts +62 -62
  350. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  351. package/src/module/workflow/service/action-template-mapping.service.ts +106 -106
  352. package/src/module/workflow/service/action.service.ts +279 -279
  353. package/src/module/workflow/service/activity-log.service.ts +107 -107
  354. package/src/module/workflow/service/comm-template.service.ts +180 -180
  355. package/src/module/workflow/service/entity-modification.service.ts +67 -67
  356. package/src/module/workflow/service/form-master.service.ts +35 -35
  357. package/src/module/workflow/service/populate-workflow.service.ts +303 -303
  358. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  359. package/src/module/workflow/service/stage-group.service.ts +319 -319
  360. package/src/module/workflow/service/stage.service.ts +199 -199
  361. package/src/module/workflow/service/task.service.ts +560 -560
  362. package/src/module/workflow/service/workflow-list-master.service.ts +60 -60
  363. package/src/module/workflow/service/workflow-meta.service.ts +654 -640
  364. package/src/module/workflow/service/workflow.service.ts +205 -205
  365. package/src/module/workflow/workflow.module.ts +176 -176
  366. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +21 -21
  367. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  368. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +35 -35
  369. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  370. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  371. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  372. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +214 -214
  373. package/src/module/workflow-automation/service/workflow-automation.service.ts +347 -347
  374. package/src/module/workflow-automation/workflow-automation.module.ts +34 -34
  375. package/src/resources/dev.properties.yaml +30 -31
  376. package/src/resources/local.properties.yaml +27 -27
  377. package/src/resources/properties.module.ts +12 -12
  378. package/src/resources/properties.yaml.ts +11 -11
  379. package/src/resources/uat.properties.yaml +31 -31
  380. package/src/table.config.ts +126 -126
  381. package/src/utils/dto/excel-data.dto.ts +14 -14
  382. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  383. package/src/utils/service/base64util.service.ts +18 -18
  384. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  385. package/src/utils/service/codeGenerator.service.ts +22 -22
  386. package/src/utils/service/dateUtil.service.ts +17 -17
  387. package/src/utils/service/encryptUtil.service.ts +97 -97
  388. package/src/utils/service/excel-helper.service.ts +72 -72
  389. package/src/utils/service/excelUtil.service.ts +15 -15
  390. package/src/utils/service/file-util.service.ts +11 -11
  391. package/src/utils/service/json-util.service.ts +23 -23
  392. package/src/utils/service/loggingUtil.service.ts +34 -34
  393. package/src/utils/service/reflection-helper.service.ts +62 -62
  394. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  395. package/src/utils/utils.module.ts +25 -25
  396. package/tsconfig.build.json +4 -4
  397. package/tsconfig.json +24 -24
  398. package/.claude/settings.local.json +0 -26
  399. package/.idea/250218_nodejs_core.iml +0 -9
  400. package/.idea/codeStyles/Project.xml +0 -59
  401. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  402. package/.idea/copilot.data.migration.agent.xml +0 -6
  403. package/.idea/copilot.data.migration.ask.xml +0 -6
  404. package/.idea/copilot.data.migration.ask2agent.xml +0 -6
  405. package/.idea/copilot.data.migration.edit.xml +0 -6
  406. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  407. package/.idea/misc.xml +0 -6
  408. package/.idea/modules.xml +0 -8
  409. package/.idea/prettier.xml +0 -6
  410. package/.idea/vcs.xml +0 -6
  411. package/server.log +0 -850
@@ -1,365 +1,365 @@
1
- import { RoleService } from './role.service';
2
- import {
3
- BadRequestException,
4
- ForbiddenException,
5
- Inject,
6
- Injectable,
7
- } from '@nestjs/common';
8
- import { EntityServiceImpl } from '../../meta/service/entity-service-impl.service';
9
- import { UserData } from '../entity/user.entity';
10
- import { BaseEntity } from '../../meta/entity/base-entity.entity';
11
- import { UserRepository } from '../repository/user.repository';
12
- import { EncryptUtilService } from '../../../utils/service/encryptUtil.service';
13
- import { ClockIDGenService } from '../../../utils/service/clockIDGenUtil.service';
14
- import {
15
- ENTITYTYPE_ROLE,
16
- STATUS_ACTIVE,
17
- INVITATION_STATUS_SENT,
18
- } from '../../../constant/global.constant';
19
- import { CreateUserDto } from '../dto/create-user.dto';
20
- import { UserRoleMappingService } from './user-role-mapping.service';
21
- import { UserRoleMapping } from '../entity/user-role-mapping.entity';
22
- import { EntityManager, Repository } from 'typeorm';
23
- import { UpdateUserDto } from '../dto/update-user.dto';
24
- import { ConfigService } from '@nestjs/config';
25
- // import { UserAppMappingService } from 'src/module/meta/service/user-app-mapping.service';
26
- import { ServiceResult } from 'src/dtos/response.dto';
27
- import { ListMasterService } from 'src/module/listmaster/service/list-master.service';
28
- import { OrganizationRepository } from 'src/module/enterprise/repository/organization.repository';
29
- import { InjectRepository } from '@nestjs/typeorm';
30
- import { Action } from 'src/module/workflow-automation/interface/action.interface';
31
- import { ActionHandler } from 'src/module/workflow-automation/interface/action.decorator';
32
-
33
- @Injectable()
34
- @ActionHandler('User')
35
- export class UserService extends EntityServiceImpl implements Action {
36
- constructor(
37
- private userRepository: UserRepository,
38
- private userRoleMappingService: UserRoleMappingService,
39
- private readonly clockIDGenService: ClockIDGenService,
40
- private configService: ConfigService,
41
- private readonly organizationRepository: OrganizationRepository,
42
- // private readonly userAppMappingService: UserAppMappingService,
43
- @Inject('RoleService') private readonly roleService: RoleService,
44
- @Inject('ListMasterService')
45
- private readonly listMasterService: ListMasterService,
46
- ) {
47
- super();
48
- }
49
-
50
- masterKey = this.configService.get('MASTER_KEY') || '';
51
- masterIv = this.configService.get('MASTER_IV') || '';
52
-
53
- async createEntity(
54
- entityData: BaseEntity,
55
- loggedInUser: UserData | null,
56
- manager?: EntityManager,
57
- ): Promise<ServiceResult<BaseEntity>> {
58
- const userData = entityData as CreateUserDto;
59
-
60
- let existingUser = await this.userRepository.findByEmailId(
61
- userData.email_id,
62
- loggedInUser?.organization_id,
63
- );
64
- if (existingUser) {
65
- return { success: false, error: 'User with this email already exists' };
66
- }
67
-
68
- existingUser = await this.userRepository.findByMobile(
69
- userData.mobile,
70
- loggedInUser?.organization_id,
71
- );
72
- if (existingUser) {
73
- return { success: false, error: 'User with this mobile already exists' };
74
- }
75
-
76
- const resolveStatus = await this.listMasterService.getResolvedListCode(
77
- STATUS_ACTIVE,
78
- loggedInUser?.organization_id || 0,
79
- );
80
-
81
- const resolvedInvitationStatus =
82
- await this.listMasterService.getResolvedListCode(
83
- INVITATION_STATUS_SENT,
84
- loggedInUser?.organization_id || 0,
85
- );
86
-
87
- userData.name =
88
- (userData.first_name || '') + ' ' + (userData.last_name || '');
89
- userData.password = EncryptUtilService.encryptGCM(
90
- userData.password || 'Admin@123',
91
- this.masterKey,
92
- this.masterIv,
93
- );
94
- userData.is_firstlogin = 1;
95
- userData.roles = [];
96
- userData.invitation_status = resolvedInvitationStatus.id;
97
- userData.status = resolveStatus.id || 'ACTIVE';
98
-
99
- const savedData = await super.createEntity(userData, loggedInUser);
100
-
101
- const insertPromises: Promise<UserRoleMapping | void | null | undefined>[] =
102
- [];
103
-
104
- for (const entry of userData.access || []) {
105
- const { level_type, level_ids, app_code, role_id } = entry;
106
-
107
- if (
108
- !level_type ||
109
- !Array.isArray(level_ids) ||
110
- !level_ids.length ||
111
- !app_code ||
112
- !role_id
113
- ) {
114
- return { success: false, error: 'Invalid access level entry' };
115
- }
116
-
117
- for (const levelId of level_ids) {
118
- const userRoleMapping = new UserRoleMapping(savedData.id, role_id);
119
- userRoleMapping.level_type = level_type;
120
- userRoleMapping.level_id = String(levelId);
121
- userRoleMapping.appcode = app_code;
122
- userRoleMapping.organization_id = loggedInUser?.organization_id || 0;
123
- insertPromises.push(
124
- this.userRoleMappingService.assignUserRole(userRoleMapping),
125
- );
126
- }
127
- }
128
-
129
- try {
130
- if (insertPromises.length > 0) {
131
- await Promise.all(insertPromises);
132
- }
133
- } catch (error) {
134
- console.error('Error adding access levels:', error);
135
- return { success: false, error: 'Failed to add access levels' };
136
- }
137
-
138
- return { success: true, data: savedData };
139
- }
140
-
141
- name: string = 'UserService';
142
- async execute(payload: any): Promise<any> {
143
- console.log('payload', payload);
144
- }
145
-
146
- async getEntityData(
147
- entityType: string,
148
- id: number,
149
- loggedInUser?: UserData,
150
- ): Promise<BaseEntity | null> {
151
- const user = await this.userRepository.findById(id);
152
- if (user) {
153
- const userRoleMappings: UserRoleMapping[] | null =
154
- await this.userRoleMappingService.findByUserId(id);
155
- if (userRoleMappings) {
156
- const userDto = user as unknown as CreateUserDto;
157
- const roles: any[] = [];
158
- for (const i in userRoleMappings) {
159
- const userRoleMapping = userRoleMappings[i];
160
- const roleId = userRoleMapping.role_id;
161
- const role = await super.getEntityData(
162
- ENTITYTYPE_ROLE,
163
- roleId,
164
- loggedInUser,
165
- );
166
- roles.push(role);
167
- }
168
- userDto.roles = roles;
169
- }
170
- return user;
171
- }
172
- return null;
173
- }
174
-
175
- async updateEntity(
176
- entityData: BaseEntity,
177
- loggedInUserData: UserData,
178
- ): Promise<ServiceResult<BaseEntity>> {
179
- const userDto = entityData as UpdateUserDto;
180
-
181
- const existingUser = await this.userRepository.findById(entityData.id);
182
-
183
- if (!existingUser) {
184
- return { success: false, error: 'User not found' };
185
- }
186
-
187
- if (userDto.password) {
188
- const decryptedPassword = EncryptUtilService.decryptGCM(
189
- existingUser.password,
190
- this.masterKey,
191
- this.masterIv,
192
- );
193
-
194
- if (decryptedPassword === userDto.password) {
195
- return {
196
- success: false,
197
- error: 'New password cannot be the same as the current password',
198
- };
199
- }
200
-
201
- userDto.password = EncryptUtilService.encryptGCM(
202
- userDto.password,
203
- this.masterKey,
204
- this.masterIv,
205
- );
206
- }
207
-
208
- const updatedUserData = { ...userDto } as any;
209
- delete updatedUserData.access;
210
-
211
- const savedData = await super.updateEntity(
212
- updatedUserData,
213
- loggedInUserData,
214
- );
215
-
216
- // Handle updated access levels
217
- if (userDto.access && userDto.access.length > 0) {
218
- if (loggedInUserData.level_type == 'ORG') {
219
- await this.userRoleMappingService.deleteByUserId(existingUser.id);
220
- } else {
221
- await this.userRoleMappingService.deleteByUserId(
222
- existingUser.id,
223
- loggedInUserData.level_type,
224
- loggedInUserData.level_id,
225
- );
226
- }
227
-
228
- const insertPromises: any[] = [];
229
-
230
- for (const entry of userDto.access) {
231
- const { level_type, level_ids, app_code, role_id } = entry;
232
-
233
- if (!level_type || !app_code || !role_id || !Array.isArray(level_ids)) {
234
- return { success: false, error: 'Invalid access level entry' };
235
- }
236
-
237
- for (const levelId of level_ids) {
238
- const userRoleMapping = new UserRoleMapping(savedData.id, role_id);
239
- userRoleMapping.level_type = level_type;
240
- userRoleMapping.level_id = String(levelId);
241
- userRoleMapping.appcode = app_code;
242
- userRoleMapping.organization_id =
243
- loggedInUserData?.organization_id || 0;
244
-
245
- insertPromises.push(
246
- this.userRoleMappingService.assignUserRole(userRoleMapping),
247
- );
248
- }
249
- }
250
-
251
- try {
252
- await Promise.all(insertPromises);
253
- } catch (error) {
254
- console.error('Error updating access levels:', error);
255
- return { success: false, error: 'Failed to update access levels' };
256
- }
257
- }
258
-
259
- return { success: true, data: savedData };
260
- }
261
-
262
- async findByEmailId(
263
- email_id: string,
264
- organization_id?: number,
265
- ): Promise<UserData | null> {
266
- return await this.userRepository.findByEmailId(email_id, organization_id);
267
- }
268
-
269
- async findByMobile(
270
- mobile: string,
271
- organization_id?: number,
272
- appCode?: string,
273
- ): Promise<UserData | null> {
274
- return await this.userRepository.findByMobile(
275
- mobile,
276
- organization_id,
277
- appCode,
278
- );
279
- }
280
-
281
- async setDefaultLastAccess(userId: number, appcode: string): Promise<void> {
282
- const user = await this.userRepository.findById(userId);
283
-
284
- if (!user) {
285
- throw new BadRequestException('User not found');
286
- }
287
-
288
- user.last_app_access = appcode;
289
-
290
- await this.userRepository.saveUser(user); // This persists the updated field
291
- }
292
-
293
- async setLastLevelTypeAndId(
294
- userId: number,
295
- levelType: string,
296
- levelId: string,
297
- appcode: string,
298
- ): Promise<void> {
299
- const user = await this.userRepository.findById(userId);
300
-
301
- if (!user) {
302
- throw new BadRequestException('User not found');
303
- }
304
-
305
- user.last_level_type = levelType;
306
- user.last_level_id = levelId;
307
- user.last_app_access = appcode;
308
-
309
- await this.userRepository.saveUser(user); // This persists the updated field
310
- }
311
-
312
- async checkEmailExists(data: {
313
- email_id: string;
314
- subdomain: string;
315
- }): Promise<any> {
316
- const { email_id, subdomain } = data;
317
-
318
- if (!email_id || !subdomain) {
319
- return { success: false, message: 'Email and Subdomain is required' };
320
- }
321
-
322
- let organization;
323
-
324
- if (subdomain) {
325
- organization =
326
- await this.organizationRepository.findOrganizationBySubdomain(
327
- subdomain,
328
- );
329
-
330
- if (!organization) {
331
- // throw new BadRequestException('Organization not found.');
332
- return {
333
- success: false,
334
- message: 'Organization not found.',
335
- };
336
- }
337
- }
338
-
339
- // 🔹 Step 2: Find the user by email + organization check
340
- const user = await this.userRepository.findByEmailId(email_id);
341
-
342
- if (!user || (organization && user.organization_id !== organization.id)) {
343
- // throw new BadRequestException('User not found in organization.');
344
- return {
345
- success: false,
346
- message: 'User not found in organization.',
347
- };
348
- }
349
-
350
- if (user) {
351
- return {
352
- success: true,
353
- message:
354
- 'An account already exists for this email address. Login or use a different email address to sign up.',
355
- userId: user.id,
356
- };
357
- } else {
358
- // throw new ForbiddenException('No account found with this email address.');
359
- return {
360
- success: false,
361
- message: 'No account found with this email address.',
362
- };
363
- }
364
- }
365
- }
1
+ import { RoleService } from './role.service';
2
+ import {
3
+ BadRequestException,
4
+ ForbiddenException,
5
+ Inject,
6
+ Injectable,
7
+ } from '@nestjs/common';
8
+ import { EntityServiceImpl } from '../../meta/service/entity-service-impl.service';
9
+ import { UserData } from '../entity/user.entity';
10
+ import { BaseEntity } from '../../meta/entity/base-entity.entity';
11
+ import { UserRepository } from '../repository/user.repository';
12
+ import { EncryptUtilService } from '../../../utils/service/encryptUtil.service';
13
+ import { ClockIDGenService } from '../../../utils/service/clockIDGenUtil.service';
14
+ import {
15
+ ENTITYTYPE_ROLE,
16
+ STATUS_ACTIVE,
17
+ INVITATION_STATUS_SENT,
18
+ } from '../../../constant/global.constant';
19
+ import { CreateUserDto } from '../dto/create-user.dto';
20
+ import { UserRoleMappingService } from './user-role-mapping.service';
21
+ import { UserRoleMapping } from '../entity/user-role-mapping.entity';
22
+ import { EntityManager, Repository } from 'typeorm';
23
+ import { UpdateUserDto } from '../dto/update-user.dto';
24
+ import { ConfigService } from '@nestjs/config';
25
+ // import { UserAppMappingService } from 'src/module/meta/service/user-app-mapping.service';
26
+ import { ServiceResult } from 'src/dtos/response.dto';
27
+ import { ListMasterService } from 'src/module/listmaster/service/list-master.service';
28
+ import { OrganizationRepository } from 'src/module/enterprise/repository/organization.repository';
29
+ import { InjectRepository } from '@nestjs/typeorm';
30
+ import { Action } from 'src/module/workflow-automation/interface/action.interface';
31
+ import { ActionHandler } from 'src/module/workflow-automation/interface/action.decorator';
32
+
33
+ @Injectable()
34
+ @ActionHandler('User')
35
+ export class UserService extends EntityServiceImpl implements Action {
36
+ constructor(
37
+ private userRepository: UserRepository,
38
+ private userRoleMappingService: UserRoleMappingService,
39
+ private readonly clockIDGenService: ClockIDGenService,
40
+ private configService: ConfigService,
41
+ private readonly organizationRepository: OrganizationRepository,
42
+ // private readonly userAppMappingService: UserAppMappingService,
43
+ @Inject('RoleService') private readonly roleService: RoleService,
44
+ @Inject('ListMasterService')
45
+ private readonly listMasterService: ListMasterService,
46
+ ) {
47
+ super();
48
+ }
49
+
50
+ masterKey = this.configService.get('MASTER_KEY') || '';
51
+ masterIv = this.configService.get('MASTER_IV') || '';
52
+
53
+ async createEntity(
54
+ entityData: BaseEntity,
55
+ loggedInUser: UserData | null,
56
+ manager?: EntityManager,
57
+ ): Promise<ServiceResult<BaseEntity>> {
58
+ const userData = entityData as CreateUserDto;
59
+
60
+ let existingUser = await this.userRepository.findByEmailId(
61
+ userData.email_id,
62
+ loggedInUser?.organization_id,
63
+ );
64
+ if (existingUser) {
65
+ return { success: false, error: 'User with this email already exists' };
66
+ }
67
+
68
+ existingUser = await this.userRepository.findByMobile(
69
+ userData.mobile,
70
+ loggedInUser?.organization_id,
71
+ );
72
+ if (existingUser) {
73
+ return { success: false, error: 'User with this mobile already exists' };
74
+ }
75
+
76
+ const resolveStatus = await this.listMasterService.getResolvedListCode(
77
+ STATUS_ACTIVE,
78
+ loggedInUser?.organization_id || 0,
79
+ );
80
+
81
+ const resolvedInvitationStatus =
82
+ await this.listMasterService.getResolvedListCode(
83
+ INVITATION_STATUS_SENT,
84
+ loggedInUser?.organization_id || 0,
85
+ );
86
+
87
+ userData.name =
88
+ (userData.first_name || '') + ' ' + (userData.last_name || '');
89
+ userData.password = EncryptUtilService.encryptGCM(
90
+ userData.password || 'Admin@123',
91
+ this.masterKey,
92
+ this.masterIv,
93
+ );
94
+ userData.is_firstlogin = 1;
95
+ userData.roles = [];
96
+ userData.invitation_status = resolvedInvitationStatus.id;
97
+ userData.status = resolveStatus.id || 'ACTIVE';
98
+
99
+ const savedData = await super.createEntity(userData, loggedInUser);
100
+
101
+ const insertPromises: Promise<UserRoleMapping | void | null | undefined>[] =
102
+ [];
103
+
104
+ for (const entry of userData.access || []) {
105
+ const { level_type, level_ids, app_code, role_id } = entry;
106
+
107
+ if (
108
+ !level_type ||
109
+ !Array.isArray(level_ids) ||
110
+ !level_ids.length ||
111
+ !app_code ||
112
+ !role_id
113
+ ) {
114
+ return { success: false, error: 'Invalid access level entry' };
115
+ }
116
+
117
+ for (const levelId of level_ids) {
118
+ const userRoleMapping = new UserRoleMapping(savedData.id, role_id);
119
+ userRoleMapping.level_type = level_type;
120
+ userRoleMapping.level_id = String(levelId);
121
+ userRoleMapping.appcode = app_code;
122
+ userRoleMapping.organization_id = loggedInUser?.organization_id || 0;
123
+ insertPromises.push(
124
+ this.userRoleMappingService.assignUserRole(userRoleMapping),
125
+ );
126
+ }
127
+ }
128
+
129
+ try {
130
+ if (insertPromises.length > 0) {
131
+ await Promise.all(insertPromises);
132
+ }
133
+ } catch (error) {
134
+ console.error('Error adding access levels:', error);
135
+ return { success: false, error: 'Failed to add access levels' };
136
+ }
137
+
138
+ return { success: true, data: savedData };
139
+ }
140
+
141
+ name: string = 'UserService';
142
+ async execute(payload: any): Promise<any> {
143
+ console.log('payload', payload);
144
+ }
145
+
146
+ async getEntityData(
147
+ entityType: string,
148
+ id: number,
149
+ loggedInUser?: UserData,
150
+ ): Promise<BaseEntity | null> {
151
+ const user = await this.userRepository.findById(id);
152
+ if (user) {
153
+ const userRoleMappings: UserRoleMapping[] | null =
154
+ await this.userRoleMappingService.findByUserId(id);
155
+ if (userRoleMappings) {
156
+ const userDto = user as unknown as CreateUserDto;
157
+ const roles: any[] = [];
158
+ for (const i in userRoleMappings) {
159
+ const userRoleMapping = userRoleMappings[i];
160
+ const roleId = userRoleMapping.role_id;
161
+ const role = await super.getEntityData(
162
+ ENTITYTYPE_ROLE,
163
+ roleId,
164
+ loggedInUser,
165
+ );
166
+ roles.push(role);
167
+ }
168
+ userDto.roles = roles;
169
+ }
170
+ return user;
171
+ }
172
+ return null;
173
+ }
174
+
175
+ async updateEntity(
176
+ entityData: BaseEntity,
177
+ loggedInUserData: UserData,
178
+ ): Promise<ServiceResult<BaseEntity>> {
179
+ const userDto = entityData as UpdateUserDto;
180
+
181
+ const existingUser = await this.userRepository.findById(entityData.id);
182
+
183
+ if (!existingUser) {
184
+ return { success: false, error: 'User not found' };
185
+ }
186
+
187
+ if (userDto.password) {
188
+ const decryptedPassword = EncryptUtilService.decryptGCM(
189
+ existingUser.password,
190
+ this.masterKey,
191
+ this.masterIv,
192
+ );
193
+
194
+ if (decryptedPassword === userDto.password) {
195
+ return {
196
+ success: false,
197
+ error: 'New password cannot be the same as the current password',
198
+ };
199
+ }
200
+
201
+ userDto.password = EncryptUtilService.encryptGCM(
202
+ userDto.password,
203
+ this.masterKey,
204
+ this.masterIv,
205
+ );
206
+ }
207
+
208
+ const updatedUserData = { ...userDto } as any;
209
+ delete updatedUserData.access;
210
+
211
+ const savedData = await super.updateEntity(
212
+ updatedUserData,
213
+ loggedInUserData,
214
+ );
215
+
216
+ // Handle updated access levels
217
+ if (userDto.access && userDto.access.length > 0) {
218
+ if (loggedInUserData.level_type == 'ORG') {
219
+ await this.userRoleMappingService.deleteByUserId(existingUser.id);
220
+ } else {
221
+ await this.userRoleMappingService.deleteByUserId(
222
+ existingUser.id,
223
+ loggedInUserData.level_type,
224
+ loggedInUserData.level_id,
225
+ );
226
+ }
227
+
228
+ const insertPromises: any[] = [];
229
+
230
+ for (const entry of userDto.access) {
231
+ const { level_type, level_ids, app_code, role_id } = entry;
232
+
233
+ if (!level_type || !app_code || !role_id || !Array.isArray(level_ids)) {
234
+ return { success: false, error: 'Invalid access level entry' };
235
+ }
236
+
237
+ for (const levelId of level_ids) {
238
+ const userRoleMapping = new UserRoleMapping(savedData.id, role_id);
239
+ userRoleMapping.level_type = level_type;
240
+ userRoleMapping.level_id = String(levelId);
241
+ userRoleMapping.appcode = app_code;
242
+ userRoleMapping.organization_id =
243
+ loggedInUserData?.organization_id || 0;
244
+
245
+ insertPromises.push(
246
+ this.userRoleMappingService.assignUserRole(userRoleMapping),
247
+ );
248
+ }
249
+ }
250
+
251
+ try {
252
+ await Promise.all(insertPromises);
253
+ } catch (error) {
254
+ console.error('Error updating access levels:', error);
255
+ return { success: false, error: 'Failed to update access levels' };
256
+ }
257
+ }
258
+
259
+ return { success: true, data: savedData };
260
+ }
261
+
262
+ async findByEmailId(
263
+ email_id: string,
264
+ organization_id?: number,
265
+ ): Promise<UserData | null> {
266
+ return await this.userRepository.findByEmailId(email_id, organization_id);
267
+ }
268
+
269
+ async findByMobile(
270
+ mobile: string,
271
+ organization_id?: number,
272
+ appCode?: string,
273
+ ): Promise<UserData | null> {
274
+ return await this.userRepository.findByMobile(
275
+ mobile,
276
+ organization_id,
277
+ appCode,
278
+ );
279
+ }
280
+
281
+ async setDefaultLastAccess(userId: number, appcode: string): Promise<void> {
282
+ const user = await this.userRepository.findById(userId);
283
+
284
+ if (!user) {
285
+ throw new BadRequestException('User not found');
286
+ }
287
+
288
+ user.last_app_access = appcode;
289
+
290
+ await this.userRepository.saveUser(user); // This persists the updated field
291
+ }
292
+
293
+ async setLastLevelTypeAndId(
294
+ userId: number,
295
+ levelType: string,
296
+ levelId: string,
297
+ appcode: string,
298
+ ): Promise<void> {
299
+ const user = await this.userRepository.findById(userId);
300
+
301
+ if (!user) {
302
+ throw new BadRequestException('User not found');
303
+ }
304
+
305
+ user.last_level_type = levelType;
306
+ user.last_level_id = levelId;
307
+ user.last_app_access = appcode;
308
+
309
+ await this.userRepository.saveUser(user); // This persists the updated field
310
+ }
311
+
312
+ async checkEmailExists(data: {
313
+ email_id: string;
314
+ subdomain: string;
315
+ }): Promise<any> {
316
+ const { email_id, subdomain } = data;
317
+
318
+ if (!email_id || !subdomain) {
319
+ return { success: false, message: 'Email and Subdomain is required' };
320
+ }
321
+
322
+ let organization;
323
+
324
+ if (subdomain) {
325
+ organization =
326
+ await this.organizationRepository.findOrganizationBySubdomain(
327
+ subdomain,
328
+ );
329
+
330
+ if (!organization) {
331
+ // throw new BadRequestException('Organization not found.');
332
+ return {
333
+ success: false,
334
+ message: 'Organization not found.',
335
+ };
336
+ }
337
+ }
338
+
339
+ // 🔹 Step 2: Find the user by email + organization check
340
+ const user = await this.userRepository.findByEmailId(email_id);
341
+
342
+ if (!user || (organization && user.organization_id !== organization.id)) {
343
+ // throw new BadRequestException('User not found in organization.');
344
+ return {
345
+ success: false,
346
+ message: 'User not found in organization.',
347
+ };
348
+ }
349
+
350
+ if (user) {
351
+ return {
352
+ success: true,
353
+ message:
354
+ 'An account already exists for this email address. Login or use a different email address to sign up.',
355
+ userId: user.id,
356
+ };
357
+ } else {
358
+ // throw new ForbiddenException('No account found with this email address.');
359
+ return {
360
+ success: false,
361
+ message: 'No account found with this email address.',
362
+ };
363
+ }
364
+ }
365
+ }