rez_core 4.0.111 → 4.0.112

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 (386) hide show
  1. package/.idea/250218_nodejs_core.iml +11 -8
  2. package/.idea/codeStyles/Project.xml +58 -58
  3. package/.idea/codeStyles/codeStyleConfig.xml +4 -4
  4. package/.idea/inspectionProfiles/Project_Default.xml +1 -1
  5. package/.idea/modules.xml +7 -7
  6. package/.idea/prettier.xml +5 -5
  7. package/.idea/vcs.xml +5 -5
  8. package/.prettierrc +3 -3
  9. package/README.md +99 -99
  10. package/dist/module/auth/guards/role.guard.js +3 -3
  11. package/dist/module/auth/services/auth.service.js +2 -2
  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/examples/usage.example.js +9 -9
  16. package/dist/module/integration/service/integration.service.js +1 -1
  17. package/dist/module/integration/service/wrapper.service.js +25 -25
  18. package/dist/module/listmaster/service/list-master-item.service.js +2 -2
  19. package/dist/module/mapper/service/field-mapper.service.js +4 -4
  20. package/dist/module/mapper/service/mapper.service.js +2 -2
  21. package/dist/module/meta/service/entity-dynamic.service.js +9 -9
  22. package/dist/module/meta/service/entity-list.service.js +3 -3
  23. package/dist/module/meta/service/entity-master.service.js +3 -3
  24. package/dist/module/meta/service/entity-relation.service.js +11 -11
  25. package/dist/module/meta/service/entity-service-impl.service.js +3 -3
  26. package/dist/module/meta/service/resolver.service.js +3 -3
  27. package/dist/module/module/repository/menu.repository.js +12 -12
  28. package/dist/module/notification/service/notification.service.js +9 -9
  29. package/dist/module/user/controller/login.controller.js +18 -18
  30. package/dist/module/user/service/role.service.js +4 -4
  31. package/dist/module/user/service/user-session.service.js +2 -2
  32. package/dist/module/workflow/repository/action.repository.js +20 -20
  33. package/dist/module/workflow/repository/comm-template.repository.js +6 -6
  34. package/dist/module/workflow/repository/form-master.repository.js +2 -2
  35. package/dist/module/workflow/repository/stage-group.repository.js +23 -23
  36. package/dist/module/workflow/repository/stage-movement.repository.js +15 -15
  37. package/dist/module/workflow/repository/stage.repository.js +8 -8
  38. package/dist/module/workflow/service/action-template-mapping.service.js +22 -22
  39. package/dist/module/workflow/service/action.service.js +7 -7
  40. package/dist/module/workflow/service/entity-modification.service.js +6 -6
  41. package/dist/module/workflow/service/stage-group.service.js +2 -2
  42. package/dist/module/workflow/service/stage.service.js +2 -2
  43. package/dist/module/workflow/service/task.service.js +28 -28
  44. package/dist/module/workflow/service/workflow-list-master.service.js +15 -15
  45. package/dist/module/workflow/service/workflow-meta.service.js +35 -35
  46. package/dist/module/workflow/service/workflow.service.js +2 -2
  47. package/dist/tsconfig.build.tsbuildinfo +1 -1
  48. package/dist/utils/service/reflection-helper.service.js +2 -2
  49. package/docs/modules/event-driven-integration-design.md +91 -91
  50. package/docs/modules/integration.md +250 -250
  51. package/eslint.config.mjs +34 -34
  52. package/nest-cli.json +14 -14
  53. package/package.json +119 -119
  54. package/src/app.controller.ts +12 -12
  55. package/src/app.module.ts +52 -52
  56. package/src/app.service.ts +8 -8
  57. package/src/config/config.module.ts +18 -18
  58. package/src/config/database.config.ts +23 -23
  59. package/src/constant/global.constant.ts +67 -67
  60. package/src/core.module.ts +81 -81
  61. package/src/decorators/roles.decorator.ts +7 -7
  62. package/src/dtos/response.dto.ts +6 -6
  63. package/src/dtos/response.ts +5 -5
  64. package/src/index.ts +1 -1
  65. package/src/module/auth/auth.module.ts +49 -49
  66. package/src/module/auth/controller/auth.controller.ts +28 -28
  67. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  68. package/src/module/auth/guards/jwt.guard.ts +22 -22
  69. package/src/module/auth/guards/role.guard.ts +68 -68
  70. package/src/module/auth/services/auth.service.ts +50 -50
  71. package/src/module/auth/services/jwt.service.ts +11 -11
  72. package/src/module/auth/strategies/google.strategy.ts +54 -54
  73. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  74. package/src/module/auth/strategies/local.strategy.ts +13 -13
  75. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  76. package/src/module/dashboard/dashboard.module.ts +21 -21
  77. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  78. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  79. package/src/module/dashboard/repository/dashboard.repository.ts +42 -42
  80. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  81. package/src/module/dev/dev.module.ts +12 -12
  82. package/src/module/dev/service/dev.service.ts +7 -7
  83. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  84. package/src/module/enterprise/enterprise.module.ts +30 -30
  85. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  86. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  87. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  88. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  89. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  90. package/src/module/enterprise/repository/school.repository.ts +278 -278
  91. package/src/module/enterprise/service/brand.service.ts +5 -5
  92. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  93. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  94. package/src/module/enterprise/service/organization.service.ts +145 -145
  95. package/src/module/filter/controller/filter.controller.ts +84 -84
  96. package/src/module/filter/dto/filter-request.dto.ts +38 -38
  97. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  98. package/src/module/filter/entity/saved-filter-master.entity.ts +23 -23
  99. package/src/module/filter/filter.module.ts +31 -31
  100. package/src/module/filter/repository/saved-filter.repository.ts +168 -168
  101. package/src/module/filter/service/filter-evaluator.service.ts +86 -86
  102. package/src/module/filter/service/filter.service.ts +1004 -1004
  103. package/src/module/filter/service/saved-filter.service.ts +170 -170
  104. package/src/module/ics/controller/ics.controller.ts +21 -21
  105. package/src/module/ics/dto/ics.dto.ts +55 -55
  106. package/src/module/ics/ics.module.ts +13 -13
  107. package/src/module/ics/service/ics.service.ts +57 -57
  108. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  109. package/src/module/integration/controller/integration.controller.ts +662 -662
  110. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  111. package/src/module/integration/dto/create-config.dto.ts +526 -526
  112. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  113. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  114. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  115. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  116. package/src/module/integration/examples/usage.example.ts +338 -338
  117. package/src/module/integration/factories/base.factory.ts +7 -7
  118. package/src/module/integration/factories/email.factory.ts +49 -49
  119. package/src/module/integration/factories/integration.factory.ts +121 -121
  120. package/src/module/integration/factories/sms.factory.ts +51 -51
  121. package/src/module/integration/factories/telephone.factory.ts +41 -41
  122. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  123. package/src/module/integration/integration.module.ts +110 -110
  124. package/src/module/integration/service/calendar-event.service.ts +118 -118
  125. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  126. package/src/module/integration/service/integration-queue.service.ts +229 -229
  127. package/src/module/integration/service/integration.service.ts +2633 -2633
  128. package/src/module/integration/service/oauth.service.ts +224 -224
  129. package/src/module/integration/service/wrapper.service.ts +493 -493
  130. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  131. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  132. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  133. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  134. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  135. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  136. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  137. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  138. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  139. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  140. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  141. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  142. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  143. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  144. package/src/module/layout/controller/layout.controller.ts +47 -47
  145. package/src/module/layout/entity/header-items.entity.ts +28 -28
  146. package/src/module/layout/entity/header-section.entity.ts +19 -19
  147. package/src/module/layout/layout.module.ts +21 -21
  148. package/src/module/layout/repository/header-items.repository.ts +18 -18
  149. package/src/module/layout/repository/header-section.repository.ts +22 -22
  150. package/src/module/layout/service/header-section.service.ts +25 -25
  151. package/src/module/layout_preference/controller/layout_preference.controller.ts +73 -73
  152. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  153. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  154. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  155. package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
  156. package/src/module/lead/controller/lead.controller.ts +30 -30
  157. package/src/module/lead/lead.module.ts +14 -14
  158. package/src/module/lead/repository/lead.repository.ts +41 -41
  159. package/src/module/lead/service/lead.service.ts +54 -54
  160. package/src/module/listmaster/controller/list-master.controller.ts +230 -230
  161. package/src/module/listmaster/entity/list-master-items.entity.ts +43 -43
  162. package/src/module/listmaster/entity/list-master.entity.ts +33 -33
  163. package/src/module/listmaster/listmaster.module.ts +46 -46
  164. package/src/module/listmaster/repository/list-master-items.repository.ts +169 -169
  165. package/src/module/listmaster/repository/list-master.repository.ts +46 -46
  166. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  167. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  168. package/src/module/listmaster/service/list-master-item.service.ts +292 -292
  169. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  170. package/src/module/listmaster/service/list-master.service.ts +535 -535
  171. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  172. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  173. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  174. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  175. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  176. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  177. package/src/module/mapper/mapper.module.ts +34 -34
  178. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  179. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  180. package/src/module/mapper/repository/mapper.repository.ts +15 -15
  181. package/src/module/mapper/service/field-mapper.service.ts +266 -266
  182. package/src/module/mapper/service/mapper.service.ts +79 -79
  183. package/src/module/master/controller/master.controller.ts +74 -74
  184. package/src/module/master/service/master.service.ts +483 -483
  185. package/src/module/meta/controller/app-master.controller.ts +38 -38
  186. package/src/module/meta/controller/attribute-master.controller.ts +66 -66
  187. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  188. package/src/module/meta/controller/entity-master.controller.ts +28 -28
  189. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  190. package/src/module/meta/controller/entity.controller.ts +392 -392
  191. package/src/module/meta/controller/entity.public.controller.ts +75 -75
  192. package/src/module/meta/controller/media.controller.ts +107 -107
  193. package/src/module/meta/controller/meta.controller.ts +96 -96
  194. package/src/module/meta/controller/view-master.controller.ts +86 -86
  195. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  196. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  197. package/src/module/meta/dto/entity-table.dto.ts +9 -9
  198. package/src/module/meta/entity/app-master.entity.ts +34 -34
  199. package/src/module/meta/entity/attribute-master.entity.ts +89 -89
  200. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  201. package/src/module/meta/entity/entity-master.entity.ts +85 -85
  202. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  203. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  204. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  205. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  206. package/src/module/meta/entity/media-data.entity.ts +32 -32
  207. package/src/module/meta/entity/preference.entity.ts +62 -62
  208. package/src/module/meta/entity/view-master.entity.ts +41 -41
  209. package/src/module/meta/entity.module.ts +158 -158
  210. package/src/module/meta/repository/app-master.repository.ts +20 -20
  211. package/src/module/meta/repository/attribute-master.repository.ts +118 -118
  212. package/src/module/meta/repository/entity-master.repository.ts +69 -69
  213. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  214. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  215. package/src/module/meta/repository/media-data.repository.ts +50 -50
  216. package/src/module/meta/repository/preference.repository.ts +20 -20
  217. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  218. package/src/module/meta/repository/view-master.repository.ts +42 -42
  219. package/src/module/meta/service/app-master.service.ts +37 -37
  220. package/src/module/meta/service/attribute-master.service.ts +126 -126
  221. package/src/module/meta/service/common.service.ts +9 -9
  222. package/src/module/meta/service/entity-dynamic.service.ts +819 -819
  223. package/src/module/meta/service/entity-list.service.ts +205 -205
  224. package/src/module/meta/service/entity-master.service.ts +169 -169
  225. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  226. package/src/module/meta/service/entity-relation.service.ts +69 -69
  227. package/src/module/meta/service/entity-service-impl.service.ts +525 -525
  228. package/src/module/meta/service/entity-table-column.service.ts +39 -39
  229. package/src/module/meta/service/entity-table.service.ts +150 -150
  230. package/src/module/meta/service/entity-validation.service.ts +187 -187
  231. package/src/module/meta/service/entity.service.ts +67 -67
  232. package/src/module/meta/service/field-group.service.ts +103 -103
  233. package/src/module/meta/service/media-data.service.ts +507 -507
  234. package/src/module/meta/service/populate-meta.service.ts +193 -193
  235. package/src/module/meta/service/preference.service.ts +16 -16
  236. package/src/module/meta/service/resolver.service.ts +267 -267
  237. package/src/module/meta/service/section-master.service.ts +104 -104
  238. package/src/module/meta/service/update-form-json.service.ts +22 -22
  239. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  240. package/src/module/meta/service/view-master.service.ts +127 -127
  241. package/src/module/microservice-client/microservice-clients.module.ts +13 -13
  242. package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
  243. package/src/module/microservice-client/service/microservice-clients.ts +4 -4
  244. package/src/module/module/controller/menu.controller.ts +15 -15
  245. package/src/module/module/controller/module-access.controller.ts +134 -134
  246. package/src/module/module/entity/menu.entity.ts +43 -43
  247. package/src/module/module/entity/module-access.entity.ts +25 -25
  248. package/src/module/module/entity/module-action.entity.ts +17 -17
  249. package/src/module/module/entity/module.entity.ts +52 -52
  250. package/src/module/module/module.module.ts +42 -42
  251. package/src/module/module/repository/menu.repository.ts +184 -184
  252. package/src/module/module/repository/module-access.repository.ts +344 -344
  253. package/src/module/module/service/menu.service.ts +82 -82
  254. package/src/module/module/service/module-access.service.ts +209 -209
  255. package/src/module/notification/controller/notification.controller.ts +58 -58
  256. package/src/module/notification/controller/otp.controller.ts +117 -117
  257. package/src/module/notification/entity/notification.entity.ts +26 -26
  258. package/src/module/notification/entity/otp.entity.ts +28 -28
  259. package/src/module/notification/firebase-admin.config.ts +22 -22
  260. package/src/module/notification/notification.module.ts +69 -69
  261. package/src/module/notification/repository/otp.repository.ts +27 -27
  262. package/src/module/notification/service/email.service.ts +127 -127
  263. package/src/module/notification/service/notification.service.ts +163 -163
  264. package/src/module/notification/service/otp.service.ts +132 -132
  265. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  266. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  267. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  268. package/src/module/third-party-module/third-party.module.ts +12 -12
  269. package/src/module/user/controller/login.controller.ts +197 -197
  270. package/src/module/user/controller/user.controller.ts +40 -40
  271. package/src/module/user/dto/create-user.dto.ts +62 -62
  272. package/src/module/user/dto/update-user.dto.ts +4 -4
  273. package/src/module/user/entity/role.entity.ts +33 -33
  274. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  275. package/src/module/user/entity/user-session.entity.ts +73 -73
  276. package/src/module/user/entity/user.entity.ts +59 -59
  277. package/src/module/user/repository/role.repository.ts +96 -96
  278. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  279. package/src/module/user/repository/user.repository.ts +50 -50
  280. package/src/module/user/repository/userSession.repository.ts +33 -33
  281. package/src/module/user/service/login.service.ts +290 -290
  282. package/src/module/user/service/role.service.ts +189 -189
  283. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  284. package/src/module/user/service/user-session.service.ts +168 -168
  285. package/src/module/user/service/user.service.ts +365 -365
  286. package/src/module/user/user.module.ts +65 -65
  287. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  288. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  289. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  290. package/src/module/workflow/controller/action.controller.ts +111 -111
  291. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  292. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  293. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  294. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  295. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  296. package/src/module/workflow/controller/stage.controller.ts +50 -50
  297. package/src/module/workflow/controller/task.controller.ts +77 -77
  298. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  299. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  300. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  301. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  302. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  303. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  304. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  305. package/src/module/workflow/entity/action.entity.ts +50 -50
  306. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  307. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  308. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  309. package/src/module/workflow/entity/form.entity.ts +25 -25
  310. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  311. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  312. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  313. package/src/module/workflow/entity/stage.entity.ts +20 -20
  314. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  315. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  316. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  317. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  318. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  319. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  320. package/src/module/workflow/repository/action-data.repository.ts +333 -333
  321. package/src/module/workflow/repository/action.repository.ts +323 -323
  322. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  323. package/src/module/workflow/repository/comm-template.repository.ts +149 -149
  324. package/src/module/workflow/repository/form-master.repository.ts +59 -59
  325. package/src/module/workflow/repository/stage-group.repository.ts +176 -176
  326. package/src/module/workflow/repository/stage-movement.repository.ts +244 -244
  327. package/src/module/workflow/repository/stage.repository.ts +172 -172
  328. package/src/module/workflow/repository/task.repository.ts +127 -127
  329. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  330. package/src/module/workflow/service/action-category.service.ts +33 -33
  331. package/src/module/workflow/service/action-data.service.ts +62 -62
  332. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  333. package/src/module/workflow/service/action-template-mapping.service.ts +106 -106
  334. package/src/module/workflow/service/action.service.ts +279 -279
  335. package/src/module/workflow/service/activity-log.service.ts +107 -107
  336. package/src/module/workflow/service/comm-template.service.ts +180 -180
  337. package/src/module/workflow/service/entity-modification.service.ts +67 -67
  338. package/src/module/workflow/service/form-master.service.ts +35 -35
  339. package/src/module/workflow/service/populate-workflow.service.ts +303 -303
  340. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  341. package/src/module/workflow/service/stage-group.service.ts +319 -319
  342. package/src/module/workflow/service/stage.service.ts +199 -199
  343. package/src/module/workflow/service/task.service.ts +560 -560
  344. package/src/module/workflow/service/workflow-list-master.service.ts +60 -60
  345. package/src/module/workflow/service/workflow-meta.service.ts +640 -640
  346. package/src/module/workflow/service/workflow.service.ts +205 -205
  347. package/src/module/workflow/workflow.module.ts +176 -176
  348. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +21 -21
  349. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  350. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +35 -35
  351. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  352. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  353. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  354. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +214 -214
  355. package/src/module/workflow-automation/service/workflow-automation.service.ts +347 -347
  356. package/src/module/workflow-automation/workflow-automation.module.ts +34 -34
  357. package/src/resources/dev.properties.yaml +30 -30
  358. package/src/resources/local.properties.yaml +27 -27
  359. package/src/resources/properties.module.ts +12 -12
  360. package/src/resources/properties.yaml.ts +11 -11
  361. package/src/resources/uat.properties.yaml +31 -31
  362. package/src/table.config.ts +126 -126
  363. package/src/utils/dto/excel-data.dto.ts +14 -14
  364. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  365. package/src/utils/service/base64util.service.ts +18 -18
  366. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  367. package/src/utils/service/codeGenerator.service.ts +22 -22
  368. package/src/utils/service/dateUtil.service.ts +17 -17
  369. package/src/utils/service/encryptUtil.service.ts +97 -97
  370. package/src/utils/service/excel-helper.service.ts +72 -72
  371. package/src/utils/service/excelUtil.service.ts +15 -15
  372. package/src/utils/service/file-util.service.ts +11 -11
  373. package/src/utils/service/json-util.service.ts +23 -23
  374. package/src/utils/service/loggingUtil.service.ts +34 -34
  375. package/src/utils/service/reflection-helper.service.ts +62 -62
  376. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  377. package/src/utils/utils.module.ts +25 -25
  378. package/tsconfig.build.json +4 -4
  379. package/tsconfig.json +24 -24
  380. package/.claude/settings.local.json +0 -26
  381. package/.idea/copilot.data.migration.agent.xml +0 -6
  382. package/.idea/copilot.data.migration.ask.xml +0 -6
  383. package/.idea/copilot.data.migration.ask2agent.xml +0 -6
  384. package/.idea/copilot.data.migration.edit.xml +0 -6
  385. package/.idea/misc.xml +0 -6
  386. package/server.log +0 -850
@@ -1,344 +1,344 @@
1
- import { BadRequestException, Injectable } from '@nestjs/common';
2
- import { InjectRepository } from '@nestjs/typeorm';
3
- import { In, Not, Repository, IsNull, DataSource } from 'typeorm';
4
- import { Role } from 'src/module/user/entity/role.entity';
5
- import { ModuleAccess } from '../entity/module-access.entity';
6
- import { ModuleAction } from '../entity/module-action.entity';
7
- import { ModuleData } from '../entity/module.entity';
8
-
9
- @Injectable()
10
- export class ModuleAccessRepository {
11
- constructor(
12
- @InjectRepository(Role)
13
- private readonly roleRepo: Repository<Role>,
14
-
15
- @InjectRepository(ModuleData)
16
- private readonly moduleRepo: Repository<ModuleData>,
17
-
18
- @InjectRepository(ModuleAccess)
19
- private readonly moduleAccessRepo: Repository<ModuleAccess>,
20
-
21
- @InjectRepository(ModuleAction)
22
- private readonly moduleActionRepo: Repository<ModuleAction>,
23
-
24
- private readonly dataSource: DataSource,
25
- ) {}
26
-
27
- async getRoles({
28
- appcode,
29
- level_type,
30
- level_id,
31
- }: {
32
- appcode: string;
33
- level_type?: string;
34
- level_id?: number;
35
- }) {
36
- const query = this.dataSource
37
- .createQueryBuilder()
38
- .select('*')
39
- .from('sso_role', 'role')
40
- .where('role.appcode = :appcode', { appcode })
41
- .andWhere('(role.is_factory IS NULL OR role.is_factory != 1)');
42
-
43
- if (level_type) {
44
- query.andWhere('role.level_type = :level_type', { level_type });
45
- }
46
-
47
- if (level_id !== undefined) {
48
- query.andWhere('role.level_id = :level_id', {
49
- level_id: String(level_id),
50
- });
51
- }
52
-
53
- const roles = await query.getRawMany(); // use getRawMany since you're selecting from a raw table
54
-
55
- return roles.map((role) => ({
56
- label: role.name,
57
- value: role.id,
58
- }));
59
- }
60
-
61
- async getModules({
62
- appcode,
63
- loggedInUser,
64
- }: {
65
- appcode: string;
66
- loggedInUser: any;
67
- }) {
68
- let modules: any[];
69
- if (loggedInUser.level_type == 'SCH') {
70
- modules = await this.moduleRepo.find({
71
- where: { module_level: 'MAINMOD', appcode, level_type: 'SCH' },
72
- });
73
- } else {
74
- modules = await this.moduleRepo.find({
75
- where: { module_level: 'MAINMOD', appcode },
76
- });
77
- }
78
-
79
- return modules
80
- .map((mod) => ({
81
- label: mod.name,
82
- value: mod.id,
83
- group: mod.level_type,
84
- }))
85
- .sort((a, b) => a.group.localeCompare(b.group));
86
- }
87
-
88
- async getAccessListing(
89
- roleIds: (number | string)[],
90
- appcode: string,
91
- levelType: string,
92
- levelId?: number, // add levelId as input so we can fetch roles based on it
93
- ) {
94
- let roles;
95
-
96
- if (roleIds.length === 1 && roleIds[0] === -1) {
97
- // Internally call getRoles
98
- const fetchedRoles = await this.getRoles({
99
- appcode,
100
- level_type: levelType,
101
- level_id: levelId,
102
- });
103
-
104
- const fetchedRoleIds = fetchedRoles.map((r) => r.value);
105
- roles = await this.roleRepo.find({
106
- where: {
107
- id: In(fetchedRoleIds),
108
- appcode,
109
- },
110
- });
111
- } else {
112
- roles = await this.roleRepo.find({
113
- where: {
114
- id: In(roleIds.map((id) => Number(id))),
115
- appcode,
116
- },
117
- });
118
- }
119
-
120
- if (!roles.length) return [];
121
-
122
- const roleCodes = roles.map((role) => role.code);
123
-
124
- const moduleAccesses = await this.moduleAccessRepo.find({
125
- where: {
126
- role_code: In(roleCodes),
127
- appcode,
128
- },
129
- });
130
-
131
- return roles.map((role) => ({
132
- role_code: role.code,
133
- name: role.name,
134
- permission: moduleAccesses
135
- .filter((access) => access.role_code === role.code)
136
- .map((access) => ({
137
- action: access.action_type,
138
- access: access.access_flag,
139
- code: access.module_code,
140
- level_type: access.level_type,
141
- appcode: access.appcode,
142
- })),
143
- }));
144
- }
145
-
146
- async getAllModulesByLevel(mainModIds: string[], appcode: string, levelType) {
147
- const mainModules =
148
- mainModIds.length === 1 && mainModIds[0] === '-1'
149
- ? await this.moduleRepo.find({
150
- where: { module_level: 'MAINMOD', appcode },
151
- })
152
- : await this.moduleRepo.find({
153
- where: { id: In(mainModIds), module_level: 'MAINMOD', appcode },
154
- });
155
-
156
- if (!mainModules.length) return {};
157
-
158
- const wbsCodes = mainModules.map((mod) => mod.wbs_code);
159
-
160
- let allModules = await this.moduleRepo
161
- .createQueryBuilder('module')
162
- .where(
163
- wbsCodes
164
- .map((code) => `module.wbs_code LIKE :code${code}`)
165
- .join(' OR '),
166
- Object.fromEntries(wbsCodes.map((code) => [`code${code}`, `${code}%`])),
167
- )
168
- .andWhere('module.appcode = :appcode', { appcode })
169
- .andWhere('module.module_code != :excludedCode', {
170
- excludedCode: 'all_organization_adm_org',
171
- })
172
- .getMany();
173
-
174
- allModules = allModules.filter(
175
- (mod) => mod.module_code != 'all_organization_adm_org',
176
- );
177
-
178
- const moduleCodes = allModules.map((m) => m.module_code);
179
-
180
- const allActions = await this.moduleActionRepo.find({
181
- where: { module_code: In(moduleCodes) },
182
- });
183
-
184
- // Map actions by module_code with VIEW action first
185
- const actionMap = allActions.reduce(
186
- (acc, action) => {
187
- if (!acc[action.module_code]) acc[action.module_code] = [];
188
-
189
- const actionItem = {
190
- action: action.action_type,
191
- name: action.action_name,
192
- };
193
-
194
- if (action.action_type === 'VIEW') {
195
- acc[action.module_code].unshift(actionItem); // ➕ Add VIEW at start
196
- } else {
197
- acc[action.module_code].push(actionItem); // ➕ Add others at end
198
- }
199
-
200
- return acc;
201
- },
202
- {} as Record<string, { action: string; name: string }[]>,
203
- );
204
-
205
- const levelsToReturn = levelType === 'ORG' ? ['ORG', 'SCH'] : ['SCH'];
206
-
207
- const groupedByLevel: Record<string, any[]> = {};
208
-
209
- for (const lvl of levelsToReturn) {
210
- const filteredModules = allModules.filter((m) => m.level_type === lvl);
211
-
212
- const buildHierarchy = (parentWbs: string): any[] =>
213
- filteredModules
214
- .filter(
215
- (mod) =>
216
- mod.wbs_code.startsWith(`${parentWbs}.`) &&
217
- mod.wbs_code.split('.').length ===
218
- parentWbs.split('.').length + 1,
219
- )
220
- .map((mod) => ({
221
- name: mod.name,
222
- code: mod.module_code,
223
- permission: actionMap[mod.module_code] || [],
224
- submod: buildHierarchy(mod.wbs_code),
225
- }));
226
-
227
- const levelModules = mainModules
228
- .filter((mod) => mod.level_type === lvl)
229
- .map((mod) => ({
230
- name: mod.name,
231
- code: mod.module_code,
232
- permission: actionMap[mod.module_code] || [],
233
- submod: buildHierarchy(mod.wbs_code),
234
- }));
235
-
236
- if (levelModules.length) {
237
- groupedByLevel[lvl] = levelModules;
238
- }
239
- }
240
- return groupedByLevel;
241
- }
242
-
243
- async updateModuleAccess(
244
- accessList: {
245
- role_code: string;
246
- module_code: string;
247
- action_type: string;
248
- access_flag: number;
249
- appcode: string;
250
- level_type: string;
251
- }[],
252
- ): Promise<boolean> {
253
- try {
254
- for (const access of accessList) {
255
- const existing = await this.moduleAccessRepo.findOne({
256
- where: {
257
- role_code: access.role_code,
258
- module_code: access.module_code,
259
- action_type: access.action_type,
260
- appcode: access.appcode,
261
- level_type: access.level_type,
262
- },
263
- });
264
-
265
- if (existing) {
266
- existing.access_flag = access.access_flag;
267
- await this.moduleAccessRepo.save(existing);
268
- } else {
269
- await this.moduleAccessRepo.save(
270
- await this.moduleAccessRepo.create(access),
271
- );
272
- }
273
- }
274
- return true;
275
- } catch (error) {
276
- console.error('Error updating module access:', error);
277
- return false;
278
- }
279
- }
280
-
281
- async getModuleUIConfig(moduleCode: string, roleIds: number[]) {
282
- const module = await this.moduleRepo.findOne({
283
- where: { module_code: moduleCode },
284
- });
285
-
286
- if (!module) throw new BadRequestException('Module not found');
287
-
288
- const roles = await this.roleRepo.find({ where: { id: In(roleIds) } });
289
- const roleCodes = roles.map((role) => role.code);
290
-
291
- const actions = await this.moduleAccessRepo.find({
292
- where: {
293
- module_code: moduleCode,
294
- role_code: In(roleCodes),
295
- access_flag: 1,
296
- },
297
- });
298
-
299
- const uniqueActions = [...new Set(actions.map((a) => a.action_type))];
300
-
301
- return {
302
- entity_type: module.entity_type,
303
- title: module.title,
304
- ui_config: module.ui_config || {},
305
- action: uniqueActions,
306
- };
307
- }
308
- async getModuleAccessByRoles(roleIds: number[], appcode: string) {
309
- // Step 1: Get role codes from sso_role
310
- const roles = await this.roleRepo.find({
311
- where: {
312
- id: In(roleIds),
313
- appcode,
314
- },
315
- select: ['id', 'code'],
316
- });
317
-
318
- const roleCodes = roles.map((r) => r.code);
319
- if (!roleCodes.length) return [];
320
-
321
- // Step 2: Fetch full access data
322
- const accessRecords = await this.moduleAccessRepo
323
- .createQueryBuilder('access')
324
- .select([
325
- 'access.module_code AS module_code',
326
- 'access.action_type AS action_type',
327
- 'access.access_flag AS access_flag',
328
- 'access.level_type AS level_type',
329
- 'access.appcode AS appcode',
330
- ])
331
- .where('access.role_code IN (:...roleCodes)', { roleCodes })
332
- .andWhere('access.appcode = :appcode', { appcode })
333
- .getRawMany();
334
-
335
- // Step 3: Format output
336
- return accessRecords.map((record) => ({
337
- action: record.action_type,
338
- access: record.access_flag,
339
- code: record.module_code,
340
- level_type: record.level_type,
341
- appcode: record.appcode,
342
- }));
343
- }
344
- }
1
+ import { BadRequestException, Injectable } from '@nestjs/common';
2
+ import { InjectRepository } from '@nestjs/typeorm';
3
+ import { In, Not, Repository, IsNull, DataSource } from 'typeorm';
4
+ import { Role } from 'src/module/user/entity/role.entity';
5
+ import { ModuleAccess } from '../entity/module-access.entity';
6
+ import { ModuleAction } from '../entity/module-action.entity';
7
+ import { ModuleData } from '../entity/module.entity';
8
+
9
+ @Injectable()
10
+ export class ModuleAccessRepository {
11
+ constructor(
12
+ @InjectRepository(Role)
13
+ private readonly roleRepo: Repository<Role>,
14
+
15
+ @InjectRepository(ModuleData)
16
+ private readonly moduleRepo: Repository<ModuleData>,
17
+
18
+ @InjectRepository(ModuleAccess)
19
+ private readonly moduleAccessRepo: Repository<ModuleAccess>,
20
+
21
+ @InjectRepository(ModuleAction)
22
+ private readonly moduleActionRepo: Repository<ModuleAction>,
23
+
24
+ private readonly dataSource: DataSource,
25
+ ) {}
26
+
27
+ async getRoles({
28
+ appcode,
29
+ level_type,
30
+ level_id,
31
+ }: {
32
+ appcode: string;
33
+ level_type?: string;
34
+ level_id?: number;
35
+ }) {
36
+ const query = this.dataSource
37
+ .createQueryBuilder()
38
+ .select('*')
39
+ .from('sso_role', 'role')
40
+ .where('role.appcode = :appcode', { appcode })
41
+ .andWhere('(role.is_factory IS NULL OR role.is_factory != 1)');
42
+
43
+ if (level_type) {
44
+ query.andWhere('role.level_type = :level_type', { level_type });
45
+ }
46
+
47
+ if (level_id !== undefined) {
48
+ query.andWhere('role.level_id = :level_id', {
49
+ level_id: String(level_id),
50
+ });
51
+ }
52
+
53
+ const roles = await query.getRawMany(); // use getRawMany since you're selecting from a raw table
54
+
55
+ return roles.map((role) => ({
56
+ label: role.name,
57
+ value: role.id,
58
+ }));
59
+ }
60
+
61
+ async getModules({
62
+ appcode,
63
+ loggedInUser,
64
+ }: {
65
+ appcode: string;
66
+ loggedInUser: any;
67
+ }) {
68
+ let modules: any[];
69
+ if (loggedInUser.level_type == 'SCH') {
70
+ modules = await this.moduleRepo.find({
71
+ where: { module_level: 'MAINMOD', appcode, level_type: 'SCH' },
72
+ });
73
+ } else {
74
+ modules = await this.moduleRepo.find({
75
+ where: { module_level: 'MAINMOD', appcode },
76
+ });
77
+ }
78
+
79
+ return modules
80
+ .map((mod) => ({
81
+ label: mod.name,
82
+ value: mod.id,
83
+ group: mod.level_type,
84
+ }))
85
+ .sort((a, b) => a.group.localeCompare(b.group));
86
+ }
87
+
88
+ async getAccessListing(
89
+ roleIds: (number | string)[],
90
+ appcode: string,
91
+ levelType: string,
92
+ levelId?: number, // add levelId as input so we can fetch roles based on it
93
+ ) {
94
+ let roles;
95
+
96
+ if (roleIds.length === 1 && roleIds[0] === -1) {
97
+ // Internally call getRoles
98
+ const fetchedRoles = await this.getRoles({
99
+ appcode,
100
+ level_type: levelType,
101
+ level_id: levelId,
102
+ });
103
+
104
+ const fetchedRoleIds = fetchedRoles.map((r) => r.value);
105
+ roles = await this.roleRepo.find({
106
+ where: {
107
+ id: In(fetchedRoleIds),
108
+ appcode,
109
+ },
110
+ });
111
+ } else {
112
+ roles = await this.roleRepo.find({
113
+ where: {
114
+ id: In(roleIds.map((id) => Number(id))),
115
+ appcode,
116
+ },
117
+ });
118
+ }
119
+
120
+ if (!roles.length) return [];
121
+
122
+ const roleCodes = roles.map((role) => role.code);
123
+
124
+ const moduleAccesses = await this.moduleAccessRepo.find({
125
+ where: {
126
+ role_code: In(roleCodes),
127
+ appcode,
128
+ },
129
+ });
130
+
131
+ return roles.map((role) => ({
132
+ role_code: role.code,
133
+ name: role.name,
134
+ permission: moduleAccesses
135
+ .filter((access) => access.role_code === role.code)
136
+ .map((access) => ({
137
+ action: access.action_type,
138
+ access: access.access_flag,
139
+ code: access.module_code,
140
+ level_type: access.level_type,
141
+ appcode: access.appcode,
142
+ })),
143
+ }));
144
+ }
145
+
146
+ async getAllModulesByLevel(mainModIds: string[], appcode: string, levelType) {
147
+ const mainModules =
148
+ mainModIds.length === 1 && mainModIds[0] === '-1'
149
+ ? await this.moduleRepo.find({
150
+ where: { module_level: 'MAINMOD', appcode },
151
+ })
152
+ : await this.moduleRepo.find({
153
+ where: { id: In(mainModIds), module_level: 'MAINMOD', appcode },
154
+ });
155
+
156
+ if (!mainModules.length) return {};
157
+
158
+ const wbsCodes = mainModules.map((mod) => mod.wbs_code);
159
+
160
+ let allModules = await this.moduleRepo
161
+ .createQueryBuilder('module')
162
+ .where(
163
+ wbsCodes
164
+ .map((code) => `module.wbs_code LIKE :code${code}`)
165
+ .join(' OR '),
166
+ Object.fromEntries(wbsCodes.map((code) => [`code${code}`, `${code}%`])),
167
+ )
168
+ .andWhere('module.appcode = :appcode', { appcode })
169
+ .andWhere('module.module_code != :excludedCode', {
170
+ excludedCode: 'all_organization_adm_org',
171
+ })
172
+ .getMany();
173
+
174
+ allModules = allModules.filter(
175
+ (mod) => mod.module_code != 'all_organization_adm_org',
176
+ );
177
+
178
+ const moduleCodes = allModules.map((m) => m.module_code);
179
+
180
+ const allActions = await this.moduleActionRepo.find({
181
+ where: { module_code: In(moduleCodes) },
182
+ });
183
+
184
+ // Map actions by module_code with VIEW action first
185
+ const actionMap = allActions.reduce(
186
+ (acc, action) => {
187
+ if (!acc[action.module_code]) acc[action.module_code] = [];
188
+
189
+ const actionItem = {
190
+ action: action.action_type,
191
+ name: action.action_name,
192
+ };
193
+
194
+ if (action.action_type === 'VIEW') {
195
+ acc[action.module_code].unshift(actionItem); // ➕ Add VIEW at start
196
+ } else {
197
+ acc[action.module_code].push(actionItem); // ➕ Add others at end
198
+ }
199
+
200
+ return acc;
201
+ },
202
+ {} as Record<string, { action: string; name: string }[]>,
203
+ );
204
+
205
+ const levelsToReturn = levelType === 'ORG' ? ['ORG', 'SCH'] : ['SCH'];
206
+
207
+ const groupedByLevel: Record<string, any[]> = {};
208
+
209
+ for (const lvl of levelsToReturn) {
210
+ const filteredModules = allModules.filter((m) => m.level_type === lvl);
211
+
212
+ const buildHierarchy = (parentWbs: string): any[] =>
213
+ filteredModules
214
+ .filter(
215
+ (mod) =>
216
+ mod.wbs_code.startsWith(`${parentWbs}.`) &&
217
+ mod.wbs_code.split('.').length ===
218
+ parentWbs.split('.').length + 1,
219
+ )
220
+ .map((mod) => ({
221
+ name: mod.name,
222
+ code: mod.module_code,
223
+ permission: actionMap[mod.module_code] || [],
224
+ submod: buildHierarchy(mod.wbs_code),
225
+ }));
226
+
227
+ const levelModules = mainModules
228
+ .filter((mod) => mod.level_type === lvl)
229
+ .map((mod) => ({
230
+ name: mod.name,
231
+ code: mod.module_code,
232
+ permission: actionMap[mod.module_code] || [],
233
+ submod: buildHierarchy(mod.wbs_code),
234
+ }));
235
+
236
+ if (levelModules.length) {
237
+ groupedByLevel[lvl] = levelModules;
238
+ }
239
+ }
240
+ return groupedByLevel;
241
+ }
242
+
243
+ async updateModuleAccess(
244
+ accessList: {
245
+ role_code: string;
246
+ module_code: string;
247
+ action_type: string;
248
+ access_flag: number;
249
+ appcode: string;
250
+ level_type: string;
251
+ }[],
252
+ ): Promise<boolean> {
253
+ try {
254
+ for (const access of accessList) {
255
+ const existing = await this.moduleAccessRepo.findOne({
256
+ where: {
257
+ role_code: access.role_code,
258
+ module_code: access.module_code,
259
+ action_type: access.action_type,
260
+ appcode: access.appcode,
261
+ level_type: access.level_type,
262
+ },
263
+ });
264
+
265
+ if (existing) {
266
+ existing.access_flag = access.access_flag;
267
+ await this.moduleAccessRepo.save(existing);
268
+ } else {
269
+ await this.moduleAccessRepo.save(
270
+ await this.moduleAccessRepo.create(access),
271
+ );
272
+ }
273
+ }
274
+ return true;
275
+ } catch (error) {
276
+ console.error('Error updating module access:', error);
277
+ return false;
278
+ }
279
+ }
280
+
281
+ async getModuleUIConfig(moduleCode: string, roleIds: number[]) {
282
+ const module = await this.moduleRepo.findOne({
283
+ where: { module_code: moduleCode },
284
+ });
285
+
286
+ if (!module) throw new BadRequestException('Module not found');
287
+
288
+ const roles = await this.roleRepo.find({ where: { id: In(roleIds) } });
289
+ const roleCodes = roles.map((role) => role.code);
290
+
291
+ const actions = await this.moduleAccessRepo.find({
292
+ where: {
293
+ module_code: moduleCode,
294
+ role_code: In(roleCodes),
295
+ access_flag: 1,
296
+ },
297
+ });
298
+
299
+ const uniqueActions = [...new Set(actions.map((a) => a.action_type))];
300
+
301
+ return {
302
+ entity_type: module.entity_type,
303
+ title: module.title,
304
+ ui_config: module.ui_config || {},
305
+ action: uniqueActions,
306
+ };
307
+ }
308
+ async getModuleAccessByRoles(roleIds: number[], appcode: string) {
309
+ // Step 1: Get role codes from sso_role
310
+ const roles = await this.roleRepo.find({
311
+ where: {
312
+ id: In(roleIds),
313
+ appcode,
314
+ },
315
+ select: ['id', 'code'],
316
+ });
317
+
318
+ const roleCodes = roles.map((r) => r.code);
319
+ if (!roleCodes.length) return [];
320
+
321
+ // Step 2: Fetch full access data
322
+ const accessRecords = await this.moduleAccessRepo
323
+ .createQueryBuilder('access')
324
+ .select([
325
+ 'access.module_code AS module_code',
326
+ 'access.action_type AS action_type',
327
+ 'access.access_flag AS access_flag',
328
+ 'access.level_type AS level_type',
329
+ 'access.appcode AS appcode',
330
+ ])
331
+ .where('access.role_code IN (:...roleCodes)', { roleCodes })
332
+ .andWhere('access.appcode = :appcode', { appcode })
333
+ .getRawMany();
334
+
335
+ // Step 3: Format output
336
+ return accessRecords.map((record) => ({
337
+ action: record.action_type,
338
+ access: record.access_flag,
339
+ code: record.module_code,
340
+ level_type: record.level_type,
341
+ appcode: record.appcode,
342
+ }));
343
+ }
344
+ }