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,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
+ }