rez_core 5.0.29 → 5.0.30

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