rez_core 4.0.191 → 4.0.193

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 (526) hide show
  1. package/.prettierrc +3 -3
  2. package/.vscode/extensions.json +5 -0
  3. package/README.md +99 -99
  4. package/dist/config/config.module.js +2 -2
  5. package/dist/config/config.module.js.map +1 -1
  6. package/dist/config/database.config.d.ts +1 -1
  7. package/dist/config/database.config.js +11 -15
  8. package/dist/config/database.config.js.map +1 -1
  9. package/dist/core.module.d.ts +1 -1
  10. package/dist/core.module.js +6 -3
  11. package/dist/core.module.js.map +1 -1
  12. package/dist/main.js +1 -1
  13. package/dist/main.js.map +1 -1
  14. package/dist/module/auth/guards/role.guard.js +3 -3
  15. package/dist/module/auth/services/auth.service.js +3 -3
  16. package/dist/module/auth/services/auth.service.js.map +1 -1
  17. package/dist/module/enterprise/entity/organization.entity.js +1 -1
  18. package/dist/module/enterprise/repository/school.repository.js +3 -3
  19. package/dist/module/enterprise/repository/school.repository.js.map +1 -1
  20. package/dist/module/entity_json/service/entity_json.service.js +2 -2
  21. package/dist/module/filter/repository/saved-filter.repository.js +4 -4
  22. package/dist/module/filter/service/filter-evaluator.service.js +3 -3
  23. package/dist/module/filter/service/filter-evaluator.service.js.map +1 -1
  24. package/dist/module/filter/service/filter.service.d.ts +1 -4
  25. package/dist/module/filter/service/filter.service.js +40 -70
  26. package/dist/module/filter/service/filter.service.js.map +1 -1
  27. package/dist/module/integration/entity/integration-config.entity.js +6 -6
  28. package/dist/module/integration/entity/integration-config.entity.js.map +1 -1
  29. package/dist/module/integration/entity/integration-entity-mapper.entity.js +1 -1
  30. package/dist/module/integration/entity/integration-entity-mapper.entity.js.map +1 -1
  31. package/dist/module/integration/entity/integration-source.entity.js +4 -4
  32. package/dist/module/integration/entity/integration-source.entity.js.map +1 -1
  33. package/dist/module/integration/entity/user-integration.entity.js +4 -4
  34. package/dist/module/integration/entity/user-integration.entity.js.map +1 -1
  35. package/dist/module/integration/examples/usage.example.js +9 -9
  36. package/dist/module/integration/service/integration.service.js +1 -1
  37. package/dist/module/integration/service/wrapper.service.js +28 -29
  38. package/dist/module/integration/service/wrapper.service.js.map +1 -1
  39. package/dist/module/listmaster/entity/list-master-items.entity.js +3 -3
  40. package/dist/module/listmaster/entity/list-master-items.entity.js.map +1 -1
  41. package/dist/module/listmaster/entity/list-master.entity.js +4 -4
  42. package/dist/module/listmaster/entity/list-master.entity.js.map +1 -1
  43. package/dist/module/listmaster/service/list-master-item.service.js +3 -3
  44. package/dist/module/listmaster/service/list-master-item.service.js.map +1 -1
  45. package/dist/module/mapper/entity/field-mapper.entity.js +6 -6
  46. package/dist/module/mapper/entity/field-mapper.entity.js.map +1 -1
  47. package/dist/module/mapper/service/field-mapper.service.js +5 -5
  48. package/dist/module/mapper/service/field-mapper.service.js.map +1 -1
  49. package/dist/module/mapper/service/mapper.service.js +4 -4
  50. package/dist/module/mapper/service/mapper.service.js.map +1 -1
  51. package/dist/module/meta/entity/app-master.entity.d.ts +2 -2
  52. package/dist/module/meta/entity/app-master.entity.js +4 -4
  53. package/dist/module/meta/entity/entity-master.entity.js +1 -1
  54. package/dist/module/meta/entity/entity-master.entity.js.map +1 -1
  55. package/dist/module/meta/entity/view-master.entity.js +1 -1
  56. package/dist/module/meta/entity/view-master.entity.js.map +1 -1
  57. package/dist/module/meta/repository/attribute-master.repository.js +2 -2
  58. package/dist/module/meta/repository/attribute-master.repository.js.map +1 -1
  59. package/dist/module/meta/repository/entity-attribute-update.repository.js +3 -3
  60. package/dist/module/meta/repository/entity-master.repository.js +2 -2
  61. package/dist/module/meta/repository/entity-master.repository.js.map +1 -1
  62. package/dist/module/meta/service/attribute-master.service.js +1 -1
  63. package/dist/module/meta/service/attribute-master.service.js.map +1 -1
  64. package/dist/module/meta/service/entity-dynamic.service.js +27 -27
  65. package/dist/module/meta/service/entity-dynamic.service.js.map +1 -1
  66. package/dist/module/meta/service/entity-list.service.js +3 -3
  67. package/dist/module/meta/service/entity-master.service.js +4 -4
  68. package/dist/module/meta/service/entity-master.service.js.map +1 -1
  69. package/dist/module/meta/service/entity-relation.service.js +13 -13
  70. package/dist/module/meta/service/entity-relation.service.js.map +1 -1
  71. package/dist/module/meta/service/entity-service-impl.service.js +3 -3
  72. package/dist/module/meta/service/media-data.service.js +9 -9
  73. package/dist/module/meta/service/media-data.service.js.map +1 -1
  74. package/dist/module/meta/service/resolver.service.js +17 -17
  75. package/dist/module/meta/service/resolver.service.js.map +1 -1
  76. package/dist/module/module/repository/menu.repository.js +12 -12
  77. package/dist/module/module/service/module-access.service.js +8 -2
  78. package/dist/module/module/service/module-access.service.js.map +1 -1
  79. package/dist/module/notification/entity/otp.entity.js +1 -1
  80. package/dist/module/notification/entity/otp.entity.js.map +1 -1
  81. package/dist/module/notification/service/notification.service.js +22 -26
  82. package/dist/module/notification/service/notification.service.js.map +1 -1
  83. package/dist/module/user/controller/login.controller.js +18 -18
  84. package/dist/module/user/entity/user-role-mapping.entity.js +1 -1
  85. package/dist/module/user/entity/user-role-mapping.entity.js.map +1 -1
  86. package/dist/module/user/service/login.service.js +1 -1
  87. package/dist/module/user/service/login.service.js.map +1 -1
  88. package/dist/module/user/service/role.service.js +4 -4
  89. package/dist/module/user/service/user-session.service.js +4 -4
  90. package/dist/module/user/service/user-session.service.js.map +1 -1
  91. package/dist/module/workflow/entity/action-category.entity.d.ts +1 -1
  92. package/dist/module/workflow/entity/action-category.entity.js +1 -1
  93. package/dist/module/workflow/entity/action-data.entity.js +1 -1
  94. package/dist/module/workflow/entity/action-data.entity.js.map +1 -1
  95. package/dist/module/workflow/entity/action.entity.js +1 -1
  96. package/dist/module/workflow/entity/action.entity.js.map +1 -1
  97. package/dist/module/workflow/entity/comm-template.entity.js +1 -1
  98. package/dist/module/workflow/entity/comm-template.entity.js.map +1 -1
  99. package/dist/module/workflow/entity/template-attach-mapper.entity.js +1 -1
  100. package/dist/module/workflow/entity/template-attach-mapper.entity.js.map +1 -1
  101. package/dist/module/workflow/repository/action-data.repository.js +4 -4
  102. package/dist/module/workflow/repository/action-data.repository.js.map +1 -1
  103. package/dist/module/workflow/repository/action.repository.js +21 -21
  104. package/dist/module/workflow/repository/action.repository.js.map +1 -1
  105. package/dist/module/workflow/repository/comm-template.repository.js +7 -7
  106. package/dist/module/workflow/repository/comm-template.repository.js.map +1 -1
  107. package/dist/module/workflow/repository/form-master.repository.js +3 -3
  108. package/dist/module/workflow/repository/form-master.repository.js.map +1 -1
  109. package/dist/module/workflow/repository/stage-group.repository.js +23 -23
  110. package/dist/module/workflow/repository/stage-movement.repository.js +17 -17
  111. package/dist/module/workflow/repository/stage-movement.repository.js.map +1 -1
  112. package/dist/module/workflow/repository/stage.repository.js +8 -8
  113. package/dist/module/workflow/repository/task.repository.js +4 -4
  114. package/dist/module/workflow/repository/task.repository.js.map +1 -1
  115. package/dist/module/workflow/service/action-template-mapping.service.js +22 -22
  116. package/dist/module/workflow/service/action.service.js +13 -13
  117. package/dist/module/workflow/service/action.service.js.map +1 -1
  118. package/dist/module/workflow/service/entity-modification.service.js +6 -6
  119. package/dist/module/workflow/service/populate-workflow.service.js +8 -8
  120. package/dist/module/workflow/service/populate-workflow.service.js.map +1 -1
  121. package/dist/module/workflow/service/stage-group.service.js +6 -6
  122. package/dist/module/workflow/service/stage-group.service.js.map +1 -1
  123. package/dist/module/workflow/service/stage.service.js +4 -4
  124. package/dist/module/workflow/service/stage.service.js.map +1 -1
  125. package/dist/module/workflow/service/task.service.js +33 -33
  126. package/dist/module/workflow/service/task.service.js.map +1 -1
  127. package/dist/module/workflow/service/workflow-list-master.service.js +16 -16
  128. package/dist/module/workflow/service/workflow-list-master.service.js.map +1 -1
  129. package/dist/module/workflow/service/workflow-meta.service.js +31 -31
  130. package/dist/module/workflow/service/workflow-meta.service.js.map +1 -1
  131. package/dist/module/workflow/service/workflow.service.js +5 -5
  132. package/dist/module/workflow/service/workflow.service.js.map +1 -1
  133. package/dist/module/workflow-automation/entity/workflow-automation-action.entity.d.ts +1 -1
  134. package/dist/module/workflow-automation/entity/workflow-automation-action.entity.js +1 -1
  135. package/dist/module/workflow-automation/service/schedule-handler.service.js +14 -14
  136. package/dist/module/workflow-automation/service/workflow-automation-engine.service.js +1 -1
  137. package/dist/module/workflow-automation/service/workflow-automation-engine.service.js.map +1 -1
  138. package/dist/module/workflow-automation/service/workflow-automation.service.js +4 -4
  139. package/dist/module/workflow-automation/workflow-automation.module.js.map +1 -1
  140. package/dist/module/workflow-schedule/entities/scheduled-workflow.entity.js +4 -4
  141. package/dist/module/workflow-schedule/entities/scheduled-workflow.entity.js.map +1 -1
  142. package/dist/module/workflow-schedule/entities/workflow-execution-log.entity.js +2 -2
  143. package/dist/module/workflow-schedule/entities/workflow-execution-log.entity.js.map +1 -1
  144. package/dist/module/workflow-schedule/processors/schedule.processor.js +4 -4
  145. package/dist/module/workflow-schedule/service/workflow-schedule.service.js +9 -9
  146. package/dist/table.config.js +5 -1
  147. package/dist/table.config.js.map +1 -1
  148. package/dist/tsconfig.build.tsbuildinfo +1 -1
  149. package/dist/utils/service/reflection-helper.service.js +3 -3
  150. package/dist/utils/service/reflection-helper.service.js.map +1 -1
  151. package/docs/modules/event-driven-integration-design.md +91 -91
  152. package/docs/modules/integration.md +250 -250
  153. package/eslint.config.mjs +34 -34
  154. package/nest-cli.json +14 -14
  155. package/package.json +124 -125
  156. package/src/app.controller.ts +12 -12
  157. package/src/app.module.ts +66 -66
  158. package/src/app.service.ts +8 -8
  159. package/src/config/bull.config.ts +69 -69
  160. package/src/config/config.module.ts +18 -17
  161. package/src/config/database.config.ts +23 -48
  162. package/src/constant/global.constant.ts +67 -67
  163. package/src/core.module.ts +88 -81
  164. package/src/decorators/roles.decorator.ts +7 -7
  165. package/src/dtos/response.dto.ts +6 -6
  166. package/src/dtos/response.ts +5 -5
  167. package/src/index.ts +1 -1
  168. package/src/module/auth/auth.module.ts +49 -49
  169. package/src/module/auth/controller/auth.controller.ts +28 -28
  170. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  171. package/src/module/auth/guards/jwt.guard.ts +22 -22
  172. package/src/module/auth/guards/role.guard.ts +68 -68
  173. package/src/module/auth/services/auth.service.ts +50 -50
  174. package/src/module/auth/services/jwt.service.ts +11 -11
  175. package/src/module/auth/strategies/google.strategy.ts +54 -54
  176. package/src/module/auth/strategies/jwt.strategy.ts +58 -58
  177. package/src/module/auth/strategies/local.strategy.ts +13 -13
  178. package/src/module/dashboard/controller/dashboard.controller.ts +36 -36
  179. package/src/module/dashboard/dashboard.module.ts +21 -21
  180. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +27 -27
  181. package/src/module/dashboard/entity/widget_master.entity.ts +18 -18
  182. package/src/module/dashboard/repository/dashboard.repository.ts +42 -42
  183. package/src/module/dashboard/service/dashboard.service.ts +73 -73
  184. package/src/module/dev/dev.module.ts +12 -12
  185. package/src/module/dev/service/dev.service.ts +7 -7
  186. package/src/module/enterprise/controller/organization.controller.ts +36 -36
  187. package/src/module/enterprise/enterprise.module.ts +30 -30
  188. package/src/module/enterprise/entity/enterprise.entity.ts +37 -37
  189. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +13 -13
  190. package/src/module/enterprise/entity/organization.entity.ts +92 -92
  191. package/src/module/enterprise/repository/enterprise.repository.ts +31 -31
  192. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  193. package/src/module/enterprise/repository/school.repository.ts +278 -278
  194. package/src/module/enterprise/service/brand.service.ts +5 -5
  195. package/src/module/enterprise/service/enterprise.service.ts +16 -16
  196. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  197. package/src/module/enterprise/service/organization.service.ts +145 -145
  198. package/src/module/entity_json/controller/entity_json.controller.ts +47 -47
  199. package/src/module/entity_json/entity_json.module.ts +15 -15
  200. package/src/module/entity_json/service/entity_json.service.ts +265 -265
  201. package/src/module/filter/controller/filter.controller.ts +84 -84
  202. package/src/module/filter/dto/filter-request.dto.ts +38 -38
  203. package/src/module/filter/entity/saved-filter-detail.entity.ts +41 -41
  204. package/src/module/filter/entity/saved-filter-master.entity.ts +23 -23
  205. package/src/module/filter/filter.module.ts +31 -31
  206. package/src/module/filter/repository/saved-filter.repository.ts +168 -168
  207. package/src/module/filter/service/filter-evaluator.service.ts +86 -86
  208. package/src/module/filter/service/filter.service.ts +1005 -1051
  209. package/src/module/filter/service/saved-filter.service.ts +170 -170
  210. package/src/module/ics/controller/ics.controller.ts +21 -21
  211. package/src/module/ics/dto/ics.dto.ts +55 -55
  212. package/src/module/ics/ics.module.ts +13 -13
  213. package/src/module/ics/service/ics.service.ts +57 -57
  214. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  215. package/src/module/integration/controller/integration.controller.ts +662 -662
  216. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  217. package/src/module/integration/dto/create-config.dto.ts +526 -526
  218. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  219. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  220. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  221. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  222. package/src/module/integration/examples/usage.example.ts +338 -338
  223. package/src/module/integration/factories/base.factory.ts +7 -7
  224. package/src/module/integration/factories/email.factory.ts +49 -49
  225. package/src/module/integration/factories/integration.factory.ts +121 -121
  226. package/src/module/integration/factories/sms.factory.ts +51 -51
  227. package/src/module/integration/factories/telephone.factory.ts +41 -41
  228. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  229. package/src/module/integration/integration.module.ts +110 -110
  230. package/src/module/integration/service/calendar-event.service.ts +118 -118
  231. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  232. package/src/module/integration/service/integration-queue.service.ts +229 -229
  233. package/src/module/integration/service/integration.service.ts +2633 -2633
  234. package/src/module/integration/service/oauth.service.ts +224 -224
  235. package/src/module/integration/service/wrapper.service.ts +700 -701
  236. package/src/module/integration/strategies/email/gmail-api.strategy.ts +280 -280
  237. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  238. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  239. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -260
  240. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  241. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  242. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  243. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  244. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  245. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  246. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  247. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  248. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  249. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  250. package/src/module/layout/controller/layout.controller.ts +47 -47
  251. package/src/module/layout/entity/header-items.entity.ts +28 -28
  252. package/src/module/layout/entity/header-section.entity.ts +19 -19
  253. package/src/module/layout/layout.module.ts +21 -21
  254. package/src/module/layout/repository/header-items.repository.ts +18 -18
  255. package/src/module/layout/repository/header-section.repository.ts +22 -22
  256. package/src/module/layout/service/header-section.service.ts +25 -25
  257. package/src/module/layout_preference/controller/layout_preference.controller.ts +73 -73
  258. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  259. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  260. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  261. package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
  262. package/src/module/lead/controller/lead.controller.ts +30 -30
  263. package/src/module/lead/lead.module.ts +14 -14
  264. package/src/module/lead/repository/lead.repository.ts +41 -41
  265. package/src/module/lead/service/lead.service.ts +54 -54
  266. package/src/module/linked_attributes/controller/linked_attributes.controller.ts +10 -10
  267. package/src/module/linked_attributes/entity/linked_attribute.entity.ts +48 -48
  268. package/src/module/linked_attributes/linked_attributes.module.ts +16 -16
  269. package/src/module/linked_attributes/repository/linked_attribute.repository.ts +12 -12
  270. package/src/module/linked_attributes/service/linked_attributes.service.ts +22 -22
  271. package/src/module/listmaster/controller/list-master.controller.ts +230 -230
  272. package/src/module/listmaster/entity/list-master-items.entity.ts +43 -43
  273. package/src/module/listmaster/entity/list-master.entity.ts +33 -33
  274. package/src/module/listmaster/listmaster.module.ts +46 -46
  275. package/src/module/listmaster/repository/list-master-items.repository.ts +169 -169
  276. package/src/module/listmaster/repository/list-master.repository.ts +46 -46
  277. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  278. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  279. package/src/module/listmaster/service/list-master-item.service.ts +292 -292
  280. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  281. package/src/module/listmaster/service/list-master.service.ts +535 -535
  282. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  283. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  284. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  285. package/src/module/mapper/entity/field-lovs.entity.ts +19 -19
  286. package/src/module/mapper/entity/field-mapper.entity.ts +53 -53
  287. package/src/module/mapper/entity/mapper.entity.ts +16 -16
  288. package/src/module/mapper/mapper.module.ts +34 -34
  289. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  290. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  291. package/src/module/mapper/repository/mapper.repository.ts +15 -15
  292. package/src/module/mapper/service/field-mapper.service.ts +271 -271
  293. package/src/module/mapper/service/mapper.service.ts +79 -79
  294. package/src/module/master/controller/master.controller.ts +74 -74
  295. package/src/module/master/service/master.service.ts +483 -483
  296. package/src/module/meta/controller/app-master.controller.ts +38 -38
  297. package/src/module/meta/controller/attribute-master.controller.ts +86 -86
  298. package/src/module/meta/controller/entity-dynamic.controller.ts +125 -125
  299. package/src/module/meta/controller/entity-master.controller.ts +41 -41
  300. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  301. package/src/module/meta/controller/entity.controller.ts +392 -392
  302. package/src/module/meta/controller/entity.public.controller.ts +75 -75
  303. package/src/module/meta/controller/media.controller.ts +107 -107
  304. package/src/module/meta/controller/meta.controller.ts +96 -96
  305. package/src/module/meta/controller/view-master.controller.ts +86 -86
  306. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  307. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  308. package/src/module/meta/dto/entity-table.dto.ts +9 -9
  309. package/src/module/meta/entity/app-master.entity.ts +34 -34
  310. package/src/module/meta/entity/attribute-master.entity.ts +89 -89
  311. package/src/module/meta/entity/base-entity.entity.ts +75 -75
  312. package/src/module/meta/entity/entity-master.entity.ts +85 -85
  313. package/src/module/meta/entity/entity-relation-data.entity.ts +29 -29
  314. package/src/module/meta/entity/entity-relation.entity.ts +23 -23
  315. package/src/module/meta/entity/entity-table-column.entity.ts +61 -61
  316. package/src/module/meta/entity/entity-table.entity.ts +50 -50
  317. package/src/module/meta/entity/media-data.entity.ts +32 -32
  318. package/src/module/meta/entity/preference.entity.ts +62 -62
  319. package/src/module/meta/entity/view-master.entity.ts +41 -41
  320. package/src/module/meta/entity.module.ts +166 -166
  321. package/src/module/meta/repository/app-master.repository.ts +20 -20
  322. package/src/module/meta/repository/attribute-master.repository.ts +138 -138
  323. package/src/module/meta/repository/entity-attribute-update.repository.ts +44 -44
  324. package/src/module/meta/repository/entity-master.repository.ts +99 -99
  325. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  326. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  327. package/src/module/meta/repository/media-data.repository.ts +50 -50
  328. package/src/module/meta/repository/preference.repository.ts +20 -20
  329. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  330. package/src/module/meta/repository/view-master.repository.ts +42 -42
  331. package/src/module/meta/service/app-master.service.ts +37 -37
  332. package/src/module/meta/service/attribute-master.service.ts +130 -130
  333. package/src/module/meta/service/common.service.ts +9 -9
  334. package/src/module/meta/service/entity-attribute-update.service.ts +28 -28
  335. package/src/module/meta/service/entity-dynamic.service.ts +819 -819
  336. package/src/module/meta/service/entity-list.service.ts +205 -205
  337. package/src/module/meta/service/entity-master.service.ts +175 -175
  338. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  339. package/src/module/meta/service/entity-relation.service.ts +69 -69
  340. package/src/module/meta/service/entity-service-impl.service.ts +525 -525
  341. package/src/module/meta/service/entity-table-column.service.ts +39 -39
  342. package/src/module/meta/service/entity-table.service.ts +150 -150
  343. package/src/module/meta/service/entity-validation.service.ts +187 -187
  344. package/src/module/meta/service/entity.service.ts +67 -67
  345. package/src/module/meta/service/field-group.service.ts +103 -103
  346. package/src/module/meta/service/media-data.service.ts +507 -507
  347. package/src/module/meta/service/populate-meta.service.ts +193 -193
  348. package/src/module/meta/service/preference.service.ts +16 -16
  349. package/src/module/meta/service/resolver.service.ts +267 -267
  350. package/src/module/meta/service/section-master.service.ts +104 -104
  351. package/src/module/meta/service/update-form-json.service.ts +22 -22
  352. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  353. package/src/module/meta/service/view-master.service.ts +127 -127
  354. package/src/module/microservice-client/microservice-clients.module.ts +13 -13
  355. package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
  356. package/src/module/microservice-client/service/microservice-clients.ts +4 -4
  357. package/src/module/module/controller/menu.controller.ts +15 -15
  358. package/src/module/module/controller/module-access.controller.ts +134 -134
  359. package/src/module/module/entity/menu.entity.ts +43 -43
  360. package/src/module/module/entity/module-access.entity.ts +25 -25
  361. package/src/module/module/entity/module-action.entity.ts +17 -17
  362. package/src/module/module/entity/module.entity.ts +52 -52
  363. package/src/module/module/module.module.ts +42 -42
  364. package/src/module/module/repository/menu.repository.ts +184 -184
  365. package/src/module/module/repository/module-access.repository.ts +344 -344
  366. package/src/module/module/service/menu.service.ts +82 -82
  367. package/src/module/module/service/module-access.service.ts +209 -194
  368. package/src/module/notification/controller/notification.controller.ts +58 -58
  369. package/src/module/notification/controller/otp.controller.ts +117 -117
  370. package/src/module/notification/entity/notification.entity.ts +26 -26
  371. package/src/module/notification/entity/otp.entity.ts +28 -28
  372. package/src/module/notification/firebase-admin.config.ts +22 -22
  373. package/src/module/notification/notification.module.ts +69 -69
  374. package/src/module/notification/repository/otp.repository.ts +27 -27
  375. package/src/module/notification/service/email.service.ts +127 -127
  376. package/src/module/notification/service/notification.service.ts +163 -160
  377. package/src/module/notification/service/otp.service.ts +132 -132
  378. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  379. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  380. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  381. package/src/module/third-party-module/third-party.module.ts +12 -12
  382. package/src/module/user/controller/login.controller.ts +197 -197
  383. package/src/module/user/controller/user.controller.ts +40 -40
  384. package/src/module/user/dto/create-user.dto.ts +62 -62
  385. package/src/module/user/dto/update-user.dto.ts +4 -4
  386. package/src/module/user/entity/role.entity.ts +33 -33
  387. package/src/module/user/entity/user-role-mapping.entity.ts +38 -38
  388. package/src/module/user/entity/user-session.entity.ts +73 -73
  389. package/src/module/user/entity/user.entity.ts +59 -59
  390. package/src/module/user/repository/role.repository.ts +96 -96
  391. package/src/module/user/repository/user-role-mapping.repository.ts +126 -126
  392. package/src/module/user/repository/user.repository.ts +50 -50
  393. package/src/module/user/repository/userSession.repository.ts +33 -33
  394. package/src/module/user/service/login.service.ts +304 -304
  395. package/src/module/user/service/role.service.ts +189 -189
  396. package/src/module/user/service/user-role-mapping.service.ts +98 -98
  397. package/src/module/user/service/user-session.service.ts +168 -168
  398. package/src/module/user/service/user.service.ts +365 -365
  399. package/src/module/user/user.module.ts +65 -65
  400. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  401. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  402. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  403. package/src/module/workflow/controller/action.controller.ts +111 -111
  404. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  405. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  406. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  407. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  408. package/src/module/workflow/controller/stage-group.controller.ts +48 -48
  409. package/src/module/workflow/controller/stage.controller.ts +50 -50
  410. package/src/module/workflow/controller/task.controller.ts +77 -77
  411. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  412. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  413. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  414. package/src/module/workflow/entity/action-category.entity.ts +38 -38
  415. package/src/module/workflow/entity/action-data.entity.ts +55 -55
  416. package/src/module/workflow/entity/action-resources-mapping.entity.ts +29 -29
  417. package/src/module/workflow/entity/action-template-mapping.entity.ts +17 -17
  418. package/src/module/workflow/entity/action.entity.ts +53 -53
  419. package/src/module/workflow/entity/activity-log.entity.ts +43 -43
  420. package/src/module/workflow/entity/comm-template.entity.ts +43 -43
  421. package/src/module/workflow/entity/entity-modification.entity.ts +38 -38
  422. package/src/module/workflow/entity/form.entity.ts +25 -25
  423. package/src/module/workflow/entity/stage-action-mapping.entity.ts +17 -17
  424. package/src/module/workflow/entity/stage-group.entity.ts +23 -23
  425. package/src/module/workflow/entity/stage-movement-data.entity.ts +38 -38
  426. package/src/module/workflow/entity/stage.entity.ts +20 -20
  427. package/src/module/workflow/entity/task-data.entity.ts +88 -88
  428. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  429. package/src/module/workflow/entity/workflow-data.entity.ts +11 -11
  430. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  431. package/src/module/workflow/entity/workflow.entity.ts +20 -20
  432. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  433. package/src/module/workflow/repository/action-data.repository.ts +334 -334
  434. package/src/module/workflow/repository/action.repository.ts +323 -323
  435. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  436. package/src/module/workflow/repository/comm-template.repository.ts +149 -149
  437. package/src/module/workflow/repository/form-master.repository.ts +59 -59
  438. package/src/module/workflow/repository/stage-group.repository.ts +176 -176
  439. package/src/module/workflow/repository/stage-movement.repository.ts +244 -244
  440. package/src/module/workflow/repository/stage.repository.ts +172 -172
  441. package/src/module/workflow/repository/task.repository.ts +134 -134
  442. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  443. package/src/module/workflow/service/action-category.service.ts +33 -33
  444. package/src/module/workflow/service/action-data.service.ts +62 -62
  445. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  446. package/src/module/workflow/service/action-template-mapping.service.ts +106 -106
  447. package/src/module/workflow/service/action.service.ts +279 -279
  448. package/src/module/workflow/service/activity-log.service.ts +107 -107
  449. package/src/module/workflow/service/comm-template.service.ts +180 -180
  450. package/src/module/workflow/service/entity-modification.service.ts +67 -67
  451. package/src/module/workflow/service/form-master.service.ts +35 -35
  452. package/src/module/workflow/service/populate-workflow.service.ts +303 -303
  453. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  454. package/src/module/workflow/service/stage-group.service.ts +319 -319
  455. package/src/module/workflow/service/stage.service.ts +199 -199
  456. package/src/module/workflow/service/task.service.ts +569 -569
  457. package/src/module/workflow/service/workflow-list-master.service.ts +60 -60
  458. package/src/module/workflow/service/workflow-meta.service.ts +654 -654
  459. package/src/module/workflow/service/workflow.service.ts +205 -205
  460. package/src/module/workflow/workflow.module.ts +176 -176
  461. package/src/module/workflow-automation/SCHEDULING_GUIDE.md +145 -145
  462. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +43 -43
  463. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  464. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +40 -40
  465. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  466. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  467. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  468. package/src/module/workflow-automation/service/schedule-handler.service.ts +149 -149
  469. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +214 -214
  470. package/src/module/workflow-automation/service/workflow-automation.service.ts +508 -508
  471. package/src/module/workflow-automation/workflow-automation.module.ts +47 -48
  472. package/src/module/workflow-schedule/INSTALLATION.md +244 -244
  473. package/src/module/workflow-schedule/MULTI_PROJECT_GUIDE.md +196 -196
  474. package/src/module/workflow-schedule/README.md +422 -422
  475. package/src/module/workflow-schedule/constants/schedule.constants.ts +48 -48
  476. package/src/module/workflow-schedule/controller/workflow-schedule.controller.ts +255 -255
  477. package/src/module/workflow-schedule/docs/CLAUDE_CODE_GUIDE.md +510 -510
  478. package/src/module/workflow-schedule/docs/CLAUDE_CODE_PROMPT.md +362 -362
  479. package/src/module/workflow-schedule/docs/RUN_CLAUDE_CODE.sh +68 -68
  480. package/src/module/workflow-schedule/dto/create-schedule.dto.ts +147 -147
  481. package/src/module/workflow-schedule/dto/get-execution-logs.dto.ts +119 -119
  482. package/src/module/workflow-schedule/dto/update-schedule.dto.ts +96 -96
  483. package/src/module/workflow-schedule/entities/scheduled-workflow.entity.ts +148 -148
  484. package/src/module/workflow-schedule/entities/workflow-execution-log.entity.ts +154 -154
  485. package/src/module/workflow-schedule/interfaces/schedule-job-data.interface.ts +53 -53
  486. package/src/module/workflow-schedule/interfaces/workflow-schedule-options.interface.ts +12 -12
  487. package/src/module/workflow-schedule/processors/schedule.processor.ts +584 -584
  488. package/src/module/workflow-schedule/service/workflow-schedule.service.ts +600 -600
  489. package/src/module/workflow-schedule/workflow-schedule.module.ts +67 -67
  490. package/src/resources/dev.properties.yaml +30 -31
  491. package/src/resources/local.properties.yaml +27 -27
  492. package/src/resources/properties.module.ts +12 -12
  493. package/src/resources/properties.yaml.ts +11 -11
  494. package/src/resources/uat.properties.yaml +31 -31
  495. package/src/table.config.ts +130 -126
  496. package/src/utils/dto/excel-data.dto.ts +14 -14
  497. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  498. package/src/utils/service/base64util.service.ts +18 -18
  499. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  500. package/src/utils/service/codeGenerator.service.ts +22 -22
  501. package/src/utils/service/dateUtil.service.ts +17 -17
  502. package/src/utils/service/encryptUtil.service.ts +97 -97
  503. package/src/utils/service/excel-helper.service.ts +72 -72
  504. package/src/utils/service/excelUtil.service.ts +15 -15
  505. package/src/utils/service/file-util.service.ts +11 -11
  506. package/src/utils/service/json-util.service.ts +23 -23
  507. package/src/utils/service/loggingUtil.service.ts +88 -88
  508. package/src/utils/service/reflection-helper.service.ts +62 -62
  509. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  510. package/src/utils/utils.module.ts +27 -27
  511. package/tsconfig.build.json +4 -4
  512. package/tsconfig.json +24 -24
  513. package/.claude/settings.local.json +0 -26
  514. package/.idea/250218_nodejs_core.iml +0 -9
  515. package/.idea/codeStyles/Project.xml +0 -59
  516. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  517. package/.idea/copilot.data.migration.agent.xml +0 -6
  518. package/.idea/copilot.data.migration.ask.xml +0 -6
  519. package/.idea/copilot.data.migration.ask2agent.xml +0 -6
  520. package/.idea/copilot.data.migration.edit.xml +0 -6
  521. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  522. package/.idea/misc.xml +0 -6
  523. package/.idea/modules.xml +0 -8
  524. package/.idea/prettier.xml +0 -6
  525. package/.idea/vcs.xml +0 -6
  526. package/server.log +0 -850
@@ -1,483 +1,483 @@
1
- import { BadRequestException, Injectable } from '@nestjs/common';
2
- import { Brackets, EntityManager } from 'typeorm';
3
- import { ExcelUtil } from 'src/utils/service/excelUtil.service';
4
- import { EntityMasterService } from '../../meta/service/entity-master.service';
5
- import { AttributeMasterService } from 'src/module/meta/service/attribute-master.service';
6
- import { EntityMaster } from 'src/module/meta/entity/entity-master.entity';
7
- import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
8
- import { ReflectionHelper } from 'src/utils/service/reflection-helper.service';
9
- import { EntityValidationService } from 'src/module/meta/service/entity-validation.service';
10
-
11
- @Injectable()
12
- export class MasterService {
13
- constructor(
14
- private readonly entityManager: EntityManager,
15
- private readonly entityMasterService: EntityMasterService,
16
- private readonly attributeMasterService: AttributeMasterService,
17
- private readonly excelUtil: ExcelUtil,
18
- private reflectionHelper: ReflectionHelper,
19
-
20
- private readonly entityServiceImpl: EntityServiceImpl,
21
- protected readonly entityValidationService: EntityValidationService,
22
- ) {}
23
-
24
- // private readonly metaSheets = [
25
- // 'frm_entity_master',
26
- // 'frm_entity_attribute',
27
- // 'frm_list_master',
28
- // 'frm_list_master_items',
29
- // 'frm_entity_table',
30
- // 'frm_entity_table_column',
31
- // 'frm_entity_view',
32
- // ];
33
- private readonly sequence = [
34
- {
35
- table: 'frm_entity_master',
36
- unique_fields: ['id', 'organization_id'],
37
- },
38
- {
39
- table: 'frm_entity_attribute',
40
- unique_fields: ['mapped_entity_type', 'attribute_key', 'organization_id'],
41
- },
42
- {
43
- table: 'frm_list_master',
44
- unique_fields: ['type', 'organization_id'],
45
- },
46
- {
47
- table: 'frm_list_master_items',
48
- unique_fields: ['listtype', 'code', 'organization_id'],
49
- },
50
- {
51
- table: 'frm_entity_table',
52
- unique_fields: ['list_type', 'mapped_entity_type', 'organization_id'],
53
- },
54
- {
55
- table: 'frm_entity_table_column',
56
- unique_fields: [
57
- 'parent_id',
58
- 'parent_type',
59
- 'attribute_key',
60
- 'organization_id',
61
- ],
62
- },
63
- {
64
- table: 'frm_entity_view',
65
- unique_fields: ['mapped_entity_type', 'organization_id'],
66
- },
67
- {
68
- table: 'sso_user',
69
- unique_fields: ['organization_id'],
70
- },
71
- {
72
- table: 'sso_header_items',
73
- unique_fields: ['code', 'section_id', 'organization_id'],
74
- },
75
- {
76
- table: 'sso_module_access',
77
- unique_fields: ['module_code', 'action_type', 'role_code'],
78
- },
79
- {
80
- table: 'sso_module_action',
81
- unique_fields: ['module_code', 'action_type', 'organization_id'],
82
- },
83
- {
84
- table: 'sso_menu',
85
- unique_fields: ['module_code', 'organization_id'],
86
- },
87
- {
88
- table: 'sso_module',
89
- unique_fields: ['module_code', 'organization_id'],
90
- },
91
- {
92
- table: 'sso_role',
93
- unique_fields: ['code', 'organization_id'],
94
- },
95
- {
96
- table: 'sso_header_sections',
97
- unique_fields: ['section_name', 'organization_id'],
98
- },
99
- {
100
- table: 'sso_user_role_mapping',
101
- unique_fields: ['user_id', 'role_id', 'organization_id'],
102
- },
103
- {
104
- table: 'sso_organization',
105
- unique_fields: ['code'],
106
- },
107
- {
108
- table: 'eth_academic_year',
109
- unique_fields: ['code'],
110
- },
111
- ];
112
- private readonly dataSequence = [
113
- {
114
- table: 'sso_user',
115
- unique_fields: ['code'],
116
- },
117
- {
118
- table: 'sso_role',
119
- unique_fields: ['code'],
120
- },
121
- {
122
- table: 'sso_user_role_mapping',
123
- unique_fields: ['user_id', 'role_id'],
124
- },
125
- {
126
- table: 'eth_school',
127
- unique_fields: ['code'],
128
- },
129
- {
130
- table: 'eth_school_address',
131
- unique_fields: ['code'],
132
- },
133
- ];
134
-
135
- async uploadMeta(file) {
136
- const data = ExcelUtil.readExcel(file.buffer);
137
-
138
- for (let i = 0; i < this.sequence.length; i++) {
139
- const { table, unique_fields } = this.sequence[i];
140
- const sheetData = data[table];
141
-
142
- if (!sheetData) {
143
- console.log(`Sheet ${table} not found in the Excel file.`);
144
- continue;
145
- }
146
- console.log(`Processing sheet: ${table}`);
147
- await this.upsertData(table, unique_fields, sheetData);
148
- }
149
- return {
150
- message: 'Data uploaded successfully',
151
- };
152
- }
153
-
154
- async uploadData(file, loggedInUser) {
155
- const data = ExcelUtil.readExcel(file.buffer);
156
-
157
- for (let i = 0; i < this.dataSequence.length; i++) {
158
- const { table, unique_fields } = this.dataSequence[i];
159
- const sheetData = data[table];
160
-
161
- if (!sheetData) {
162
- console.log(`Sheet ${table} not found in the Excel file.`);
163
- continue;
164
- }
165
-
166
- const entityMasterData =
167
- await this.entityMasterService.getEntityByTableName(table);
168
-
169
- if (!entityMasterData) {
170
- throw new Error(`Entity master not found for table: ${table}`);
171
- }
172
-
173
- const attributes =
174
- await this.attributeMasterService.findAttributesByMappedEntityType(
175
- entityMasterData.mapped_entity_type,
176
- loggedInUser.organization_id,
177
- );
178
-
179
- for (const row of sheetData) {
180
- if (row.parent_type !== undefined && row.parent_id !== undefined) {
181
- this.resolveParent(row);
182
- }
183
-
184
- for (const attribute of attributes) {
185
- if (attribute.data_source_type === 'entity') {
186
- const entityMaster = await this.entityMasterService.getEntityData(
187
- attribute.datasource_list,
188
- loggedInUser,
189
- );
190
- const entityData = await this.entityManager.query(
191
- `SELECT * FROM ${entityMaster.db_table_name} WHERE code = ? LIMIT 1`,
192
- [row[attribute.attribute_key]],
193
- );
194
- row[attribute.attribute_key] = entityData[0].id;
195
- }
196
- }
197
- }
198
-
199
- console.log(`Processing sheet: ${table}`);
200
- await this.upsertData(table, unique_fields, sheetData);
201
- }
202
- return {
203
- message: 'Data uploaded successfully',
204
- };
205
- }
206
-
207
- async uploadEntityData(
208
- file,
209
- entityType,
210
- loggedInUser,
211
- duplicateHandling: 'skip_duplicates' | 'overwrite_items',
212
- ) {
213
- const data = ExcelUtil.readExcel(file.buffer);
214
- const entityMaster =
215
- await this.entityMasterService.findByMappedEntityType(entityType);
216
- if (!entityMaster) {
217
- throw new Error(`Entity master not found for entityType: ${entityType}`);
218
- }
219
-
220
- const tableName = entityMaster.db_table_name;
221
- const sheetData = data[tableName];
222
- if (!sheetData) {
223
- throw new Error(`Sheet for ${tableName} not found in uploaded file`);
224
- }
225
-
226
- const attributes =
227
- await this.attributeMasterService.findAttributesByMappedEntityType(
228
- entityMaster.mapped_entity_type,
229
- loggedInUser,
230
- );
231
-
232
- const uniqueFields = attributes
233
- .filter((attr) => attr.is_unique)
234
- .map((attr) => attr.attribute_key);
235
-
236
- if (uniqueFields.length === 0) {
237
- throw new Error(`No unique fields found for entityType: ${entityType}`);
238
- }
239
-
240
- const errors: any[] = [];
241
-
242
- // ✅ Iterate row by row
243
- for (let i = 0; i < sheetData.length; i++) {
244
- const row = sheetData[i];
245
-
246
- if (row.parent_type && row.parent_id) {
247
- await this.resolveParent(row);
248
- }
249
-
250
- // handle reference entity replacement
251
- for (const attr of attributes) {
252
- if (attr.data_source_type === 'entity' && row[attr.attribute_key]) {
253
- const refEntity = await this.entityMasterService.getEntityData(
254
- attr.datasource_list,
255
- loggedInUser,
256
- );
257
- const refData = await this.entityManager.query(
258
- `SELECT * FROM ${refEntity.db_table_name} WHERE code = ? LIMIT 1`,
259
- [row[attr.attribute_key]],
260
- );
261
-
262
- if (!refData.length) {
263
- errors.push({
264
- row: i + 1,
265
- errors: [
266
- `Reference entity not found for code: ${row[attr.attribute_key]}`,
267
- ],
268
- });
269
- continue; // skip further processing for this row
270
- }
271
-
272
- // replace with reference id
273
- row[attr.attribute_key] = refData[0].id;
274
- }
275
- }
276
-
277
- for (const attr of attributes) {
278
- if (attr.data_source_type === 'master' && row[attr.attribute_key]) {
279
- const refData = await this.entityManager.query(
280
- `SELECT * FROM frm_list_master_items WHERE name = ? and organization_id = ? LIMIT 1`,
281
- [row[attr.attribute_key], loggedInUser.organization_id],
282
- );
283
-
284
- if (!refData.length) {
285
- errors.push({
286
- row: i + 1,
287
- errors: [
288
- `Reference master data not found for name: ${row[attr.attribute_key]}`,
289
- ],
290
- });
291
- continue; // skip further processing for this row
292
- }
293
-
294
- // replace with reference id
295
- row[attr.attribute_key] = refData[0].id;
296
- }
297
- }
298
-
299
- // ✅ validate single row
300
- const rowErrors = await this.entityValidationService.validateImportData(
301
- row,
302
- entityMaster,
303
- loggedInUser,
304
- );
305
-
306
- if (rowErrors.length > 0) {
307
- errors.push({ row: i + 1, errors: rowErrors });
308
- }
309
- }
310
-
311
- // ✅ if any row failed, return errors instead of inserting
312
- if (errors.length > 0) {
313
- throw new BadRequestException({
314
- message: 'Validation errors found',
315
- errors,
316
- });
317
- }
318
-
319
- // ✅ only upsert if no validation errors
320
- await this.upsertViaService(
321
- entityType,
322
- sheetData,
323
- attributes,
324
- uniqueFields,
325
- loggedInUser,
326
- duplicateHandling,
327
- );
328
-
329
- return { message: 'Entity data uploaded successfully' };
330
- }
331
-
332
- // private isMetaSheet(sheetName: string): boolean {
333
- // return this.metaSheets.includes(sheetName.toLowerCase());
334
- // }
335
-
336
- private async resolveParent(row: any): Promise<void> {
337
- const parentType = row.parent_type; // (Future use maybe)
338
- const code = row.parent_id;
339
-
340
- if (!code) {
341
- throw new Error('Parent code is missing in the row');
342
- }
343
-
344
- const parentEntity: EntityMaster | null =
345
- await this.entityMasterService.findByMappedEntityType(parentType);
346
-
347
- const tableName: any = parentEntity?.db_table_name;
348
- if (!tableName) {
349
- throw new Error(`Table name not found for parent type ${parentType}`);
350
- }
351
-
352
- // Using RAW SQL Query
353
- const entityData = await this.entityManager.query(
354
- `SELECT * FROM ${tableName} WHERE code = ? LIMIT 1`,
355
- [code],
356
- );
357
-
358
- if (!entityData || entityData.length === 0) {
359
- throw new Error(
360
- `Parent entity with code ${code} not found in table ${tableName}`,
361
- );
362
- }
363
-
364
- // entityData is an array when using .query()
365
- row.parent_id = entityData[0].id;
366
- }
367
-
368
- async upsertData(
369
- tableName: string,
370
- uniqueFields: string[],
371
- data: any[],
372
- ): Promise<void> {
373
- for (const row of data) {
374
- const whereClause = uniqueFields
375
- .map((field) => `${field} = :${field}`)
376
- .join(' AND ');
377
-
378
- const whereParams = uniqueFields.reduce((acc, field) => {
379
- acc[field] = row[field];
380
- return acc;
381
- }, {});
382
-
383
- const existing = await this.entityManager
384
- .createQueryBuilder()
385
- .select('*')
386
- .from(tableName, tableName)
387
- .where(whereClause, whereParams)
388
- .limit(1)
389
- .getRawMany();
390
-
391
- if (existing.length > 0) {
392
- // Update
393
- await this.entityManager
394
- .createQueryBuilder()
395
- .update(tableName)
396
- .set(row)
397
- .where(whereClause, whereParams)
398
- .execute();
399
- } else {
400
- // Insert
401
- await this.entityManager
402
- .createQueryBuilder()
403
- .insert()
404
- .into(tableName)
405
- .values(row)
406
- .execute();
407
- }
408
- }
409
- }
410
-
411
- async upsertViaService(
412
- entityType: string,
413
- data: any[],
414
- attributes: any[],
415
- uniqueFields: string[],
416
- loggedInUser: any,
417
- duplicateHandling: 'skip_duplicates' | 'overwrite_items',
418
- ): Promise<void> {
419
- const entityMaster =
420
- await this.entityMasterService.findByMappedEntityType(entityType);
421
- if (!entityMaster)
422
- throw new Error(`Entity master not found for ${entityType}`);
423
-
424
- const serviceName = entityMaster.entity_service;
425
- const entityService =
426
- await this.reflectionHelper.getBean<EntityServiceImpl>(serviceName);
427
- if (!entityService)
428
- throw new Error(`Entity service not found for ${entityType}`);
429
-
430
- const errors: { row: number; errors: any[] }[] = [];
431
-
432
- for (const [i, row] of data.entries()) {
433
- row.entity_type = entityType;
434
- row.organization_id = loggedInUser.organization_id;
435
-
436
- // 🧠 Check if this already exists
437
- const qb = this.entityManager
438
- .createQueryBuilder()
439
- .select('*')
440
- .from(entityMaster.db_table_name, entityMaster.db_table_name)
441
- .where(
442
- new Brackets((qbOr) => {
443
- uniqueFields.forEach((field, index) => {
444
- const condition = `${entityMaster.db_table_name}.${field} = :val${index}`;
445
- const param = { [`val${index}`]: row[field] };
446
- if (index === 0) {
447
- qbOr.where(condition, param);
448
- } else {
449
- qbOr.orWhere(condition, param);
450
- }
451
- });
452
- }),
453
- )
454
- .andWhere(`${entityMaster.db_table_name}.organization_id = :orgId`, {
455
- orgId: loggedInUser.organization_id,
456
- })
457
- .andWhere(`${entityMaster.db_table_name}.level_type = :levelType`, {
458
- levelType: loggedInUser.level_type,
459
- })
460
- .andWhere(`${entityMaster.db_table_name}.level_id = :levelId`, {
461
- levelId: loggedInUser.level_id,
462
- });
463
-
464
- const existing = await qb.limit(1).getRawOne();
465
-
466
- if (existing) {
467
- if (duplicateHandling === 'skip_duplicates') continue;
468
- if (duplicateHandling === 'overwrite_items') {
469
- row.id = existing.id;
470
- await entityService.updateEntity(row, loggedInUser);
471
- }
472
- } else {
473
- await entityService.createEntity(row, loggedInUser);
474
- }
475
- }
476
-
477
- // if (errors.length > 0) {
478
- // throw new Error(
479
- // `Validation errors found in the uploaded data: ${JSON.stringify(errors)}`,
480
- // );
481
- // }
482
- }
483
- }
1
+ import { BadRequestException, Injectable } from '@nestjs/common';
2
+ import { Brackets, EntityManager } from 'typeorm';
3
+ import { ExcelUtil } from 'src/utils/service/excelUtil.service';
4
+ import { EntityMasterService } from '../../meta/service/entity-master.service';
5
+ import { AttributeMasterService } from 'src/module/meta/service/attribute-master.service';
6
+ import { EntityMaster } from 'src/module/meta/entity/entity-master.entity';
7
+ import { EntityServiceImpl } from 'src/module/meta/service/entity-service-impl.service';
8
+ import { ReflectionHelper } from 'src/utils/service/reflection-helper.service';
9
+ import { EntityValidationService } from 'src/module/meta/service/entity-validation.service';
10
+
11
+ @Injectable()
12
+ export class MasterService {
13
+ constructor(
14
+ private readonly entityManager: EntityManager,
15
+ private readonly entityMasterService: EntityMasterService,
16
+ private readonly attributeMasterService: AttributeMasterService,
17
+ private readonly excelUtil: ExcelUtil,
18
+ private reflectionHelper: ReflectionHelper,
19
+
20
+ private readonly entityServiceImpl: EntityServiceImpl,
21
+ protected readonly entityValidationService: EntityValidationService,
22
+ ) {}
23
+
24
+ // private readonly metaSheets = [
25
+ // 'frm_entity_master',
26
+ // 'frm_entity_attribute',
27
+ // 'frm_list_master',
28
+ // 'frm_list_master_items',
29
+ // 'frm_entity_table',
30
+ // 'frm_entity_table_column',
31
+ // 'frm_entity_view',
32
+ // ];
33
+ private readonly sequence = [
34
+ {
35
+ table: 'frm_entity_master',
36
+ unique_fields: ['id', 'organization_id'],
37
+ },
38
+ {
39
+ table: 'frm_entity_attribute',
40
+ unique_fields: ['mapped_entity_type', 'attribute_key', 'organization_id'],
41
+ },
42
+ {
43
+ table: 'frm_list_master',
44
+ unique_fields: ['type', 'organization_id'],
45
+ },
46
+ {
47
+ table: 'frm_list_master_items',
48
+ unique_fields: ['listtype', 'code', 'organization_id'],
49
+ },
50
+ {
51
+ table: 'frm_entity_table',
52
+ unique_fields: ['list_type', 'mapped_entity_type', 'organization_id'],
53
+ },
54
+ {
55
+ table: 'frm_entity_table_column',
56
+ unique_fields: [
57
+ 'parent_id',
58
+ 'parent_type',
59
+ 'attribute_key',
60
+ 'organization_id',
61
+ ],
62
+ },
63
+ {
64
+ table: 'frm_entity_view',
65
+ unique_fields: ['mapped_entity_type', 'organization_id'],
66
+ },
67
+ {
68
+ table: 'sso_user',
69
+ unique_fields: ['organization_id'],
70
+ },
71
+ {
72
+ table: 'sso_header_items',
73
+ unique_fields: ['code', 'section_id', 'organization_id'],
74
+ },
75
+ {
76
+ table: 'sso_module_access',
77
+ unique_fields: ['module_code', 'action_type', 'role_code'],
78
+ },
79
+ {
80
+ table: 'sso_module_action',
81
+ unique_fields: ['module_code', 'action_type', 'organization_id'],
82
+ },
83
+ {
84
+ table: 'sso_menu',
85
+ unique_fields: ['module_code', 'organization_id'],
86
+ },
87
+ {
88
+ table: 'sso_module',
89
+ unique_fields: ['module_code', 'organization_id'],
90
+ },
91
+ {
92
+ table: 'sso_role',
93
+ unique_fields: ['code', 'organization_id'],
94
+ },
95
+ {
96
+ table: 'sso_header_sections',
97
+ unique_fields: ['section_name', 'organization_id'],
98
+ },
99
+ {
100
+ table: 'sso_user_role_mapping',
101
+ unique_fields: ['user_id', 'role_id', 'organization_id'],
102
+ },
103
+ {
104
+ table: 'sso_organization',
105
+ unique_fields: ['code'],
106
+ },
107
+ {
108
+ table: 'eth_academic_year',
109
+ unique_fields: ['code'],
110
+ },
111
+ ];
112
+ private readonly dataSequence = [
113
+ {
114
+ table: 'sso_user',
115
+ unique_fields: ['code'],
116
+ },
117
+ {
118
+ table: 'sso_role',
119
+ unique_fields: ['code'],
120
+ },
121
+ {
122
+ table: 'sso_user_role_mapping',
123
+ unique_fields: ['user_id', 'role_id'],
124
+ },
125
+ {
126
+ table: 'eth_school',
127
+ unique_fields: ['code'],
128
+ },
129
+ {
130
+ table: 'eth_school_address',
131
+ unique_fields: ['code'],
132
+ },
133
+ ];
134
+
135
+ async uploadMeta(file) {
136
+ const data = ExcelUtil.readExcel(file.buffer);
137
+
138
+ for (let i = 0; i < this.sequence.length; i++) {
139
+ const { table, unique_fields } = this.sequence[i];
140
+ const sheetData = data[table];
141
+
142
+ if (!sheetData) {
143
+ console.log(`Sheet ${table} not found in the Excel file.`);
144
+ continue;
145
+ }
146
+ console.log(`Processing sheet: ${table}`);
147
+ await this.upsertData(table, unique_fields, sheetData);
148
+ }
149
+ return {
150
+ message: 'Data uploaded successfully',
151
+ };
152
+ }
153
+
154
+ async uploadData(file, loggedInUser) {
155
+ const data = ExcelUtil.readExcel(file.buffer);
156
+
157
+ for (let i = 0; i < this.dataSequence.length; i++) {
158
+ const { table, unique_fields } = this.dataSequence[i];
159
+ const sheetData = data[table];
160
+
161
+ if (!sheetData) {
162
+ console.log(`Sheet ${table} not found in the Excel file.`);
163
+ continue;
164
+ }
165
+
166
+ const entityMasterData =
167
+ await this.entityMasterService.getEntityByTableName(table);
168
+
169
+ if (!entityMasterData) {
170
+ throw new Error(`Entity master not found for table: ${table}`);
171
+ }
172
+
173
+ const attributes =
174
+ await this.attributeMasterService.findAttributesByMappedEntityType(
175
+ entityMasterData.mapped_entity_type,
176
+ loggedInUser.organization_id,
177
+ );
178
+
179
+ for (const row of sheetData) {
180
+ if (row.parent_type !== undefined && row.parent_id !== undefined) {
181
+ this.resolveParent(row);
182
+ }
183
+
184
+ for (const attribute of attributes) {
185
+ if (attribute.data_source_type === 'entity') {
186
+ const entityMaster = await this.entityMasterService.getEntityData(
187
+ attribute.datasource_list,
188
+ loggedInUser,
189
+ );
190
+ const entityData = await this.entityManager.query(
191
+ `SELECT * FROM ${entityMaster.db_table_name} WHERE code = ? LIMIT 1`,
192
+ [row[attribute.attribute_key]],
193
+ );
194
+ row[attribute.attribute_key] = entityData[0].id;
195
+ }
196
+ }
197
+ }
198
+
199
+ console.log(`Processing sheet: ${table}`);
200
+ await this.upsertData(table, unique_fields, sheetData);
201
+ }
202
+ return {
203
+ message: 'Data uploaded successfully',
204
+ };
205
+ }
206
+
207
+ async uploadEntityData(
208
+ file,
209
+ entityType,
210
+ loggedInUser,
211
+ duplicateHandling: 'skip_duplicates' | 'overwrite_items',
212
+ ) {
213
+ const data = ExcelUtil.readExcel(file.buffer);
214
+ const entityMaster =
215
+ await this.entityMasterService.findByMappedEntityType(entityType);
216
+ if (!entityMaster) {
217
+ throw new Error(`Entity master not found for entityType: ${entityType}`);
218
+ }
219
+
220
+ const tableName = entityMaster.db_table_name;
221
+ const sheetData = data[tableName];
222
+ if (!sheetData) {
223
+ throw new Error(`Sheet for ${tableName} not found in uploaded file`);
224
+ }
225
+
226
+ const attributes =
227
+ await this.attributeMasterService.findAttributesByMappedEntityType(
228
+ entityMaster.mapped_entity_type,
229
+ loggedInUser,
230
+ );
231
+
232
+ const uniqueFields = attributes
233
+ .filter((attr) => attr.is_unique)
234
+ .map((attr) => attr.attribute_key);
235
+
236
+ if (uniqueFields.length === 0) {
237
+ throw new Error(`No unique fields found for entityType: ${entityType}`);
238
+ }
239
+
240
+ const errors: any[] = [];
241
+
242
+ // ✅ Iterate row by row
243
+ for (let i = 0; i < sheetData.length; i++) {
244
+ const row = sheetData[i];
245
+
246
+ if (row.parent_type && row.parent_id) {
247
+ await this.resolveParent(row);
248
+ }
249
+
250
+ // handle reference entity replacement
251
+ for (const attr of attributes) {
252
+ if (attr.data_source_type === 'entity' && row[attr.attribute_key]) {
253
+ const refEntity = await this.entityMasterService.getEntityData(
254
+ attr.datasource_list,
255
+ loggedInUser,
256
+ );
257
+ const refData = await this.entityManager.query(
258
+ `SELECT * FROM ${refEntity.db_table_name} WHERE code = ? LIMIT 1`,
259
+ [row[attr.attribute_key]],
260
+ );
261
+
262
+ if (!refData.length) {
263
+ errors.push({
264
+ row: i + 1,
265
+ errors: [
266
+ `Reference entity not found for code: ${row[attr.attribute_key]}`,
267
+ ],
268
+ });
269
+ continue; // skip further processing for this row
270
+ }
271
+
272
+ // replace with reference id
273
+ row[attr.attribute_key] = refData[0].id;
274
+ }
275
+ }
276
+
277
+ for (const attr of attributes) {
278
+ if (attr.data_source_type === 'master' && row[attr.attribute_key]) {
279
+ const refData = await this.entityManager.query(
280
+ `SELECT * FROM frm_list_master_items WHERE name = ? and organization_id = ? LIMIT 1`,
281
+ [row[attr.attribute_key], loggedInUser.organization_id],
282
+ );
283
+
284
+ if (!refData.length) {
285
+ errors.push({
286
+ row: i + 1,
287
+ errors: [
288
+ `Reference master data not found for name: ${row[attr.attribute_key]}`,
289
+ ],
290
+ });
291
+ continue; // skip further processing for this row
292
+ }
293
+
294
+ // replace with reference id
295
+ row[attr.attribute_key] = refData[0].id;
296
+ }
297
+ }
298
+
299
+ // ✅ validate single row
300
+ const rowErrors = await this.entityValidationService.validateImportData(
301
+ row,
302
+ entityMaster,
303
+ loggedInUser,
304
+ );
305
+
306
+ if (rowErrors.length > 0) {
307
+ errors.push({ row: i + 1, errors: rowErrors });
308
+ }
309
+ }
310
+
311
+ // ✅ if any row failed, return errors instead of inserting
312
+ if (errors.length > 0) {
313
+ throw new BadRequestException({
314
+ message: 'Validation errors found',
315
+ errors,
316
+ });
317
+ }
318
+
319
+ // ✅ only upsert if no validation errors
320
+ await this.upsertViaService(
321
+ entityType,
322
+ sheetData,
323
+ attributes,
324
+ uniqueFields,
325
+ loggedInUser,
326
+ duplicateHandling,
327
+ );
328
+
329
+ return { message: 'Entity data uploaded successfully' };
330
+ }
331
+
332
+ // private isMetaSheet(sheetName: string): boolean {
333
+ // return this.metaSheets.includes(sheetName.toLowerCase());
334
+ // }
335
+
336
+ private async resolveParent(row: any): Promise<void> {
337
+ const parentType = row.parent_type; // (Future use maybe)
338
+ const code = row.parent_id;
339
+
340
+ if (!code) {
341
+ throw new Error('Parent code is missing in the row');
342
+ }
343
+
344
+ const parentEntity: EntityMaster | null =
345
+ await this.entityMasterService.findByMappedEntityType(parentType);
346
+
347
+ const tableName: any = parentEntity?.db_table_name;
348
+ if (!tableName) {
349
+ throw new Error(`Table name not found for parent type ${parentType}`);
350
+ }
351
+
352
+ // Using RAW SQL Query
353
+ const entityData = await this.entityManager.query(
354
+ `SELECT * FROM ${tableName} WHERE code = ? LIMIT 1`,
355
+ [code],
356
+ );
357
+
358
+ if (!entityData || entityData.length === 0) {
359
+ throw new Error(
360
+ `Parent entity with code ${code} not found in table ${tableName}`,
361
+ );
362
+ }
363
+
364
+ // entityData is an array when using .query()
365
+ row.parent_id = entityData[0].id;
366
+ }
367
+
368
+ async upsertData(
369
+ tableName: string,
370
+ uniqueFields: string[],
371
+ data: any[],
372
+ ): Promise<void> {
373
+ for (const row of data) {
374
+ const whereClause = uniqueFields
375
+ .map((field) => `${field} = :${field}`)
376
+ .join(' AND ');
377
+
378
+ const whereParams = uniqueFields.reduce((acc, field) => {
379
+ acc[field] = row[field];
380
+ return acc;
381
+ }, {});
382
+
383
+ const existing = await this.entityManager
384
+ .createQueryBuilder()
385
+ .select('*')
386
+ .from(tableName, tableName)
387
+ .where(whereClause, whereParams)
388
+ .limit(1)
389
+ .getRawMany();
390
+
391
+ if (existing.length > 0) {
392
+ // Update
393
+ await this.entityManager
394
+ .createQueryBuilder()
395
+ .update(tableName)
396
+ .set(row)
397
+ .where(whereClause, whereParams)
398
+ .execute();
399
+ } else {
400
+ // Insert
401
+ await this.entityManager
402
+ .createQueryBuilder()
403
+ .insert()
404
+ .into(tableName)
405
+ .values(row)
406
+ .execute();
407
+ }
408
+ }
409
+ }
410
+
411
+ async upsertViaService(
412
+ entityType: string,
413
+ data: any[],
414
+ attributes: any[],
415
+ uniqueFields: string[],
416
+ loggedInUser: any,
417
+ duplicateHandling: 'skip_duplicates' | 'overwrite_items',
418
+ ): Promise<void> {
419
+ const entityMaster =
420
+ await this.entityMasterService.findByMappedEntityType(entityType);
421
+ if (!entityMaster)
422
+ throw new Error(`Entity master not found for ${entityType}`);
423
+
424
+ const serviceName = entityMaster.entity_service;
425
+ const entityService =
426
+ await this.reflectionHelper.getBean<EntityServiceImpl>(serviceName);
427
+ if (!entityService)
428
+ throw new Error(`Entity service not found for ${entityType}`);
429
+
430
+ const errors: { row: number; errors: any[] }[] = [];
431
+
432
+ for (const [i, row] of data.entries()) {
433
+ row.entity_type = entityType;
434
+ row.organization_id = loggedInUser.organization_id;
435
+
436
+ // 🧠 Check if this already exists
437
+ const qb = this.entityManager
438
+ .createQueryBuilder()
439
+ .select('*')
440
+ .from(entityMaster.db_table_name, entityMaster.db_table_name)
441
+ .where(
442
+ new Brackets((qbOr) => {
443
+ uniqueFields.forEach((field, index) => {
444
+ const condition = `${entityMaster.db_table_name}.${field} = :val${index}`;
445
+ const param = { [`val${index}`]: row[field] };
446
+ if (index === 0) {
447
+ qbOr.where(condition, param);
448
+ } else {
449
+ qbOr.orWhere(condition, param);
450
+ }
451
+ });
452
+ }),
453
+ )
454
+ .andWhere(`${entityMaster.db_table_name}.organization_id = :orgId`, {
455
+ orgId: loggedInUser.organization_id,
456
+ })
457
+ .andWhere(`${entityMaster.db_table_name}.level_type = :levelType`, {
458
+ levelType: loggedInUser.level_type,
459
+ })
460
+ .andWhere(`${entityMaster.db_table_name}.level_id = :levelId`, {
461
+ levelId: loggedInUser.level_id,
462
+ });
463
+
464
+ const existing = await qb.limit(1).getRawOne();
465
+
466
+ if (existing) {
467
+ if (duplicateHandling === 'skip_duplicates') continue;
468
+ if (duplicateHandling === 'overwrite_items') {
469
+ row.id = existing.id;
470
+ await entityService.updateEntity(row, loggedInUser);
471
+ }
472
+ } else {
473
+ await entityService.createEntity(row, loggedInUser);
474
+ }
475
+ }
476
+
477
+ // if (errors.length > 0) {
478
+ // throw new Error(
479
+ // `Validation errors found in the uploaded data: ${JSON.stringify(errors)}`,
480
+ // );
481
+ // }
482
+ }
483
+ }