rez_core 6.5.59 → 6.5.61

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 (451) hide show
  1. package/dist/app.module.js +3 -5
  2. package/dist/app.module.js.map +1 -1
  3. package/dist/core.module.js +38 -63
  4. package/dist/core.module.js.map +1 -1
  5. package/dist/migrations/1732612800000-AddEntityJsonGinIndex.d.ts +6 -0
  6. package/dist/migrations/1732612800000-AddEntityJsonGinIndex.js +32 -0
  7. package/dist/migrations/1732612800000-AddEntityJsonGinIndex.js.map +1 -0
  8. package/dist/module/auth/strategies/jwt.strategy.d.ts +1 -2
  9. package/dist/module/auth/strategies/jwt.strategy.js +2 -3
  10. package/dist/module/auth/strategies/jwt.strategy.js.map +1 -1
  11. package/dist/module/dashboard/dashboard.module.js +1 -1
  12. package/dist/module/dashboard/dashboard.module.js.map +1 -1
  13. package/dist/module/dashboard/service/dashboard.service.js +2 -1
  14. package/dist/module/dashboard/service/dashboard.service.js.map +1 -1
  15. package/dist/module/enterprise/controller/organization.controller.d.ts +4 -12
  16. package/dist/module/enterprise/controller/organization.controller.js +8 -64
  17. package/dist/module/enterprise/controller/organization.controller.js.map +1 -1
  18. package/dist/module/enterprise/enterprise.module.js +15 -10
  19. package/dist/module/enterprise/enterprise.module.js.map +1 -1
  20. package/dist/module/enterprise/entity/enterprise.entity.d.ts +3 -1
  21. package/dist/module/enterprise/entity/enterprise.entity.js +12 -4
  22. package/dist/module/enterprise/entity/enterprise.entity.js.map +1 -1
  23. package/dist/module/enterprise/entity/organization-app-mapping.entity.d.ts +1 -6
  24. package/dist/module/enterprise/entity/organization-app-mapping.entity.js +4 -21
  25. package/dist/module/enterprise/entity/organization-app-mapping.entity.js.map +1 -1
  26. package/dist/module/enterprise/entity/organization.entity.d.ts +17 -3
  27. package/dist/module/enterprise/entity/organization.entity.js +73 -11
  28. package/dist/module/enterprise/entity/organization.entity.js.map +1 -1
  29. package/dist/module/enterprise/repository/enterprise.repository.d.ts +2 -4
  30. package/dist/module/enterprise/repository/enterprise.repository.js +4 -19
  31. package/dist/module/enterprise/repository/enterprise.repository.js.map +1 -1
  32. package/dist/module/enterprise/service/brand.service.d.ts +3 -0
  33. package/dist/module/enterprise/service/brand.service.js +17 -0
  34. package/dist/module/enterprise/service/brand.service.js.map +1 -1
  35. package/dist/module/enterprise/service/enterprise.service.d.ts +2 -2
  36. package/dist/module/enterprise/service/enterprise.service.js +4 -6
  37. package/dist/module/enterprise/service/enterprise.service.js.map +1 -1
  38. package/dist/module/enterprise/service/organization.service.d.ts +6 -6
  39. package/dist/module/enterprise/service/organization.service.js +27 -109
  40. package/dist/module/enterprise/service/organization.service.js.map +1 -1
  41. package/dist/module/entity_json/controller/entity_json.controller.d.ts +2 -9
  42. package/dist/module/entity_json/controller/entity_json.controller.js.map +1 -1
  43. package/dist/module/entity_json/entity/entityJson.entity.d.ts +2 -1
  44. package/dist/module/entity_json/entity/entityJson.entity.js +5 -1
  45. package/dist/module/entity_json/entity/entityJson.entity.js.map +1 -1
  46. package/dist/module/entity_json/entity_json.module.js +7 -2
  47. package/dist/module/entity_json/entity_json.module.js.map +1 -1
  48. package/dist/module/entity_json/service/entity_json.service.d.ts +2 -10
  49. package/dist/module/entity_json/service/entity_json.service.js +101 -25
  50. package/dist/module/entity_json/service/entity_json.service.js.map +1 -1
  51. package/dist/module/filter/controller/filter.controller.d.ts +12 -0
  52. package/dist/module/filter/controller/filter.controller.js +1 -1
  53. package/dist/module/filter/controller/filter.controller.js.map +1 -1
  54. package/dist/module/filter/filter.module.js +11 -2
  55. package/dist/module/filter/filter.module.js.map +1 -1
  56. package/dist/module/filter/service/filter.service.d.ts +38 -2
  57. package/dist/module/filter/service/filter.service.js +43 -50
  58. package/dist/module/filter/service/filter.service.js.map +1 -1
  59. package/dist/module/filter/service/flatjson-filter.service.d.ts +32 -0
  60. package/dist/module/filter/service/flatjson-filter.service.js +632 -0
  61. package/dist/module/filter/service/flatjson-filter.service.js.map +1 -0
  62. package/dist/module/filter/service/saved-filter.service.d.ts +3 -2
  63. package/dist/module/filter/service/saved-filter.service.js +14 -18
  64. package/dist/module/filter/service/saved-filter.service.js.map +1 -1
  65. package/dist/module/integration/service/integration.service.d.ts +1 -0
  66. package/dist/module/integration/service/integration.service.js +2 -1
  67. package/dist/module/integration/service/integration.service.js.map +1 -1
  68. package/dist/module/integration/service/wrapper.service.js +1 -0
  69. package/dist/module/integration/service/wrapper.service.js.map +1 -1
  70. package/dist/module/layout/controller/layout.controller.d.ts +3 -1
  71. package/dist/module/layout/controller/layout.controller.js +7 -3
  72. package/dist/module/layout/controller/layout.controller.js.map +1 -1
  73. package/dist/module/layout/entity/header-section.entity.d.ts +2 -0
  74. package/dist/module/layout/entity/header-section.entity.js +8 -0
  75. package/dist/module/layout/entity/header-section.entity.js.map +1 -1
  76. package/dist/module/layout/layout.module.js +2 -1
  77. package/dist/module/layout/layout.module.js.map +1 -1
  78. package/dist/module/layout/repository/header-section.repository.d.ts +1 -0
  79. package/dist/module/layout/repository/header-section.repository.js +5 -0
  80. package/dist/module/layout/repository/header-section.repository.js.map +1 -1
  81. package/dist/module/layout/service/header-section.service.d.ts +1 -1
  82. package/dist/module/layout/service/header-section.service.js +1 -1
  83. package/dist/module/layout/service/header-section.service.js.map +1 -1
  84. package/dist/module/linked_attributes/controller/linked_attributes.controller.d.ts +41 -0
  85. package/dist/module/linked_attributes/controller/linked_attributes.controller.js +90 -0
  86. package/dist/module/linked_attributes/controller/linked_attributes.controller.js.map +1 -1
  87. package/dist/module/linked_attributes/dto/create-linked-attribute-smart.dto.d.ts +13 -0
  88. package/dist/module/linked_attributes/dto/create-linked-attribute-smart.dto.js +64 -0
  89. package/dist/module/linked_attributes/dto/create-linked-attribute-smart.dto.js.map +1 -0
  90. package/dist/module/linked_attributes/linked_attributes.module.js +8 -1
  91. package/dist/module/linked_attributes/linked_attributes.module.js.map +1 -1
  92. package/dist/module/linked_attributes/service/linked_attributes.service.d.ts +65 -1
  93. package/dist/module/linked_attributes/service/linked_attributes.service.js +287 -2
  94. package/dist/module/linked_attributes/service/linked_attributes.service.js.map +1 -1
  95. package/dist/module/listmaster/service/list-master.service.d.ts +1 -14
  96. package/dist/module/listmaster/service/list-master.service.js +44 -217
  97. package/dist/module/listmaster/service/list-master.service.js.map +1 -1
  98. package/dist/module/meta/controller/app-master.controller.js.map +1 -0
  99. package/dist/module/meta/controller/attribute-master.controller.d.ts +3 -0
  100. package/dist/module/meta/controller/attribute-master.controller.js +12 -0
  101. package/dist/module/meta/controller/attribute-master.controller.js.map +1 -1
  102. package/dist/module/meta/controller/entity-dynamic.controller.js +3 -6
  103. package/dist/module/meta/controller/entity-dynamic.controller.js.map +1 -1
  104. package/dist/module/meta/controller/entity.controller.js +1 -1
  105. package/dist/module/meta/controller/entity.controller.js.map +1 -1
  106. package/dist/module/meta/controller/meta.controller.d.ts +6 -1
  107. package/dist/module/meta/controller/meta.controller.js +19 -1
  108. package/dist/module/meta/controller/meta.controller.js.map +1 -1
  109. package/dist/module/meta/entity/app-master.entity.d.ts +13 -0
  110. package/dist/module/{app_master → meta}/entity/app-master.entity.js +12 -30
  111. package/dist/module/meta/entity/app-master.entity.js.map +1 -0
  112. package/dist/module/meta/entity/attribute-master.entity.d.ts +0 -4
  113. package/dist/module/meta/entity/attribute-master.entity.js +0 -16
  114. package/dist/module/meta/entity/attribute-master.entity.js.map +1 -1
  115. package/dist/module/meta/entity/entity-master.entity.d.ts +1 -0
  116. package/dist/module/meta/entity/entity-master.entity.js +8 -1
  117. package/dist/module/meta/entity/entity-master.entity.js.map +1 -1
  118. package/dist/module/meta/entity.module.js +14 -3
  119. package/dist/module/meta/entity.module.js.map +1 -1
  120. package/dist/module/{app_master → meta}/repository/app-master.repository.d.ts +2 -2
  121. package/dist/module/{app_master → meta}/repository/app-master.repository.js +4 -4
  122. package/dist/module/meta/repository/app-master.repository.js.map +1 -0
  123. package/dist/module/meta/service/app-master.service.js.map +1 -0
  124. package/dist/module/meta/service/attribute-master.service.d.ts +6 -1
  125. package/dist/module/meta/service/attribute-master.service.js +22 -2
  126. package/dist/module/meta/service/attribute-master.service.js.map +1 -1
  127. package/dist/module/meta/service/entity-dynamic.service.d.ts +12 -9
  128. package/dist/module/meta/service/entity-dynamic.service.js +22 -20
  129. package/dist/module/meta/service/entity-dynamic.service.js.map +1 -1
  130. package/dist/module/meta/service/entity-master.service.js +1 -0
  131. package/dist/module/meta/service/entity-master.service.js.map +1 -1
  132. package/dist/module/meta/service/entity-relation.service.d.ts +4 -3
  133. package/dist/module/meta/service/entity-relation.service.js +10 -4
  134. package/dist/module/meta/service/entity-relation.service.js.map +1 -1
  135. package/dist/module/meta/service/entity-service-impl.service.d.ts +2 -2
  136. package/dist/module/meta/service/entity-service-impl.service.js +15 -11
  137. package/dist/module/meta/service/entity-service-impl.service.js.map +1 -1
  138. package/dist/module/meta/service/entity-table.service.d.ts +5 -4
  139. package/dist/module/meta/service/entity-table.service.js +45 -24
  140. package/dist/module/meta/service/entity-table.service.js.map +1 -1
  141. package/dist/module/meta/service/populate-meta.service.d.ts +13 -0
  142. package/dist/module/{enterprise → meta}/service/populate-meta.service.js +8 -2
  143. package/dist/module/meta/service/populate-meta.service.js.map +1 -0
  144. package/dist/module/meta/service/resolver.service.d.ts +1 -1
  145. package/dist/module/meta/service/resolver.service.js +6 -3
  146. package/dist/module/meta/service/resolver.service.js.map +1 -1
  147. package/dist/module/module/controller/module-access.controller.d.ts +4 -3
  148. package/dist/module/module/controller/module-access.controller.js +8 -13
  149. package/dist/module/module/controller/module-access.controller.js.map +1 -1
  150. package/dist/module/module/entity/menu.entity.d.ts +3 -6
  151. package/dist/module/module/entity/menu.entity.js +10 -19
  152. package/dist/module/module/entity/menu.entity.js.map +1 -1
  153. package/dist/module/module/entity/module-access.entity.d.ts +1 -15
  154. package/dist/module/module/entity/module-access.entity.js +3 -49
  155. package/dist/module/module/entity/module-access.entity.js.map +1 -1
  156. package/dist/module/module/entity/module-action.entity.d.ts +2 -4
  157. package/dist/module/module/entity/module-action.entity.js +6 -11
  158. package/dist/module/module/entity/module-action.entity.js.map +1 -1
  159. package/dist/module/module/entity/module.entity.d.ts +5 -3
  160. package/dist/module/module/entity/module.entity.js +18 -8
  161. package/dist/module/module/entity/module.entity.js.map +1 -1
  162. package/dist/module/module/module.module.d.ts +1 -1
  163. package/dist/module/module/module.module.js +7 -5
  164. package/dist/module/module/module.module.js.map +1 -1
  165. package/dist/module/module/repository/menu.repository.d.ts +3 -3
  166. package/dist/module/module/repository/menu.repository.js +27 -38
  167. package/dist/module/module/repository/menu.repository.js.map +1 -1
  168. package/dist/module/module/repository/module-access.repository.d.ts +6 -6
  169. package/dist/module/module/repository/module-access.repository.js +50 -100
  170. package/dist/module/module/repository/module-access.repository.js.map +1 -1
  171. package/dist/module/module/service/menu.service.d.ts +4 -2
  172. package/dist/module/module/service/menu.service.js +10 -7
  173. package/dist/module/module/service/menu.service.js.map +1 -1
  174. package/dist/module/module/service/module-access.service.d.ts +10 -7
  175. package/dist/module/module/service/module-access.service.js +24 -22
  176. package/dist/module/module/service/module-access.service.js.map +1 -1
  177. package/dist/module/notification/entity/notification.entity.d.ts +2 -17
  178. package/dist/module/notification/entity/notification.entity.js +2 -68
  179. package/dist/module/notification/entity/notification.entity.js.map +1 -1
  180. package/dist/module/notification/notification.module.js +4 -3
  181. package/dist/module/notification/notification.module.js.map +1 -1
  182. package/dist/module/notification/service/email.service.d.ts +0 -1
  183. package/dist/module/notification/service/email.service.js +0 -14
  184. package/dist/module/notification/service/email.service.js.map +1 -1
  185. package/dist/module/notification/service/notification.service.d.ts +3 -1
  186. package/dist/module/notification/service/notification.service.js +5 -2
  187. package/dist/module/notification/service/notification.service.js.map +1 -1
  188. package/dist/module/notification/service/otp.service.d.ts +2 -2
  189. package/dist/module/notification/service/otp.service.js +5 -4
  190. package/dist/module/notification/service/otp.service.js.map +1 -1
  191. package/dist/module/user/controller/login.controller.d.ts +3 -1
  192. package/dist/module/user/controller/login.controller.js +6 -2
  193. package/dist/module/user/controller/login.controller.js.map +1 -1
  194. package/dist/module/user/controller/user.controller.d.ts +2 -0
  195. package/dist/module/user/controller/user.controller.js +13 -0
  196. package/dist/module/user/controller/user.controller.js.map +1 -1
  197. package/dist/module/user/dto/create-user.dto.d.ts +3 -6
  198. package/dist/module/user/dto/create-user.dto.js +11 -17
  199. package/dist/module/user/dto/create-user.dto.js.map +1 -1
  200. package/dist/module/user/entity/role.entity.d.ts +6 -18
  201. package/dist/module/user/entity/role.entity.js +19 -64
  202. package/dist/module/user/entity/role.entity.js.map +1 -1
  203. package/dist/module/user/entity/user-role-mapping.entity.d.ts +0 -10
  204. package/dist/module/user/entity/user-role-mapping.entity.js +1 -33
  205. package/dist/module/user/entity/user-role-mapping.entity.js.map +1 -1
  206. package/dist/module/user/entity/user-session.entity.d.ts +2 -0
  207. package/dist/module/user/entity/user-session.entity.js +20 -2
  208. package/dist/module/user/entity/user-session.entity.js.map +1 -1
  209. package/dist/module/user/entity/user.entity.d.ts +5 -17
  210. package/dist/module/user/entity/user.entity.js +15 -61
  211. package/dist/module/user/entity/user.entity.js.map +1 -1
  212. package/dist/module/user/repository/role.repository.d.ts +2 -7
  213. package/dist/module/user/repository/role.repository.js +8 -23
  214. package/dist/module/user/repository/role.repository.js.map +1 -1
  215. package/dist/module/user/repository/user-role-mapping.repository.d.ts +0 -1
  216. package/dist/module/user/repository/user-role-mapping.repository.js +0 -3
  217. package/dist/module/user/repository/user-role-mapping.repository.js.map +1 -1
  218. package/dist/module/user/repository/user.repository.d.ts +2 -5
  219. package/dist/module/user/repository/user.repository.js +7 -26
  220. package/dist/module/user/repository/user.repository.js.map +1 -1
  221. package/dist/module/user/repository/userSession.repository.d.ts +0 -1
  222. package/dist/module/user/repository/userSession.repository.js +0 -3
  223. package/dist/module/user/repository/userSession.repository.js.map +1 -1
  224. package/dist/module/user/service/login.service.d.ts +5 -3
  225. package/dist/module/user/service/login.service.js +42 -43
  226. package/dist/module/user/service/login.service.js.map +1 -1
  227. package/dist/module/user/service/role.service.d.ts +11 -24
  228. package/dist/module/user/service/role.service.js +40 -54
  229. package/dist/module/user/service/role.service.js.map +1 -1
  230. package/dist/module/user/service/user-role-mapping.service.d.ts +0 -2
  231. package/dist/module/user/service/user-role-mapping.service.js +0 -6
  232. package/dist/module/user/service/user-role-mapping.service.js.map +1 -1
  233. package/dist/module/user/service/user-session.service.d.ts +4 -3
  234. package/dist/module/user/service/user-session.service.js +11 -10
  235. package/dist/module/user/service/user-session.service.js.map +1 -1
  236. package/dist/module/user/service/user.service.d.ts +22 -33
  237. package/dist/module/user/service/user.service.js +58 -66
  238. package/dist/module/user/service/user.service.js.map +1 -1
  239. package/dist/module/user/user.module.js +7 -2
  240. package/dist/module/user/user.module.js.map +1 -1
  241. package/dist/module/workflow/repository/action-data.repository.d.ts +1 -1
  242. package/dist/module/workflow/repository/action-data.repository.js +8 -6
  243. package/dist/module/workflow/repository/action-data.repository.js.map +1 -1
  244. package/dist/module/workflow/repository/action.repository.d.ts +1 -1
  245. package/dist/module/workflow/repository/action.repository.js +10 -10
  246. package/dist/module/workflow/repository/action.repository.js.map +1 -1
  247. package/dist/module/workflow/repository/form-master.repository.d.ts +1 -1
  248. package/dist/module/workflow/repository/form-master.repository.js +2 -2
  249. package/dist/module/workflow/repository/form-master.repository.js.map +1 -1
  250. package/dist/module/workflow/service/action-data.service.js +2 -1
  251. package/dist/module/workflow/service/action-data.service.js.map +1 -1
  252. package/dist/module/workflow/service/action.service.js +2 -2
  253. package/dist/module/workflow/service/action.service.js.map +1 -1
  254. package/dist/module/workflow/service/comm-template.service.js +2 -0
  255. package/dist/module/workflow/service/comm-template.service.js.map +1 -1
  256. package/dist/module/workflow/service/entity-modification.service.js +1 -0
  257. package/dist/module/workflow/service/entity-modification.service.js.map +1 -1
  258. package/dist/module/workflow/service/form-master.service.js +2 -2
  259. package/dist/module/workflow/service/form-master.service.js.map +1 -1
  260. package/dist/module/workflow/service/populate-workflow.service.d.ts +1 -1
  261. package/dist/module/workflow/service/populate-workflow.service.js +1 -1
  262. package/dist/module/workflow/service/populate-workflow.service.js.map +1 -1
  263. package/dist/module/workflow/service/task.service.js +4 -1
  264. package/dist/module/workflow/service/task.service.js.map +1 -1
  265. package/dist/module/workflow/service/workflow-meta.service.js +7 -2
  266. package/dist/module/workflow/service/workflow-meta.service.js.map +1 -1
  267. package/dist/module/workflow/service/workflow.service.js +2 -2
  268. package/dist/module/workflow/service/workflow.service.js.map +1 -1
  269. package/dist/module/workflow/workflow.module.js +0 -2
  270. package/dist/module/workflow/workflow.module.js.map +1 -1
  271. package/dist/module/workflow-automation/service/workflow-automation.service.js +6 -11
  272. package/dist/module/workflow-automation/service/workflow-automation.service.js.map +1 -1
  273. package/dist/module/workflow-automation/workflow-automation.module.js +1 -3
  274. package/dist/module/workflow-automation/workflow-automation.module.js.map +1 -1
  275. package/dist/module/workflow-schedule/service/workflow-schedule.service.js +2 -0
  276. package/dist/module/workflow-schedule/service/workflow-schedule.service.js.map +1 -1
  277. package/dist/table.config.d.ts +5 -3
  278. package/dist/table.config.js +3 -3
  279. package/dist/table.config.js.map +1 -1
  280. package/dist/tsconfig.build.tsbuildinfo +1 -1
  281. package/package.json +2 -2
  282. package/src/app.module.ts +5 -7
  283. package/src/core.module.ts +44 -58
  284. package/src/migrations/1732612800000-AddEntityJsonGinIndex.ts +41 -0
  285. package/src/module/auth/strategies/jwt.strategy.ts +2 -4
  286. package/src/module/dashboard/dashboard.module.ts +3 -3
  287. package/src/module/dashboard/service/dashboard.service.ts +2 -1
  288. package/src/module/enterprise/controller/organization.controller.ts +4 -60
  289. package/src/module/enterprise/enterprise.module.ts +18 -16
  290. package/src/module/enterprise/entity/enterprise.entity.ts +11 -5
  291. package/src/module/enterprise/entity/organization-app-mapping.entity.ts +4 -18
  292. package/src/module/enterprise/entity/organization.entity.ts +58 -11
  293. package/src/module/enterprise/repository/enterprise.repository.ts +4 -26
  294. package/src/module/enterprise/service/brand.service.ts +5 -75
  295. package/src/module/enterprise/service/enterprise.service.ts +4 -12
  296. package/src/module/enterprise/service/organization.service.ts +28 -151
  297. package/src/module/entity_json/controller/entity_json.controller.ts +13 -0
  298. package/src/module/entity_json/docs/FlatJson_Filterin_System.md +2804 -0
  299. package/src/module/entity_json/entity/entityJson.entity.ts +4 -1
  300. package/src/module/entity_json/entity_json.module.ts +9 -5
  301. package/src/module/entity_json/service/entity_json.service.ts +237 -51
  302. package/src/module/filter/controller/filter.controller.ts +1 -3
  303. package/src/module/filter/filter.module.ts +12 -3
  304. package/src/module/filter/service/filter.service.ts +130 -73
  305. package/src/module/filter/service/flatjson-filter.service.ts +903 -0
  306. package/src/module/filter/service/saved-filter.service.ts +16 -26
  307. package/src/module/filter/test/flatjson-filter.service.spec.ts +415 -0
  308. package/src/module/integration/service/integration.service.ts +6 -2
  309. package/src/module/integration/service/wrapper.service.ts +1 -0
  310. package/src/module/layout/controller/layout.controller.ts +8 -1
  311. package/src/module/layout/entity/header-section.entity.ts +6 -0
  312. package/src/module/layout/layout.module.ts +1 -1
  313. package/src/module/layout/repository/header-section.repository.ts +6 -0
  314. package/src/module/layout/service/header-section.service.ts +1 -1
  315. package/src/module/linked_attributes/controller/linked_attributes.controller.ts +100 -0
  316. package/src/module/linked_attributes/dto/create-linked-attribute-smart.dto.ts +54 -0
  317. package/src/module/linked_attributes/linked_attributes.module.ts +9 -2
  318. package/src/module/linked_attributes/service/linked_attributes.service.ts +578 -3
  319. package/src/module/linked_attributes/test/linked-attributes.service.spec.ts +244 -0
  320. package/src/module/listmaster/service/list-master.service.ts +75 -437
  321. package/src/module/meta/controller/attribute-master.controller.ts +12 -0
  322. package/src/module/meta/controller/entity-dynamic.controller.ts +8 -6
  323. package/src/module/meta/controller/entity.controller.ts +1 -0
  324. package/src/module/meta/controller/meta.controller.ts +25 -3
  325. package/src/module/{app_master → meta}/entity/app-master.entity.ts +9 -22
  326. package/src/module/meta/entity/attribute-master.entity.ts +0 -13
  327. package/src/module/meta/entity/entity-master.entity.ts +9 -3
  328. package/src/module/meta/entity.module.ts +20 -6
  329. package/src/module/{app_master → meta}/repository/app-master.repository.ts +3 -3
  330. package/src/module/meta/service/attribute-master.service.ts +31 -1
  331. package/src/module/meta/service/entity-dynamic.service.ts +26 -23
  332. package/src/module/meta/service/entity-master.service.ts +1 -0
  333. package/src/module/meta/service/entity-relation.service.ts +10 -6
  334. package/src/module/meta/service/entity-service-impl.service.ts +15 -19
  335. package/src/module/meta/service/entity-table.service.ts +82 -68
  336. package/src/module/meta/service/entity.service.ts +0 -1
  337. package/src/module/{enterprise → meta}/service/populate-meta.service.ts +5 -2
  338. package/src/module/meta/service/resolver.service.ts +4 -0
  339. package/src/module/module/controller/module-access.controller.ts +9 -14
  340. package/src/module/module/entity/menu.entity.ts +10 -18
  341. package/src/module/module/entity/module-access.entity.ts +3 -40
  342. package/src/module/module/entity/module-action.entity.ts +6 -10
  343. package/src/module/module/entity/module.entity.ts +14 -7
  344. package/src/module/module/module.module.ts +3 -2
  345. package/src/module/module/repository/menu.repository.ts +29 -43
  346. package/src/module/module/repository/module-access.repository.ts +62 -110
  347. package/src/module/module/service/menu.service.ts +9 -7
  348. package/src/module/module/service/module-access.service.ts +34 -22
  349. package/src/module/notification/entity/notification.entity.ts +3 -53
  350. package/src/module/notification/notification.module.ts +5 -6
  351. package/src/module/notification/service/email.service.ts +1 -16
  352. package/src/module/notification/service/notification.service.ts +1 -0
  353. package/src/module/notification/service/otp.service.ts +5 -16
  354. package/src/module/user/controller/login.controller.ts +8 -7
  355. package/src/module/user/controller/user.controller.ts +9 -0
  356. package/src/module/user/dto/create-user.dto.ts +6 -19
  357. package/src/module/user/entity/role.entity.ts +16 -59
  358. package/src/module/user/entity/user-role-mapping.entity.ts +3 -29
  359. package/src/module/user/entity/user-session.entity.ts +19 -3
  360. package/src/module/user/entity/user.entity.ts +13 -48
  361. package/src/module/user/repository/role.repository.ts +12 -32
  362. package/src/module/user/repository/user-role-mapping.repository.ts +1 -5
  363. package/src/module/user/repository/user.repository.ts +9 -36
  364. package/src/module/user/repository/userSession.repository.ts +1 -5
  365. package/src/module/user/service/login.service.ts +51 -47
  366. package/src/module/user/service/role.service.ts +63 -64
  367. package/src/module/user/service/user-role-mapping.service.ts +1 -23
  368. package/src/module/user/service/user-session.service.ts +11 -14
  369. package/src/module/user/service/user.service.ts +95 -76
  370. package/src/module/user/user.module.ts +5 -4
  371. package/src/module/workflow/repository/action-data.repository.ts +8 -6
  372. package/src/module/workflow/repository/action.repository.ts +11 -11
  373. package/src/module/workflow/repository/form-master.repository.ts +2 -2
  374. package/src/module/workflow/service/action-data.service.ts +2 -3
  375. package/src/module/workflow/service/action.service.ts +2 -2
  376. package/src/module/workflow/service/comm-template.service.ts +2 -0
  377. package/src/module/workflow/service/entity-modification.service.ts +1 -0
  378. package/src/module/workflow/service/form-master.service.ts +2 -2
  379. package/src/module/workflow/service/populate-workflow.service.ts +1 -1
  380. package/src/module/workflow/service/task.service.ts +4 -0
  381. package/src/module/workflow/service/workflow-meta.service.ts +7 -2
  382. package/src/module/workflow/service/workflow.service.ts +2 -2
  383. package/src/module/workflow/workflow.module.ts +0 -2
  384. package/src/module/workflow-automation/service/workflow-automation.service.ts +7 -19
  385. package/src/module/workflow-automation/workflow-automation.module.ts +3 -4
  386. package/src/module/workflow-schedule/service/workflow-schedule.service.ts +2 -0
  387. package/src/resources/dev.properties.yaml +2 -2
  388. package/src/table.config.ts +3 -3
  389. package/.claude/settings.local.json +0 -26
  390. package/.idea/250218_nodejs_core.iml +0 -9
  391. package/.idea/codeStyles/Project.xml +0 -59
  392. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  393. package/.idea/copilot.data.migration.agent.xml +0 -6
  394. package/.idea/copilot.data.migration.ask.xml +0 -6
  395. package/.idea/copilot.data.migration.ask2agent.xml +0 -6
  396. package/.idea/copilot.data.migration.edit.xml +0 -6
  397. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  398. package/.idea/misc.xml +0 -6
  399. package/.idea/modules.xml +0 -8
  400. package/.idea/prettier.xml +0 -6
  401. package/.idea/vcs.xml +0 -6
  402. package/dist/constant/status.constant.d.ts +0 -4
  403. package/dist/constant/status.constant.js +0 -9
  404. package/dist/constant/status.constant.js.map +0 -1
  405. package/dist/module/app_master/app-master.module.d.ts +0 -2
  406. package/dist/module/app_master/app-master.module.js +0 -28
  407. package/dist/module/app_master/app-master.module.js.map +0 -1
  408. package/dist/module/app_master/controller/app-master.controller.js.map +0 -1
  409. package/dist/module/app_master/entity/app-master.entity.d.ts +0 -17
  410. package/dist/module/app_master/entity/app-master.entity.js.map +0 -1
  411. package/dist/module/app_master/repository/app-master.repository.js.map +0 -1
  412. package/dist/module/app_master/service/app-master.service.js.map +0 -1
  413. package/dist/module/enterprise/controller/enterprise.controller.d.ts +0 -12
  414. package/dist/module/enterprise/controller/enterprise.controller.js +0 -57
  415. package/dist/module/enterprise/controller/enterprise.controller.js.map +0 -1
  416. package/dist/module/enterprise/controller/meta.controller.d.ts +0 -9
  417. package/dist/module/enterprise/controller/meta.controller.js +0 -43
  418. package/dist/module/enterprise/controller/meta.controller.js.map +0 -1
  419. package/dist/module/enterprise/service/brand-profile.service.d.ts +0 -0
  420. package/dist/module/enterprise/service/brand-profile.service.js +0 -1
  421. package/dist/module/enterprise/service/brand-profile.service.js.map +0 -1
  422. package/dist/module/enterprise/service/populate-meta.service.d.ts +0 -9
  423. package/dist/module/enterprise/service/populate-meta.service.js.map +0 -1
  424. package/dist/module/enterprise/service/school.service.d.ts +0 -0
  425. package/dist/module/enterprise/service/school.service.js +0 -1
  426. package/dist/module/enterprise/service/school.service.js.map +0 -1
  427. package/dist/module/preference_master/entity/preference.entity.d.ts +0 -9
  428. package/dist/module/preference_master/entity/preference.entity.js +0 -48
  429. package/dist/module/preference_master/entity/preference.entity.js.map +0 -1
  430. package/dist/module/preference_master/preference.service.d.ts +0 -8
  431. package/dist/module/preference_master/preference.service.js +0 -31
  432. package/dist/module/preference_master/preference.service.js.map +0 -1
  433. package/dist/module/preference_master/repo/preference.repository.d.ts +0 -8
  434. package/dist/module/preference_master/repo/preference.repository.js +0 -48
  435. package/dist/module/preference_master/repo/preference.repository.js.map +0 -1
  436. package/server.log +0 -850
  437. package/src/constant/status.constant.ts +0 -4
  438. package/src/module/app_master/app-master.module.ts +0 -15
  439. package/src/module/enterprise/controller/enterprise.controller.ts +0 -40
  440. package/src/module/enterprise/controller/meta.controller.ts +0 -23
  441. package/src/module/enterprise/service/brand-profile.service.ts +0 -10
  442. package/src/module/enterprise/service/school.service.ts +0 -5
  443. package/src/module/preference_master/entity/preference.entity.ts +0 -25
  444. package/src/module/preference_master/preference.service.ts +0 -27
  445. package/src/module/preference_master/repo/preference.repository.ts +0 -36
  446. /package/dist/module/{app_master → meta}/controller/app-master.controller.d.ts +0 -0
  447. /package/dist/module/{app_master → meta}/controller/app-master.controller.js +0 -0
  448. /package/dist/module/{app_master → meta}/service/app-master.service.d.ts +0 -0
  449. /package/dist/module/{app_master → meta}/service/app-master.service.js +0 -0
  450. /package/src/module/{app_master → meta}/controller/app-master.controller.ts +0 -0
  451. /package/src/module/{app_master → meta}/service/app-master.service.ts +0 -0
@@ -0,0 +1,903 @@
1
+ import { Injectable, BadRequestException, Inject, forwardRef } from '@nestjs/common';
2
+ import { EntityManager, SelectQueryBuilder } from 'typeorm';
3
+ import { EntityMasterService } from 'src/module/meta/service/entity-master.service';
4
+ import { AttributeMasterService } from 'src/module/meta/service/attribute-master.service';
5
+ import { ResolverService } from 'src/module/meta/service/resolver.service';
6
+ import { LoggingService } from 'src/utils/service/loggingUtil.service';
7
+ import { ConfigService } from '@nestjs/config';
8
+ import {
9
+ FilterRequestDto,
10
+ FilterCondition,
11
+ SortConfig,
12
+ } from '../dto/filter-request.dto';
13
+ import { EntityJson } from 'src/module/entity_json/entity/entityJson.entity';
14
+ import { SavedFilterRepositoryService } from '../repository/saved-filter.repository';
15
+ import { EntityJSONService } from 'src/module/entity_json/service/entity_json.service';
16
+
17
+ /**
18
+ * JSONB query condition structure
19
+ */
20
+ interface JsonbCondition {
21
+ query: string;
22
+ params: Record<string, any>;
23
+ }
24
+
25
+ @Injectable()
26
+ export class FlatjsonFilterService {
27
+ constructor(
28
+ private readonly entityManager: EntityManager,
29
+ @Inject(forwardRef(() => EntityMasterService))
30
+ private readonly entityMasterService: EntityMasterService,
31
+ @Inject(forwardRef(() => AttributeMasterService))
32
+ private readonly attributeMasterService: AttributeMasterService,
33
+ @Inject(forwardRef(() => ResolverService))
34
+ private readonly resolverService: ResolverService,
35
+ @Inject(forwardRef(() => LoggingService))
36
+ private readonly loggingService: LoggingService,
37
+ private readonly configService: ConfigService,
38
+ @Inject(forwardRef(() => SavedFilterRepositoryService))
39
+ private readonly savedFilterRepositoryService: SavedFilterRepositoryService,
40
+ @Inject(forwardRef(() => EntityJSONService))
41
+ private readonly entityJsonService: EntityJSONService,
42
+ ) {}
43
+
44
+ /**
45
+ * Main filtering method - queries frm_entity_json table
46
+ */
47
+ async applyFlatjsonFilter(dto: FilterRequestDto): Promise<any> {
48
+ const {
49
+ entity_type,
50
+ quickFilter = [],
51
+ savedFilterCode,
52
+ attributeFilter = [],
53
+ sortby = [],
54
+ tabs,
55
+ page = 1,
56
+ size = 20,
57
+ loggedInUser,
58
+ } = dto;
59
+
60
+ await this.loggingService.log(
61
+ 'info',
62
+ 'FlatjsonFilterService',
63
+ 'applyFlatjsonFilter',
64
+ `Filtering entity: ${entity_type}`,
65
+ );
66
+
67
+ // Step 1: Load attribute metadata for this entity
68
+ let attributes =
69
+ await this.entityJsonService.getAttributeForFlatJSON(
70
+ entity_type,
71
+ loggedInUser,
72
+ 'filter_attribute',
73
+ );
74
+
75
+ if (!attributes?.length) {
76
+ attributes =
77
+ await this.attributeMasterService.findAttributesByMappedEntityType(
78
+ entity_type,
79
+ loggedInUser,
80
+ );
81
+ }
82
+
83
+ attributes = attributes ?? [];
84
+
85
+ const attributeMetaMap: Record<string, any> = {};
86
+ attributes.forEach((attr) => {
87
+ attributeMetaMap[attr.flat_json_key] = attr;
88
+ });
89
+
90
+ await this.loggingService.log(
91
+ 'debug',
92
+ 'FlatjsonFilterService',
93
+ 'applyFlatjsonFilter',
94
+ `Loaded ${attributes.length} attributes`,
95
+ );
96
+
97
+ // Step 2: Merge filters (quickFilter + savedFilter + attributeFilter)
98
+ let allFilters: FilterCondition[] = [...quickFilter, ...attributeFilter];
99
+
100
+ if (savedFilterCode) {
101
+ const savedFilterDetails =
102
+ await this.savedFilterRepositoryService.getDetailsByCode(
103
+ savedFilterCode,
104
+ );
105
+ allFilters = [...allFilters, ...savedFilterDetails];
106
+ }
107
+
108
+ await this.loggingService.log(
109
+ 'debug',
110
+ 'FlatjsonFilterService',
111
+ 'applyFlatjsonFilter',
112
+ `Total filters: ${allFilters.length}`,
113
+ );
114
+
115
+ // Step 3: Build JSONB conditions
116
+ const jsonbConditions = this.buildJsonbConditions(
117
+ allFilters,
118
+ attributeMetaMap,
119
+ );
120
+
121
+ // Step 4: Build base query
122
+ const qb = this.entityManager
123
+ .getRepository(EntityJson)
124
+ .createQueryBuilder('ej')
125
+ .where('ej.entity_type = :entity_type', { entity_type })
126
+ .andWhere('ej.organization_id = :orgId', {
127
+ orgId: loggedInUser.organization_id,
128
+ });
129
+
130
+ // Step 5: Apply JSONB conditions
131
+ jsonbConditions.forEach((condition, index) => {
132
+ qb.andWhere(condition.query, condition.params);
133
+ });
134
+
135
+ // Step 6: Apply tab filter if provided
136
+ if (tabs?.columnName && tabs?.value) {
137
+ const tabMeta = attributeMetaMap[tabs.columnName];
138
+ if (tabMeta) {
139
+ const flatJsonKey =
140
+ tabMeta.flat_json_key ||
141
+ `${entity_type}__${tabs.columnName}`;
142
+ qb.andWhere(`json_data->>'${flatJsonKey}' = :tabValue`, {
143
+ tabValue: tabs.value,
144
+ });
145
+ }
146
+ }
147
+
148
+ // Step 7: Get tab counts if needed (before pagination)
149
+ let tabCounts: any[] = [];
150
+ if (tabs?.columnName && !tabs?.value) {
151
+ const tabMeta = attributeMetaMap[tabs.columnName];
152
+ if (tabMeta) {
153
+ const flatJsonKey =
154
+ tabMeta.flat_json_key ||
155
+ `${entity_type}__${tabs.columnName}`;
156
+ tabCounts = await this.getJsonbTabCounts(
157
+ entity_type,
158
+ flatJsonKey,
159
+ jsonbConditions,
160
+ );
161
+ }
162
+ }
163
+
164
+ // Step 8: Apply sorting
165
+ if (sortby && sortby.length > 0) {
166
+ this.applyJsonbSorting(qb, sortby, attributeMetaMap);
167
+ } else {
168
+ // Default sort by created_date DESC
169
+ qb.orderBy('ej.created_at', 'DESC');
170
+ }
171
+
172
+ // Step 9: Get total count (before pagination)
173
+ const totalCount = await qb.getCount();
174
+
175
+ // Step 10: Apply pagination
176
+ if (page && size) {
177
+ const skip = (page - 1) * size;
178
+ qb.skip(skip).take(size);
179
+ }
180
+
181
+ const results = await qb.getMany();
182
+
183
+ await this.loggingService.log(
184
+ 'info',
185
+ 'FlatjsonFilterService',
186
+ 'applyFlatjsonFilter',
187
+ `Found ${totalCount} total, returning ${results.length} records`,
188
+ );
189
+
190
+ // Map only json_data
191
+ const jsonDataResults = results.map((r) => r.json_data);
192
+
193
+ return {
194
+ data: jsonDataResults,
195
+ total: totalCount,
196
+ page: page || 1,
197
+ size: size || 20,
198
+ totalPages: size ? Math.ceil(totalCount / size) : 1,
199
+ tabCounts: tabCounts.length > 0 ? tabCounts : undefined,
200
+ };
201
+
202
+ }
203
+
204
+ /**
205
+ * Build JSONB where clauses from filter conditions
206
+ */
207
+ private buildJsonbConditions(
208
+ filters: FilterCondition[],
209
+ attributeMetaMap: Record<string, any>,
210
+ ): JsonbCondition[] {
211
+ const conditions: JsonbCondition[] = [];
212
+
213
+ for (const filter of filters) {
214
+ const meta = attributeMetaMap[filter.filter_attribute];
215
+ const condition = this.buildJsonbCondition(filter, meta);
216
+
217
+ if (condition) {
218
+ conditions.push(condition);
219
+ } else {
220
+ console.warn(
221
+ `Could not build condition for filter: ${filter.filter_attribute}`,
222
+ );
223
+ }
224
+ }
225
+
226
+ return conditions;
227
+ }
228
+
229
+ /**
230
+ * Resolve entity IDs to full entity data
231
+ */
232
+ private async resolveEntityData(
233
+ entityJsonRecords: EntityJson[],
234
+ entity_type: string,
235
+ loggedInUser: any,
236
+ ): Promise<any[]> {
237
+ if (entityJsonRecords.length === 0) return [];
238
+
239
+ const entityIds = entityJsonRecords.map((ej) => ej.entity_id);
240
+
241
+ try {
242
+ // Use resolver service to get full entity data
243
+ const fullEntities = await this.resolverService.getResolvedData(
244
+ entity_type,
245
+ entityIds,
246
+ loggedInUser,
247
+ );
248
+
249
+ // Return with json_data merged
250
+ return entityJsonRecords.map((ej) => {
251
+ const fullEntity = fullEntities.find((e) => e.id === ej.entity_id);
252
+ return {
253
+ ...fullEntity,
254
+ _flatjson: ej.json_data, // Include flatjson for debugging
255
+ };
256
+ });
257
+ } catch (error) {
258
+ console.error('Error resolving entity data:', error);
259
+ // Fallback: return just the entity IDs with json_data
260
+ return entityJsonRecords.map((ej) => ({
261
+ id: ej.entity_id,
262
+ entity_type: ej.entity_type,
263
+ ...ej.json_data,
264
+ }));
265
+ }
266
+ }
267
+
268
+ /**
269
+ * Build a single JSONB condition based on data type
270
+ */
271
+ private buildJsonbCondition(
272
+ filter: FilterCondition,
273
+ meta: any,
274
+ ): JsonbCondition | null {
275
+ if (!meta) return null;
276
+
277
+ const flatJsonKey =
278
+ meta.flat_json_key ||
279
+ `${meta.mapped_entity_type}__${filter.filter_attribute}`;
280
+ const op = filter.filter_operator;
281
+ const val = filter.filter_value;
282
+ const key = `param_${filter.filter_attribute}_${Math.random().toString(36).substring(2, 8)}`;
283
+
284
+ switch (meta.data_type) {
285
+ case 'text':
286
+ return this.buildTextCondition(flatJsonKey, op, val, key);
287
+ case 'number':
288
+ return this.buildNumberCondition(flatJsonKey, op, val, key);
289
+ case 'date':
290
+ return this.buildDateCondition(flatJsonKey, op, val, key);
291
+ case 'select':
292
+ case 'radio':
293
+ return this.buildSelectCondition(flatJsonKey, op, val, key);
294
+ case 'multiselect':
295
+ case 'checkbox':
296
+ return this.buildMultiSelectCondition(flatJsonKey, op, val, key);
297
+ case 'year':
298
+ return this.buildYearCondition(flatJsonKey, op, val, key);
299
+ default:
300
+ return null;
301
+ }
302
+ }
303
+
304
+ /**
305
+ * Build text condition (JSONB ->> operator)
306
+ */
307
+ private buildTextCondition(
308
+ flatJsonKey: string,
309
+ operator: string,
310
+ value: any,
311
+ paramKey: string,
312
+ ): JsonbCondition | null {
313
+ // Text is already stored lowercase in flatjson
314
+ const lowerValue = value ? String(value).toLowerCase() : '';
315
+
316
+ switch (operator) {
317
+ case 'equal':
318
+ return {
319
+ query: `json_data->>'${flatJsonKey}' = :${paramKey}`,
320
+ params: { [paramKey]: lowerValue },
321
+ };
322
+
323
+ case 'not_equal':
324
+ return {
325
+ query: `json_data->>'${flatJsonKey}' != :${paramKey}`,
326
+ params: { [paramKey]: lowerValue },
327
+ };
328
+
329
+ case 'contains':
330
+ return {
331
+ query: `json_data->>'${flatJsonKey}' LIKE :${paramKey}`,
332
+ params: { [paramKey]: `%${lowerValue}%` },
333
+ };
334
+
335
+ case 'not_contains':
336
+ return {
337
+ query: `json_data->>'${flatJsonKey}' NOT LIKE :${paramKey}`,
338
+ params: { [paramKey]: `%${lowerValue}%` },
339
+ };
340
+
341
+ case 'starts_with':
342
+ return {
343
+ query: `json_data->>'${flatJsonKey}' LIKE :${paramKey}`,
344
+ params: { [paramKey]: `${lowerValue}%` },
345
+ };
346
+
347
+ case 'ends_with':
348
+ return {
349
+ query: `json_data->>'${flatJsonKey}' LIKE :${paramKey}`,
350
+ params: { [paramKey]: `%${lowerValue}` },
351
+ };
352
+
353
+ case 'empty':
354
+ return {
355
+ query: `(json_data->>'${flatJsonKey}' IS NULL OR json_data->>'${flatJsonKey}' = '')`,
356
+ params: {},
357
+ };
358
+
359
+ case 'not_empty':
360
+ return {
361
+ query: `(json_data->>'${flatJsonKey}' IS NOT NULL AND json_data->>'${flatJsonKey}' != '')`,
362
+ params: {},
363
+ };
364
+
365
+ default:
366
+ console.warn(`Unsupported text operator: ${operator}`);
367
+ return null;
368
+ }
369
+ }
370
+
371
+ /**
372
+ * Build number condition (JSONB ->> with ::numeric cast)
373
+ */
374
+ private buildNumberCondition(
375
+ flatJsonKey: string,
376
+ operator: string,
377
+ value: any,
378
+ paramKey: string,
379
+ ): JsonbCondition | null {
380
+ // Cast JSONB text to numeric for comparison
381
+ const jsonbField = `(json_data->>'${flatJsonKey}')::numeric`;
382
+
383
+ switch (operator) {
384
+ case 'equal':
385
+ return {
386
+ query: `${jsonbField} = :${paramKey}`,
387
+ params: { [paramKey]: Number(value) },
388
+ };
389
+
390
+ case 'not_equal':
391
+ return {
392
+ query: `${jsonbField} != :${paramKey}`,
393
+ params: { [paramKey]: Number(value) },
394
+ };
395
+
396
+ case 'greater_than':
397
+ return {
398
+ query: `${jsonbField} > :${paramKey}`,
399
+ params: { [paramKey]: Number(value) },
400
+ };
401
+
402
+ case 'less_than':
403
+ return {
404
+ query: `${jsonbField} < :${paramKey}`,
405
+ params: { [paramKey]: Number(value) },
406
+ };
407
+
408
+ case 'greater_than_equal_to':
409
+ return {
410
+ query: `${jsonbField} >= :${paramKey}`,
411
+ params: { [paramKey]: Number(value) },
412
+ };
413
+
414
+ case 'less_than_equal_to':
415
+ return {
416
+ query: `${jsonbField} <= :${paramKey}`,
417
+ params: { [paramKey]: Number(value) },
418
+ };
419
+
420
+ case 'between': {
421
+ // Value should be array [min, max] or string "min,max"
422
+ let range: number[];
423
+ if (typeof value === 'string') {
424
+ range = value.split(',').map((v) => Number(v.trim()));
425
+ } else if (Array.isArray(value)) {
426
+ range = value.map((v) => Number(v));
427
+ } else {
428
+ return null;
429
+ }
430
+
431
+ if (range.length !== 2) return null;
432
+
433
+ return {
434
+ query: `${jsonbField} BETWEEN :${paramKey}_min AND :${paramKey}_max`,
435
+ params: {
436
+ [`${paramKey}_min`]: range[0],
437
+ [`${paramKey}_max`]: range[1],
438
+ },
439
+ };
440
+ }
441
+
442
+ case 'empty':
443
+ return {
444
+ query: `json_data->>'${flatJsonKey}' IS NULL`,
445
+ params: {},
446
+ };
447
+
448
+ case 'not_empty':
449
+ return {
450
+ query: `json_data->>'${flatJsonKey}' IS NOT NULL`,
451
+ params: {},
452
+ };
453
+
454
+ default:
455
+ console.warn(`Unsupported number operator: ${operator}`);
456
+ return null;
457
+ }
458
+ }
459
+
460
+ /**
461
+ * Build date condition (JSONB ->> with ::bigint cast for epoch ms)
462
+ */
463
+ private buildDateCondition(
464
+ flatJsonKey: string,
465
+ operator: string,
466
+ value: any,
467
+ paramKey: string,
468
+ ): JsonbCondition | null {
469
+ // Dates stored as epoch milliseconds (bigint)
470
+ const jsonbField = `(json_data->>'${flatJsonKey}')::bigint`;
471
+
472
+ // Helper: Convert date string to epoch ms
473
+ const toEpochMs = (dateStr: string): number => {
474
+ return new Date(dateStr).getTime();
475
+ };
476
+
477
+ // Helper: Get date N days ago
478
+ const daysAgo = (days: number): number => {
479
+ const d = new Date();
480
+ d.setDate(d.getDate() - days);
481
+ return d.getTime();
482
+ };
483
+
484
+ // Helper: Get date N days from now
485
+ const daysFromNow = (days: number): number => {
486
+ const d = new Date();
487
+ d.setDate(d.getDate() + days);
488
+ return d.getTime();
489
+ };
490
+
491
+ // Helper: Subtract business days (skip weekends)
492
+ const subtractBusinessDays = (days: number): number => {
493
+ let d = new Date();
494
+ let count = 0;
495
+
496
+ while (count < days) {
497
+ d.setDate(d.getDate() - 1);
498
+ const day = d.getDay(); // 0=Sun, 6=Sat
499
+ if (day !== 0 && day !== 6) {
500
+ count++;
501
+ }
502
+ }
503
+
504
+ return d.getTime();
505
+ };
506
+
507
+ const numVal = Number(value);
508
+
509
+ switch (operator) {
510
+ // Basic comparisons
511
+ case 'equal':
512
+ case 'is':
513
+ return {
514
+ query: `${jsonbField} = :${paramKey}`,
515
+ params: { [paramKey]: toEpochMs(value) },
516
+ };
517
+
518
+ case 'before':
519
+ case 'is_before':
520
+ return {
521
+ query: `${jsonbField} < :${paramKey}`,
522
+ params: { [paramKey]: toEpochMs(value) },
523
+ };
524
+
525
+ case 'after':
526
+ case 'is_after':
527
+ return {
528
+ query: `${jsonbField} > :${paramKey}`,
529
+ params: { [paramKey]: toEpochMs(value) },
530
+ };
531
+
532
+ case 'is_on_or_before':
533
+ return {
534
+ query: `${jsonbField} <= :${paramKey}`,
535
+ params: { [paramKey]: toEpochMs(value) },
536
+ };
537
+
538
+ case 'is_on_or_after':
539
+ return {
540
+ query: `${jsonbField} >= :${paramKey}`,
541
+ params: { [paramKey]: toEpochMs(value) },
542
+ };
543
+
544
+ // Day offset logic
545
+ case 'is_day_before':
546
+ if (isNaN(numVal)) return null;
547
+ return {
548
+ query: `${jsonbField} <= :${paramKey}`,
549
+ params: { [paramKey]: daysAgo(numVal) },
550
+ };
551
+
552
+ case 'is_day_after':
553
+ if (isNaN(numVal)) return null;
554
+ return {
555
+ query: `${jsonbField} >= :${paramKey}`,
556
+ params: { [paramKey]: daysFromNow(numVal) },
557
+ };
558
+
559
+ // Business days (skip weekends)
560
+ case 'is_before_business_days':
561
+ if (isNaN(numVal)) return null;
562
+ return {
563
+ query: `${jsonbField} <= :${paramKey}`,
564
+ params: { [paramKey]: subtractBusinessDays(numVal) },
565
+ };
566
+
567
+ // Range operators
568
+ case 'between': {
569
+ let range: string[];
570
+ if (typeof value === 'string') {
571
+ range = value.split(',').map((v) => v.trim());
572
+ } else if (Array.isArray(value)) {
573
+ range = value;
574
+ } else {
575
+ return null;
576
+ }
577
+
578
+ if (range.length !== 2) return null;
579
+
580
+ return {
581
+ query: `${jsonbField} BETWEEN :${paramKey}_start AND :${paramKey}_end`,
582
+ params: {
583
+ [`${paramKey}_start`]: toEpochMs(range[0]),
584
+ [`${paramKey}_end`]: toEpochMs(range[1]),
585
+ },
586
+ };
587
+ }
588
+
589
+ case 'in_last_day':
590
+ if (isNaN(numVal)) return null;
591
+ return {
592
+ query: `${jsonbField} BETWEEN :${paramKey}_start AND :${paramKey}_end`,
593
+ params: {
594
+ [`${paramKey}_start`]: daysAgo(numVal),
595
+ [`${paramKey}_end`]: Date.now(),
596
+ },
597
+ };
598
+
599
+ case 'in_next_day':
600
+ if (isNaN(numVal)) return null;
601
+ return {
602
+ query: `${jsonbField} BETWEEN :${paramKey}_start AND :${paramKey}_end`,
603
+ params: {
604
+ [`${paramKey}_start`]: Date.now(),
605
+ [`${paramKey}_end`]: daysFromNow(numVal),
606
+ },
607
+ };
608
+
609
+ // Special cases
610
+ case 'today': {
611
+ const todayStart = new Date().setHours(0, 0, 0, 0);
612
+ const todayEnd = new Date().setHours(23, 59, 59, 999);
613
+ return {
614
+ query: `${jsonbField} BETWEEN :${paramKey}_start AND :${paramKey}_end`,
615
+ params: {
616
+ [`${paramKey}_start`]: todayStart,
617
+ [`${paramKey}_end`]: todayEnd,
618
+ },
619
+ };
620
+ }
621
+
622
+ case 'empty':
623
+ return {
624
+ query: `json_data->>'${flatJsonKey}' IS NULL`,
625
+ params: {},
626
+ };
627
+
628
+ case 'not_empty':
629
+ return {
630
+ query: `json_data->>'${flatJsonKey}' IS NOT NULL`,
631
+ params: {},
632
+ };
633
+
634
+ default:
635
+ console.warn(`Unsupported date operator: ${operator}`);
636
+ return null;
637
+ }
638
+ }
639
+
640
+ /**
641
+ * Build select condition (single value)
642
+ */
643
+ private buildSelectCondition(
644
+ flatJsonKey: string,
645
+ operator: string,
646
+ value: any,
647
+ paramKey: string,
648
+ ): JsonbCondition | null {
649
+ switch (operator) {
650
+ case 'equal':
651
+ if (Array.isArray(value)) {
652
+ // IN operator for multiple values
653
+ return {
654
+ query: `json_data->>'${flatJsonKey}' = ANY(:${paramKey})`,
655
+ params: { [paramKey]: value.map(String) },
656
+ };
657
+ }
658
+ return {
659
+ query: `json_data->>'${flatJsonKey}' = :${paramKey}`,
660
+ params: { [paramKey]: String(value) },
661
+ };
662
+
663
+ case 'not_equal':
664
+ if (Array.isArray(value)) {
665
+ // NOT IN operator
666
+ return {
667
+ query: `json_data->>'${flatJsonKey}' != ALL(:${paramKey})`,
668
+ params: { [paramKey]: value.map(String) },
669
+ };
670
+ }
671
+ return {
672
+ query: `json_data->>'${flatJsonKey}' != :${paramKey}`,
673
+ params: { [paramKey]: String(value) },
674
+ };
675
+
676
+ case 'in': {
677
+ const inValues = Array.isArray(value) ? value : [value];
678
+ return {
679
+ query: `json_data->>'${flatJsonKey}' = ANY(:${paramKey})`,
680
+ params: { [paramKey]: inValues.map(String) },
681
+ };
682
+ }
683
+
684
+ case 'not_in': {
685
+ const notInValues = Array.isArray(value) ? value : [value];
686
+ return {
687
+ query: `json_data->>'${flatJsonKey}' != ALL(:${paramKey})`,
688
+ params: { [paramKey]: notInValues.map(String) },
689
+ };
690
+ }
691
+
692
+ case 'empty':
693
+ return {
694
+ query: `json_data->>'${flatJsonKey}' IS NULL`,
695
+ params: {},
696
+ };
697
+
698
+ case 'not_empty':
699
+ return {
700
+ query: `json_data->>'${flatJsonKey}' IS NOT NULL`,
701
+ params: {},
702
+ };
703
+
704
+ default:
705
+ console.warn(`Unsupported select operator: ${operator}`);
706
+ return null;
707
+ }
708
+ }
709
+
710
+ /**
711
+ * Build multiselect condition (JSONB -> with ? operators for arrays)
712
+ */
713
+ private buildMultiSelectCondition(
714
+ flatJsonKey: string,
715
+ operator: string,
716
+ value: any,
717
+ paramKey: string,
718
+ ): JsonbCondition | null {
719
+ // Convert value to array if not already
720
+ let arr: string[];
721
+ if (Array.isArray(value)) {
722
+ arr = value.map(String);
723
+ } else if (typeof value === 'string') {
724
+ arr = value.split(',').map((v) => v.trim());
725
+ } else {
726
+ arr = [String(value)];
727
+ }
728
+
729
+ if (arr.length === 0) {
730
+ return { query: '1=1', params: {} }; // Always true for empty array
731
+ }
732
+
733
+ switch (operator) {
734
+ case 'contains':
735
+ case 'has':
736
+ // Check if JSON array contains this element
737
+ // json_data->'LEAD__languages' ? 'hindi'
738
+ if (arr.length === 1) {
739
+ return {
740
+ query: `json_data->'${flatJsonKey}' ? :${paramKey}`,
741
+ params: { [paramKey]: arr[0] },
742
+ };
743
+ }
744
+ // For multiple values, check if contains ANY
745
+ return {
746
+ query: `json_data->'${flatJsonKey}' ?| ARRAY[:...${paramKey}]::text[]`,
747
+ params: { [paramKey]: arr },
748
+ };
749
+
750
+ case 'contains_all':
751
+ // Check if JSON array contains ALL elements
752
+ // json_data->'LEAD__languages' ?& ARRAY['hindi', 'english']
753
+ return {
754
+ query: `json_data->'${flatJsonKey}' ?& ARRAY[:...${paramKey}]::text[]`,
755
+ params: { [paramKey]: arr },
756
+ };
757
+
758
+ case 'contains_any':
759
+ // Check if JSON array contains ANY element
760
+ // json_data->'LEAD__languages' ?| ARRAY['hindi', 'english']
761
+ return {
762
+ query: `json_data->'${flatJsonKey}' ?| ARRAY[:...${paramKey}]::text[]`,
763
+ params: { [paramKey]: arr },
764
+ };
765
+
766
+ case 'not_contains':
767
+ // Check if JSON array does NOT contain element
768
+ if (arr.length === 1) {
769
+ return {
770
+ query: `NOT (json_data->'${flatJsonKey}' ? :${paramKey})`,
771
+ params: { [paramKey]: arr[0] },
772
+ };
773
+ }
774
+ return {
775
+ query: `NOT (json_data->'${flatJsonKey}' ?| ARRAY[:...${paramKey}]::text[])`,
776
+ params: { [paramKey]: arr },
777
+ };
778
+
779
+ case 'equal':
780
+ // Exact array match (order matters in PostgreSQL)
781
+ return {
782
+ query: `json_data->'${flatJsonKey}'::jsonb = :${paramKey}::jsonb`,
783
+ params: { [paramKey]: JSON.stringify(arr) },
784
+ };
785
+
786
+ case 'empty':
787
+ return {
788
+ query: `(json_data->>'${flatJsonKey}' IS NULL OR json_data->'${flatJsonKey}' = '[]'::jsonb)`,
789
+ params: {},
790
+ };
791
+
792
+ case 'not_empty':
793
+ return {
794
+ query: `(json_data->>'${flatJsonKey}' IS NOT NULL AND json_data->'${flatJsonKey}' != '[]'::jsonb)`,
795
+ params: {},
796
+ };
797
+
798
+ default:
799
+ console.warn(`Unsupported multiselect operator: ${operator}`);
800
+ return null;
801
+ }
802
+ }
803
+
804
+ /**
805
+ * Build year condition
806
+ */
807
+ private buildYearCondition(
808
+ flatJsonKey: string,
809
+ operator: string,
810
+ value: any,
811
+ paramKey: string,
812
+ ): JsonbCondition | null {
813
+ // Similar to number condition
814
+ return this.buildNumberCondition(flatJsonKey, operator, value, paramKey);
815
+ }
816
+
817
+ /**
818
+ * Get tab aggregation counts from JSONB
819
+ */
820
+ private async getJsonbTabCounts(
821
+ entity_type: string,
822
+ flatJsonKey: string,
823
+ whereClauses: JsonbCondition[],
824
+ ): Promise<Array<{ tab_value: string; tab_value_count: number }>> {
825
+ // Build a query that groups by the tab field
826
+ const qb = this.entityManager
827
+ .getRepository(EntityJson)
828
+ .createQueryBuilder('ej')
829
+ .select(`json_data->>'${flatJsonKey}'`, 'tab_value')
830
+ .addSelect('COUNT(*)', 'tab_value_count')
831
+ .where('ej.entity_type = :entity_type', { entity_type })
832
+ .groupBy(`json_data->>'${flatJsonKey}'`);
833
+
834
+ // Apply the same filter conditions (but not the tab filter itself)
835
+ whereClauses.forEach((condition) => {
836
+ qb.andWhere(condition.query, condition.params);
837
+ });
838
+
839
+ const results = await qb.getRawMany();
840
+
841
+ // Filter out NULL/undefined tab values and convert count to number
842
+ return results
843
+ .filter((r) => r.tab_value != null && r.tab_value !== '')
844
+ .map((r) => ({
845
+ tab_value: r.tab_value,
846
+ tab_value_count: parseInt(r.tab_value_count, 10),
847
+ }))
848
+ .sort((a, b) => b.tab_value_count - a.tab_value_count); // Sort by count DESC
849
+ }
850
+
851
+ /**
852
+ * Apply sorting on JSONB fields
853
+ */
854
+ private applyJsonbSorting(
855
+ qb: SelectQueryBuilder<EntityJson>,
856
+ sortby: SortConfig[],
857
+ attributeMetaMap: Record<string, any>,
858
+ ): void {
859
+ sortby.forEach((sort, index) => {
860
+ const meta = attributeMetaMap[sort.sortColum];
861
+
862
+ if (!meta) {
863
+ console.warn(`No metadata found for sort column: ${sort.sortColum}`);
864
+ return;
865
+ }
866
+
867
+ const flatJsonKey =
868
+ meta.flat_json_key || `${meta.mapped_entity_type}__${sort.sortColum}`;
869
+ const direction = sort.sortType === 'ASC' ? 'ASC' : 'DESC';
870
+
871
+ // Apply type-specific casting for proper sorting
872
+ let sortExpression: string;
873
+
874
+ switch (meta.data_type) {
875
+ case 'number':
876
+ case 'year':
877
+ // Cast to numeric for number sorting
878
+ sortExpression = `(json_data->>'${flatJsonKey}')::numeric`;
879
+ break;
880
+
881
+ case 'date':
882
+ // Cast to bigint for date sorting (epoch ms)
883
+ sortExpression = `(json_data->>'${flatJsonKey}')::bigint`;
884
+ break;
885
+
886
+ case 'text':
887
+ case 'select':
888
+ case 'radio':
889
+ default:
890
+ // Text sorting (already lowercase)
891
+ sortExpression = `json_data->>'${flatJsonKey}'`;
892
+ break;
893
+ }
894
+
895
+ // Add to ORDER BY clause
896
+ if (index === 0) {
897
+ qb.orderBy(sortExpression, direction);
898
+ } else {
899
+ qb.addOrderBy(sortExpression, direction);
900
+ }
901
+ });
902
+ }
903
+ }