rez_core 6.6.6 → 7.0.0

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 (1048) 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.controller.js.map +1 -1
  17. package/dist/app.module.js +7 -3
  18. package/dist/app.module.js.map +1 -1
  19. package/dist/constant/attribute.constant.d.ts +8 -0
  20. package/dist/constant/attribute.constant.js +14 -0
  21. package/dist/constant/attribute.constant.js.map +1 -0
  22. package/dist/constant/db-data-type.constant.d.ts +33 -0
  23. package/dist/constant/db-data-type.constant.js +119 -0
  24. package/dist/constant/db-data-type.constant.js.map +1 -0
  25. package/dist/constant/entity.constant.d.ts +4 -0
  26. package/dist/constant/entity.constant.js +9 -0
  27. package/dist/constant/entity.constant.js.map +1 -0
  28. package/dist/constant/status.constant.d.ts +4 -0
  29. package/dist/constant/status.constant.js +9 -0
  30. package/dist/constant/status.constant.js.map +1 -0
  31. package/dist/core.module.js +66 -38
  32. package/dist/core.module.js.map +1 -1
  33. package/dist/module/app_master/app-master.module.d.ts +2 -0
  34. package/dist/module/app_master/app-master.module.js +28 -0
  35. package/dist/module/app_master/app-master.module.js.map +1 -0
  36. package/dist/module/{meta → app_master}/controller/app-master.controller.d.ts +1 -0
  37. package/dist/module/{meta → app_master}/controller/app-master.controller.js +20 -1
  38. package/dist/module/app_master/controller/app-master.controller.js.map +1 -0
  39. package/dist/module/app_master/entity/app-master.entity.d.ts +17 -0
  40. package/dist/module/{meta → app_master}/entity/app-master.entity.js +30 -12
  41. package/dist/module/app_master/entity/app-master.entity.js.map +1 -0
  42. package/dist/module/{meta → app_master}/repository/app-master.repository.d.ts +4 -2
  43. package/dist/module/{meta → app_master}/repository/app-master.repository.js +17 -4
  44. package/dist/module/app_master/repository/app-master.repository.js.map +1 -0
  45. package/dist/module/{meta → app_master}/service/app-master.service.d.ts +7 -3
  46. package/dist/module/{meta → app_master}/service/app-master.service.js +12 -5
  47. package/dist/module/app_master/service/app-master.service.js.map +1 -0
  48. package/dist/module/auth/auth.module.d.ts +6 -1
  49. package/dist/module/auth/auth.module.js +28 -1
  50. package/dist/module/auth/auth.module.js.map +1 -1
  51. package/dist/module/auth/guards/role.guard.js +3 -3
  52. package/dist/module/auth/strategies/jwt.strategy.d.ts +6 -2
  53. package/dist/module/auth/strategies/jwt.strategy.js +18 -4
  54. package/dist/module/auth/strategies/jwt.strategy.js.map +1 -1
  55. package/dist/module/dashboard/controller/dashboard.controller.d.ts +6 -6
  56. package/dist/module/dashboard/dashboard.module.js +1 -1
  57. package/dist/module/dashboard/dashboard.module.js.map +1 -1
  58. package/dist/module/dashboard/entity/dashboard_page_data.entity.d.ts +0 -1
  59. package/dist/module/dashboard/entity/dashboard_page_data.entity.js +1 -6
  60. package/dist/module/dashboard/entity/dashboard_page_data.entity.js.map +1 -1
  61. package/dist/module/dashboard/entity/widget_master.entity.d.ts +0 -1
  62. package/dist/module/dashboard/entity/widget_master.entity.js +1 -6
  63. package/dist/module/dashboard/entity/widget_master.entity.js.map +1 -1
  64. package/dist/module/dashboard/service/dashboard.service.d.ts +6 -6
  65. package/dist/module/dashboard/service/dashboard.service.js +1 -2
  66. package/dist/module/dashboard/service/dashboard.service.js.map +1 -1
  67. package/dist/module/eav/controller/eav.controller.d.ts +21 -0
  68. package/dist/module/eav/controller/eav.controller.js +127 -0
  69. package/dist/module/eav/controller/eav.controller.js.map +1 -0
  70. package/dist/module/eav/dto/eav-operation.dto.d.ts +20 -0
  71. package/dist/module/eav/dto/eav-operation.dto.js +75 -0
  72. package/dist/module/eav/dto/eav-operation.dto.js.map +1 -0
  73. package/dist/module/eav/eav.module.d.ts +2 -0
  74. package/dist/module/eav/eav.module.js +84 -0
  75. package/dist/module/eav/eav.module.js.map +1 -0
  76. package/dist/module/eav/entity/eav-boolean.entity.d.ts +9 -0
  77. package/dist/module/eav/entity/eav-boolean.entity.js +48 -0
  78. package/dist/module/eav/entity/eav-boolean.entity.js.map +1 -0
  79. package/dist/module/eav/entity/eav-date.entity.d.ts +9 -0
  80. package/dist/module/eav/entity/eav-date.entity.js +48 -0
  81. package/dist/module/eav/entity/eav-date.entity.js.map +1 -0
  82. package/dist/module/eav/entity/eav-decimal.entity.d.ts +9 -0
  83. package/dist/module/eav/entity/eav-decimal.entity.js +48 -0
  84. package/dist/module/eav/entity/eav-decimal.entity.js.map +1 -0
  85. package/dist/module/eav/entity/eav-int.entity.d.ts +9 -0
  86. package/dist/module/eav/entity/eav-int.entity.js +48 -0
  87. package/dist/module/eav/entity/eav-int.entity.js.map +1 -0
  88. package/dist/module/eav/entity/eav-json.entity.d.ts +9 -0
  89. package/dist/module/eav/entity/eav-json.entity.js +48 -0
  90. package/dist/module/eav/entity/eav-json.entity.js.map +1 -0
  91. package/dist/module/eav/entity/eav-text.entity.d.ts +9 -0
  92. package/dist/module/eav/entity/eav-text.entity.js +48 -0
  93. package/dist/module/eav/entity/eav-text.entity.js.map +1 -0
  94. package/dist/module/eav/entity/eav-time.entity.d.ts +9 -0
  95. package/dist/module/eav/entity/eav-time.entity.js +48 -0
  96. package/dist/module/eav/entity/eav-time.entity.js.map +1 -0
  97. package/dist/module/eav/entity/eav-timestamp.entity.d.ts +9 -0
  98. package/dist/module/eav/entity/eav-timestamp.entity.js +48 -0
  99. package/dist/module/eav/entity/eav-timestamp.entity.js.map +1 -0
  100. package/dist/module/eav/entity/eav-varchar.entity.d.ts +9 -0
  101. package/dist/module/eav/entity/eav-varchar.entity.js +48 -0
  102. package/dist/module/eav/entity/eav-varchar.entity.js.map +1 -0
  103. package/dist/module/eav/interface/eav-strategy.interface.d.ts +8 -0
  104. package/dist/module/eav/interface/eav-strategy.interface.js +3 -0
  105. package/dist/module/eav/interface/eav-strategy.interface.js.map +1 -0
  106. package/dist/module/eav/repository/eav-boolean.repository.d.ts +13 -0
  107. package/dist/module/eav/repository/eav-boolean.repository.js +57 -0
  108. package/dist/module/eav/repository/eav-boolean.repository.js.map +1 -0
  109. package/dist/module/eav/repository/eav-date.repository.d.ts +13 -0
  110. package/dist/module/eav/repository/eav-date.repository.js +57 -0
  111. package/dist/module/eav/repository/eav-date.repository.js.map +1 -0
  112. package/dist/module/eav/repository/eav-decimal.repository.d.ts +13 -0
  113. package/dist/module/eav/repository/eav-decimal.repository.js +57 -0
  114. package/dist/module/eav/repository/eav-decimal.repository.js.map +1 -0
  115. package/dist/module/eav/repository/eav-int.repository.d.ts +13 -0
  116. package/dist/module/eav/repository/eav-int.repository.js +57 -0
  117. package/dist/module/eav/repository/eav-int.repository.js.map +1 -0
  118. package/dist/module/eav/repository/eav-json.repository.d.ts +13 -0
  119. package/dist/module/eav/repository/eav-json.repository.js +57 -0
  120. package/dist/module/eav/repository/eav-json.repository.js.map +1 -0
  121. package/dist/module/eav/repository/eav-text.repository.d.ts +13 -0
  122. package/dist/module/eav/repository/eav-text.repository.js +57 -0
  123. package/dist/module/eav/repository/eav-text.repository.js.map +1 -0
  124. package/dist/module/eav/repository/eav-time.repository.d.ts +13 -0
  125. package/dist/module/eav/repository/eav-time.repository.js +57 -0
  126. package/dist/module/eav/repository/eav-time.repository.js.map +1 -0
  127. package/dist/module/eav/repository/eav-timestamp.repository.d.ts +13 -0
  128. package/dist/module/eav/repository/eav-timestamp.repository.js +57 -0
  129. package/dist/module/eav/repository/eav-timestamp.repository.js.map +1 -0
  130. package/dist/module/eav/repository/eav-varchar.repository.d.ts +13 -0
  131. package/dist/module/eav/repository/eav-varchar.repository.js +57 -0
  132. package/dist/module/eav/repository/eav-varchar.repository.js.map +1 -0
  133. package/dist/module/eav/service/eav-boolean.service.d.ts +12 -0
  134. package/dist/module/eav/service/eav-boolean.service.js +59 -0
  135. package/dist/module/eav/service/eav-boolean.service.js.map +1 -0
  136. package/dist/module/eav/service/eav-date.service.d.ts +12 -0
  137. package/dist/module/eav/service/eav-date.service.js +59 -0
  138. package/dist/module/eav/service/eav-date.service.js.map +1 -0
  139. package/dist/module/eav/service/eav-decimal.service.d.ts +12 -0
  140. package/dist/module/eav/service/eav-decimal.service.js +59 -0
  141. package/dist/module/eav/service/eav-decimal.service.js.map +1 -0
  142. package/dist/module/eav/service/eav-factory.service.d.ts +26 -0
  143. package/dist/module/eav/service/eav-factory.service.js +81 -0
  144. package/dist/module/eav/service/eav-factory.service.js.map +1 -0
  145. package/dist/module/eav/service/eav-int.service.d.ts +12 -0
  146. package/dist/module/eav/service/eav-int.service.js +59 -0
  147. package/dist/module/eav/service/eav-int.service.js.map +1 -0
  148. package/dist/module/eav/service/eav-json.service.d.ts +12 -0
  149. package/dist/module/eav/service/eav-json.service.js +59 -0
  150. package/dist/module/eav/service/eav-json.service.js.map +1 -0
  151. package/dist/module/eav/service/eav-text.service.d.ts +12 -0
  152. package/dist/module/eav/service/eav-text.service.js +59 -0
  153. package/dist/module/eav/service/eav-text.service.js.map +1 -0
  154. package/dist/module/eav/service/eav-time.service.d.ts +12 -0
  155. package/dist/module/eav/service/eav-time.service.js +59 -0
  156. package/dist/module/eav/service/eav-time.service.js.map +1 -0
  157. package/dist/module/eav/service/eav-timestamp.service.d.ts +12 -0
  158. package/dist/module/eav/service/eav-timestamp.service.js +59 -0
  159. package/dist/module/eav/service/eav-timestamp.service.js.map +1 -0
  160. package/dist/module/eav/service/eav-varchar.service.d.ts +12 -0
  161. package/dist/module/eav/service/eav-varchar.service.js +59 -0
  162. package/dist/module/eav/service/eav-varchar.service.js.map +1 -0
  163. package/dist/module/eav/service/eav.service.d.ts +14 -0
  164. package/dist/module/eav/service/eav.service.js +65 -0
  165. package/dist/module/eav/service/eav.service.js.map +1 -0
  166. package/dist/module/enterprise/controller/enterprise.controller.d.ts +12 -0
  167. package/dist/module/enterprise/controller/enterprise.controller.js +57 -0
  168. package/dist/module/enterprise/controller/enterprise.controller.js.map +1 -0
  169. package/dist/module/enterprise/controller/meta.controller.d.ts +9 -0
  170. package/dist/module/enterprise/controller/meta.controller.js +43 -0
  171. package/dist/module/enterprise/controller/meta.controller.js.map +1 -0
  172. package/dist/module/enterprise/controller/organization.controller.d.ts +12 -4
  173. package/dist/module/enterprise/controller/organization.controller.js +68 -8
  174. package/dist/module/enterprise/controller/organization.controller.js.map +1 -1
  175. package/dist/module/enterprise/enterprise.module.js +10 -15
  176. package/dist/module/enterprise/enterprise.module.js.map +1 -1
  177. package/dist/module/enterprise/entity/enterprise.entity.d.ts +1 -3
  178. package/dist/module/enterprise/entity/enterprise.entity.js +4 -12
  179. package/dist/module/enterprise/entity/enterprise.entity.js.map +1 -1
  180. package/dist/module/enterprise/entity/organization-app-mapping.entity.d.ts +6 -1
  181. package/dist/module/enterprise/entity/organization-app-mapping.entity.js +21 -4
  182. package/dist/module/enterprise/entity/organization-app-mapping.entity.js.map +1 -1
  183. package/dist/module/enterprise/entity/organization.entity.d.ts +3 -17
  184. package/dist/module/enterprise/entity/organization.entity.js +11 -73
  185. package/dist/module/enterprise/entity/organization.entity.js.map +1 -1
  186. package/dist/module/enterprise/repository/enterprise.repository.d.ts +4 -2
  187. package/dist/module/enterprise/repository/enterprise.repository.js +19 -4
  188. package/dist/module/enterprise/repository/enterprise.repository.js.map +1 -1
  189. package/dist/module/enterprise/repository/school.repository.js +8 -8
  190. package/dist/module/enterprise/repository/school.repository.js.map +1 -1
  191. package/dist/module/enterprise/service/brand-profile.service.d.ts +0 -0
  192. package/dist/module/enterprise/service/brand-profile.service.js +1 -0
  193. package/dist/module/enterprise/service/brand-profile.service.js.map +1 -0
  194. package/dist/module/enterprise/service/brand.service.d.ts +0 -3
  195. package/dist/module/enterprise/service/brand.service.js +0 -17
  196. package/dist/module/enterprise/service/brand.service.js.map +1 -1
  197. package/dist/module/enterprise/service/enterprise.service.d.ts +2 -2
  198. package/dist/module/enterprise/service/enterprise.service.js +6 -4
  199. package/dist/module/enterprise/service/enterprise.service.js.map +1 -1
  200. package/dist/module/enterprise/service/organization.service.d.ts +13 -5
  201. package/dist/module/enterprise/service/organization.service.js +177 -29
  202. package/dist/module/enterprise/service/organization.service.js.map +1 -1
  203. package/dist/module/enterprise/service/populate-meta.service.d.ts +9 -0
  204. package/dist/module/{meta → enterprise}/service/populate-meta.service.js +24 -43
  205. package/dist/module/enterprise/service/populate-meta.service.js.map +1 -0
  206. package/dist/module/enterprise/service/school.service.d.ts +0 -0
  207. package/dist/module/enterprise/service/school.service.js +1 -0
  208. package/dist/module/enterprise/service/school.service.js.map +1 -0
  209. package/dist/module/entity_json/controller/entity_json.controller.d.ts +2 -5
  210. package/dist/module/entity_json/controller/entity_json.controller.js +7 -21
  211. package/dist/module/entity_json/controller/entity_json.controller.js.map +1 -1
  212. package/dist/module/entity_json/service/entity_json.service.d.ts +10 -2
  213. package/dist/module/entity_json/service/entity_json.service.js +102 -95
  214. package/dist/module/entity_json/service/entity_json.service.js.map +1 -1
  215. package/dist/module/export/service/export.service.js +5 -0
  216. package/dist/module/export/service/export.service.js.map +1 -1
  217. package/dist/module/filter/controller/filter.controller.d.ts +1 -12
  218. package/dist/module/filter/controller/filter.controller.js +3 -2
  219. package/dist/module/filter/controller/filter.controller.js.map +1 -1
  220. package/dist/module/filter/dto/filter-request.dto.d.ts +1 -0
  221. package/dist/module/filter/entity/saved-filter-detail.entity.d.ts +0 -1
  222. package/dist/module/filter/entity/saved-filter-detail.entity.js +1 -7
  223. package/dist/module/filter/entity/saved-filter-detail.entity.js.map +1 -1
  224. package/dist/module/filter/entity/saved-filter-master.entity.d.ts +0 -1
  225. package/dist/module/filter/entity/saved-filter-master.entity.js +1 -7
  226. package/dist/module/filter/entity/saved-filter-master.entity.js.map +1 -1
  227. package/dist/module/filter/filter.module.js +2 -11
  228. package/dist/module/filter/filter.module.js.map +1 -1
  229. package/dist/module/filter/repository/saved-filter.repository.js +2 -4
  230. package/dist/module/filter/repository/saved-filter.repository.js.map +1 -1
  231. package/dist/module/filter/service/filter.service.d.ts +5 -38
  232. package/dist/module/filter/service/filter.service.js +134 -88
  233. package/dist/module/filter/service/filter.service.js.map +1 -1
  234. package/dist/module/filter/service/saved-filter.service.d.ts +2 -3
  235. package/dist/module/filter/service/saved-filter.service.js +18 -15
  236. package/dist/module/filter/service/saved-filter.service.js.map +1 -1
  237. package/dist/module/integration/examples/usage.example.js +9 -9
  238. package/dist/module/integration/service/integration.service.d.ts +1 -6
  239. package/dist/module/integration/service/integration.service.js +4 -18
  240. package/dist/module/integration/service/integration.service.js.map +1 -1
  241. package/dist/module/integration/service/oauth.service.js +0 -2
  242. package/dist/module/integration/service/oauth.service.js.map +1 -1
  243. package/dist/module/integration/service/wrapper.service.js +0 -1
  244. package/dist/module/integration/service/wrapper.service.js.map +1 -1
  245. package/dist/module/integration/strategies/email/gmail-api.strategy.js +7 -23
  246. package/dist/module/integration/strategies/email/gmail-api.strategy.js.map +1 -1
  247. package/dist/module/integration/strategies/email/sendgrid-api.strategy.js +5 -8
  248. package/dist/module/integration/strategies/email/sendgrid-api.strategy.js.map +1 -1
  249. package/dist/module/layout/controller/layout.controller.d.ts +1 -3
  250. package/dist/module/layout/controller/layout.controller.js +3 -7
  251. package/dist/module/layout/controller/layout.controller.js.map +1 -1
  252. package/dist/module/layout/entity/header-items.entity.js +1 -1
  253. package/dist/module/layout/entity/header-section.entity.d.ts +0 -2
  254. package/dist/module/layout/entity/header-section.entity.js +1 -9
  255. package/dist/module/layout/entity/header-section.entity.js.map +1 -1
  256. package/dist/module/layout/layout.module.js +1 -2
  257. package/dist/module/layout/layout.module.js.map +1 -1
  258. package/dist/module/layout/repository/header-section.repository.d.ts +0 -1
  259. package/dist/module/layout/repository/header-section.repository.js +0 -5
  260. package/dist/module/layout/repository/header-section.repository.js.map +1 -1
  261. package/dist/module/layout/service/header-section.service.d.ts +1 -1
  262. package/dist/module/layout/service/header-section.service.js +1 -1
  263. package/dist/module/layout/service/header-section.service.js.map +1 -1
  264. package/dist/module/linked_attributes/controller/linked_attributes.controller.d.ts +1 -0
  265. package/dist/module/linked_attributes/service/linked_attributes.service.d.ts +2 -2
  266. package/dist/module/linked_attributes/service/linked_attributes.service.js +3 -4
  267. package/dist/module/linked_attributes/service/linked_attributes.service.js.map +1 -1
  268. package/dist/module/listmaster/controller/list-master.controller.d.ts +0 -1
  269. package/dist/module/listmaster/controller/list-master.controller.js +0 -19
  270. package/dist/module/listmaster/controller/list-master.controller.js.map +1 -1
  271. package/dist/module/listmaster/entity/list-master-items.entity.d.ts +0 -4
  272. package/dist/module/listmaster/entity/list-master-items.entity.js +2 -20
  273. package/dist/module/listmaster/entity/list-master-items.entity.js.map +1 -1
  274. package/dist/module/listmaster/entity/list-master.entity.d.ts +1 -4
  275. package/dist/module/listmaster/entity/list-master.entity.js +5 -19
  276. package/dist/module/listmaster/entity/list-master.entity.js.map +1 -1
  277. package/dist/module/listmaster/repository/list-master-items.repository.d.ts +2 -2
  278. package/dist/module/listmaster/repository/list-master-items.repository.js +68 -25
  279. package/dist/module/listmaster/repository/list-master-items.repository.js.map +1 -1
  280. package/dist/module/listmaster/service/list-master-item.service.js +129 -48
  281. package/dist/module/listmaster/service/list-master-item.service.js.map +1 -1
  282. package/dist/module/listmaster/service/list-master.service.d.ts +16 -12
  283. package/dist/module/listmaster/service/list-master.service.js +228 -135
  284. package/dist/module/listmaster/service/list-master.service.js.map +1 -1
  285. package/dist/module/mapper/entity/field-lovs.entity.d.ts +0 -1
  286. package/dist/module/mapper/entity/field-lovs.entity.js +1 -6
  287. package/dist/module/mapper/entity/field-lovs.entity.js.map +1 -1
  288. package/dist/module/mapper/entity/field-mapper.entity.d.ts +0 -1
  289. package/dist/module/mapper/entity/field-mapper.entity.js +1 -6
  290. package/dist/module/mapper/entity/field-mapper.entity.js.map +1 -1
  291. package/dist/module/mapper/entity/mapper.entity.d.ts +0 -2
  292. package/dist/module/mapper/entity/mapper.entity.js +1 -10
  293. package/dist/module/mapper/entity/mapper.entity.js.map +1 -1
  294. package/dist/module/mapper/service/field-mapper.service.js +0 -1
  295. package/dist/module/mapper/service/field-mapper.service.js.map +1 -1
  296. package/dist/module/master/controller/master.controller.d.ts +1 -3
  297. package/dist/module/master/controller/master.controller.js +4 -6
  298. package/dist/module/master/controller/master.controller.js.map +1 -1
  299. package/dist/module/master/service/master.service.d.ts +1 -1
  300. package/dist/module/master/service/master.service.js +30 -44
  301. package/dist/module/master/service/master.service.js.map +1 -1
  302. package/dist/module/meta/controller/attribute-master.controller.d.ts +3 -8
  303. package/dist/module/meta/controller/attribute-master.controller.js +5 -19
  304. package/dist/module/meta/controller/attribute-master.controller.js.map +1 -1
  305. package/dist/module/meta/controller/entity-dynamic.controller.js +6 -3
  306. package/dist/module/meta/controller/entity-dynamic.controller.js.map +1 -1
  307. package/dist/module/meta/controller/entity-master.controller.js +1 -0
  308. package/dist/module/meta/controller/entity-master.controller.js.map +1 -1
  309. package/dist/module/meta/controller/entity.controller.js +3 -3
  310. package/dist/module/meta/controller/entity.controller.js.map +1 -1
  311. package/dist/module/meta/controller/entity.public.controller.js +1 -0
  312. package/dist/module/meta/controller/entity.public.controller.js.map +1 -1
  313. package/dist/module/meta/controller/media.controller.d.ts +0 -6
  314. package/dist/module/meta/controller/media.controller.js +0 -27
  315. package/dist/module/meta/controller/media.controller.js.map +1 -1
  316. package/dist/module/meta/controller/meta.controller.d.ts +1 -6
  317. package/dist/module/meta/controller/meta.controller.js +2 -19
  318. package/dist/module/meta/controller/meta.controller.js.map +1 -1
  319. package/dist/module/meta/entity/attribute-master.entity.d.ts +12 -14
  320. package/dist/module/meta/entity/attribute-master.entity.js +41 -77
  321. package/dist/module/meta/entity/attribute-master.entity.js.map +1 -1
  322. package/dist/module/meta/entity/base-entity.entity.d.ts +6 -7
  323. package/dist/module/meta/entity/base-entity.entity.js +24 -47
  324. package/dist/module/meta/entity/base-entity.entity.js.map +1 -1
  325. package/dist/module/meta/entity/dynamic.entity.d.ts +3 -0
  326. package/dist/module/meta/entity/dynamic.entity.js +18 -0
  327. package/dist/module/meta/entity/dynamic.entity.js.map +1 -0
  328. package/dist/module/meta/entity/entity-master.entity.d.ts +6 -9
  329. package/dist/module/meta/entity/entity-master.entity.js +21 -66
  330. package/dist/module/meta/entity/entity-master.entity.js.map +1 -1
  331. package/dist/module/meta/entity/entity-relation-data.entity.d.ts +0 -1
  332. package/dist/module/meta/entity/entity-relation-data.entity.js +1 -7
  333. package/dist/module/meta/entity/entity-relation-data.entity.js.map +1 -1
  334. package/dist/module/meta/entity/entity-relation.entity.d.ts +0 -1
  335. package/dist/module/meta/entity/entity-relation.entity.js +1 -7
  336. package/dist/module/meta/entity/entity-relation.entity.js.map +1 -1
  337. package/dist/module/meta/entity/entity-table-column.entity.d.ts +0 -1
  338. package/dist/module/meta/entity/entity-table-column.entity.js +1 -7
  339. package/dist/module/meta/entity/entity-table-column.entity.js.map +1 -1
  340. package/dist/module/meta/entity/entity-table.entity.d.ts +0 -1
  341. package/dist/module/meta/entity/entity-table.entity.js +1 -7
  342. package/dist/module/meta/entity/entity-table.entity.js.map +1 -1
  343. package/dist/module/meta/entity/media-data.entity.d.ts +0 -2
  344. package/dist/module/meta/entity/media-data.entity.js +0 -8
  345. package/dist/module/meta/entity/media-data.entity.js.map +1 -1
  346. package/dist/module/meta/entity/preference.entity.d.ts +0 -1
  347. package/dist/module/meta/entity/preference.entity.js +1 -7
  348. package/dist/module/meta/entity/preference.entity.js.map +1 -1
  349. package/dist/module/meta/entity/view-master.entity.d.ts +0 -1
  350. package/dist/module/meta/entity/view-master.entity.js +1 -7
  351. package/dist/module/meta/entity/view-master.entity.js.map +1 -1
  352. package/dist/module/meta/entity.module.js +11 -19
  353. package/dist/module/meta/entity.module.js.map +1 -1
  354. package/dist/module/meta/repository/attribute-master.repository.d.ts +8 -2
  355. package/dist/module/meta/repository/attribute-master.repository.js +41 -15
  356. package/dist/module/meta/repository/attribute-master.repository.js.map +1 -1
  357. package/dist/module/meta/repository/entity-master.repository.js +1 -1
  358. package/dist/module/meta/repository/entity-master.repository.js.map +1 -1
  359. package/dist/module/meta/repository/entity-relation.repository.d.ts +1 -0
  360. package/dist/module/meta/repository/entity-relation.repository.js +10 -0
  361. package/dist/module/meta/repository/entity-relation.repository.js.map +1 -1
  362. package/dist/module/meta/service/attribute-master.service.d.ts +6 -6
  363. package/dist/module/meta/service/attribute-master.service.js +74 -49
  364. package/dist/module/meta/service/attribute-master.service.js.map +1 -1
  365. package/dist/module/meta/service/entity-dynamic.service.d.ts +12 -13
  366. package/dist/module/meta/service/entity-dynamic.service.js +215 -80
  367. package/dist/module/meta/service/entity-dynamic.service.js.map +1 -1
  368. package/dist/module/meta/service/entity-master.service.d.ts +10 -1
  369. package/dist/module/meta/service/entity-master.service.js +80 -3
  370. package/dist/module/meta/service/entity-master.service.js.map +1 -1
  371. package/dist/module/meta/service/entity-relation.service.d.ts +6 -5
  372. package/dist/module/meta/service/entity-relation.service.js +7 -10
  373. package/dist/module/meta/service/entity-relation.service.js.map +1 -1
  374. package/dist/module/meta/service/entity-service-impl.service.d.ts +3 -3
  375. package/dist/module/meta/service/entity-service-impl.service.js +14 -18
  376. package/dist/module/meta/service/entity-service-impl.service.js.map +1 -1
  377. package/dist/module/meta/service/entity-table.service.d.ts +4 -5
  378. package/dist/module/meta/service/entity-table.service.js +24 -45
  379. package/dist/module/meta/service/entity-table.service.js.map +1 -1
  380. package/dist/module/meta/service/entity-validation.service.d.ts +1 -3
  381. package/dist/module/meta/service/entity-validation.service.js +5 -34
  382. package/dist/module/meta/service/entity-validation.service.js.map +1 -1
  383. package/dist/module/meta/service/entity.service.d.ts +1 -1
  384. package/dist/module/meta/service/media-data.service.d.ts +0 -4
  385. package/dist/module/meta/service/media-data.service.js +0 -129
  386. package/dist/module/meta/service/media-data.service.js.map +1 -1
  387. package/dist/module/meta/service/resolver.service.d.ts +1 -1
  388. package/dist/module/meta/service/resolver.service.js +55 -95
  389. package/dist/module/meta/service/resolver.service.js.map +1 -1
  390. package/dist/module/module/controller/menu.controller.d.ts +6 -1
  391. package/dist/module/module/controller/menu.controller.js +20 -2
  392. package/dist/module/module/controller/menu.controller.js.map +1 -1
  393. package/dist/module/module/controller/module-access.controller.d.ts +3 -4
  394. package/dist/module/module/controller/module-access.controller.js +13 -8
  395. package/dist/module/module/controller/module-access.controller.js.map +1 -1
  396. package/dist/module/module/entity/menu.entity.d.ts +6 -3
  397. package/dist/module/module/entity/menu.entity.js +19 -10
  398. package/dist/module/module/entity/menu.entity.js.map +1 -1
  399. package/dist/module/module/entity/module-access.entity.d.ts +15 -1
  400. package/dist/module/module/entity/module-access.entity.js +49 -3
  401. package/dist/module/module/entity/module-access.entity.js.map +1 -1
  402. package/dist/module/module/entity/module-action.entity.d.ts +4 -2
  403. package/dist/module/module/entity/module-action.entity.js +11 -6
  404. package/dist/module/module/entity/module-action.entity.js.map +1 -1
  405. package/dist/module/module/entity/module.entity.d.ts +3 -5
  406. package/dist/module/module/entity/module.entity.js +8 -18
  407. package/dist/module/module/entity/module.entity.js.map +1 -1
  408. package/dist/module/module/module.module.d.ts +1 -1
  409. package/dist/module/module/module.module.js +7 -7
  410. package/dist/module/module/module.module.js.map +1 -1
  411. package/dist/module/module/repository/menu.repository.d.ts +3 -3
  412. package/dist/module/module/repository/menu.repository.js +40 -29
  413. package/dist/module/module/repository/menu.repository.js.map +1 -1
  414. package/dist/module/module/repository/module-access.repository.d.ts +6 -6
  415. package/dist/module/module/repository/module-access.repository.js +100 -50
  416. package/dist/module/module/repository/module-access.repository.js.map +1 -1
  417. package/dist/module/module/service/menu.service.d.ts +2 -4
  418. package/dist/module/module/service/menu.service.js +7 -10
  419. package/dist/module/module/service/menu.service.js.map +1 -1
  420. package/dist/module/module/service/module-access.service.d.ts +7 -10
  421. package/dist/module/module/service/module-access.service.js +22 -24
  422. package/dist/module/module/service/module-access.service.js.map +1 -1
  423. package/dist/module/module/service/module-import.service.d.ts +18 -0
  424. package/dist/module/module/service/module-import.service.js +203 -0
  425. package/dist/module/module/service/module-import.service.js.map +1 -0
  426. package/dist/module/notification/entity/notification.entity.d.ts +17 -2
  427. package/dist/module/notification/entity/notification.entity.js +68 -2
  428. package/dist/module/notification/entity/notification.entity.js.map +1 -1
  429. package/dist/module/notification/notification.module.js +3 -6
  430. package/dist/module/notification/notification.module.js.map +1 -1
  431. package/dist/module/notification/service/email.service.d.ts +1 -0
  432. package/dist/module/notification/service/email.service.js +14 -0
  433. package/dist/module/notification/service/email.service.js.map +1 -1
  434. package/dist/module/notification/service/notification.service.d.ts +1 -5
  435. package/dist/module/notification/service/notification.service.js +41 -31
  436. package/dist/module/notification/service/notification.service.js.map +1 -1
  437. package/dist/module/notification/service/otp.service.d.ts +2 -2
  438. package/dist/module/notification/service/otp.service.js +4 -5
  439. package/dist/module/notification/service/otp.service.js.map +1 -1
  440. package/dist/module/preference_master/entity/preference.entity.d.ts +9 -0
  441. package/dist/module/preference_master/entity/preference.entity.js +48 -0
  442. package/dist/module/preference_master/entity/preference.entity.js.map +1 -0
  443. package/dist/module/preference_master/preference.service.d.ts +8 -0
  444. package/dist/module/preference_master/preference.service.js +31 -0
  445. package/dist/module/preference_master/preference.service.js.map +1 -0
  446. package/dist/module/preference_master/repo/preference.repository.d.ts +8 -0
  447. package/dist/module/preference_master/repo/preference.repository.js +48 -0
  448. package/dist/module/preference_master/repo/preference.repository.js.map +1 -0
  449. package/dist/module/user/controller/login.controller.d.ts +1 -3
  450. package/dist/module/user/controller/login.controller.js +20 -24
  451. package/dist/module/user/controller/login.controller.js.map +1 -1
  452. package/dist/module/user/controller/user.controller.d.ts +0 -2
  453. package/dist/module/user/controller/user.controller.js +0 -13
  454. package/dist/module/user/controller/user.controller.js.map +1 -1
  455. package/dist/module/user/dto/create-user.dto.d.ts +6 -3
  456. package/dist/module/user/dto/create-user.dto.js +17 -11
  457. package/dist/module/user/dto/create-user.dto.js.map +1 -1
  458. package/dist/module/user/entity/role.entity.d.ts +18 -6
  459. package/dist/module/user/entity/role.entity.js +64 -19
  460. package/dist/module/user/entity/role.entity.js.map +1 -1
  461. package/dist/module/user/entity/user-role-mapping.entity.d.ts +10 -0
  462. package/dist/module/user/entity/user-role-mapping.entity.js +33 -1
  463. package/dist/module/user/entity/user-role-mapping.entity.js.map +1 -1
  464. package/dist/module/user/entity/user-session.entity.d.ts +0 -2
  465. package/dist/module/user/entity/user-session.entity.js +2 -20
  466. package/dist/module/user/entity/user-session.entity.js.map +1 -1
  467. package/dist/module/user/entity/user.entity.d.ts +17 -5
  468. package/dist/module/user/entity/user.entity.js +61 -15
  469. package/dist/module/user/entity/user.entity.js.map +1 -1
  470. package/dist/module/user/repository/role.repository.d.ts +7 -2
  471. package/dist/module/user/repository/role.repository.js +23 -8
  472. package/dist/module/user/repository/role.repository.js.map +1 -1
  473. package/dist/module/user/repository/user-role-mapping.repository.d.ts +1 -0
  474. package/dist/module/user/repository/user-role-mapping.repository.js +3 -0
  475. package/dist/module/user/repository/user-role-mapping.repository.js.map +1 -1
  476. package/dist/module/user/repository/user.repository.d.ts +5 -2
  477. package/dist/module/user/repository/user.repository.js +26 -7
  478. package/dist/module/user/repository/user.repository.js.map +1 -1
  479. package/dist/module/user/repository/userSession.repository.d.ts +1 -0
  480. package/dist/module/user/repository/userSession.repository.js +3 -0
  481. package/dist/module/user/repository/userSession.repository.js.map +1 -1
  482. package/dist/module/user/service/login.service.d.ts +3 -5
  483. package/dist/module/user/service/login.service.js +43 -42
  484. package/dist/module/user/service/login.service.js.map +1 -1
  485. package/dist/module/user/service/role.service.d.ts +24 -11
  486. package/dist/module/user/service/role.service.js +54 -41
  487. package/dist/module/user/service/role.service.js.map +1 -1
  488. package/dist/module/user/service/user-role-mapping.service.d.ts +5 -0
  489. package/dist/module/user/service/user-role-mapping.service.js +9 -0
  490. package/dist/module/user/service/user-role-mapping.service.js.map +1 -1
  491. package/dist/module/user/service/user-session.service.d.ts +3 -4
  492. package/dist/module/user/service/user-session.service.js +10 -12
  493. package/dist/module/user/service/user-session.service.js.map +1 -1
  494. package/dist/module/user/service/user.service.d.ts +33 -22
  495. package/dist/module/user/service/user.service.js +66 -58
  496. package/dist/module/user/service/user.service.js.map +1 -1
  497. package/dist/module/user/user.module.js +2 -7
  498. package/dist/module/user/user.module.js.map +1 -1
  499. package/dist/module/workflow/controller/activity-log.controller.d.ts +5 -6
  500. package/dist/module/workflow/entity/action-category.entity.d.ts +0 -1
  501. package/dist/module/workflow/entity/action-category.entity.js +1 -7
  502. package/dist/module/workflow/entity/action-category.entity.js.map +1 -1
  503. package/dist/module/workflow/entity/action-data.entity.d.ts +0 -1
  504. package/dist/module/workflow/entity/action-data.entity.js +1 -6
  505. package/dist/module/workflow/entity/action-data.entity.js.map +1 -1
  506. package/dist/module/workflow/entity/action-resources-mapping.entity.d.ts +0 -1
  507. package/dist/module/workflow/entity/action-resources-mapping.entity.js +1 -7
  508. package/dist/module/workflow/entity/action-resources-mapping.entity.js.map +1 -1
  509. package/dist/module/workflow/entity/action-template-mapping.entity.d.ts +0 -1
  510. package/dist/module/workflow/entity/action-template-mapping.entity.js +1 -7
  511. package/dist/module/workflow/entity/action-template-mapping.entity.js.map +1 -1
  512. package/dist/module/workflow/entity/action.entity.d.ts +0 -1
  513. package/dist/module/workflow/entity/action.entity.js +1 -7
  514. package/dist/module/workflow/entity/action.entity.js.map +1 -1
  515. package/dist/module/workflow/entity/activity-log.entity.d.ts +0 -1
  516. package/dist/module/workflow/entity/activity-log.entity.js +1 -6
  517. package/dist/module/workflow/entity/activity-log.entity.js.map +1 -1
  518. package/dist/module/workflow/entity/comm-template.entity.d.ts +0 -1
  519. package/dist/module/workflow/entity/comm-template.entity.js +1 -7
  520. package/dist/module/workflow/entity/comm-template.entity.js.map +1 -1
  521. package/dist/module/workflow/entity/entity-modification.entity.d.ts +0 -1
  522. package/dist/module/workflow/entity/entity-modification.entity.js +1 -7
  523. package/dist/module/workflow/entity/entity-modification.entity.js.map +1 -1
  524. package/dist/module/workflow/entity/form.entity.d.ts +0 -1
  525. package/dist/module/workflow/entity/form.entity.js +1 -6
  526. package/dist/module/workflow/entity/form.entity.js.map +1 -1
  527. package/dist/module/workflow/entity/stage-action-mapping.entity.d.ts +0 -1
  528. package/dist/module/workflow/entity/stage-action-mapping.entity.js +1 -7
  529. package/dist/module/workflow/entity/stage-action-mapping.entity.js.map +1 -1
  530. package/dist/module/workflow/entity/stage-group.entity.d.ts +0 -1
  531. package/dist/module/workflow/entity/stage-group.entity.js +1 -7
  532. package/dist/module/workflow/entity/stage-group.entity.js.map +1 -1
  533. package/dist/module/workflow/entity/stage-movement-data.entity.d.ts +0 -1
  534. package/dist/module/workflow/entity/stage-movement-data.entity.js +1 -7
  535. package/dist/module/workflow/entity/stage-movement-data.entity.js.map +1 -1
  536. package/dist/module/workflow/entity/stage.entity.d.ts +0 -1
  537. package/dist/module/workflow/entity/stage.entity.js +1 -7
  538. package/dist/module/workflow/entity/stage.entity.js.map +1 -1
  539. package/dist/module/workflow/entity/task-data.entity.d.ts +0 -1
  540. package/dist/module/workflow/entity/task-data.entity.js +1 -6
  541. package/dist/module/workflow/entity/task-data.entity.js.map +1 -1
  542. package/dist/module/workflow/entity/workflow-data.entity.d.ts +0 -1
  543. package/dist/module/workflow/entity/workflow-data.entity.js +1 -10
  544. package/dist/module/workflow/entity/workflow-data.entity.js.map +1 -1
  545. package/dist/module/workflow/entity/workflow.entity.d.ts +0 -1
  546. package/dist/module/workflow/entity/workflow.entity.js +1 -7
  547. package/dist/module/workflow/entity/workflow.entity.js.map +1 -1
  548. package/dist/module/workflow/repository/action-data.repository.d.ts +1 -1
  549. package/dist/module/workflow/repository/action-data.repository.js +9 -17
  550. package/dist/module/workflow/repository/action-data.repository.js.map +1 -1
  551. package/dist/module/workflow/repository/action.repository.d.ts +1 -1
  552. package/dist/module/workflow/repository/action.repository.js +12 -12
  553. package/dist/module/workflow/repository/action.repository.js.map +1 -1
  554. package/dist/module/workflow/repository/activity-log.repository.d.ts +5 -6
  555. package/dist/module/workflow/repository/comm-template.repository.js +2 -2
  556. package/dist/module/workflow/repository/comm-template.repository.js.map +1 -1
  557. package/dist/module/workflow/repository/form-master.repository.d.ts +1 -1
  558. package/dist/module/workflow/repository/form-master.repository.js +2 -2
  559. package/dist/module/workflow/repository/form-master.repository.js.map +1 -1
  560. package/dist/module/workflow/repository/stage-group.repository.d.ts +6 -6
  561. package/dist/module/workflow/repository/stage.repository.d.ts +5 -6
  562. package/dist/module/workflow/repository/stage.repository.js +8 -8
  563. package/dist/module/workflow/repository/task.repository.js +5 -5
  564. package/dist/module/workflow/repository/task.repository.js.map +1 -1
  565. package/dist/module/workflow/repository/workflow.repository.js +1 -1
  566. package/dist/module/workflow/repository/workflow.repository.js.map +1 -1
  567. package/dist/module/workflow/service/action-data.service.js +1 -2
  568. package/dist/module/workflow/service/action-data.service.js.map +1 -1
  569. package/dist/module/workflow/service/action-template-mapping.service.js +2 -2
  570. package/dist/module/workflow/service/action.service.js +15 -17
  571. package/dist/module/workflow/service/action.service.js.map +1 -1
  572. package/dist/module/workflow/service/activity-log.service.d.ts +5 -6
  573. package/dist/module/workflow/service/comm-template.service.js +0 -2
  574. package/dist/module/workflow/service/comm-template.service.js.map +1 -1
  575. package/dist/module/workflow/service/entity-modification.service.js +2 -3
  576. package/dist/module/workflow/service/entity-modification.service.js.map +1 -1
  577. package/dist/module/workflow/service/form-master.service.js +2 -2
  578. package/dist/module/workflow/service/form-master.service.js.map +1 -1
  579. package/dist/module/workflow/service/populate-workflow.service.d.ts +1 -1
  580. package/dist/module/workflow/service/populate-workflow.service.js +1 -6
  581. package/dist/module/workflow/service/populate-workflow.service.js.map +1 -1
  582. package/dist/module/workflow/service/task.service.js +10 -13
  583. package/dist/module/workflow/service/task.service.js.map +1 -1
  584. package/dist/module/workflow/service/workflow-meta.service.js +2 -7
  585. package/dist/module/workflow/service/workflow-meta.service.js.map +1 -1
  586. package/dist/module/workflow/service/workflow.service.js +2 -2
  587. package/dist/module/workflow/service/workflow.service.js.map +1 -1
  588. package/dist/module/workflow/workflow.module.js +2 -0
  589. package/dist/module/workflow/workflow.module.js.map +1 -1
  590. package/dist/module/workflow-automation/entity/workflow-automation.entity.d.ts +1 -3
  591. package/dist/module/workflow-automation/entity/workflow-automation.entity.js +1 -9
  592. package/dist/module/workflow-automation/entity/workflow-automation.entity.js.map +1 -1
  593. package/dist/module/workflow-automation/service/schedule-handler.service.js +11 -12
  594. package/dist/module/workflow-automation/service/schedule-handler.service.js.map +1 -1
  595. package/dist/module/workflow-automation/service/workflow-automation.service.d.ts +7 -9
  596. package/dist/module/workflow-automation/service/workflow-automation.service.js +18 -15
  597. package/dist/module/workflow-automation/service/workflow-automation.service.js.map +1 -1
  598. package/dist/module/workflow-automation/workflow-automation.module.js +3 -1
  599. package/dist/module/workflow-automation/workflow-automation.module.js.map +1 -1
  600. package/dist/module/workflow-schedule/interfaces/schedule-job-data.interface.d.ts +1 -2
  601. package/dist/module/workflow-schedule/processors/schedule.processor.js +5 -9
  602. package/dist/module/workflow-schedule/processors/schedule.processor.js.map +1 -1
  603. package/dist/module/workflow-schedule/service/workflow-schedule.service.js +4 -13
  604. package/dist/module/workflow-schedule/service/workflow-schedule.service.js.map +1 -1
  605. package/dist/table.config.d.ts +4 -12
  606. package/dist/table.config.js +21 -3
  607. package/dist/table.config.js.map +1 -1
  608. package/dist/tsconfig.build.tsbuildinfo +1 -1
  609. package/dist/utils/service/reflection-helper.service.js +2 -2
  610. package/docs/modules/event-driven-integration-design.md +91 -91
  611. package/docs/modules/integration.md +250 -250
  612. package/eslint.config.mjs +34 -34
  613. package/nest-cli.json +14 -14
  614. package/package.json +128 -125
  615. package/server.log +850 -0
  616. package/src/app.controller.ts +12 -13
  617. package/src/app.module.ts +72 -68
  618. package/src/app.service.ts +8 -8
  619. package/src/config/bull.config.ts +69 -69
  620. package/src/config/config.module.ts +17 -17
  621. package/src/config/database.config.ts +48 -48
  622. package/src/constant/attribute.constant.ts +9 -0
  623. package/src/constant/db-data-type.constant.ts +160 -0
  624. package/src/constant/entity.constant.ts +4 -0
  625. package/src/constant/global.constant.ts +67 -67
  626. package/src/constant/status.constant.ts +4 -0
  627. package/src/core.module.ts +111 -94
  628. package/src/decorators/roles.decorator.ts +7 -7
  629. package/src/dtos/response.dto.ts +6 -6
  630. package/src/dtos/response.ts +5 -5
  631. package/src/index.ts +1 -1
  632. package/src/module/app_master/app-master.module.ts +15 -0
  633. package/src/module/{meta → app_master}/controller/app-master.controller.ts +56 -38
  634. package/src/module/{meta → app_master}/entity/app-master.entity.ts +50 -37
  635. package/src/module/app_master/repository/app-master.repository.ts +38 -0
  636. package/src/module/{meta → app_master}/service/app-master.service.ts +48 -37
  637. package/src/module/auth/auth.module.ts +77 -49
  638. package/src/module/auth/controller/auth.controller.ts +28 -28
  639. package/src/module/auth/guards/google-auth.guard.ts +9 -9
  640. package/src/module/auth/guards/jwt.guard.ts +22 -22
  641. package/src/module/auth/guards/role.guard.ts +68 -68
  642. package/src/module/auth/services/auth.service.ts +56 -56
  643. package/src/module/auth/services/jwt.service.ts +11 -11
  644. package/src/module/auth/strategies/google.strategy.ts +54 -54
  645. package/src/module/auth/strategies/jwt.strategy.ts +64 -58
  646. package/src/module/auth/strategies/local.strategy.ts +13 -13
  647. package/src/module/dashboard/controller/dashboard.controller.ts +38 -38
  648. package/src/module/dashboard/dashboard.module.ts +21 -21
  649. package/src/module/dashboard/entity/dashboard_page_data.entity.ts +23 -27
  650. package/src/module/dashboard/entity/widget_master.entity.ts +15 -18
  651. package/src/module/dashboard/repository/dashboard.repository.ts +49 -49
  652. package/src/module/dashboard/service/dashboard.service.ts +71 -72
  653. package/src/module/eav/EAV_USAGE_GUIDE.md +351 -0
  654. package/src/module/eav/controller/eav.controller.ts +119 -0
  655. package/src/module/eav/dto/eav-operation.dto.ts +62 -0
  656. package/src/module/eav/eav.module.ts +80 -0
  657. package/src/module/eav/entity/eav-boolean.entity.ts +26 -0
  658. package/src/module/eav/entity/eav-date.entity.ts +25 -0
  659. package/src/module/eav/entity/eav-decimal.entity.ts +25 -0
  660. package/src/module/eav/entity/eav-int.entity.ts +25 -0
  661. package/src/module/eav/entity/eav-json.entity.ts +25 -0
  662. package/src/module/eav/entity/eav-text.entity.ts +25 -0
  663. package/src/module/eav/entity/eav-time.entity.ts +25 -0
  664. package/src/module/eav/entity/eav-timestamp.entity.ts +25 -0
  665. package/src/module/eav/entity/eav-varchar.entity.ts +25 -0
  666. package/src/module/eav/interface/eav-strategy.interface.ts +32 -0
  667. package/src/module/eav/repository/eav-boolean.repository.ts +67 -0
  668. package/src/module/eav/repository/eav-date.repository.ts +67 -0
  669. package/src/module/eav/repository/eav-decimal.repository.ts +67 -0
  670. package/src/module/eav/repository/eav-int.repository.ts +67 -0
  671. package/src/module/eav/repository/eav-json.repository.ts +67 -0
  672. package/src/module/eav/repository/eav-text.repository.ts +67 -0
  673. package/src/module/eav/repository/eav-time.repository.ts +67 -0
  674. package/src/module/eav/repository/eav-timestamp.repository.ts +67 -0
  675. package/src/module/eav/repository/eav-varchar.repository.ts +67 -0
  676. package/src/module/eav/service/eav-boolean.service.ts +64 -0
  677. package/src/module/eav/service/eav-date.service.ts +64 -0
  678. package/src/module/eav/service/eav-decimal.service.ts +64 -0
  679. package/src/module/eav/service/eav-factory.service.ts +93 -0
  680. package/src/module/eav/service/eav-int.service.ts +64 -0
  681. package/src/module/eav/service/eav-json.service.ts +64 -0
  682. package/src/module/eav/service/eav-text.service.ts +64 -0
  683. package/src/module/eav/service/eav-time.service.ts +64 -0
  684. package/src/module/eav/service/eav-timestamp.service.ts +64 -0
  685. package/src/module/eav/service/eav-varchar.service.ts +65 -0
  686. package/src/module/eav/service/eav.service.ts +116 -0
  687. package/src/module/enterprise/controller/enterprise.controller.ts +40 -0
  688. package/src/module/enterprise/controller/meta.controller.ts +23 -0
  689. package/src/module/enterprise/controller/organization.controller.ts +99 -36
  690. package/src/module/enterprise/enterprise.module.ts +43 -45
  691. package/src/module/enterprise/entity/enterprise.entity.ts +31 -37
  692. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +27 -13
  693. package/src/module/enterprise/entity/organization.entity.ts +45 -92
  694. package/src/module/enterprise/repository/enterprise.repository.ts +53 -31
  695. package/src/module/enterprise/repository/organization.repository.ts +26 -26
  696. package/src/module/enterprise/repository/school.repository.ts +272 -289
  697. package/src/module/enterprise/service/brand-profile.service.ts +10 -0
  698. package/src/module/enterprise/service/brand.service.ts +75 -5
  699. package/src/module/enterprise/service/enterprise.service.ts +24 -16
  700. package/src/module/enterprise/service/organization-app-mapping.service.ts +4 -4
  701. package/src/module/enterprise/service/organization.service.ts +374 -146
  702. package/src/module/{meta → enterprise}/service/populate-meta.service.ts +210 -228
  703. package/src/module/enterprise/service/school.service.ts +5 -0
  704. package/src/module/entity_json/controller/entity_json.controller.ts +75 -60
  705. package/src/module/entity_json/docs/FlatJson_Filterin_System.md +2803 -2803
  706. package/src/module/entity_json/entity/entityJson.entity.ts +42 -42
  707. package/src/module/entity_json/entity_json.module.ts +22 -22
  708. package/src/module/entity_json/service/entityJson.repository.ts +37 -37
  709. package/src/module/entity_json/service/entity_json.service.ts +492 -486
  710. package/src/module/export/controller/export.controller.ts +83 -83
  711. package/src/module/export/export.module.ts +14 -14
  712. package/src/module/export/service/export.service.ts +107 -105
  713. package/src/module/filter/controller/filter.controller.ts +89 -87
  714. package/src/module/filter/dto/filter-request.dto.ts +40 -39
  715. package/src/module/filter/entity/saved-filter-detail.entity.ts +37 -41
  716. package/src/module/filter/entity/saved-filter-master.entity.ts +30 -35
  717. package/src/module/filter/filter.module.ts +33 -42
  718. package/src/module/filter/repository/saved-filter.repository.ts +247 -249
  719. package/src/module/filter/repository/saved.filter-detail.repository.ts +19 -19
  720. package/src/module/filter/service/filter-evaluator.service.ts +82 -82
  721. package/src/module/filter/service/filter.service.ts +1389 -1406
  722. package/src/module/filter/service/saved-filter.service.ts +165 -154
  723. package/src/module/ics/controller/ics.controller.ts +21 -21
  724. package/src/module/ics/dto/ics.dto.ts +55 -55
  725. package/src/module/ics/ics.module.ts +13 -13
  726. package/src/module/ics/service/ics.service.ts +57 -57
  727. package/src/module/integration/controller/calender-event.controller.ts +31 -31
  728. package/src/module/integration/controller/integration.controller.ts +662 -662
  729. package/src/module/integration/controller/wrapper.controller.ts +37 -37
  730. package/src/module/integration/dto/create-config.dto.ts +526 -526
  731. package/src/module/integration/entity/integration-config.entity.ts +112 -112
  732. package/src/module/integration/entity/integration-entity-mapper.entity.ts +14 -14
  733. package/src/module/integration/entity/integration-source.entity.ts +17 -17
  734. package/src/module/integration/entity/user-integration.entity.ts +71 -71
  735. package/src/module/integration/examples/usage.example.ts +338 -338
  736. package/src/module/integration/factories/base.factory.ts +7 -7
  737. package/src/module/integration/factories/email.factory.ts +49 -49
  738. package/src/module/integration/factories/integration.factory.ts +121 -121
  739. package/src/module/integration/factories/sms.factory.ts +51 -51
  740. package/src/module/integration/factories/telephone.factory.ts +41 -41
  741. package/src/module/integration/factories/whatsapp.factory.ts +56 -56
  742. package/src/module/integration/integration.module.ts +110 -110
  743. package/src/module/integration/service/calendar-event.service.ts +118 -118
  744. package/src/module/integration/service/integration-entity-mapper.service.ts +17 -17
  745. package/src/module/integration/service/integration-queue.service.ts +229 -229
  746. package/src/module/integration/service/integration.service.ts +2632 -2653
  747. package/src/module/integration/service/oauth.service.ts +224 -226
  748. package/src/module/integration/service/wrapper.service.ts +753 -754
  749. package/src/module/integration/strategies/email/gmail-api.strategy.ts +281 -307
  750. package/src/module/integration/strategies/email/outlook-api.strategy.ts +44 -44
  751. package/src/module/integration/strategies/email/outlook.strategy.ts +64 -64
  752. package/src/module/integration/strategies/email/sendgrid-api.strategy.ts +260 -263
  753. package/src/module/integration/strategies/integration.strategy.ts +97 -97
  754. package/src/module/integration/strategies/sms/gupshup-sms.strategy.ts +146 -146
  755. package/src/module/integration/strategies/sms/msg91-sms.strategy.ts +164 -164
  756. package/src/module/integration/strategies/sms/tubelight-sms.strategy.ts +163 -163
  757. package/src/module/integration/strategies/telephone/ozonetel-voice.strategy.ts +238 -238
  758. package/src/module/integration/strategies/telephone/tubelight-voice.strategy.ts +210 -210
  759. package/src/module/integration/strategies/whatsapp/gupshup-whatsapp.strategy.ts +359 -359
  760. package/src/module/integration/strategies/whatsapp/tubelight-whatsapp.strategy.ts +372 -372
  761. package/src/module/integration/strategies/whatsapp/whatsapp-cloud.strategy.ts +403 -403
  762. package/src/module/integration/strategies/whatsapp/whatsapp.strategy.ts +57 -57
  763. package/src/module/layout/controller/layout.controller.ts +40 -47
  764. package/src/module/layout/entity/header-items.entity.ts +28 -28
  765. package/src/module/layout/entity/header-section.entity.ts +13 -19
  766. package/src/module/layout/layout.module.ts +21 -21
  767. package/src/module/layout/repository/header-items.repository.ts +18 -18
  768. package/src/module/layout/repository/header-section.repository.ts +16 -22
  769. package/src/module/layout/service/header-section.service.ts +25 -25
  770. package/src/module/layout_preference/controller/layout_preference.controller.ts +76 -76
  771. package/src/module/layout_preference/entity/layout_preference.entity.ts +28 -28
  772. package/src/module/layout_preference/layout_preference.module.ts +22 -22
  773. package/src/module/layout_preference/repository/layout_preference.repository.ts +65 -65
  774. package/src/module/layout_preference/service/layout_preference.service.ts +191 -191
  775. package/src/module/lead/controller/lead.controller.ts +30 -30
  776. package/src/module/lead/lead.module.ts +14 -14
  777. package/src/module/lead/repository/lead.repository.ts +41 -41
  778. package/src/module/lead/service/lead.service.ts +54 -54
  779. package/src/module/linked_attributes/controller/linked_attributes.controller.ts +137 -137
  780. package/src/module/linked_attributes/dto/create-linked-attribute-smart.dto.ts +54 -54
  781. package/src/module/linked_attributes/entity/linked_attribute.entity.ts +51 -51
  782. package/src/module/linked_attributes/linked_attributes.module.ts +23 -23
  783. package/src/module/linked_attributes/repository/linked_attribute.repository.ts +12 -12
  784. package/src/module/linked_attributes/service/linked_attributes.service.ts +648 -648
  785. package/src/module/linked_attributes/test/linked-attributes.service.spec.ts +244 -244
  786. package/src/module/listmaster/controller/list-master.controller.ts +206 -230
  787. package/src/module/listmaster/entity/list-master-items.entity.ts +30 -43
  788. package/src/module/listmaster/entity/list-master.entity.ts +23 -33
  789. package/src/module/listmaster/listmaster.module.ts +46 -46
  790. package/src/module/listmaster/repository/list-master-items.repository.ts +225 -173
  791. package/src/module/listmaster/repository/list-master.repository.ts +56 -56
  792. package/src/module/listmaster/service/list-master-engine.ts +19 -19
  793. package/src/module/listmaster/service/list-master-extension.interface.ts +4 -4
  794. package/src/module/listmaster/service/list-master-item.service.ts +382 -280
  795. package/src/module/listmaster/service/list-master-registry.ts +15 -15
  796. package/src/module/listmaster/service/list-master.service.ts +767 -527
  797. package/src/module/mapper/controller/field-mapper.controller.ts +76 -76
  798. package/src/module/mapper/controller/mapper.controller.ts +20 -20
  799. package/src/module/mapper/dto/field-mapper.dto.ts +14 -14
  800. package/src/module/mapper/entity/field-lovs.entity.ts +15 -19
  801. package/src/module/mapper/entity/field-mapper.entity.ts +49 -53
  802. package/src/module/mapper/entity/mapper.entity.ts +9 -16
  803. package/src/module/mapper/mapper.module.ts +35 -35
  804. package/src/module/mapper/repository/field-lovs.repository.ts +35 -35
  805. package/src/module/mapper/repository/field-mapper.repository.ts +42 -42
  806. package/src/module/mapper/repository/mapper.repository.ts +32 -32
  807. package/src/module/mapper/service/field-mapper.service.ts +268 -269
  808. package/src/module/mapper/service/mapper.service.ts +80 -80
  809. package/src/module/master/controller/master.controller.ts +71 -74
  810. package/src/module/master/service/master.service.ts +460 -484
  811. package/src/module/meta/controller/attribute-master.controller.ts +82 -96
  812. package/src/module/meta/controller/entity-dynamic.controller.ts +123 -125
  813. package/src/module/meta/controller/entity-master.controller.ts +41 -41
  814. package/src/module/meta/controller/entity-relation.controller.ts +36 -36
  815. package/src/module/meta/controller/entity.controller.ts +301 -308
  816. package/src/module/meta/controller/entity.public.controller.ts +76 -75
  817. package/src/module/meta/controller/media.controller.ts +135 -167
  818. package/src/module/meta/controller/meta.controller.ts +80 -101
  819. package/src/module/meta/controller/view-master.controller.ts +79 -79
  820. package/src/module/meta/dto/entity-list-data.dto.ts +6 -6
  821. package/src/module/meta/dto/entity-tab.dto.ts +4 -4
  822. package/src/module/meta/dto/entity-table.dto.ts +12 -12
  823. package/src/module/meta/entity/attribute-master.entity.ts +62 -92
  824. package/src/module/meta/entity/base-entity.entity.ts +52 -75
  825. package/src/module/meta/entity/dynamic.entity.ts +6 -0
  826. package/src/module/meta/entity/entity-master.entity.ts +53 -91
  827. package/src/module/meta/entity/entity-relation-data.entity.ts +24 -29
  828. package/src/module/meta/entity/entity-relation.entity.ts +18 -23
  829. package/src/module/meta/entity/entity-table-column.entity.ts +56 -61
  830. package/src/module/meta/entity/entity-table.entity.ts +45 -50
  831. package/src/module/meta/entity/media-data.entity.ts +32 -38
  832. package/src/module/meta/entity/preference.entity.ts +57 -62
  833. package/src/module/meta/entity/view-master.entity.ts +36 -41
  834. package/src/module/meta/entity.module.ts +154 -165
  835. package/src/module/meta/repository/attribute-master.repository.ts +206 -164
  836. package/src/module/meta/repository/entity-attribute-update.repository.ts +48 -48
  837. package/src/module/meta/repository/entity-master.repository.ts +120 -120
  838. package/src/module/meta/repository/entity-relation.repository.ts +36 -22
  839. package/src/module/meta/repository/entity-table-column.repository.ts +39 -39
  840. package/src/module/meta/repository/entity-table.repository.ts +53 -53
  841. package/src/module/meta/repository/media-data.repository.ts +50 -50
  842. package/src/module/meta/repository/preference.repository.ts +20 -20
  843. package/src/module/meta/repository/user-app-mapping.repository.ts +28 -28
  844. package/src/module/meta/repository/view-master.repository.ts +42 -42
  845. package/src/module/meta/service/attribute-master.service.ts +254 -160
  846. package/src/module/meta/service/common.service.ts +9 -9
  847. package/src/module/meta/service/entity-attribute-update.service.ts +26 -26
  848. package/src/module/meta/service/entity-dynamic.service.ts +993 -835
  849. package/src/module/meta/service/entity-master.service.ts +288 -172
  850. package/src/module/meta/service/entity-realation-data.service.ts +9 -9
  851. package/src/module/meta/service/entity-relation.service.ts +85 -78
  852. package/src/module/meta/service/entity-service-impl.service.ts +394 -389
  853. package/src/module/meta/service/entity-table-column.service.ts +26 -26
  854. package/src/module/meta/service/entity-table.service.ts +157 -171
  855. package/src/module/meta/service/entity-validation.service.ts +187 -188
  856. package/src/module/meta/service/entity.service.ts +50 -48
  857. package/src/module/meta/service/field-group.service.ts +103 -103
  858. package/src/module/meta/service/media-data.service.ts +385 -610
  859. package/src/module/meta/service/preference.service.ts +16 -16
  860. package/src/module/meta/service/resolver.service.ts +260 -347
  861. package/src/module/meta/service/section-master.service.ts +104 -104
  862. package/src/module/meta/service/update-form-json.service.ts +22 -22
  863. package/src/module/meta/service/user-app-mapping.service.ts +17 -17
  864. package/src/module/meta/service/view-master.service.ts +127 -127
  865. package/src/module/microservice-client/microservice-clients.module.ts +13 -13
  866. package/src/module/microservice-client/service/microservice-client-factory.ts +37 -37
  867. package/src/module/microservice-client/service/microservice-clients.ts +4 -4
  868. package/src/module/module/controller/menu.controller.ts +41 -15
  869. package/src/module/module/controller/module-access.controller.ts +138 -133
  870. package/src/module/module/entity/menu.entity.ts +51 -43
  871. package/src/module/module/entity/module-access.entity.ts +62 -25
  872. package/src/module/module/entity/module-action.entity.ts +21 -17
  873. package/src/module/module/entity/module.entity.ts +45 -52
  874. package/src/module/module/module.module.ts +43 -42
  875. package/src/module/module/repository/menu.repository.ts +200 -186
  876. package/src/module/module/repository/module-access.repository.ts +392 -344
  877. package/src/module/module/service/menu.service.ts +80 -82
  878. package/src/module/module/service/module-access.service.ts +177 -189
  879. package/src/module/module/service/module-import.service.ts +294 -0
  880. package/src/module/notification/controller/notification.controller.ts +58 -58
  881. package/src/module/notification/controller/otp.controller.ts +117 -117
  882. package/src/module/notification/entity/notification.entity.ts +76 -26
  883. package/src/module/notification/entity/otp.entity.ts +28 -28
  884. package/src/module/notification/firebase-admin.config.ts +22 -22
  885. package/src/module/notification/notification.module.ts +70 -71
  886. package/src/module/notification/repository/otp.repository.ts +27 -27
  887. package/src/module/notification/service/email.service.ts +142 -127
  888. package/src/module/notification/service/notification.service.ts +163 -146
  889. package/src/module/notification/service/otp.service.ts +144 -133
  890. package/src/module/preference_master/entity/preference.entity.ts +25 -0
  891. package/src/module/preference_master/preference.service.ts +27 -0
  892. package/src/module/preference_master/repo/preference.repository.ts +36 -0
  893. package/src/module/third-party-module/entity/third-party-api-registry.entity.ts +52 -52
  894. package/src/module/third-party-module/repository/third-party-api-registry.repository.ts +20 -20
  895. package/src/module/third-party-module/service/api-registry.service.ts +13 -13
  896. package/src/module/third-party-module/third-party.module.ts +12 -12
  897. package/src/module/user/controller/login.controller.ts +197 -199
  898. package/src/module/user/controller/user.controller.ts +31 -40
  899. package/src/module/user/dto/create-user.dto.ts +75 -62
  900. package/src/module/user/dto/update-user.dto.ts +4 -4
  901. package/src/module/user/entity/role.entity.ts +76 -33
  902. package/src/module/user/entity/user-role-mapping.entity.ts +64 -38
  903. package/src/module/user/entity/user-session.entity.ts +57 -73
  904. package/src/module/user/entity/user.entity.ts +97 -62
  905. package/src/module/user/repository/role.repository.ts +116 -96
  906. package/src/module/user/repository/user-role-mapping.repository.ts +130 -126
  907. package/src/module/user/repository/user.repository.ts +77 -50
  908. package/src/module/user/repository/userSession.repository.ts +37 -33
  909. package/src/module/user/service/login.service.ts +322 -326
  910. package/src/module/user/service/role.service.ts +197 -197
  911. package/src/module/user/service/user-role-mapping.service.ts +128 -98
  912. package/src/module/user/service/user-session.service.ts +203 -201
  913. package/src/module/user/service/user.service.ts +349 -368
  914. package/src/module/user/user.module.ts +64 -65
  915. package/src/module/workflow/controller/action-category.controller.ts +54 -54
  916. package/src/module/workflow/controller/action-resource-mapping.controller.ts +23 -23
  917. package/src/module/workflow/controller/action-template-mapping.controller.ts +35 -35
  918. package/src/module/workflow/controller/action.controller.ts +111 -111
  919. package/src/module/workflow/controller/activity-log.controller.ts +55 -55
  920. package/src/module/workflow/controller/comm-template.controller.ts +43 -43
  921. package/src/module/workflow/controller/entity-modification.controller.ts +35 -35
  922. package/src/module/workflow/controller/form-master.controller.ts +43 -43
  923. package/src/module/workflow/controller/stage-group.controller.ts +49 -49
  924. package/src/module/workflow/controller/stage.controller.ts +51 -51
  925. package/src/module/workflow/controller/task.controller.ts +77 -77
  926. package/src/module/workflow/controller/workflow-list-master.controller.ts +44 -44
  927. package/src/module/workflow/controller/workflow-meta.controller.ts +80 -80
  928. package/src/module/workflow/controller/workflow.controller.ts +67 -67
  929. package/src/module/workflow/entity/action-category.entity.ts +33 -38
  930. package/src/module/workflow/entity/action-data.entity.ts +51 -55
  931. package/src/module/workflow/entity/action-resources-mapping.entity.ts +21 -29
  932. package/src/module/workflow/entity/action-template-mapping.entity.ts +12 -17
  933. package/src/module/workflow/entity/action.entity.ts +48 -53
  934. package/src/module/workflow/entity/activity-log.entity.ts +39 -43
  935. package/src/module/workflow/entity/comm-template.entity.ts +38 -43
  936. package/src/module/workflow/entity/entity-modification.entity.ts +33 -38
  937. package/src/module/workflow/entity/form.entity.ts +21 -25
  938. package/src/module/workflow/entity/stage-action-mapping.entity.ts +12 -17
  939. package/src/module/workflow/entity/stage-group.entity.ts +18 -23
  940. package/src/module/workflow/entity/stage-movement-data.entity.ts +33 -38
  941. package/src/module/workflow/entity/stage.entity.ts +15 -20
  942. package/src/module/workflow/entity/task-data.entity.ts +84 -88
  943. package/src/module/workflow/entity/template-attach-mapper.entity.ts +30 -30
  944. package/src/module/workflow/entity/workflow-data.entity.ts +6 -11
  945. package/src/module/workflow/entity/workflow-level-mapping.entity.ts +18 -18
  946. package/src/module/workflow/entity/workflow.entity.ts +15 -20
  947. package/src/module/workflow/repository/action-category.repository.ts +79 -79
  948. package/src/module/workflow/repository/action-data.repository.ts +345 -354
  949. package/src/module/workflow/repository/action.repository.ts +339 -339
  950. package/src/module/workflow/repository/activity-log.repository.ts +148 -148
  951. package/src/module/workflow/repository/comm-template.repository.ts +157 -157
  952. package/src/module/workflow/repository/form-master.repository.ts +50 -50
  953. package/src/module/workflow/repository/stage-group.repository.ts +186 -186
  954. package/src/module/workflow/repository/stage-movement.repository.ts +217 -217
  955. package/src/module/workflow/repository/stage.repository.ts +160 -160
  956. package/src/module/workflow/repository/task.repository.ts +154 -156
  957. package/src/module/workflow/repository/workflow.repository.ts +42 -42
  958. package/src/module/workflow/service/action-category.service.ts +33 -33
  959. package/src/module/workflow/service/action-data.service.ts +63 -62
  960. package/src/module/workflow/service/action-resources-mapping.service.ts +10 -10
  961. package/src/module/workflow/service/action-template-mapping.service.ts +137 -137
  962. package/src/module/workflow/service/action.service.ts +300 -302
  963. package/src/module/workflow/service/activity-log.service.ts +107 -107
  964. package/src/module/workflow/service/comm-template.service.ts +179 -181
  965. package/src/module/workflow/service/entity-modification.service.ts +55 -61
  966. package/src/module/workflow/service/form-master.service.ts +35 -35
  967. package/src/module/workflow/service/populate-workflow.service.ts +320 -325
  968. package/src/module/workflow/service/stage-action-mapping.service.ts +5 -5
  969. package/src/module/workflow/service/stage-group.service.ts +325 -325
  970. package/src/module/workflow/service/stage.service.ts +197 -197
  971. package/src/module/workflow/service/task.service.ts +547 -551
  972. package/src/module/workflow/service/workflow-list-master.service.ts +68 -68
  973. package/src/module/workflow/service/workflow-meta.service.ts +635 -640
  974. package/src/module/workflow/service/workflow.service.ts +213 -213
  975. package/src/module/workflow/workflow.module.ts +182 -180
  976. package/src/module/workflow-automation/SCHEDULING_GUIDE.md +145 -145
  977. package/src/module/workflow-automation/controller/workflow-automation.controller.ts +43 -43
  978. package/src/module/workflow-automation/entity/workflow-automation-action.entity.ts +26 -26
  979. package/src/module/workflow-automation/entity/workflow-automation.entity.ts +35 -40
  980. package/src/module/workflow-automation/interface/action.decorator.ts +7 -7
  981. package/src/module/workflow-automation/interface/action.interface.ts +5 -5
  982. package/src/module/workflow-automation/service/action-registery.service.ts +35 -35
  983. package/src/module/workflow-automation/service/schedule-handler.service.ts +167 -168
  984. package/src/module/workflow-automation/service/workflow-automation-engine.service.ts +219 -219
  985. package/src/module/workflow-automation/service/workflow-automation.service.ts +486 -474
  986. package/src/module/workflow-automation/workflow-automation.module.ts +55 -54
  987. package/src/module/workflow-schedule/INSTALLATION.md +244 -244
  988. package/src/module/workflow-schedule/MULTI_PROJECT_GUIDE.md +196 -196
  989. package/src/module/workflow-schedule/README.md +422 -422
  990. package/src/module/workflow-schedule/constants/schedule.constants.ts +48 -48
  991. package/src/module/workflow-schedule/controller/workflow-schedule.controller.ts +253 -253
  992. package/src/module/workflow-schedule/docs/CLAUDE_CODE_GUIDE.md +510 -510
  993. package/src/module/workflow-schedule/docs/CLAUDE_CODE_PROMPT.md +362 -362
  994. package/src/module/workflow-schedule/docs/RUN_CLAUDE_CODE.sh +68 -68
  995. package/src/module/workflow-schedule/dto/create-schedule.dto.ts +147 -147
  996. package/src/module/workflow-schedule/dto/get-execution-logs.dto.ts +119 -119
  997. package/src/module/workflow-schedule/dto/update-schedule.dto.ts +96 -96
  998. package/src/module/workflow-schedule/entities/scheduled-workflow.entity.ts +148 -148
  999. package/src/module/workflow-schedule/entities/workflow-execution-log.entity.ts +154 -154
  1000. package/src/module/workflow-schedule/interfaces/schedule-job-data.interface.ts +52 -53
  1001. package/src/module/workflow-schedule/interfaces/workflow-schedule-options.interface.ts +12 -12
  1002. package/src/module/workflow-schedule/processors/schedule.processor.ts +616 -620
  1003. package/src/module/workflow-schedule/service/workflow-schedule.service.ts +588 -597
  1004. package/src/module/workflow-schedule/workflow-schedule.module.ts +67 -67
  1005. package/src/resources/dev.properties.yaml +34 -31
  1006. package/src/resources/local.properties.yaml +27 -27
  1007. package/src/resources/properties.module.ts +12 -12
  1008. package/src/resources/properties.yaml.ts +11 -11
  1009. package/src/resources/uat.properties.yaml +31 -31
  1010. package/src/table.config.ts +153 -135
  1011. package/src/utils/dto/excel-data.dto.ts +14 -14
  1012. package/src/utils/dto/excelsheet-data.dto.ts +5 -5
  1013. package/src/utils/service/base64util.service.ts +18 -18
  1014. package/src/utils/service/clockIDGenUtil.service.ts +21 -21
  1015. package/src/utils/service/codeGenerator.service.ts +22 -22
  1016. package/src/utils/service/dateUtil.service.ts +17 -17
  1017. package/src/utils/service/encryptUtil.service.ts +97 -97
  1018. package/src/utils/service/excel-helper.service.ts +72 -72
  1019. package/src/utils/service/excelUtil.service.ts +15 -15
  1020. package/src/utils/service/file-util.service.ts +11 -11
  1021. package/src/utils/service/json-util.service.ts +23 -23
  1022. package/src/utils/service/loggingUtil.service.ts +88 -88
  1023. package/src/utils/service/reflection-helper.service.ts +62 -62
  1024. package/src/utils/service/wbsCodeGen.service.ts +8 -8
  1025. package/src/utils/utils.module.ts +27 -27
  1026. package/tsconfig.build.json +4 -4
  1027. package/tsconfig.json +24 -24
  1028. package/dist/migrations/1732612800000-AddEntityJsonGinIndex.d.ts +0 -6
  1029. package/dist/migrations/1732612800000-AddEntityJsonGinIndex.js +0 -32
  1030. package/dist/migrations/1732612800000-AddEntityJsonGinIndex.js.map +0 -1
  1031. package/dist/module/filter/service/flatjson-filter.service.d.ts +0 -32
  1032. package/dist/module/filter/service/flatjson-filter.service.js +0 -632
  1033. package/dist/module/filter/service/flatjson-filter.service.js.map +0 -1
  1034. package/dist/module/meta/controller/app-master.controller.js.map +0 -1
  1035. package/dist/module/meta/entity/app-master.entity.d.ts +0 -13
  1036. package/dist/module/meta/entity/app-master.entity.js.map +0 -1
  1037. package/dist/module/meta/repository/app-master.repository.js.map +0 -1
  1038. package/dist/module/meta/service/app-master.service.js.map +0 -1
  1039. package/dist/module/meta/service/populate-meta.service.d.ts +0 -13
  1040. package/dist/module/meta/service/populate-meta.service.js.map +0 -1
  1041. package/dist/module/notification/repository/notification.repository.d.ts +0 -7
  1042. package/dist/module/notification/repository/notification.repository.js +0 -43
  1043. package/dist/module/notification/repository/notification.repository.js.map +0 -1
  1044. package/src/migrations/1732612800000-AddEntityJsonGinIndex.ts +0 -41
  1045. package/src/module/filter/service/flatjson-filter.service.ts +0 -903
  1046. package/src/module/filter/test/flatjson-filter.service.spec.ts +0 -415
  1047. package/src/module/meta/repository/app-master.repository.ts +0 -20
  1048. package/src/module/notification/repository/notification.repository.ts +0 -33
@@ -1,835 +1,993 @@
1
- import { BadRequestException, Injectable } from '@nestjs/common';
2
- import { STATUS_ACTIVE } from 'src/constant/global.constant';
3
- import { EntityManager, In } from 'typeorm';
4
- import { UserData } from 'src/module/user/entity/user.entity';
5
- import { MediaDataService } from './media-data.service';
6
- import { ResolverService } from './resolver.service';
7
- import { EntityMasterRepository } from '../repository/entity-master.repository';
8
- import { ReflectionHelper } from '../../../utils/service/reflection-helper.service';
9
- import { ConfigService } from '@nestjs/config';
10
-
11
- @Injectable()
12
- export class EntityDynamicService {
13
- constructor(
14
- private readonly entityManager: EntityManager,
15
- private readonly mediaDataService: MediaDataService,
16
- private readonly resolverService: ResolverService,
17
- private readonly entityMasterRepo: EntityMasterRepository,
18
- private readonly reflectionHelper: ReflectionHelper,
19
- private readonly configService: ConfigService,
20
- ) {}
21
-
22
- schema = this.configService.get('DB_SCHEMA');
23
-
24
- // -----------------------------
25
- async createEntity(
26
- entityType: string,
27
- entityData: Record<string, any>,
28
- loggedInUser: any,
29
- mainID?: number,
30
- ): Promise<any> {
31
- const organizationId = loggedInUser.organization_id;
32
- const enterprise_id = loggedInUser.enterprise_id;
33
-
34
- const tableName = await this.getTableName(entityType, enterprise_id);
35
- const validAttributes = await this.getAttributeCodes(
36
- entityType,
37
- enterprise_id,
38
- );
39
-
40
- // -------------------------------------------------------
41
- // AUTO fields
42
- // -------------------------------------------------------
43
- entityData.created_date = new Date();
44
-
45
- if (loggedInUser) {
46
- entityData.created_by = loggedInUser.id;
47
-
48
- if (!entityData.organization_id)
49
- entityData.organization_id = loggedInUser.organization_id;
50
-
51
- if (!entityData.enterprise_id)
52
- entityData.enterprise_id = loggedInUser.enterprise_id;
53
-
54
- if (!entityData.level_type)
55
- entityData.level_type = loggedInUser.level_type;
56
-
57
- if (!entityData.level_id) entityData.level_id = loggedInUser.level_id;
58
-
59
- if (!entityData.entity_type) entityData.entity_type = entityType;
60
- }
61
-
62
- // -------------------------------------------------------
63
- // STATUS
64
- // -------------------------------------------------------
65
- const listMasterItemsRepo =
66
- this.reflectionHelper.getRepoService('ListMasterItems');
67
- const statusList = listMasterItemsRepo.find({
68
- where: {
69
- code: STATUS_ACTIVE,
70
- organization_id: organizationId,
71
- },
72
- });
73
-
74
- if (!entityData.status) entityData.status = statusList[0]?.id;
75
-
76
- // -------------------------------------------------------
77
- // AUTO-CODE GENERATION (POSTGRES SAFE)
78
- // -------------------------------------------------------
79
- const entityMaster =
80
- await this.entityMasterRepo.getEntityByMappedEntityType(
81
- entityType,
82
- loggedInUser.enterprise_id,
83
- );
84
-
85
- if (!entityData.code && entityData.entity_type && entityMaster) {
86
- // Extract integer suffix
87
- // const repo = this.reflectionHelper.getRepoService(entityMaster.entity_data_class);
88
-
89
- const result = this.entityManager.query(
90
- `SELECT MAX(id) as seq_no
91
- FROM ${this.schema}.${entityMaster.db_table_name}`,
92
- );
93
-
94
- let maxSeq = Number(result[0]?.max_seq_no) || 0;
95
- maxSeq++;
96
- entityData.code = `${entityData.entity_type}${maxSeq}`;
97
- }
98
-
99
- // -------------------------------------------------------
100
- // Parent ID
101
- // -------------------------------------------------------
102
- if (mainID) {
103
- entityData.parent_id = mainID;
104
- }
105
-
106
- // -------------------------------------------------------
107
- // BYPASS COLUMNS
108
- // -------------------------------------------------------
109
- const bypassColumns = [
110
- 'created_date',
111
- 'created_by',
112
- 'organization_id',
113
- 'enterprise_id',
114
- 'level_type',
115
- 'level_id',
116
- 'status',
117
- 'entity_type',
118
- 'code',
119
- 'parent_id',
120
- ];
121
-
122
- for (const col of bypassColumns) {
123
- if (!validAttributes.some((a) => a.attribute_key === col)) {
124
- validAttributes.push({
125
- attribute_key: col,
126
- is_hidden: false,
127
- db_datatype: 'text',
128
- element_type: 'text',
129
- });
130
- }
131
- }
132
-
133
- // -------------------------------------------------------
134
- // BUILD INSERT QUERY (POSTGRES FORMAT)
135
- // -------------------------------------------------------
136
- const columns: string[] = [];
137
- const values: any[] = [];
138
- let idx = 1;
139
- const placeholders: string[] = [];
140
-
141
- for (const attr of validAttributes) {
142
- if (attr.attribute_key === 'id') continue;
143
-
144
- columns.push(attr.attribute_key);
145
- values.push(entityData[attr.attribute_key] ?? null);
146
- placeholders.push(`$${idx++}`);
147
- }
148
-
149
- const colList = columns.map((c) => `"${c}"`).join(', ');
150
- const placeholderList = placeholders.join(', ');
151
-
152
- const sql = `
153
- INSERT INTO ${this.schema}.${tableName} (${colList})
154
- VALUES (${placeholderList}) RETURNING id
155
- `;
156
-
157
- const result = await this.entityManager.query(sql, values);
158
- return result[0];
159
- }
160
-
161
- // ----------------------------- get entity with relations
162
-
163
- // ----------------------------- create entity with relations
164
- async createEntityWithRelation(
165
- entityType: string,
166
- data: Record<string, any>,
167
- loggedInUser: any,
168
- ): Promise<any> {
169
- const enterpriseId = loggedInUser.enterprise_id;
170
- const organizationId = loggedInUser.organization_id;
171
-
172
- const repo = this.reflectionHelper.getRepoService('EntityRelation');
173
-
174
- const getRelation = await repo.find({
175
- where: {
176
- enterprise_id: enterpriseId,
177
- source_entity_type: entityType,
178
- },
179
- });
180
-
181
- const { mappedEntities, ...mainData } = data;
182
-
183
- // create main entity
184
- const createdEntityData = await this.createEntity(
185
- entityType,
186
- mainData,
187
- loggedInUser,
188
- );
189
- const mainID = createdEntityData.insertId || createdEntityData.id;
190
-
191
- if (mappedEntities && getRelation.length > 0) {
192
- for (const relation of getRelation) {
193
- const targetEntityType = relation.target_entity_type;
194
- const relationType = relation.relation_type;
195
-
196
- if (!mappedEntities[targetEntityType]) continue;
197
-
198
- // normalize: always array
199
- const entityDataArray = Array.isArray(mappedEntities[targetEntityType])
200
- ? mappedEntities[targetEntityType]
201
- : [mappedEntities[targetEntityType]];
202
-
203
- for (const item of entityDataArray) {
204
- const itemWithRef = {
205
- ...item,
206
- entity_type: targetEntityType,
207
- };
208
-
209
- const createdRelatedEntity = await this.createEntity(
210
- targetEntityType,
211
- itemWithRef,
212
- loggedInUser,
213
- mainID, // this will pass for parent_id
214
- );
215
-
216
- const relationRepo =
217
- this.reflectionHelper.getRepoService('EntityRelationData');
218
-
219
- await relationRepo.save({
220
- organizationId: organizationId,
221
- enterprise_id: enterpriseId,
222
- source_entity_id: mainID,
223
- source_entity_type: entityType,
224
- target_entity_id: createdRelatedEntity.id,
225
- target_entity_type: targetEntityType,
226
- relation_type: relationType,
227
- });
228
- }
229
- }
230
- }
231
-
232
- return {
233
- mainEntity: {
234
- id: mainID,
235
- entityType,
236
- data: createdEntityData,
237
- },
238
- };
239
- }
240
-
241
- // ----------------------------- get entity with relations
242
- async getEntityWithRelation(
243
- entityType: string,
244
- id: number | string,
245
- loggedInUser: any,
246
- ): Promise<any> {
247
- const mainEntity = await this.getEntityByDataSource(
248
- entityType,
249
- id,
250
- loggedInUser,
251
- );
252
- const relationRepo = this.reflectionHelper.getRepoService('EntityRelation');
253
- const relatedEntityRepo =
254
- this.reflectionHelper.getRepoService('EntityRelationData');
255
-
256
- const relations = await relationRepo.find({
257
- where: {
258
- source_entity_type: entityType,
259
- enterprise_id: loggedInUser.enterprise_id,
260
- },
261
- });
262
-
263
- const targetTypes = relations.map((r) => r.target_entity_type);
264
-
265
- if (targetTypes.length === 0) {
266
- return {
267
- entity_type: entityType,
268
- ...mainEntity,
269
- };
270
- }
271
-
272
- const relatedEntities = await relatedEntityRepo.find({
273
- where: {
274
- source_entity_id: id,
275
- target_entity_type: In(targetTypes),
276
- },
277
- });
278
-
279
- // Format response to match create entity structure
280
- const response: any = {
281
- entity_type: entityType,
282
- ...mainEntity,
283
- };
284
-
285
- if (relatedEntities.length > 0) {
286
- response.mappedEntities = await this.formatMappedEntities(
287
- relatedEntities,
288
- loggedInUser,
289
- );
290
- }
291
-
292
- return response;
293
- }
294
-
295
- // ----------------------------- formatMappedEntities
296
- async formatMappedEntities(
297
- relatedEntities: any[],
298
- loggedInUser: any,
299
- ): Promise<any> {
300
- const mappedEntities: any = {};
301
-
302
- for (const relation of relatedEntities) {
303
- const targetEntityType = relation.target_entity_type;
304
- const targetEntityId = relation.target_entity_id;
305
-
306
- const entityData = await this.getEntity(
307
- targetEntityType,
308
- targetEntityId,
309
- loggedInUser,
310
- );
311
-
312
- if (!mappedEntities[targetEntityType]) {
313
- mappedEntities[targetEntityType] = [];
314
- }
315
-
316
- mappedEntities[targetEntityType].push(entityData);
317
- }
318
-
319
- return mappedEntities;
320
- }
321
-
322
- // ----------------------------- update with relations
323
-
324
- // ----------------------------- update entity with relations
325
- async updateEntityWithRelations(
326
- entityType: string,
327
- id: number | string,
328
- data: Record<string, any>,
329
- loggedInUser: any,
330
- ): Promise<any> {
331
- const organizationId = loggedInUser.organization_id;
332
- const enterpriseId = loggedInUser.enterprise_id;
333
- const { mappedEntities, ...mainData } = data;
334
-
335
- // Update main entity
336
- const updatedMainEntity = await this.updateEntity(
337
- entityType,
338
- id,
339
- mainData,
340
- loggedInUser,
341
- );
342
-
343
- const updatedRelations: Record<string, any> = {};
344
-
345
- if (mappedEntities) {
346
- const entityRelationRepo =
347
- this.reflectionHelper.getRepoService('EntityRelation');
348
- const getRelationDefs = await entityRelationRepo.find({
349
- where: {
350
- enterprise_id: enterpriseId,
351
- source_entity_type: entityType,
352
- },
353
- });
354
-
355
- for (const [targetEntityType, rawEntityData] of Object.entries(
356
- mappedEntities,
357
- )) {
358
- const relationDef = getRelationDefs.find(
359
- (r) => r.target_entity_type === targetEntityType,
360
- );
361
- if (!relationDef) continue;
362
-
363
- const relationType = relationDef.relation_type;
364
- const entityArray = Array.isArray(rawEntityData)
365
- ? rawEntityData
366
- : [rawEntityData];
367
-
368
- // Delete previous relations and related entities
369
- // Create/update new entities & relations
370
- const updatedEntities: any[] = [];
371
-
372
- for (const item of entityArray) {
373
- let targetEntityId;
374
- let entityData;
375
-
376
- if (item.id) {
377
- // Update existing entity
378
- await this.updateEntity(
379
- targetEntityType,
380
- item.id,
381
- item,
382
- loggedInUser,
383
- Number(id), // pass main entity id as parent_id
384
- );
385
- targetEntityId = item.id;
386
- entityData = await this.getEntity(
387
- targetEntityType,
388
- targetEntityId,
389
- loggedInUser,
390
- );
391
- } else {
392
- // Create new entity
393
- const createdEntity = await this.createEntity(
394
- targetEntityType,
395
- item,
396
- loggedInUser,
397
- Number(id), // pass main entity id as parent_id
398
- );
399
- targetEntityId = createdEntity.insertId || createdEntity.id;
400
- entityData = await this.getEntity(
401
- targetEntityType,
402
- targetEntityId,
403
- loggedInUser,
404
- );
405
-
406
- // Insert relation as per new entity created
407
- const entityRelationDataRepo =
408
- this.reflectionHelper.getRepoService('EntityRelationData');
409
- await entityRelationDataRepo.save({
410
- organizationId: organizationId,
411
- enterprise_id: enterpriseId,
412
- source_entity_id: id,
413
- source_entity_type: entityType,
414
- target_entity_id: targetEntityId,
415
- target_entity_type: targetEntityType,
416
- relation_type: relationType,
417
- });
418
- }
419
-
420
- if (relationType === 'ONE_TO_MANY') {
421
- updatedEntities.push(entityData);
422
- } else if (
423
- relationType === 'ONE_TO_ONE' ||
424
- relationType === 'MANY_TO_ONE'
425
- ) {
426
- updatedEntities[0] = entityData; // single object
427
- }
428
- }
429
-
430
- // Assign to response mappedEntities
431
- updatedRelations[targetEntityType] =
432
- relationType === 'ONE_TO_MANY' ? updatedEntities : updatedEntities[0];
433
- }
434
- }
435
-
436
- return {
437
- mainEntity: {
438
- id,
439
- entityType,
440
- data: updatedMainEntity,
441
- },
442
- relatedEntities: updatedRelations,
443
- };
444
- }
445
-
446
- // -----------------------------
447
- async updateEntity(
448
- entityType: string,
449
- id: number | string,
450
- entityData: Record<string, any>,
451
- loggedInUser: any,
452
- mainID?: number,
453
- ): Promise<any> {
454
- const enterprise_id = loggedInUser.enterprise_id;
455
-
456
- const tableName = await this.getTableName(entityType, enterprise_id);
457
- const validAttributes = await this.getAttributeCodes(
458
- entityType,
459
- enterprise_id,
460
- );
461
-
462
- const updates: string[] = [];
463
- const values: any[] = [];
464
- let idx = 1;
465
-
466
- // Auto fields
467
- entityData.modified_date = new Date();
468
- if (loggedInUser) {
469
- entityData.modified_by = loggedInUser.id;
470
-
471
- if (!entityData.organization_id && entityData.entity_type !== 'ORG')
472
- entityData.organization_id = loggedInUser.organization_id;
473
-
474
- if (!entityData.enterprise_id)
475
- entityData.enterprise_id = loggedInUser.enterprise_id;
476
- }
477
-
478
- if (mainID) {
479
- entityData.parent_id = mainID;
480
- }
481
-
482
- // Add bypass columns if needed
483
- const bypassColumns = [
484
- 'created_date',
485
- 'created_by',
486
- 'modified_date',
487
- 'modified_by',
488
- 'organization_id',
489
- 'enterprise_id',
490
- 'level_type',
491
- 'level_id',
492
- 'status',
493
- 'entity_type',
494
- 'code',
495
- 'parent_id',
496
- ];
497
-
498
- for (const col of bypassColumns) {
499
- if (!validAttributes.some((attr) => attr.attribute_key === col)) {
500
- validAttributes.push({
501
- attribute_key: col,
502
- db_datatype: 'text',
503
- element_type: 'text',
504
- is_hidden: false,
505
- });
506
- }
507
- }
508
-
509
- // Build SET clause
510
- for (const key of Object.keys(entityData)) {
511
- if (validAttributes.some((attr) => attr.attribute_key === key)) {
512
- updates.push(`${key} = $${idx++}`);
513
- values.push(entityData[key]);
514
- }
515
- }
516
-
517
- if (updates.length === 0) {
518
- throw new Error('No valid attributes to update.');
519
- }
520
-
521
- // WHERE clause placeholder
522
- const idPlaceholder = `$${idx}`;
523
- values.push(id);
524
-
525
- const updateQuery = `
526
- UPDATE ${this.schema}.${tableName}
527
- SET ${updates.join(', ')}
528
- WHERE id = ${idPlaceholder}
529
- `;
530
-
531
- return await this.entityManager.query(updateQuery, values);
532
- }
533
-
534
- async getEntityByDataSource(
535
- entityType: string,
536
- id: number | string,
537
- loggedInUser: any,
538
- ): Promise<any> {
539
- const enterprise_id = loggedInUser.enterprise_id;
540
-
541
- const dataSource = await this.getEntitySourceTableName(
542
- entityType,
543
- enterprise_id,
544
- );
545
- const validAttributes = await this.getAttributeCodes(
546
- entityType,
547
- enterprise_id,
548
- false,
549
- );
550
-
551
- const columns = validAttributes
552
- .map((attr) => `${attr.attribute_key}`)
553
- .join(', ');
554
- const selectQuery = `SELECT ${columns}
555
- FROM ${this.schema}.${dataSource}
556
- WHERE id = $1`;
557
-
558
- const result = await this.entityManager.query(selectQuery, [id]);
559
- if (!result.length) return null;
560
-
561
- const row = result[0];
562
-
563
- // Convert boolean columns (1/0) into true/false
564
- for (const attr of validAttributes) {
565
- if (
566
- attr.db_datatype == 'boolean' &&
567
- row[attr.attribute_key] !== undefined
568
- ) {
569
- row[attr.attribute_key] = row[attr.attribute_key] == 1 ? true : false;
570
- } else if (
571
- attr.element_type == 'upload' &&
572
- row[attr.attribute_key] !== undefined
573
- ) {
574
- row[attr.attribute_key] =
575
- row[attr.attribute_key] != null
576
- ? await this.mediaDataService.getMediaDownloadUrl(
577
- Number(row[attr.attribute_key]),
578
- loggedInUser,
579
- )
580
- : null;
581
- }
582
- }
583
-
584
- return row;
585
- }
586
-
587
- // -----------------------------
588
- //TODO : make it normal getEntity function make another function if for resolve data
589
- async getEntity(
590
- entityType: string,
591
- id: number | string,
592
- loggedInUser: any,
593
- ): Promise<any> {
594
- const enterprise_id = loggedInUser.enterprise_id;
595
-
596
- const entityMaster =
597
- await this.entityMasterRepo.getEntityByMappedEntityType(
598
- entityType,
599
- enterprise_id,
600
- );
601
- if (!entityMaster) return null;
602
-
603
- const validAttributes = await this.getAttributeCodes(
604
- entityType,
605
- enterprise_id,
606
- );
607
-
608
- // const entityRepo = this.reflectionHelper.getRepoService(entityMaster?.entity_data_class);
609
-
610
- const columns = validAttributes.map((attr) => `t.${attr.attribute_key}`);
611
-
612
- // const result = await entityRepo.find({
613
- // where: {
614
- // id: id
615
- // },
616
- // select: columns
617
- // });
618
- const selectQuery = `SELECT ${columns}
619
- FROM ${this.schema}.${entityMaster.db_table_name} t
620
- WHERE id = $1`;
621
-
622
- const result = await this.entityManager.query(selectQuery, [id]);
623
- if (!result.length) return null;
624
-
625
- const row = result[0];
626
-
627
- // Convert boolean columns (1/0) into true/false
628
- for (const attr of validAttributes) {
629
- if (
630
- attr.db_datatype == 'boolean' &&
631
- row[attr.attribute_key] !== undefined
632
- ) {
633
- row[attr.attribute_key] = row[attr.attribute_key] == 1 ? true : false;
634
- } else if (
635
- attr.element_type == 'upload' &&
636
- row[attr.attribute_key] !== undefined
637
- ) {
638
- row[attr.attribute_key] =
639
- row[attr.attribute_key] != null
640
- ? await this.mediaDataService.getMediaDownloadUrl(
641
- Number(row[attr.attribute_key]),
642
- loggedInUser,
643
- )
644
- : null;
645
- }
646
- }
647
-
648
- return row;
649
- }
650
-
651
- private async getEntitySourceTableName(
652
- entityType: string,
653
- enterprise_id: string,
654
- ): Promise<string> {
655
- const result = await this.entityMasterRepo.getEntityByMappedEntityType(
656
- entityType,
657
- enterprise_id,
658
- );
659
-
660
- if (!result) {
661
- console.log(`Entity type '${entityType}' not found in frm_entity_master`);
662
- throw new BadRequestException();
663
- }
664
-
665
- return result.data_source;
666
- }
667
-
668
- // -----------------------------
669
- private async getTableName(
670
- entityType: string,
671
- enterprise_id: string,
672
- ): Promise<string> {
673
- let entityMaster = await this.entityMasterRepo.getEntityByMappedEntityType(
674
- entityType,
675
- enterprise_id,
676
- );
677
-
678
- if (!entityMaster) {
679
- console.log(`Entity type '${entityType}' not found in frm_entity_master`);
680
- throw new BadRequestException();
681
- }
682
-
683
- return entityMaster.db_table_name;
684
- }
685
-
686
- private async getAttributeCodes(
687
- entityType: string,
688
- enterprise_id: string,
689
- isHidden = true,
690
- ) {
691
- const attributeMasterRepo =
692
- this.reflectionHelper.getRepoService('AttributeMaster');
693
-
694
- const qb = attributeMasterRepo
695
- .createQueryBuilder('fea')
696
- .select('fea.attribute_key', 'attribute_key')
697
- .addSelect('MAX(fea.db_datatype)', 'db_datatype')
698
- .addSelect('MAX(fea.element_type)', 'element_type')
699
- .addSelect('bool_or(fea.is_hidden)', 'is_hidden')
700
- .where('fea.mapped_entity_type = :entityType', { entityType })
701
- .andWhere('fea.enterprise_id = :enterprise_id', { enterprise_id });
702
-
703
- if (isHidden) {
704
- qb.andWhere('(fea.is_hidden IS NULL OR fea.is_hidden = false)');
705
- }
706
-
707
- qb.groupBy('fea.attribute_key');
708
-
709
- const result = await qb.getRawMany();
710
-
711
- return result.map((row: any) => ({
712
- attribute_key: row.attribute_key,
713
- db_datatype: row.db_datatype,
714
- element_type: row.element_type,
715
- is_hidden: row.is_hidden != null ? row.is_hidden === true : undefined,
716
- }));
717
- }
718
-
719
- private async deleteEntity(
720
- entityType: string,
721
- id: number | string,
722
- loggedInUser: any,
723
- ): Promise<any> {
724
- const enterprise_id = loggedInUser.enterprise_id;
725
-
726
- const tableName = await this.getTableName(entityType, enterprise_id);
727
-
728
- const deleteQuery = `DELETE
729
- FROM ${this.schema}.${tableName}
730
- WHERE id = $1`;
731
- const result = await this.entityManager.query(deleteQuery, [id]);
732
- return result;
733
- }
734
-
735
- // -----------------------------
736
-
737
- async getEntitiesDropdownList(
738
- loggedInUser: any,
739
- appcode?: string,
740
- ): Promise<any> {
741
- const entityMasters =
742
- await this.entityMasterRepo.findByEnterpriseIdAndAppCode(
743
- loggedInUser.enterprise_id,
744
- appcode,
745
- );
746
-
747
- let dropdown = [] as any;
748
- entityMasters.map((entityMaster) =>
749
- dropdown.push({
750
- label: entityMaster.name,
751
- value: entityMaster.mapped_entity_type,
752
- }),
753
- );
754
-
755
- return dropdown;
756
- }
757
-
758
- async getCode(entityType: string, loggedInUser: any): Promise<string> {
759
- const enterprise_id = loggedInUser.enterprise_id;
760
-
761
- // 1. Get db_table_name from entity master
762
-
763
- const result = await this.entityMasterRepo.getEntityByMappedEntityType(
764
- entityType,
765
- enterprise_id,
766
- );
767
-
768
- if (!result) {
769
- throw new Error(
770
- `Entity type '${entityType}' not found in frm_entity_master for enterprise '${enterprise_id}'`,
771
- );
772
- }
773
-
774
- const tableName = result.db_table_name;
775
-
776
- // 2. Get current max sequence number from that table
777
- const seqResult = await this.entityManager.query(
778
- `SELECT MAX(id) AS max_seq_no
779
- FROM ${tableName}
780
- WHERE entity_type = $1`,
781
- [entityType],
782
- );
783
-
784
- let maxSeqNo = seqResult?.[0]?.max_seq_no
785
- ? Number(seqResult[0].max_seq_no)
786
- : 0;
787
-
788
- maxSeqNo += 1;
789
-
790
- // 3. Return generated code
791
- return `${entityType}${maxSeqNo}`;
792
- }
793
-
794
- async getResolvedEntity(
795
- id: number,
796
- entity: string,
797
- loggedInUser: UserData,
798
- ): Promise<any> {
799
- const leadData = await this.getEntityWithRelation(entity, id, loggedInUser);
800
-
801
- const { mappedEntities, ...data } = leadData as any;
802
-
803
- const resolvedData = await this.resolverService.getResolvedData(
804
- loggedInUser,
805
- data,
806
- entity,
807
- );
808
-
809
- if (mappedEntities) {
810
- resolvedData.mappedEntities = {};
811
- for (const [entityType, entities] of Object.entries(mappedEntities)) {
812
- if (Array.isArray(entities)) {
813
- resolvedData.mappedEntities[entityType] = [];
814
- for (const item of entities) {
815
- const resolvedItem = await this.resolverService.getResolvedData(
816
- loggedInUser,
817
- item,
818
- entityType,
819
- );
820
- resolvedData.mappedEntities[entityType].push(resolvedItem);
821
- }
822
- } else {
823
- resolvedData.mappedEntities[entityType] =
824
- await this.resolverService.getResolvedData(
825
- loggedInUser,
826
- entities,
827
- entityType,
828
- );
829
- }
830
- }
831
- }
832
-
833
- return resolvedData;
834
- }
835
- }
1
+ import { BadRequestException, Injectable } from '@nestjs/common';
2
+ import { STATUS_ACTIVE } from 'src/constant/global.constant';
3
+ import { EntityManager, In } from 'typeorm';
4
+ import { UserData } from 'src/module/user/entity/user.entity';
5
+ import { MediaDataService } from './media-data.service';
6
+ import { EntityMasterRepository } from '../repository/entity-master.repository';
7
+ import { ConfigService } from '@nestjs/config';
8
+ import { EntityServiceImpl } from './entity-service-impl.service';
9
+ import { EAVService } from '../../eav/service/eav.service';
10
+ import { AttributeStorageType } from '../../../constant/attribute.constant';
11
+ import { StorageType } from '../../../constant/entity.constant';
12
+
13
+ @Injectable()
14
+ export class EntityDynamicService extends EntityServiceImpl {
15
+ constructor(
16
+ private readonly entityManager: EntityManager,
17
+ private readonly mediaDataService: MediaDataService,
18
+ private readonly entityMasterRepo: EntityMasterRepository,
19
+ private readonly configService: ConfigService,
20
+ private readonly eavService: EAVService,
21
+ ) {
22
+ super();
23
+ }
24
+
25
+ schema = this.configService.get('DB_SCHEMA');
26
+
27
+ // -----------------------------
28
+ async createEntityData(
29
+ entityType: string,
30
+ entityData: Record<string, any>,
31
+ loggedInUser: any,
32
+ mainID?: number,
33
+ ): Promise<any> {
34
+ const enterprise_id = loggedInUser.enterprise_id;
35
+ const entityMaster = await this.entityMasterRepo.getEntityByMappedEntityType(entityType, loggedInUser.enterprise_id);
36
+
37
+ if (!entityMaster) {
38
+ throw new BadRequestException(`Entity With ${entityType} entity type not found`);
39
+ }
40
+ let tableName: string;
41
+ if (StorageType.SELF === entityMaster.storage_type) {
42
+ tableName = entityMaster.db_table_name;
43
+ } else {
44
+ tableName = 'frm_entity_dynamic';
45
+ }
46
+
47
+ const validAttributes = await this.getAttributeCodes(
48
+ entityType,
49
+ enterprise_id,
50
+ );
51
+
52
+ // -------------------------------------------------------
53
+ // AUTO fields
54
+ // -------------------------------------------------------
55
+ entityData.created_date = new Date();
56
+
57
+ if (loggedInUser) {
58
+ entityData.created_by = loggedInUser.id;
59
+
60
+ if (!entityData.enterprise_id)
61
+ entityData.enterprise_id = loggedInUser.enterprise_id;
62
+
63
+ if (!entityData.level_type)
64
+ entityData.level_type = loggedInUser.level_type;
65
+
66
+ if (!entityData.level_id) entityData.level_id = loggedInUser.level_id;
67
+
68
+ if (!entityData.entity_type) entityData.entity_type = entityType;
69
+ }
70
+
71
+ // -------------------------------------------------------
72
+ // STATUS
73
+ // -------------------------------------------------------
74
+ const listMasterItemsRepo =
75
+ this.reflectionHelper.getRepoService('ListMasterItems');
76
+ const statusList = listMasterItemsRepo.find({
77
+ where: {
78
+ code: STATUS_ACTIVE,
79
+ enterprise_id: enterprise_id,
80
+ },
81
+ });
82
+
83
+ if (!entityData.status) entityData.status = statusList[0]?.id;
84
+
85
+ // -------------------------------------------------------
86
+ // AUTO-CODE GENERATION (POSTGRES SAFE)
87
+ // -------------------------------------------------------
88
+
89
+ const maxSeqResult = this.entityManager.query(
90
+ `SELECT MAX(id) as seq_no
91
+ FROM ${this.schema}.${tableName}`,
92
+ );
93
+
94
+ let maxSeq = Number(maxSeqResult[0]?.seq_no) || 0;
95
+ maxSeq++;
96
+ entityData.code = `${entityData.entity_type}${maxSeq}`;
97
+
98
+
99
+ // -------------------------------------------------------
100
+ // Parent ID
101
+ // -------------------------------------------------------
102
+ if (mainID) {
103
+ entityData.parent_id = mainID;
104
+ }
105
+
106
+ // -------------------------------------------------------
107
+ // BYPASS COLUMNS
108
+ // -------------------------------------------------------
109
+ const bypassColumns = [
110
+ 'created_date',
111
+ 'created_by',
112
+ 'enterprise_id',
113
+ 'level_type',
114
+ 'level_id',
115
+ 'status',
116
+ 'entity_type',
117
+ 'code',
118
+ 'parent_id',
119
+ ];
120
+
121
+ for (const col of bypassColumns) {
122
+ if (!validAttributes.some((a) => a.attribute_key === col)) {
123
+ validAttributes.push({
124
+ attribute_key: col,
125
+ is_hidden: false,
126
+ db_datatype: 'text',
127
+ element_type: 'text',
128
+ storage_type: AttributeStorageType.DB_COL,
129
+ });
130
+ }
131
+ }
132
+
133
+ // -------------------------------------------------------
134
+ // BUILD INSERT QUERY (POSTGRES FORMAT)
135
+ // -------------------------------------------------------
136
+ const columns: string[] = [];
137
+ const values: any[] = [];
138
+ let idx = 1;
139
+ const placeholders: string[] = [];
140
+ const eavAttributes: any[] = [];
141
+
142
+ for (const attr of validAttributes) {
143
+ if (attr.attribute_key === 'id' && !entityData.id) continue;
144
+
145
+ if (attr.storage_type.toLowerCase() === AttributeStorageType.EAV.toLowerCase()) {
146
+ if (entityData[attr.attribute_key] !== undefined) {
147
+ eavAttributes.push({
148
+ key: attr.attribute_key,
149
+ value: entityData[attr.attribute_key],
150
+ data_type: attr.db_datatype,
151
+ });
152
+ }
153
+ } else {
154
+ columns.push(attr.attribute_key);
155
+ values.push(entityData[attr.attribute_key] ?? null);
156
+ placeholders.push(`$${idx++}`);
157
+ }
158
+ }
159
+
160
+ const colList = columns.map((c) => `"${c}"`).join(', ');
161
+ const placeholderList = placeholders.join(', ');
162
+
163
+
164
+ const sql = `
165
+ INSERT INTO ${this.schema}.${tableName} (${colList})
166
+ VALUES (${placeholderList}) RETURNING *
167
+ `;
168
+
169
+ const result = await this.entityManager.query(sql, values);
170
+ const newId = result[0]?.id;
171
+
172
+ // Save EAV attributes
173
+ if (newId && eavAttributes.length > 0) {
174
+ for (const eavAttr of eavAttributes) {
175
+ if (this.eavService.isTypeSupported(eavAttr.data_type)) {
176
+ await this.eavService.create(
177
+ eavAttr.data_type,
178
+ {
179
+ entity_type: entityType,
180
+ entity_id: newId,
181
+ key: eavAttr.key,
182
+ value: eavAttr.value,
183
+ },
184
+ loggedInUser?.id,
185
+ );
186
+ }
187
+ }
188
+ }
189
+
190
+ return result[0];
191
+ }
192
+
193
+ // ----------------------------- get entity with relations
194
+
195
+ // ----------------------------- create entity with relations
196
+ async createEntity(
197
+ data: Record<string, any>,
198
+ loggedInUser: any,
199
+ ): Promise<any> {
200
+ const entityType = data.entity_type;
201
+ const enterpriseId = loggedInUser.enterprise_id;
202
+
203
+ const repo = this.reflectionHelper.getRepoService('EntityRelation');
204
+
205
+ const getRelation = await repo.find({
206
+ where: {
207
+ enterprise_id: enterpriseId,
208
+ source_entity_type: entityType,
209
+ },
210
+ });
211
+
212
+ const { mappedEntities, ...mainData } = data;
213
+
214
+ // create main entity
215
+ const createdEntityData = await this.createEntityData(
216
+ entityType,
217
+ mainData,
218
+ loggedInUser,
219
+ );
220
+ const mainID = createdEntityData.insertId || createdEntityData.id;
221
+
222
+ if (mappedEntities && getRelation.length > 0) {
223
+ for (const relation of getRelation) {
224
+ const targetEntityType = relation.target_entity_type;
225
+ const relationType = relation.relation_type;
226
+
227
+ if (!mappedEntities[targetEntityType]) continue;
228
+
229
+ // normalize: always array
230
+ const entityDataArray = Array.isArray(mappedEntities[targetEntityType])
231
+ ? mappedEntities[targetEntityType]
232
+ : [mappedEntities[targetEntityType]];
233
+
234
+ for (const item of entityDataArray) {
235
+ const itemWithRef = {
236
+ ...item,
237
+ entity_type: targetEntityType,
238
+ };
239
+
240
+ const createdRelatedEntity = await this.createEntityData(
241
+ targetEntityType,
242
+ itemWithRef,
243
+ loggedInUser,
244
+ mainID, // this will pass for parent_id
245
+ );
246
+
247
+ const relationRepo =
248
+ this.reflectionHelper.getRepoService('EntityRelationData');
249
+
250
+ await relationRepo.save({
251
+ enterprise_id: enterpriseId,
252
+ source_entity_id: mainID,
253
+ source_entity_type: entityType,
254
+ target_entity_id: createdRelatedEntity.id,
255
+ target_entity_type: targetEntityType,
256
+ relation_type: relationType,
257
+ });
258
+ }
259
+ }
260
+ }
261
+
262
+ return {
263
+ mainEntity: {
264
+ id: mainID,
265
+ entityType,
266
+ data: createdEntityData,
267
+ },
268
+ };
269
+ }
270
+
271
+ // ----------------------------- get entity with relations
272
+ async getEntityData(
273
+ entityType: string,
274
+ id: number | string,
275
+ loggedInUser: any,
276
+ resolved?:boolean
277
+ ): Promise<any> {
278
+ let mainEntity = await this.getEntityByDataSource(
279
+ entityType,
280
+ id,
281
+ loggedInUser,
282
+ );
283
+
284
+ if(resolved) {
285
+ mainEntity = await this.resolverService.getResolvedData(loggedInUser, mainEntity, entityType);
286
+ }
287
+
288
+ const relationRepo = this.reflectionHelper.getRepoService('EntityRelation');
289
+ const relatedEntityRepo =
290
+ this.reflectionHelper.getRepoService('EntityRelationData');
291
+
292
+ const relations = await relationRepo.find({
293
+ where: {
294
+ source_entity_type: entityType,
295
+ enterprise_id: loggedInUser.enterprise_id,
296
+ },
297
+ });
298
+
299
+ const targetTypes = relations.map((r) => r.target_entity_type);
300
+
301
+ if (targetTypes.length === 0) {
302
+ return {
303
+ entity_type: entityType,
304
+ ...mainEntity,
305
+ };
306
+ }
307
+
308
+ const relatedEntities = await relatedEntityRepo.find({
309
+ where: {
310
+ source_entity_id: id,
311
+ target_entity_type: In(targetTypes),
312
+ },
313
+ });
314
+
315
+ // Format response to match create entity structure
316
+ const response: any = {
317
+ entity_type: entityType,
318
+ ...mainEntity,
319
+ };
320
+
321
+ if (relatedEntities.length > 0) {
322
+ response.mappedEntities = await this.formatMappedEntities(
323
+ relatedEntities,
324
+ loggedInUser,
325
+ resolved
326
+ );
327
+ }
328
+
329
+ return response;
330
+ }
331
+
332
+ // ----------------------------- formatMappedEntities
333
+ async formatMappedEntities(
334
+ relatedEntities: any[],
335
+ loggedInUser: any,
336
+ resolved?:boolean
337
+ ): Promise<any> {
338
+ const mappedEntities: any = {};
339
+
340
+ for (const relation of relatedEntities) {
341
+ const targetEntityType = relation.target_entity_type;
342
+ const targetEntityId = relation.target_entity_id;
343
+
344
+ const entityData = await this.getEntityData(
345
+ targetEntityType,
346
+ targetEntityId,
347
+ loggedInUser,
348
+ resolved
349
+ );
350
+
351
+ if (!mappedEntities[targetEntityType]) {
352
+ mappedEntities[targetEntityType] = [];
353
+ }
354
+
355
+ mappedEntities[targetEntityType].push(entityData);
356
+ }
357
+
358
+ return mappedEntities;
359
+ }
360
+
361
+ // ----------------------------- update with relations
362
+
363
+ // ----------------------------- update entity with relations
364
+ async updateEntity(
365
+ data: Record<string, any>,
366
+ loggedInUser: any,
367
+ ): Promise<any> {
368
+ const entityType = data.entity_type;
369
+ const enterpriseId = loggedInUser.enterprise_id;
370
+ const { mappedEntities, ...mainData } = data;
371
+
372
+ // Update main entity
373
+ const updatedMainEntity = await this.updateEntityData(
374
+ entityType,
375
+ data.id,
376
+ mainData,
377
+ loggedInUser,
378
+ );
379
+
380
+ const updatedRelations: Record<string, any> = {};
381
+
382
+ if (mappedEntities) {
383
+ const entityRelationRepo =
384
+ this.reflectionHelper.getRepoService('EntityRelation');
385
+ const getRelationDefs = await entityRelationRepo.find({
386
+ where: {
387
+ enterprise_id: enterpriseId,
388
+ source_entity_type: entityType,
389
+ },
390
+ });
391
+
392
+ for (const [targetEntityType, rawEntityData] of Object.entries(
393
+ mappedEntities,
394
+ )) {
395
+ const relationDef = getRelationDefs.find(
396
+ (r) => r.target_entity_type === targetEntityType,
397
+ );
398
+ if (!relationDef) continue;
399
+
400
+ const relationType = relationDef.relation_type;
401
+ const entityArray = Array.isArray(rawEntityData)
402
+ ? rawEntityData
403
+ : [rawEntityData];
404
+
405
+ // Delete previous relations and related entities
406
+ // Create/update new entities & relations
407
+ const updatedEntities: any[] = [];
408
+
409
+ for (const item of entityArray) {
410
+ let targetEntityId;
411
+ let entityData;
412
+
413
+ if (item.id) {
414
+ // Update existing entity
415
+ await this.updateEntityData(
416
+ targetEntityType,
417
+ item.id,
418
+ item,
419
+ loggedInUser,
420
+ Number(data.id), // pass main entity id as parent_id
421
+ );
422
+ targetEntityId = item.id;
423
+ entityData = await this.getEntity(
424
+ targetEntityType,
425
+ targetEntityId,
426
+ loggedInUser,
427
+ );
428
+ } else {
429
+ // Create new entity
430
+ const createdEntity = await this.createEntityData(
431
+ targetEntityType,
432
+ item,
433
+ loggedInUser,
434
+ Number(data.id), // pass main entity id as parent_id
435
+ );
436
+ targetEntityId = createdEntity.insertId || createdEntity.id;
437
+ entityData = await this.getEntity(
438
+ targetEntityType,
439
+ targetEntityId,
440
+ loggedInUser,
441
+ );
442
+
443
+ // Insert relation as per new entity created
444
+ const entityRelationDataRepo =
445
+ this.reflectionHelper.getRepoService('EntityRelationData');
446
+ await entityRelationDataRepo.save({
447
+ enterprise_id: enterpriseId,
448
+ source_entity_id: data.id,
449
+ source_entity_type: entityType,
450
+ target_entity_id: targetEntityId,
451
+ target_entity_type: targetEntityType,
452
+ relation_type: relationType,
453
+ });
454
+ }
455
+
456
+ if (relationType === 'ONE_TO_MANY') {
457
+ updatedEntities.push(entityData);
458
+ } else if (
459
+ relationType === 'ONE_TO_ONE' ||
460
+ relationType === 'MANY_TO_ONE'
461
+ ) {
462
+ updatedEntities[0] = entityData; // single object
463
+ }
464
+ }
465
+
466
+ // Assign to response mappedEntities
467
+ updatedRelations[targetEntityType] =
468
+ relationType === 'ONE_TO_MANY' ? updatedEntities : updatedEntities[0];
469
+ }
470
+ }
471
+
472
+ return {
473
+ mainEntity: {
474
+ id: data.id,
475
+ entityType,
476
+ data: updatedMainEntity,
477
+ },
478
+ relatedEntities: updatedRelations,
479
+ };
480
+ }
481
+
482
+ // -----------------------------
483
+ async updateEntityData(
484
+ entityType: string,
485
+ id: number | string,
486
+ entityData: Record<string, any>,
487
+ loggedInUser: any,
488
+ mainID?: number,
489
+ ): Promise<any> {
490
+ const enterprise_id = loggedInUser.enterprise_id;
491
+
492
+ const tableName = await this.getTableName(entityType, enterprise_id);
493
+ const validAttributes = await this.getAttributeCodes(
494
+ entityType,
495
+ enterprise_id,
496
+ );
497
+
498
+ const updates: string[] = [];
499
+ const values: any[] = [];
500
+ let idx = 1;
501
+
502
+ // Auto fields
503
+ entityData.modified_date = new Date();
504
+ if (loggedInUser) {
505
+ entityData.modified_by = loggedInUser.id;
506
+
507
+ if (!entityData.enterprise_id)
508
+ entityData.enterprise_id = loggedInUser.enterprise_id;
509
+
510
+ if (!entityData.level_type)
511
+ entityData.level_type = loggedInUser.level_type;
512
+
513
+ if (!entityData.level_id) entityData.level_id = loggedInUser.level_id;
514
+
515
+ if (!entityData.entity_type) entityData.entity_type = entityType;
516
+ }
517
+
518
+ if (mainID) {
519
+ entityData.parent_id = mainID;
520
+ }
521
+
522
+ // Add bypass columns if needed
523
+ const bypassColumns = [
524
+ 'created_date',
525
+ 'created_by',
526
+ 'modified_date',
527
+ 'modified_by',
528
+ 'enterprise_id',
529
+ 'level_type',
530
+ 'level_id',
531
+ 'status',
532
+ 'entity_type',
533
+ 'code',
534
+ 'parent_id',
535
+ ];
536
+
537
+ for (const col of bypassColumns) {
538
+ if (!validAttributes.some((attr) => attr.attribute_key === col)) {
539
+ validAttributes.push({
540
+ attribute_key: col,
541
+ db_datatype: 'text',
542
+ element_type: 'text',
543
+ is_hidden: false,
544
+ storage_type: AttributeStorageType.DB_COL,
545
+ });
546
+ }
547
+ }
548
+
549
+ const eavAttributes: any[] = [];
550
+
551
+ // Build SET clause
552
+ for (const key of Object.keys(entityData)) {
553
+ const attr = validAttributes.find((attr) => attr.attribute_key === key);
554
+ if (attr) {
555
+ if (attr.storage_type.toLowerCase() === AttributeStorageType.EAV.toLowerCase()) {
556
+ eavAttributes.push({
557
+ key: attr.attribute_key,
558
+ value: entityData[key],
559
+ data_type: attr.db_datatype,
560
+ });
561
+ } else {
562
+ updates.push(`${key} = $${idx++}`);
563
+ values.push(entityData[key]);
564
+ }
565
+ }
566
+ }
567
+
568
+ if (updates.length === 0 && eavAttributes.length === 0) {
569
+ throw new Error('No valid attributes to update.');
570
+ }
571
+
572
+ let result;
573
+
574
+ if (updates.length > 0) {
575
+ // WHERE clause placeholder
576
+ const idPlaceholder = `$${idx}`;
577
+ values.push(id);
578
+
579
+ const updateQuery = `
580
+ UPDATE ${this.schema}.${tableName}
581
+ SET ${updates.join(', ')}
582
+ WHERE id = ${idPlaceholder}
583
+ `;
584
+
585
+ result = await this.entityManager.query(updateQuery, values);
586
+ }
587
+
588
+ // Process EAV Updates
589
+ if (eavAttributes.length > 0) {
590
+ for (const eavAttr of eavAttributes) {
591
+ if (this.eavService.isTypeSupported(eavAttr.data_type)) {
592
+ await this.eavService.upsert(
593
+ eavAttr.data_type,
594
+ {
595
+ entity_type: entityType,
596
+ entity_id: id,
597
+ key: eavAttr.key,
598
+ value: eavAttr.value,
599
+ },
600
+ loggedInUser?.id,
601
+ );
602
+ }
603
+ }
604
+ }
605
+
606
+ return result || { message: 'EAV updated' };
607
+ }
608
+
609
+ async getEntityByDataSource(
610
+ entityType: string,
611
+ id: number | string,
612
+ loggedInUser: any,
613
+ ): Promise<any> {
614
+ const enterprise_id = loggedInUser.enterprise_id;
615
+
616
+ const entityMaster = await this.entityMasterService.getEntityData(entityType, loggedInUser);
617
+
618
+ let dataSource: string;
619
+ if (StorageType.SELF === entityMaster.storage_type) {
620
+ dataSource = entityMaster.db_table_name;
621
+ } else {
622
+ dataSource = 'frm_entity_dynamic';
623
+ }
624
+
625
+ const validAttributes = await this.getAttributeCodes(
626
+ entityType,
627
+ enterprise_id,
628
+ false,
629
+ );
630
+
631
+ // Filter out EAV attributes from SQL query
632
+ const dbColumns = validAttributes.filter(attr => attr.storage_type !== AttributeStorageType.EAV);
633
+ const columns = dbColumns
634
+ .map((attr) => `"${attr.attribute_key}"`)
635
+ .join(', ');
636
+
637
+ // Add id if not present (required)
638
+ // Note: If columns is empty (only EAV attributes), we still need to select something.
639
+ let selectColumns = columns;
640
+ if (!columns) {
641
+ selectColumns = 'id';
642
+ } else if (!dbColumns.some(c => c.attribute_key === 'id')) {
643
+ selectColumns += ', id';
644
+ }
645
+
646
+ const selectQuery = `SELECT ${selectColumns}
647
+ FROM ${this.schema}.${dataSource}
648
+ WHERE id = $1`;
649
+
650
+ const result = await this.entityManager.query(selectQuery, [id]);
651
+ if (!result.length) return null;
652
+
653
+ const row = result[0];
654
+
655
+ // Fetch EAV attributes
656
+ const eavAttributes = validAttributes.filter(attr => attr.storage_type === AttributeStorageType.EAV);
657
+ if (eavAttributes.length > 0) {
658
+ for (const attr of eavAttributes) {
659
+ if (this.eavService.isTypeSupported(attr.db_datatype)) {
660
+ const eavData = await this.eavService.findOne(attr.db_datatype, {
661
+ entity_type: entityType,
662
+ entity_id: id,
663
+ key: attr.attribute_key,
664
+ });
665
+
666
+ if (eavData) {
667
+ row[attr.attribute_key] = eavData.value;
668
+ }
669
+ }
670
+ }
671
+ }
672
+
673
+ // Convert boolean columns (1/0) into true/false
674
+ for (const attr of validAttributes) {
675
+ if (
676
+ attr.db_datatype == 'boolean' &&
677
+ row[attr.attribute_key] !== undefined
678
+ ) {
679
+ row[attr.attribute_key] = row[attr.attribute_key] == 1 ? true : false;
680
+ } else if (
681
+ attr.element_type == 'upload' &&
682
+ row[attr.attribute_key] !== undefined
683
+ ) {
684
+ row[attr.attribute_key] =
685
+ row[attr.attribute_key] != null
686
+ ? await this.mediaDataService.getMediaDownloadUrl(
687
+ Number(row[attr.attribute_key]),
688
+ loggedInUser,
689
+ )
690
+ : null;
691
+ }
692
+ }
693
+
694
+ return row;
695
+ }
696
+
697
+ // -----------------------------
698
+ //TODO : make it normal getEntity function make another function if for resolve data
699
+ async getEntity(
700
+ entityType: string,
701
+ id: number | string,
702
+ loggedInUser: any,
703
+ ): Promise<any> {
704
+ const enterprise_id = loggedInUser.enterprise_id;
705
+
706
+ const entityMaster = await this.entityMasterRepo.getEntityByMappedEntityType(entityType, enterprise_id);
707
+ if (!entityMaster) return null;
708
+
709
+ const validAttributes = await this.getAttributeCodes(
710
+ entityType,
711
+ enterprise_id,
712
+ );
713
+
714
+ // const entityRepo = this.reflectionHelper.getRepoService(entityMaster?.entity_data_class);
715
+
716
+ // Filter out EAV attributes from SQL query
717
+ const dbColumns = validAttributes.filter(attr => attr.storage_type !== AttributeStorageType.EAV);
718
+ const columns = dbColumns.map(attr => `t.${attr.attribute_key}`);
719
+
720
+ // Add id if not present (required)
721
+ if (!columns.some(c => c.includes('.id'))) {
722
+ columns.push('t.id');
723
+ }
724
+
725
+ // const result = await entityRepo.find({
726
+ // where: {
727
+ // id: id
728
+ // },
729
+ // select: columns
730
+ // });
731
+ const selectQuery = `SELECT ${columns.join(', ')}
732
+ FROM ${this.schema}.${entityMaster.db_table_name} t
733
+ WHERE id = $1`;
734
+
735
+ const result = await this.entityManager.query(selectQuery, [id]);
736
+ if (!result.length) return null;
737
+
738
+ const row = result[0];
739
+
740
+ // Fetch EAV attributes
741
+ const eavAttributes = validAttributes.filter(attr => attr.storage_type === AttributeStorageType.EAV);
742
+ if (eavAttributes.length > 0) {
743
+ for (const attr of eavAttributes) {
744
+ if (this.eavService.isTypeSupported(attr.db_datatype)) {
745
+ const eavData = await this.eavService.findOne(attr.db_datatype, {
746
+ entity_type: entityType,
747
+ entity_id: id,
748
+ key: attr.attribute_key,
749
+ });
750
+
751
+ if (eavData) {
752
+ row[attr.attribute_key] = eavData.value;
753
+ }
754
+ }
755
+ }
756
+ }
757
+
758
+ // Convert boolean columns (1/0) into true/false
759
+ for (const attr of validAttributes) {
760
+ if (
761
+ attr.db_datatype == 'boolean' &&
762
+ row[attr.attribute_key] !== undefined
763
+ ) {
764
+ row[attr.attribute_key] = row[attr.attribute_key] == 1 ? true : false;
765
+ } else if (
766
+ attr.element_type == 'upload' &&
767
+ row[attr.attribute_key] !== undefined
768
+ ) {
769
+ row[attr.attribute_key] =
770
+ row[attr.attribute_key] != null
771
+ ? await this.mediaDataService.getMediaDownloadUrl(
772
+ Number(row[attr.attribute_key]),
773
+ loggedInUser,
774
+ )
775
+ : null;
776
+ }
777
+ }
778
+
779
+ return row;
780
+ }
781
+
782
+ private async getEntitySourceTableName(
783
+ entityType: string,
784
+ enterprise_id: string,
785
+ ): Promise<string> {
786
+ const result = await this.entityMasterRepo.getEntityByMappedEntityType(
787
+ entityType,
788
+ enterprise_id,
789
+ );
790
+
791
+ if (!result) {
792
+ console.log(`Entity type '${entityType}' not found in frm_entity_master`);
793
+ throw new BadRequestException();
794
+ }
795
+
796
+ return result.data_source;
797
+ }
798
+
799
+ // -----------------------------
800
+ private async getTableName(
801
+ entityType: string,
802
+ enterprise_id: string,
803
+ ): Promise<string> {
804
+ let entityMaster = await this.entityMasterRepo.getEntityByMappedEntityType(
805
+ entityType,
806
+ enterprise_id,
807
+ );
808
+
809
+ if (!entityMaster) {
810
+ console.log(`Entity type '${entityType}' not found in frm_entity_master`);
811
+ throw new BadRequestException();
812
+ }
813
+
814
+ if (entityMaster.storage_type === StorageType.SELF) {
815
+ return entityMaster.db_table_name;
816
+ } else {
817
+ return 'frm_entity_dynamic';
818
+ }
819
+ }
820
+
821
+ private async getAttributeCodes(
822
+ entityType: string,
823
+ enterprise_id: string,
824
+ isHidden = true,
825
+ ) {
826
+ const attributeMasterRepo =
827
+ this.reflectionHelper.getRepoService('AttributeMaster');
828
+
829
+ const qb = attributeMasterRepo
830
+ .createQueryBuilder('fea')
831
+ .select('fea.attribute_key', 'attribute_key')
832
+ .addSelect('MAX(fea.db_datatype)', 'db_datatype')
833
+ .addSelect('MAX(fea.element_type)', 'element_type')
834
+ .addSelect('MAX(fea.storage_type)', 'storage_type')
835
+ .addSelect('bool_or(fea.is_hidden)', 'is_hidden')
836
+ .where('fea.mapped_entity_type = :entityType', { entityType })
837
+ .andWhere('fea.enterprise_id = :enterprise_id', { enterprise_id });
838
+
839
+ if (isHidden) {
840
+ qb.andWhere('(fea.is_hidden IS NULL OR fea.is_hidden = false)');
841
+ }
842
+
843
+ qb.groupBy('fea.attribute_key');
844
+
845
+ const result = await qb.getRawMany();
846
+
847
+ return result.map((row: any) => ({
848
+ attribute_key: row.attribute_key,
849
+ db_datatype: row.db_datatype,
850
+ element_type: row.element_type,
851
+ storage_type: row.storage_type,
852
+ is_hidden: row.is_hidden != null ? row.is_hidden === true : undefined,
853
+ }));
854
+ }
855
+
856
+ async deleteEntity(
857
+ entityType: string,
858
+ id: number | string,
859
+ loggedInUser: any,
860
+ ): Promise<any> {
861
+ const enterprise_id = loggedInUser.enterprise_id;
862
+
863
+ const tableName = await this.getTableName(entityType, enterprise_id);
864
+
865
+ // Delete EAV records first
866
+ const validAttributes = await this.getAttributeCodes(entityType, enterprise_id, false);
867
+ const eavAttributes = validAttributes.filter(attr => attr.storage_type === AttributeStorageType.EAV);
868
+
869
+ if (eavAttributes.length > 0) {
870
+ // Group by data type to minimize calls
871
+ const dataTypes = [...new Set(eavAttributes.map(attr => attr.db_datatype))];
872
+
873
+ for (const dataType of dataTypes) {
874
+ if (this.eavService.isTypeSupported(dataType)) {
875
+ // We need to delete all attributes for this entity_id and data source
876
+ // Since delete accepts key, we iterate over keys or finding a way to delete all for entity
877
+ // The current EAV service delete method requires a key.
878
+ // Ideally EAV service should support delete by entity_id alone, but sticking to interface:
879
+ const attrsOfType = eavAttributes.filter(attr => attr.db_datatype === dataType);
880
+ for (const attr of attrsOfType) {
881
+ await this.eavService.delete(dataType, {
882
+ entity_type: entityType,
883
+ entity_id: id,
884
+ key: attr.attribute_key,
885
+ });
886
+ }
887
+ }
888
+ }
889
+ }
890
+
891
+ const deleteQuery = `DELETE
892
+ FROM ${this.schema}.${tableName}
893
+ WHERE id = $1`;
894
+ const result = await this.entityManager.query(deleteQuery, [id]);
895
+ return result;
896
+ }
897
+
898
+ // -----------------------------
899
+
900
+ async getEntitiesDropdownList(
901
+ loggedInUser: any,
902
+ appcode?: string,
903
+ ): Promise<any> {
904
+
905
+ const entityMasters = await this.entityMasterRepo.findByEnterpriseIdAndAppCode(loggedInUser.enterprise_id, appcode);
906
+
907
+ let dropdown = [] as any;
908
+ entityMasters.map(entityMaster => dropdown.push({
909
+ label: entityMaster.name,
910
+ value: entityMaster.mapped_entity_type,
911
+ }));
912
+
913
+ return dropdown;
914
+ }
915
+
916
+ async getCode(entityType: string, loggedInUser: any): Promise<string> {
917
+ const enterprise_id = loggedInUser.enterprise_id;
918
+
919
+ // 1. Get db_table_name from entity master
920
+
921
+ const result = await this.entityMasterRepo.getEntityByMappedEntityType(
922
+ entityType,
923
+ enterprise_id,
924
+ );
925
+
926
+ if (!result) {
927
+ throw new Error(
928
+ `Entity type '${entityType}' not found in frm_entity_master for enterprise '${enterprise_id}'`,
929
+ );
930
+ }
931
+
932
+ const tableName = result.db_table_name;
933
+
934
+ // 2. Get current max sequence number from that table
935
+ const seqResult = await this.entityManager.query(
936
+ `SELECT MAX(id) AS max_seq_no
937
+ FROM ${tableName}
938
+ WHERE entity_type = $1`,
939
+ [entityType],
940
+ );
941
+
942
+ let maxSeqNo = seqResult?.[0]?.max_seq_no
943
+ ? Number(seqResult[0].max_seq_no)
944
+ : 0;
945
+
946
+ maxSeqNo += 1;
947
+
948
+ // 3. Return generated code
949
+ return `${entityType}${maxSeqNo}`;
950
+ }
951
+
952
+ async getResolvedEntity(
953
+ id: number,
954
+ entity: string,
955
+ loggedInUser: UserData,
956
+ ): Promise<any> {
957
+ const leadData = await this.getEntityData(entity, id, loggedInUser);
958
+
959
+ const { mappedEntities, ...data } = leadData as any;
960
+
961
+ const resolvedData = await this.resolverService.getResolvedData(
962
+ loggedInUser,
963
+ data,
964
+ entity,
965
+ );
966
+
967
+ if (mappedEntities) {
968
+ resolvedData.mappedEntities = {};
969
+ for (const [entityType, entities] of Object.entries(mappedEntities)) {
970
+ if (Array.isArray(entities)) {
971
+ resolvedData.mappedEntities[entityType] = [];
972
+ for (const item of entities) {
973
+ const resolvedItem = await this.resolverService.getResolvedData(
974
+ loggedInUser,
975
+ item,
976
+ entityType,
977
+ );
978
+ resolvedData.mappedEntities[entityType].push(resolvedItem);
979
+ }
980
+ } else {
981
+ resolvedData.mappedEntities[entityType] =
982
+ await this.resolverService.getResolvedData(
983
+ loggedInUser,
984
+ entities,
985
+ entityType,
986
+ );
987
+ }
988
+ }
989
+ }
990
+
991
+ return resolvedData;
992
+ }
993
+ }