rez_core 3.1.155 → 3.1.156

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 (538) 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/app.module.js +2 -0
  17. package/dist/app.module.js.map +1 -1
  18. package/dist/config/config.module.js +2 -1
  19. package/dist/config/config.module.js.map +1 -1
  20. package/dist/config/database.config.js +1 -1
  21. package/dist/config/database.config.js.map +1 -1
  22. package/dist/main.js +10 -17
  23. package/dist/main.js.map +1 -1
  24. package/dist/module/auth/auth.module.js +0 -1
  25. package/dist/module/auth/auth.module.js.map +1 -1
  26. package/dist/module/auth/guards/role.guard.js +3 -3
  27. package/dist/module/auth/services/auth.service.js +2 -2
  28. package/dist/module/enterprise/enterprise.module.js +25 -7
  29. package/dist/module/enterprise/enterprise.module.js.map +1 -1
  30. package/dist/module/enterprise/entity/brand.entity.d.ts +0 -0
  31. package/dist/module/enterprise/entity/brand.entity.js +1 -0
  32. package/dist/module/enterprise/entity/brand.entity.js.map +1 -0
  33. package/dist/module/enterprise/entity/school.entity.d.ts +0 -0
  34. package/dist/module/enterprise/entity/school.entity.js +1 -0
  35. package/dist/module/enterprise/entity/school.entity.js.map +1 -0
  36. package/dist/module/enterprise/repository/brand.repository.d.ts +0 -0
  37. package/dist/module/enterprise/repository/brand.repository.js +1 -0
  38. package/dist/module/enterprise/repository/brand.repository.js.map +1 -0
  39. package/dist/module/enterprise/service/brand-profile.service.d.ts +4 -0
  40. package/dist/module/enterprise/service/brand-profile.service.js +25 -0
  41. package/dist/module/enterprise/service/brand-profile.service.js.map +1 -0
  42. package/dist/module/enterprise/service/brand.service.d.ts +4 -0
  43. package/dist/module/enterprise/service/brand.service.js +40 -1
  44. package/dist/module/enterprise/service/brand.service.js.map +1 -1
  45. package/dist/module/enterprise/service/organization.service.d.ts +6 -4
  46. package/dist/module/enterprise/service/organization.service.js +9 -5
  47. package/dist/module/enterprise/service/organization.service.js.map +1 -1
  48. package/dist/module/enterprise/service/school.service.d.ts +3 -0
  49. package/dist/module/enterprise/service/school.service.js +18 -0
  50. package/dist/module/enterprise/service/school.service.js.map +1 -0
  51. package/dist/module/filter/controller/filter.controller.js.map +1 -1
  52. package/dist/module/filter/dto/filter-request.dto.d.ts +0 -1
  53. package/dist/module/filter/repository/saved-filter.repository.js +4 -4
  54. package/dist/module/filter/service/filter-evaluator.service.js +2 -3
  55. package/dist/module/filter/service/filter-evaluator.service.js.map +1 -1
  56. package/dist/module/filter/service/filter.service.js +7 -7
  57. package/dist/module/ics/service/ics.service.d.ts +1 -1
  58. package/dist/module/ics/service/ics.service.js +2 -2
  59. package/dist/module/ics/service/ics.service.js.map +1 -1
  60. package/dist/module/integration/controller/wrapper.controller.d.ts +3 -3
  61. package/dist/module/integration/controller/wrapper.controller.js +4 -3
  62. package/dist/module/integration/controller/wrapper.controller.js.map +1 -1
  63. package/dist/module/integration/examples/usage.example.js +9 -9
  64. package/dist/module/integration/service/integration.service.js +2 -4
  65. package/dist/module/integration/service/integration.service.js.map +1 -1
  66. package/dist/module/integration/service/wrapper.service.d.ts +3 -3
  67. package/dist/module/integration/service/wrapper.service.js +36 -59
  68. package/dist/module/integration/service/wrapper.service.js.map +1 -1
  69. package/dist/module/listmaster/repository/list-master-items.repository.js +1 -1
  70. package/dist/module/listmaster/repository/list-master-items.repository.js.map +1 -1
  71. package/dist/module/listmaster/service/list-master-item.service.js +2 -2
  72. package/dist/module/listmaster/service/list-master.service.js +3 -4
  73. package/dist/module/listmaster/service/list-master.service.js.map +1 -1
  74. package/dist/module/mapper/controller/field-mapper.controller.js.map +1 -1
  75. package/dist/module/mapper/dto/field-mapper.dto.d.ts +1 -0
  76. package/dist/module/mapper/dto/field-mapper.dto.js.map +1 -1
  77. package/dist/module/mapper/service/field-mapper.service.js +4 -4
  78. package/dist/module/mapper/service/mapper.service.js +2 -2
  79. package/dist/module/meta/controller/media.controller.js +1 -1
  80. package/dist/module/meta/controller/media.controller.js.map +1 -1
  81. package/dist/module/meta/entity/brand-profile.entity.d.ts +3 -0
  82. package/dist/module/meta/entity/brand-profile.entity.js +18 -0
  83. package/dist/module/meta/entity/brand-profile.entity.js.map +1 -0
  84. package/dist/module/meta/entity/field-group.entity.d.ts +0 -0
  85. package/dist/module/meta/entity/field-group.entity.js +1 -0
  86. package/dist/module/meta/entity/field-group.entity.js.map +1 -0
  87. package/dist/module/meta/entity/school.entity.d.ts +8 -0
  88. package/dist/module/meta/entity/school.entity.js +44 -0
  89. package/dist/module/meta/entity/school.entity.js.map +1 -0
  90. package/dist/module/meta/entity/schoolAddress.entity.d.ts +9 -0
  91. package/dist/module/meta/entity/schoolAddress.entity.js +48 -0
  92. package/dist/module/meta/entity/schoolAddress.entity.js.map +1 -0
  93. package/dist/module/meta/entity/section-master.entity.d.ts +0 -0
  94. package/dist/module/meta/entity/section-master.entity.js +1 -0
  95. package/dist/module/meta/entity/section-master.entity.js.map +1 -0
  96. package/dist/module/meta/entity/user-app-mapping.entity.d.ts +0 -0
  97. package/dist/module/meta/entity/user-app-mapping.entity.js +1 -0
  98. package/dist/module/meta/entity/user-app-mapping.entity.js.map +1 -0
  99. package/dist/module/meta/entity.module.js +6 -0
  100. package/dist/module/meta/entity.module.js.map +1 -1
  101. package/dist/module/meta/service/entity-dynamic.service.js +18 -18
  102. package/dist/module/meta/service/entity-list.service.js +3 -3
  103. package/dist/module/meta/service/entity-master.service.js +3 -3
  104. package/dist/module/meta/service/entity-relation.service.js +11 -11
  105. package/dist/module/meta/service/entity-service-impl.service.js +4 -6
  106. package/dist/module/meta/service/entity-service-impl.service.js.map +1 -1
  107. package/dist/module/meta/service/entity-table.service.js.map +1 -1
  108. package/dist/module/meta/service/entity-validation.service.js.map +1 -1
  109. package/dist/module/meta/service/resolver.service.d.ts +2 -2
  110. package/dist/module/meta/service/resolver.service.js +4 -4
  111. package/dist/module/meta/service/resolver.service.js.map +1 -1
  112. package/dist/module/module/module.module.js.map +1 -1
  113. package/dist/module/module/repository/menu.repository.js +12 -12
  114. package/dist/module/module/repository/module-access.repository.js +1 -0
  115. package/dist/module/module/repository/module-access.repository.js.map +1 -1
  116. package/dist/module/module/service/module-access.service.js +1 -7
  117. package/dist/module/module/service/module-access.service.js.map +1 -1
  118. package/dist/module/notification/service/email.service.js +5 -10
  119. package/dist/module/notification/service/email.service.js.map +1 -1
  120. package/dist/module/notification/service/notification.service.js +12 -12
  121. package/dist/module/school/controller/school.controller.d.ts +0 -0
  122. package/dist/module/school/controller/school.controller.js +1 -0
  123. package/dist/module/school/controller/school.controller.js.map +1 -0
  124. package/dist/module/school/dto/school.dto.d.ts +2 -0
  125. package/dist/module/school/dto/school.dto.js +6 -0
  126. package/dist/module/school/dto/school.dto.js.map +1 -0
  127. package/dist/module/school/entity/school-address.entity.d.ts +12 -0
  128. package/dist/module/school/entity/school-address.entity.js +58 -0
  129. package/dist/module/school/entity/school-address.entity.js.map +1 -0
  130. package/dist/module/school/entity/school-board-affiliations.entity.d.ts +0 -0
  131. package/dist/module/school/entity/school-board-affiliations.entity.js +1 -0
  132. package/dist/module/school/entity/school-board-affiliations.entity.js.map +1 -0
  133. package/dist/module/school/entity/school-certification.entity.d.ts +0 -0
  134. package/dist/module/school/entity/school-certification.entity.js +1 -0
  135. package/dist/module/school/entity/school-certification.entity.js.map +1 -0
  136. package/dist/module/school/entity/school-contact.entity.d.ts +7 -0
  137. package/dist/module/school/entity/school-contact.entity.js +38 -0
  138. package/dist/module/school/entity/school-contact.entity.js.map +1 -0
  139. package/dist/module/school/entity/school-infrastructure.entity.d.ts +0 -0
  140. package/dist/module/school/entity/school-infrastructure.entity.js +1 -0
  141. package/dist/module/school/entity/school-infrastructure.entity.js.map +1 -0
  142. package/dist/module/school/entity/school-lead.entity.d.ts +0 -0
  143. package/dist/module/school/entity/school-lead.entity.js +1 -0
  144. package/dist/module/school/entity/school-lead.entity.js.map +1 -0
  145. package/dist/module/school/entity/school-operational-information.entity.d.ts +0 -0
  146. package/dist/module/school/entity/school-operational-information.entity.js +1 -0
  147. package/dist/module/school/entity/school-operational-information.entity.js.map +1 -0
  148. package/dist/module/school/entity/school-shift-time.entity.d.ts +0 -0
  149. package/dist/module/school/entity/school-shift-time.entity.js +1 -0
  150. package/dist/module/school/entity/school-shift-time.entity.js.map +1 -0
  151. package/dist/module/school/entity/school-shift.entity.d.ts +0 -0
  152. package/dist/module/school/entity/school-shift.entity.js +1 -0
  153. package/dist/module/school/entity/school-shift.entity.js.map +1 -0
  154. package/dist/module/school/entity/school.entity.d.ts +37 -0
  155. package/dist/module/school/entity/school.entity.js +158 -0
  156. package/dist/module/school/entity/school.entity.js.map +1 -0
  157. package/dist/module/school/repository/school-lead.repository.d.ts +0 -0
  158. package/dist/module/school/repository/school-lead.repository.js +1 -0
  159. package/dist/module/school/repository/school-lead.repository.js.map +1 -0
  160. package/dist/module/school/repository/school.repository.d.ts +17 -0
  161. package/dist/module/school/repository/school.repository.js +101 -0
  162. package/dist/module/school/repository/school.repository.js.map +1 -0
  163. package/dist/module/school/school.module.d.ts +2 -0
  164. package/dist/module/school/school.module.js +38 -0
  165. package/dist/module/school/school.module.js.map +1 -0
  166. package/dist/module/school/service/school-lead.service.d.ts +0 -0
  167. package/dist/module/school/service/school-lead.service.js +1 -0
  168. package/dist/module/school/service/school-lead.service.js.map +1 -0
  169. package/dist/module/school/service/school.service.d.ts +11 -0
  170. package/dist/module/school/service/school.service.js +144 -0
  171. package/dist/module/school/service/school.service.js.map +1 -0
  172. package/dist/module/user/controller/login.controller.js +18 -18
  173. package/dist/module/user/service/login.service.d.ts +2 -2
  174. package/dist/module/user/service/role.service.js +4 -4
  175. package/dist/module/user/service/user-session.service.js +2 -2
  176. package/dist/module/user/service/user-session.service.js.map +1 -1
  177. package/dist/module/user/service/user.service.d.ts +0 -4
  178. package/dist/module/user/service/user.service.js +0 -104
  179. package/dist/module/user/service/user.service.js.map +1 -1
  180. package/dist/module/workflow/repository/action.repository.js +16 -16
  181. package/dist/module/workflow/repository/activity-log.repository.d.ts +3 -2
  182. package/dist/module/workflow/repository/activity-log.repository.js +3 -2
  183. package/dist/module/workflow/repository/activity-log.repository.js.map +1 -1
  184. package/dist/module/workflow/repository/comm-template.repository.js +6 -6
  185. package/dist/module/workflow/repository/form-master.repository.js +2 -2
  186. package/dist/module/workflow/repository/stage-group.repository.js +23 -23
  187. package/dist/module/workflow/repository/stage-movement.repository.js +11 -11
  188. package/dist/module/workflow/repository/stage.repository.js +8 -8
  189. package/dist/module/workflow/repository/task.repository.js +0 -2
  190. package/dist/module/workflow/repository/task.repository.js.map +1 -1
  191. package/dist/module/workflow/service/action-template-mapping.service.js +10 -10
  192. package/dist/module/workflow/service/action.service.js +7 -7
  193. package/dist/module/workflow/service/entity-modification.service.js +6 -6
  194. package/dist/module/workflow/service/stage-group.service.js +5 -5
  195. package/dist/module/workflow/service/stage.service.js +2 -2
  196. package/dist/module/workflow/service/task.service.js +33 -33
  197. package/dist/module/workflow/service/workflow-list-master.service.js +15 -15
  198. package/dist/module/workflow/service/workflow-meta.service.js +50 -50
  199. package/dist/module/workflow/service/workflow.service.js +2 -2
  200. package/dist/resources/dev.properties.yaml +30 -0
  201. package/dist/resources/local.properties.yaml +27 -0
  202. package/dist/resources/uat.properties.yaml +16 -0
  203. package/dist/tsconfig.build.tsbuildinfo +1 -1
  204. package/dist/utils/service/reflection-helper.service.js +2 -2
  205. package/docs/modules/event-driven-integration-design.md +91 -91
  206. package/docs/modules/integration.md +250 -250
  207. package/eslint.config.mjs +34 -34
  208. package/nest-cli.json +14 -14
  209. package/package.json +118 -118
  210. package/server.log +850 -0
  211. package/src/app.controller.ts +12 -12
  212. package/src/app.module.ts +49 -49
  213. package/src/app.service.ts +8 -8
  214. package/src/config/config.module.ts +18 -18
  215. package/src/config/database.config.ts +23 -23
  216. package/src/constant/global.constant.ts +67 -67
  217. package/src/core.module.ts +81 -81
  218. package/src/decorators/roles.decorator.ts +7 -7
  219. package/src/dtos/response.dto.ts +6 -6
  220. package/src/dtos/response.ts +5 -5
  221. package/src/index.ts +1 -1
  222. package/src/module/auth/auth.module.ts +49 -49
  223. package/src/module/auth/controller/auth.controller.ts +28 -28
  224. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  225. package/src/module/auth/guards/jwt.guard.ts +22 -22
  226. package/src/module/auth/guards/role.guard.ts +68 -68
  227. package/src/module/auth/services/auth.service.ts +50 -50
  228. package/src/module/auth/services/jwt.service.ts +11 -11
  229. package/src/module/auth/strategies/google.strategy.ts +54 -54
  230. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  231. package/src/module/auth/strategies/local.strategy.ts +13 -13
  232. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  233. package/src/module/dashboard/dashboard.module.ts +21 -21
  234. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  235. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  236. package/src/module/dashboard/repository/dashboard.repository.ts +42 -42
  237. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  238. package/src/module/dev/dev.module.ts +12 -12
  239. package/src/module/dev/service/dev.service.ts +7 -7
  240. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  241. package/src/module/enterprise/enterprise.module.ts +30 -30
  242. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  243. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  244. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  245. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  246. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  247. package/src/module/enterprise/repository/school.repository.ts +281 -281
  248. package/src/module/enterprise/service/brand.service.ts +5 -5
  249. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  250. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  251. package/src/module/enterprise/service/organization.service.ts +145 -145
  252. package/src/module/filter/controller/filter.controller.ts +84 -84
  253. package/src/module/filter/dto/filter-request.dto.ts +38 -38
  254. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  255. package/src/module/filter/entity/saved-filter-master.entity.ts +23 -23
  256. package/src/module/filter/filter.module.ts +31 -31
  257. package/src/module/filter/repository/saved-filter.repository.ts +168 -168
  258. package/src/module/filter/service/filter-evaluator.service.ts +86 -86
  259. package/src/module/filter/service/filter.service.ts +841 -841
  260. package/src/module/filter/service/saved-filter.service.ts +170 -170
  261. package/src/module/ics/controller/ics.controller.ts +21 -21
  262. package/src/module/ics/dto/ics.dto.ts +55 -55
  263. package/src/module/ics/ics.module.ts +13 -13
  264. package/src/module/ics/service/ics.service.ts +57 -57
  265. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  266. package/src/module/integration/controller/integration.controller.ts +662 -662
  267. package/src/module/integration/controller/wrapper.controller.ts +37 -39
  268. package/src/module/integration/dto/create-config.dto.ts +526 -526
  269. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  270. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  271. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  272. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  273. package/src/module/integration/examples/usage.example.ts +338 -338
  274. package/src/module/integration/factories/base.factory.ts +7 -7
  275. package/src/module/integration/factories/email.factory.ts +49 -49
  276. package/src/module/integration/factories/integration.factory.ts +121 -121
  277. package/src/module/integration/factories/sms.factory.ts +51 -51
  278. package/src/module/integration/factories/telephone.factory.ts +41 -41
  279. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  280. package/src/module/integration/integration.module.ts +110 -110
  281. package/src/module/integration/service/calendar-event.service.ts +118 -118
  282. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  283. package/src/module/integration/service/integration-queue.service.ts +229 -229
  284. package/src/module/integration/service/integration.service.ts +2572 -2572
  285. package/src/module/integration/service/oauth.service.ts +224 -224
  286. package/src/module/integration/service/wrapper.service.ts +439 -513
  287. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  288. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  289. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  290. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  291. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  292. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  293. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  294. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  295. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  296. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  297. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  298. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  299. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  300. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  301. package/src/module/layout/controller/layout.controller.ts +47 -47
  302. package/src/module/layout/entity/header-items.entity.ts +28 -28
  303. package/src/module/layout/entity/header-section.entity.ts +19 -19
  304. package/src/module/layout/layout.module.ts +21 -21
  305. package/src/module/layout/repository/header-items.repository.ts +18 -18
  306. package/src/module/layout/repository/header-section.repository.ts +22 -22
  307. package/src/module/layout/service/header-section.service.ts +25 -25
  308. package/src/module/layout_preference/controller/layout_preference.controller.ts +47 -47
  309. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  310. package/src/module/layout_preference/layout_preference.module.ts +18 -18
  311. package/src/module/layout_preference/repository/layout_preference.repository.ts +30 -30
  312. package/src/module/layout_preference/service/layout_preference.service.ts +172 -172
  313. package/src/module/lead/controller/lead.controller.ts +30 -30
  314. package/src/module/lead/lead.module.ts +14 -14
  315. package/src/module/lead/repository/lead.repository.ts +41 -41
  316. package/src/module/lead/service/lead.service.ts +54 -54
  317. package/src/module/listmaster/controller/list-master.controller.ts +143 -143
  318. package/src/module/listmaster/entity/list-master-items.entity.ts +41 -41
  319. package/src/module/listmaster/entity/list-master.entity.ts +32 -32
  320. package/src/module/listmaster/listmaster.module.ts +44 -44
  321. package/src/module/listmaster/repository/list-master-items.repository.ts +169 -169
  322. package/src/module/listmaster/repository/list-master.repository.ts +46 -46
  323. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  324. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  325. package/src/module/listmaster/service/list-master-item.service.ts +292 -292
  326. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  327. package/src/module/listmaster/service/list-master.service.ts +375 -375
  328. package/src/module/mapper/controller/field-mapper.controller.ts +69 -69
  329. package/src/module/mapper/controller/mapper.controller.ts +14 -14
  330. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  331. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  332. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  333. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  334. package/src/module/mapper/mapper.module.ts +34 -34
  335. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  336. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  337. package/src/module/mapper/repository/mapper.repository.ts +15 -15
  338. package/src/module/mapper/service/field-mapper.service.ts +223 -223
  339. package/src/module/mapper/service/mapper.service.ts +72 -72
  340. package/src/module/master/controller/master.controller.ts +74 -74
  341. package/src/module/master/service/master.service.ts +483 -483
  342. package/src/module/meta/controller/app-master.controller.ts +38 -38
  343. package/src/module/meta/controller/attribute-master.controller.ts +66 -66
  344. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  345. package/src/module/meta/controller/entity-master.controller.ts +28 -28
  346. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  347. package/src/module/meta/controller/entity.controller.ts +385 -385
  348. package/src/module/meta/controller/media.controller.ts +82 -82
  349. package/src/module/meta/controller/meta.controller.ts +96 -96
  350. package/src/module/meta/controller/view-master.controller.ts +86 -86
  351. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  352. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  353. package/src/module/meta/dto/entity-table.dto.ts +9 -9
  354. package/src/module/meta/entity/app-master.entity.ts +34 -34
  355. package/src/module/meta/entity/attribute-master.entity.ts +87 -87
  356. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  357. package/src/module/meta/entity/entity-master.entity.ts +78 -78
  358. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  359. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  360. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  361. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  362. package/src/module/meta/entity/media-data.entity.ts +32 -32
  363. package/src/module/meta/entity/preference.entity.ts +62 -62
  364. package/src/module/meta/entity/view-master.entity.ts +41 -41
  365. package/src/module/meta/entity.module.ts +156 -156
  366. package/src/module/meta/repository/app-master.repository.ts +20 -20
  367. package/src/module/meta/repository/attribute-master.repository.ts +110 -110
  368. package/src/module/meta/repository/entity-master.repository.ts +69 -69
  369. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  370. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  371. package/src/module/meta/repository/media-data.repository.ts +50 -50
  372. package/src/module/meta/repository/preference.repository.ts +20 -20
  373. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  374. package/src/module/meta/repository/view-master.repository.ts +42 -42
  375. package/src/module/meta/service/app-master.service.ts +37 -37
  376. package/src/module/meta/service/attribute-master.service.ts +117 -117
  377. package/src/module/meta/service/common.service.ts +9 -9
  378. package/src/module/meta/service/entity-dynamic.service.ts +762 -762
  379. package/src/module/meta/service/entity-list.service.ts +205 -205
  380. package/src/module/meta/service/entity-master.service.ts +164 -164
  381. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  382. package/src/module/meta/service/entity-relation.service.ts +69 -69
  383. package/src/module/meta/service/entity-service-impl.service.ts +524 -524
  384. package/src/module/meta/service/entity-table-column.service.ts +39 -39
  385. package/src/module/meta/service/entity-table.service.ts +150 -150
  386. package/src/module/meta/service/entity-validation.service.ts +185 -185
  387. package/src/module/meta/service/entity.service.ts +67 -67
  388. package/src/module/meta/service/field-group.service.ts +103 -103
  389. package/src/module/meta/service/media-data.service.ts +140 -140
  390. package/src/module/meta/service/populate-meta.service.ts +173 -173
  391. package/src/module/meta/service/preference.service.ts +16 -16
  392. package/src/module/meta/service/resolver.service.ts +274 -274
  393. package/src/module/meta/service/section-master.service.ts +104 -104
  394. package/src/module/meta/service/update-form-json.service.ts +22 -22
  395. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  396. package/src/module/meta/service/view-master.service.ts +111 -111
  397. package/src/module/module/controller/menu.controller.ts +15 -15
  398. package/src/module/module/controller/module-access.controller.ts +132 -132
  399. package/src/module/module/entity/menu.entity.ts +43 -43
  400. package/src/module/module/entity/module-access.entity.ts +25 -25
  401. package/src/module/module/entity/module-action.entity.ts +17 -17
  402. package/src/module/module/entity/module.entity.ts +52 -52
  403. package/src/module/module/module.module.ts +42 -42
  404. package/src/module/module/repository/menu.repository.ts +184 -184
  405. package/src/module/module/repository/module-access.repository.ts +331 -331
  406. package/src/module/module/service/menu.service.ts +82 -82
  407. package/src/module/module/service/module-access.service.ts +209 -209
  408. package/src/module/notification/controller/notification.controller.ts +58 -58
  409. package/src/module/notification/controller/otp.controller.ts +117 -117
  410. package/src/module/notification/entity/notification.entity.ts +23 -23
  411. package/src/module/notification/entity/otp.entity.ts +28 -28
  412. package/src/module/notification/firebase-admin.config.ts +22 -22
  413. package/src/module/notification/notification.module.ts +69 -69
  414. package/src/module/notification/repository/otp.repository.ts +27 -27
  415. package/src/module/notification/service/email.service.ts +127 -127
  416. package/src/module/notification/service/notification.service.ts +138 -138
  417. package/src/module/notification/service/otp.service.ts +121 -121
  418. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  419. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  420. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  421. package/src/module/third-party-module/third-party.module.ts +12 -12
  422. package/src/module/user/controller/login.controller.ts +197 -197
  423. package/src/module/user/controller/user.controller.ts +40 -40
  424. package/src/module/user/dto/create-user.dto.ts +62 -62
  425. package/src/module/user/dto/update-user.dto.ts +4 -4
  426. package/src/module/user/entity/role.entity.ts +33 -33
  427. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  428. package/src/module/user/entity/user-session.entity.ts +61 -61
  429. package/src/module/user/entity/user.entity.ts +68 -68
  430. package/src/module/user/repository/role.repository.ts +96 -96
  431. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  432. package/src/module/user/repository/user.repository.ts +50 -50
  433. package/src/module/user/repository/userSession.repository.ts +33 -33
  434. package/src/module/user/service/login.service.ts +280 -280
  435. package/src/module/user/service/role.service.ts +189 -189
  436. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  437. package/src/module/user/service/user-session.service.ts +168 -168
  438. package/src/module/user/service/user.service.ts +353 -353
  439. package/src/module/user/user.module.ts +65 -65
  440. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  441. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  442. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  443. package/src/module/workflow/controller/action.controller.ts +95 -95
  444. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  445. package/src/module/workflow/controller/comm-template.controller.ts +34 -34
  446. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  447. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  448. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  449. package/src/module/workflow/controller/stage.controller.ts +50 -50
  450. package/src/module/workflow/controller/task.controller.ts +77 -77
  451. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  452. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  453. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  454. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  455. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  456. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  457. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  458. package/src/module/workflow/entity/action.entity.ts +50 -50
  459. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  460. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  461. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  462. package/src/module/workflow/entity/form.entity.ts +25 -25
  463. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  464. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  465. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  466. package/src/module/workflow/entity/stage.entity.ts +20 -20
  467. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  468. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  469. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  470. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  471. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  472. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  473. package/src/module/workflow/repository/action-data.repository.ts +219 -219
  474. package/src/module/workflow/repository/action.repository.ts +277 -277
  475. package/src/module/workflow/repository/activity-log.repository.ts +121 -121
  476. package/src/module/workflow/repository/comm-template.repository.ts +142 -142
  477. package/src/module/workflow/repository/form-master.repository.ts +59 -59
  478. package/src/module/workflow/repository/stage-group.repository.ts +176 -176
  479. package/src/module/workflow/repository/stage-movement.repository.ts +227 -227
  480. package/src/module/workflow/repository/stage.repository.ts +172 -172
  481. package/src/module/workflow/repository/task.repository.ts +113 -113
  482. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  483. package/src/module/workflow/service/action-category.service.ts +33 -33
  484. package/src/module/workflow/service/action-data.service.ts +62 -62
  485. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  486. package/src/module/workflow/service/action-template-mapping.service.ts +55 -55
  487. package/src/module/workflow/service/action.service.ts +263 -263
  488. package/src/module/workflow/service/activity-log.service.ts +107 -107
  489. package/src/module/workflow/service/comm-template.service.ts +121 -121
  490. package/src/module/workflow/service/entity-modification.service.ts +67 -67
  491. package/src/module/workflow/service/form-master.service.ts +35 -35
  492. package/src/module/workflow/service/populate-workflow.service.ts +303 -303
  493. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  494. package/src/module/workflow/service/stage-group.service.ts +300 -300
  495. package/src/module/workflow/service/stage.service.ts +199 -199
  496. package/src/module/workflow/service/task.service.ts +504 -504
  497. package/src/module/workflow/service/workflow-list-master.service.ts +60 -60
  498. package/src/module/workflow/service/workflow-meta.service.ts +581 -581
  499. package/src/module/workflow/service/workflow.service.ts +205 -205
  500. package/src/module/workflow/workflow.module.ts +172 -172
  501. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +21 -21
  502. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  503. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +35 -35
  504. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  505. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  506. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  507. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +214 -214
  508. package/src/module/workflow-automation/service/workflow-automation.service.ts +345 -345
  509. package/src/module/workflow-automation/workflow-automation.module.ts +34 -34
  510. package/src/resources/dev.properties.yaml +30 -30
  511. package/src/resources/local.properties.yaml +27 -27
  512. package/src/resources/properties.module.ts +12 -12
  513. package/src/resources/properties.yaml.ts +11 -11
  514. package/src/resources/uat.properties.yaml +15 -15
  515. package/src/utils/dto/excel-data.dto.ts +14 -14
  516. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  517. package/src/utils/service/base64util.service.ts +18 -18
  518. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  519. package/src/utils/service/codeGenerator.service.ts +22 -22
  520. package/src/utils/service/dateUtil.service.ts +17 -17
  521. package/src/utils/service/encryptUtil.service.ts +97 -97
  522. package/src/utils/service/excel-helper.service.ts +72 -72
  523. package/src/utils/service/excelUtil.service.ts +15 -15
  524. package/src/utils/service/file-util.service.ts +11 -11
  525. package/src/utils/service/json-util.service.ts +23 -23
  526. package/src/utils/service/loggingUtil.service.ts +34 -34
  527. package/src/utils/service/reflection-helper.service.ts +62 -62
  528. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  529. package/src/utils/utils.module.ts +25 -25
  530. package/tsconfig.build.json +4 -4
  531. package/tsconfig.json +24 -24
  532. package/.vscode/extensions.json +0 -5
  533. package/dist/core.module.d.ts +0 -4
  534. package/dist/core.module.js +0 -79
  535. package/dist/core.module.js.map +0 -1
  536. package/dist/index.d.ts +0 -1
  537. package/dist/index.js +0 -18
  538. package/dist/index.js.map +0 -1
@@ -1,375 +1,375 @@
1
- import {
2
- BadRequestException,
3
- forwardRef,
4
- Inject,
5
- Injectable,
6
- NotFoundException,
7
- } from '@nestjs/common';
8
- import { ListMasterItemsRepository } from '../repository/list-master-items.repository';
9
- import { ListMasterRepository } from '../repository/list-master.repository';
10
- import { ApiRegistryService } from '../../third-party-module/service/api-registry.service';
11
- import { firstValueFrom } from 'rxjs';
12
- import { HttpService } from '@nestjs/axios';
13
- import { EntityManager } from 'typeorm';
14
- import { EntityMasterService } from 'src/module/meta/service/entity-master.service';
15
- import { UserData } from 'src/module/user/entity/user.entity';
16
- import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
17
- import { STATUS_ACTIVE, STATUS_INACTIVE } from 'src/constant/global.constant';
18
- import { ListMasterExtension } from './list-master-extension.interface';
19
- import { ListMasterEngine } from './list-master-engine';
20
-
21
- @Injectable()
22
- export class ListMasterService {
23
- constructor(
24
- private readonly entityManager: EntityManager,
25
- @Inject(forwardRef(() => EntityServiceImpl))
26
- private readonly entityServiceImpl: EntityServiceImpl,
27
- @Inject(forwardRef(() => EntityMasterService))
28
- private readonly entityMasterService: EntityMasterService,
29
- private readonly listMasterRepo: ListMasterRepository,
30
- private readonly listItemsRepo: ListMasterItemsRepository,
31
- private readonly apiRegistryService: ApiRegistryService,
32
- private readonly httpService: HttpService,
33
- private readonly listMasterEngine: ListMasterEngine,
34
- ) {}
35
-
36
- private readonly skipLevelFilterEntities = ['BRN'];
37
-
38
- async getResolvedListCode(
39
- code: string,
40
- organization_id: number,
41
- ): Promise<any> {
42
- if (!code) return code;
43
-
44
- // Check if it's a valid list type
45
- const listMaster = await this.listItemsRepo.findItemByCode(
46
- code,
47
- organization_id,
48
- );
49
- if (listMaster) {
50
- return listMaster;
51
- }
52
- }
53
-
54
- async getDropdownOptions(
55
- type: string,
56
- params: Record<string, string>,
57
- inactiveIdsArray?: number[],
58
- loggedInUser?,
59
- ) {
60
- const config = await this.listMasterRepo.findByType(
61
- type,
62
- loggedInUser?.organization_id,
63
- );
64
-
65
- if (!config) throw new NotFoundException(`Type ${type} not found`);
66
-
67
- // Check if a dynamic extension exists for this type
68
- try {
69
- const extensionResult = await this.listMasterEngine.execute(type, {
70
- params,
71
- inactiveIdsArray,
72
- loggedInUser,
73
- config,
74
- });
75
-
76
- if (extensionResult !== undefined) return extensionResult;
77
- } catch (err) {
78
- console.warn(`No extension found for type ${type}, falling back to default logic`);
79
- }
80
-
81
- // Fallback to old logic if no extension exists
82
- switch (config.source) {
83
- case 'entity':
84
- return this.fetchFromEntity(type, params, inactiveIdsArray, loggedInUser);
85
-
86
- case 'master':
87
- return this.listItemsRepo.findItemsByType(
88
- type,
89
- config.sort_by,
90
- inactiveIdsArray,
91
- loggedInUser?.organization_id,
92
- params,
93
- );
94
-
95
- case 'operator':
96
- return this.listItemsRepo.findOperatorsByType(
97
- type,
98
- loggedInUser?.organization_id,
99
- );
100
-
101
- case 'custom':
102
- return this.fetchFromExternalSource(config.custom_source_id, params);
103
-
104
- default:
105
- throw new BadRequestException(`Unknown source: ${config.source}`);
106
- }
107
- }
108
-
109
-
110
- private async fetchFromEntity(
111
- sourceList: string,
112
- params: Record<string, any>,
113
- inactiveIdsArray?: number[],
114
- loggedInUser?: UserData,
115
- ) {
116
- console.log(
117
- sourceList,
118
- 'sourceList',
119
- params,
120
- 'params',
121
- inactiveIdsArray,
122
- 'inactiveIdsArray',
123
- loggedInUser,
124
- 'loggedInUser',
125
- );
126
- let result: { label: string; value: number }[] = [];
127
- if (!sourceList) return result;
128
-
129
- const entityMaster = await this.entityMasterService.getEntityData(
130
- sourceList,
131
- loggedInUser,
132
- );
133
- const tableName = entityMaster.data_source;
134
-
135
- const applyCommonFilters = (qb: any, status?: number) => {
136
- if (status) {
137
- const isView = tableName.endsWith('_vw'); // auto-detect view
138
- const statusColumn = isView ? 'status_id' : 'status';
139
- qb.andWhere(`${tableName}.${statusColumn} = :status`, { status });
140
- }
141
-
142
- if (loggedInUser?.level_type && loggedInUser?.level_id) {
143
- // Skip level filter for certain entities
144
- if (!this.skipLevelFilterEntities.includes(sourceList)) {
145
- qb.andWhere(
146
- `${tableName}.level_type = :levelType AND ${tableName}.level_id = :levelId AND ${tableName}.organization_id = :organization_id`,
147
- {
148
- levelType: loggedInUser.level_type,
149
- levelId: loggedInUser.level_id,
150
- organization_id: loggedInUser.organization_id,
151
- },
152
- );
153
- } else {
154
- // IN the case of BRN, we don't filter by level
155
- qb.andWhere(
156
- `${tableName}.parent_id = :organization_id
157
- AND ${tableName}.type = 'BRN'
158
- `,
159
- {
160
- organization_id: loggedInUser.organization_id,
161
- },
162
- );
163
- }
164
- }
165
-
166
- if (loggedInUser?.appcode && sourceList === 'ROL') {
167
- if (!this.skipLevelFilterEntities.includes(sourceList)) {
168
- qb.andWhere(`${tableName}.appcode = :appcode`, {
169
- appcode: loggedInUser.appcode,
170
- });
171
- }
172
- }
173
-
174
- for (const key in params) {
175
- qb.andWhere(`${tableName}.${key} = :${key}`, {
176
- [key]: params[key],
177
- });
178
- }
179
-
180
- return qb;
181
- };
182
-
183
- const resolveStatus = await this.getResolvedListCode(
184
- STATUS_ACTIVE,
185
- loggedInUser?.organization_id || 0,
186
- );
187
-
188
- // Fetpords
189
- const activeQuery = applyCommonFilters(
190
- this.entityManager
191
- .createQueryBuilder()
192
- .select('*')
193
- .from(tableName, tableName),
194
- resolveStatus.id,
195
- );
196
-
197
- const activeResults = await activeQuery.getRawMany();
198
- const activeIds = new Set(activeResults.map((r) => r.id));
199
-
200
- // Add active entries first
201
- activeResults.forEach((r) => {
202
- result.push({ label: r.name, value: r.id });
203
- });
204
-
205
- const resolveInactiveStatus = await this.getResolvedListCode(
206
- STATUS_INACTIVE,
207
- loggedInUser?.organization_id || 0,
208
- );
209
-
210
- // Fetch inactive records (with same filters but without status condition)
211
- if (inactiveIdsArray?.length) {
212
- const inactiveQuery = applyCommonFilters(
213
- this.entityManager
214
- .createQueryBuilder()
215
- .select('*')
216
- .from(tableName, tableName),
217
- resolveInactiveStatus.id,
218
- );
219
-
220
- inactiveQuery.andWhere(`${tableName}.id IN (:...ids)`, {
221
- ids: inactiveIdsArray,
222
- });
223
-
224
- const inactiveResults = await inactiveQuery.getRawMany();
225
-
226
- // Add only those inactive records not already present in active
227
- inactiveResults.forEach((item) => {
228
- if (!activeIds.has(item.id)) {
229
- result.push({
230
- label: `${item.name} [INACTIVE]`,
231
- value: item.id,
232
- });
233
- }
234
- });
235
- }
236
-
237
- return result;
238
- }
239
-
240
- private async fetchFromExternalSource(
241
- customSourceId: number,
242
- params?: Record<string, string>,
243
- ) {
244
- const apiRegistry = await this.apiRegistryService.findById(customSourceId);
245
- if (!apiRegistry) return [];
246
-
247
- const url = `${apiRegistry.base_url}${apiRegistry.endpoint.replace(/{{(.*?)}}/g, (_, key) => params?.[key.trim()] || '')}`;
248
- const payload = this.injectDynamicParams(
249
- apiRegistry.request_payload_schema,
250
- params,
251
- );
252
-
253
- const response = await firstValueFrom(
254
- this.httpService.request({
255
- url,
256
- method: apiRegistry.http_method || 'POST',
257
- data: payload,
258
- headers: apiRegistry.headers ? apiRegistry.headers : undefined,
259
- }),
260
- );
261
-
262
- const data = this.extractByPath(
263
- response.data,
264
- apiRegistry.response_data_path,
265
- );
266
-
267
- if (!Array.isArray(data)) {
268
- return [{ label: data, value: data }];
269
- }
270
-
271
- if (typeof data[0] === 'string') {
272
- return data.map((item: string) => ({ label: item, value: item }));
273
- }
274
-
275
- return data.map((item: any) => ({
276
- label: item[apiRegistry?.label],
277
- value: item[apiRegistry?.value],
278
- }));
279
- }
280
-
281
- private injectDynamicParams(
282
- payload: any,
283
- params?: Record<string, string>,
284
- ): any {
285
- if (params) {
286
- const stringified = JSON.stringify(payload);
287
- const replaced = stringified.replace(
288
- /{{(.*?)}}/g,
289
- (_, key) => params[key.trim()] || '',
290
- );
291
- return JSON.parse(replaced);
292
- }
293
- }
294
-
295
- private extractByPath(obj: any, path: string): any {
296
- if (!path || !obj) return obj;
297
-
298
- return path.split('.').reduce((acc, key) => {
299
- if (acc == null) return undefined;
300
-
301
- // Try to convert to number if it's a numeric string (for array indexes)
302
- const index = Number(key);
303
- if (!isNaN(index) && Array.isArray(acc)) {
304
- return acc[index];
305
- }
306
-
307
- return acc[key];
308
- }, obj);
309
- }
310
-
311
- // createEntity method
312
- async createEntity(entityData: any, loggedInUser: UserData): Promise<any> {
313
- // Trim and validate name and code
314
- const name = entityData.name?.trim();
315
- // const code = entityData.code?.trim();
316
-
317
- if (!name) {
318
- throw new BadRequestException('Name is required and cannot be empty');
319
- }
320
-
321
- entityData.name = name;
322
- entityData.is_factory = entityData.is_factory || 0;
323
- entityData.source = entityData.source || 'master';
324
- entityData.status = entityData.status || 'ACTIVE';
325
- entityData.type = entityData.code;
326
- entityData.sort_by = entityData.sort_by || 'asc';
327
- entityData.organization_id = loggedInUser.organization_id;
328
-
329
- // Check for duplicate name
330
- const nameExists = await this.listMasterRepo.findOneByCondition({
331
- name,
332
- organization_id: loggedInUser.organization_id,
333
- });
334
-
335
- if (nameExists) {
336
- throw new BadRequestException(
337
- 'A List Master with the same name already exists',
338
- );
339
- }
340
-
341
- const createdListMaster = await this.entityServiceImpl.createEntity(
342
- entityData,
343
- loggedInUser,
344
- );
345
-
346
- if (!createdListMaster) {
347
- throw new BadRequestException('Failed to create entity');
348
- }
349
-
350
- return createdListMaster;
351
- }
352
-
353
- async updateEntity(entityData: any, loggedInUser: UserData): Promise<any> {
354
- return await this.entityServiceImpl.updateEntity(entityData, loggedInUser);
355
- }
356
-
357
- async getEntityData(
358
- entity_type: string,
359
- id: number,
360
- loggedInUser,
361
- ): Promise<any> {
362
- return await this.entityServiceImpl.getEntityData(
363
- entity_type,
364
- id,
365
- loggedInUser,
366
- );
367
- }
368
-
369
- async getAllListMasterByOrganization(
370
- organizationId: number,
371
- search?: string,
372
- ): Promise<any[]> {
373
- return await this.listMasterRepo.findAllItems(organizationId, search);
374
- }
375
- }
1
+ import {
2
+ BadRequestException,
3
+ forwardRef,
4
+ Inject,
5
+ Injectable,
6
+ NotFoundException,
7
+ } from '@nestjs/common';
8
+ import { ListMasterItemsRepository } from '../repository/list-master-items.repository';
9
+ import { ListMasterRepository } from '../repository/list-master.repository';
10
+ import { ApiRegistryService } from '../../third-party-module/service/api-registry.service';
11
+ import { firstValueFrom } from 'rxjs';
12
+ import { HttpService } from '@nestjs/axios';
13
+ import { EntityManager } from 'typeorm';
14
+ import { EntityMasterService } from 'src/module/meta/service/entity-master.service';
15
+ import { UserData } from 'src/module/user/entity/user.entity';
16
+ import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
17
+ import { STATUS_ACTIVE, STATUS_INACTIVE } from 'src/constant/global.constant';
18
+ import { ListMasterExtension } from './list-master-extension.interface';
19
+ import { ListMasterEngine } from './list-master-engine';
20
+
21
+ @Injectable()
22
+ export class ListMasterService {
23
+ constructor(
24
+ private readonly entityManager: EntityManager,
25
+ @Inject(forwardRef(() => EntityServiceImpl))
26
+ private readonly entityServiceImpl: EntityServiceImpl,
27
+ @Inject(forwardRef(() => EntityMasterService))
28
+ private readonly entityMasterService: EntityMasterService,
29
+ private readonly listMasterRepo: ListMasterRepository,
30
+ private readonly listItemsRepo: ListMasterItemsRepository,
31
+ private readonly apiRegistryService: ApiRegistryService,
32
+ private readonly httpService: HttpService,
33
+ private readonly listMasterEngine: ListMasterEngine,
34
+ ) {}
35
+
36
+ private readonly skipLevelFilterEntities = ['BRN'];
37
+
38
+ async getResolvedListCode(
39
+ code: string,
40
+ organization_id: number,
41
+ ): Promise<any> {
42
+ if (!code) return code;
43
+
44
+ // Check if it's a valid list type
45
+ const listMaster = await this.listItemsRepo.findItemByCode(
46
+ code,
47
+ organization_id,
48
+ );
49
+ if (listMaster) {
50
+ return listMaster;
51
+ }
52
+ }
53
+
54
+ async getDropdownOptions(
55
+ type: string,
56
+ params: Record<string, string>,
57
+ inactiveIdsArray?: number[],
58
+ loggedInUser?,
59
+ ) {
60
+ const config = await this.listMasterRepo.findByType(
61
+ type,
62
+ loggedInUser?.organization_id,
63
+ );
64
+
65
+ if (!config) throw new NotFoundException(`Type ${type} not found`);
66
+
67
+ // Check if a dynamic extension exists for this type
68
+ try {
69
+ const extensionResult = await this.listMasterEngine.execute(type, {
70
+ params,
71
+ inactiveIdsArray,
72
+ loggedInUser,
73
+ config,
74
+ });
75
+
76
+ if (extensionResult !== undefined) return extensionResult;
77
+ } catch (err) {
78
+ console.warn(`No extension found for type ${type}, falling back to default logic`);
79
+ }
80
+
81
+ // Fallback to old logic if no extension exists
82
+ switch (config.source) {
83
+ case 'entity':
84
+ return this.fetchFromEntity(type, params, inactiveIdsArray, loggedInUser);
85
+
86
+ case 'master':
87
+ return this.listItemsRepo.findItemsByType(
88
+ type,
89
+ config.sort_by,
90
+ inactiveIdsArray,
91
+ loggedInUser?.organization_id,
92
+ params,
93
+ );
94
+
95
+ case 'operator':
96
+ return this.listItemsRepo.findOperatorsByType(
97
+ type,
98
+ loggedInUser?.organization_id,
99
+ );
100
+
101
+ case 'custom':
102
+ return this.fetchFromExternalSource(config.custom_source_id, params);
103
+
104
+ default:
105
+ throw new BadRequestException(`Unknown source: ${config.source}`);
106
+ }
107
+ }
108
+
109
+
110
+ private async fetchFromEntity(
111
+ sourceList: string,
112
+ params: Record<string, any>,
113
+ inactiveIdsArray?: number[],
114
+ loggedInUser?: UserData,
115
+ ) {
116
+ console.log(
117
+ sourceList,
118
+ 'sourceList',
119
+ params,
120
+ 'params',
121
+ inactiveIdsArray,
122
+ 'inactiveIdsArray',
123
+ loggedInUser,
124
+ 'loggedInUser',
125
+ );
126
+ let result: { label: string; value: number }[] = [];
127
+ if (!sourceList) return result;
128
+
129
+ const entityMaster = await this.entityMasterService.getEntityData(
130
+ sourceList,
131
+ loggedInUser,
132
+ );
133
+ const tableName = entityMaster.data_source;
134
+
135
+ const applyCommonFilters = (qb: any, status?: number) => {
136
+ if (status) {
137
+ const isView = tableName.endsWith('_vw'); // auto-detect view
138
+ const statusColumn = isView ? 'status_id' : 'status';
139
+ qb.andWhere(`${tableName}.${statusColumn} = :status`, { status });
140
+ }
141
+
142
+ if (loggedInUser?.level_type && loggedInUser?.level_id) {
143
+ // Skip level filter for certain entities
144
+ if (!this.skipLevelFilterEntities.includes(sourceList)) {
145
+ qb.andWhere(
146
+ `${tableName}.level_type = :levelType AND ${tableName}.level_id = :levelId AND ${tableName}.organization_id = :organization_id`,
147
+ {
148
+ levelType: loggedInUser.level_type,
149
+ levelId: loggedInUser.level_id,
150
+ organization_id: loggedInUser.organization_id,
151
+ },
152
+ );
153
+ } else {
154
+ // IN the case of BRN, we don't filter by level
155
+ qb.andWhere(
156
+ `${tableName}.parent_id = :organization_id
157
+ AND ${tableName}.type = 'BRN'
158
+ `,
159
+ {
160
+ organization_id: loggedInUser.organization_id,
161
+ },
162
+ );
163
+ }
164
+ }
165
+
166
+ if (loggedInUser?.appcode && sourceList === 'ROL') {
167
+ if (!this.skipLevelFilterEntities.includes(sourceList)) {
168
+ qb.andWhere(`${tableName}.appcode = :appcode`, {
169
+ appcode: loggedInUser.appcode,
170
+ });
171
+ }
172
+ }
173
+
174
+ for (const key in params) {
175
+ qb.andWhere(`${tableName}.${key} = :${key}`, {
176
+ [key]: params[key],
177
+ });
178
+ }
179
+
180
+ return qb;
181
+ };
182
+
183
+ const resolveStatus = await this.getResolvedListCode(
184
+ STATUS_ACTIVE,
185
+ loggedInUser?.organization_id || 0,
186
+ );
187
+
188
+ // Fetpords
189
+ const activeQuery = applyCommonFilters(
190
+ this.entityManager
191
+ .createQueryBuilder()
192
+ .select('*')
193
+ .from(tableName, tableName),
194
+ resolveStatus.id,
195
+ );
196
+
197
+ const activeResults = await activeQuery.getRawMany();
198
+ const activeIds = new Set(activeResults.map((r) => r.id));
199
+
200
+ // Add active entries first
201
+ activeResults.forEach((r) => {
202
+ result.push({ label: r.name, value: r.id });
203
+ });
204
+
205
+ const resolveInactiveStatus = await this.getResolvedListCode(
206
+ STATUS_INACTIVE,
207
+ loggedInUser?.organization_id || 0,
208
+ );
209
+
210
+ // Fetch inactive records (with same filters but without status condition)
211
+ if (inactiveIdsArray?.length) {
212
+ const inactiveQuery = applyCommonFilters(
213
+ this.entityManager
214
+ .createQueryBuilder()
215
+ .select('*')
216
+ .from(tableName, tableName),
217
+ resolveInactiveStatus.id,
218
+ );
219
+
220
+ inactiveQuery.andWhere(`${tableName}.id IN (:...ids)`, {
221
+ ids: inactiveIdsArray,
222
+ });
223
+
224
+ const inactiveResults = await inactiveQuery.getRawMany();
225
+
226
+ // Add only those inactive records not already present in active
227
+ inactiveResults.forEach((item) => {
228
+ if (!activeIds.has(item.id)) {
229
+ result.push({
230
+ label: `${item.name} [INACTIVE]`,
231
+ value: item.id,
232
+ });
233
+ }
234
+ });
235
+ }
236
+
237
+ return result;
238
+ }
239
+
240
+ private async fetchFromExternalSource(
241
+ customSourceId: number,
242
+ params?: Record<string, string>,
243
+ ) {
244
+ const apiRegistry = await this.apiRegistryService.findById(customSourceId);
245
+ if (!apiRegistry) return [];
246
+
247
+ const url = `${apiRegistry.base_url}${apiRegistry.endpoint.replace(/{{(.*?)}}/g, (_, key) => params?.[key.trim()] || '')}`;
248
+ const payload = this.injectDynamicParams(
249
+ apiRegistry.request_payload_schema,
250
+ params,
251
+ );
252
+
253
+ const response = await firstValueFrom(
254
+ this.httpService.request({
255
+ url,
256
+ method: apiRegistry.http_method || 'POST',
257
+ data: payload,
258
+ headers: apiRegistry.headers ? apiRegistry.headers : undefined,
259
+ }),
260
+ );
261
+
262
+ const data = this.extractByPath(
263
+ response.data,
264
+ apiRegistry.response_data_path,
265
+ );
266
+
267
+ if (!Array.isArray(data)) {
268
+ return [{ label: data, value: data }];
269
+ }
270
+
271
+ if (typeof data[0] === 'string') {
272
+ return data.map((item: string) => ({ label: item, value: item }));
273
+ }
274
+
275
+ return data.map((item: any) => ({
276
+ label: item[apiRegistry?.label],
277
+ value: item[apiRegistry?.value],
278
+ }));
279
+ }
280
+
281
+ private injectDynamicParams(
282
+ payload: any,
283
+ params?: Record<string, string>,
284
+ ): any {
285
+ if (params) {
286
+ const stringified = JSON.stringify(payload);
287
+ const replaced = stringified.replace(
288
+ /{{(.*?)}}/g,
289
+ (_, key) => params[key.trim()] || '',
290
+ );
291
+ return JSON.parse(replaced);
292
+ }
293
+ }
294
+
295
+ private extractByPath(obj: any, path: string): any {
296
+ if (!path || !obj) return obj;
297
+
298
+ return path.split('.').reduce((acc, key) => {
299
+ if (acc == null) return undefined;
300
+
301
+ // Try to convert to number if it's a numeric string (for array indexes)
302
+ const index = Number(key);
303
+ if (!isNaN(index) && Array.isArray(acc)) {
304
+ return acc[index];
305
+ }
306
+
307
+ return acc[key];
308
+ }, obj);
309
+ }
310
+
311
+ // createEntity method
312
+ async createEntity(entityData: any, loggedInUser: UserData): Promise<any> {
313
+ // Trim and validate name and code
314
+ const name = entityData.name?.trim();
315
+ // const code = entityData.code?.trim();
316
+
317
+ if (!name) {
318
+ throw new BadRequestException('Name is required and cannot be empty');
319
+ }
320
+
321
+ entityData.name = name;
322
+ entityData.is_factory = entityData.is_factory || 0;
323
+ entityData.source = entityData.source || 'master';
324
+ entityData.status = entityData.status || 'ACTIVE';
325
+ entityData.type = entityData.code;
326
+ entityData.sort_by = entityData.sort_by || 'asc';
327
+ entityData.organization_id = loggedInUser.organization_id;
328
+
329
+ // Check for duplicate name
330
+ const nameExists = await this.listMasterRepo.findOneByCondition({
331
+ name,
332
+ organization_id: loggedInUser.organization_id,
333
+ });
334
+
335
+ if (nameExists) {
336
+ throw new BadRequestException(
337
+ 'A List Master with the same name already exists',
338
+ );
339
+ }
340
+
341
+ const createdListMaster = await this.entityServiceImpl.createEntity(
342
+ entityData,
343
+ loggedInUser,
344
+ );
345
+
346
+ if (!createdListMaster) {
347
+ throw new BadRequestException('Failed to create entity');
348
+ }
349
+
350
+ return createdListMaster;
351
+ }
352
+
353
+ async updateEntity(entityData: any, loggedInUser: UserData): Promise<any> {
354
+ return await this.entityServiceImpl.updateEntity(entityData, loggedInUser);
355
+ }
356
+
357
+ async getEntityData(
358
+ entity_type: string,
359
+ id: number,
360
+ loggedInUser,
361
+ ): Promise<any> {
362
+ return await this.entityServiceImpl.getEntityData(
363
+ entity_type,
364
+ id,
365
+ loggedInUser,
366
+ );
367
+ }
368
+
369
+ async getAllListMasterByOrganization(
370
+ organizationId: number,
371
+ search?: string,
372
+ ): Promise<any[]> {
373
+ return await this.listMasterRepo.findAllItems(organizationId, search);
374
+ }
375
+ }