@solidxai/core 0.1.12 → 0.1.13-beta.10

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 (687) hide show
  1. package/CHANGELOG.md +3786 -0
  2. package/dist/commands/run-tests.command.d.ts +7 -1
  3. package/dist/commands/run-tests.command.d.ts.map +1 -1
  4. package/dist/commands/run-tests.command.js +49 -3
  5. package/dist/commands/run-tests.command.js.map +1 -1
  6. package/dist/commands/seed.command.d.ts +2 -0
  7. package/dist/commands/seed.command.d.ts.map +1 -1
  8. package/dist/commands/seed.command.js +21 -0
  9. package/dist/commands/seed.command.js.map +1 -1
  10. package/dist/constants/chatter-message.constants.d.ts +1 -0
  11. package/dist/constants/chatter-message.constants.d.ts.map +1 -1
  12. package/dist/constants/chatter-message.constants.js +3 -1
  13. package/dist/constants/chatter-message.constants.js.map +1 -1
  14. package/dist/constants/draft-publish-fields.d.ts +2 -0
  15. package/dist/constants/draft-publish-fields.d.ts.map +1 -0
  16. package/dist/constants/draft-publish-fields.js +5 -0
  17. package/dist/constants/draft-publish-fields.js.map +1 -0
  18. package/dist/constants/media-file-types.d.ts +9 -0
  19. package/dist/constants/media-file-types.d.ts.map +1 -1
  20. package/dist/constants/media-file-types.js +27 -1
  21. package/dist/constants/media-file-types.js.map +1 -1
  22. package/dist/constants/user.constants.d.ts +2 -0
  23. package/dist/constants/user.constants.d.ts.map +1 -0
  24. package/dist/constants/user.constants.js +5 -0
  25. package/dist/constants/user.constants.js.map +1 -0
  26. package/dist/controllers/action-metadata.controller.d.ts +1 -1
  27. package/dist/controllers/action-metadata.controller.js +1 -1
  28. package/dist/controllers/agent-event.controller.d.ts +1 -1
  29. package/dist/controllers/agent-event.controller.js +1 -1
  30. package/dist/controllers/agent-session.controller.d.ts +1 -1
  31. package/dist/controllers/agent-session.controller.js +1 -1
  32. package/dist/controllers/chatter-message.controller.d.ts +5 -0
  33. package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
  34. package/dist/controllers/chatter-message.controller.js +14 -0
  35. package/dist/controllers/chatter-message.controller.js.map +1 -1
  36. package/dist/controllers/dashboard-user-layout.controller.d.ts +1 -1
  37. package/dist/controllers/dashboard-user-layout.controller.js +1 -1
  38. package/dist/controllers/email-template.controller.d.ts +1 -1
  39. package/dist/controllers/email-template.controller.js +1 -1
  40. package/dist/controllers/export-template.controller.d.ts +1 -1
  41. package/dist/controllers/export-template.controller.d.ts.map +1 -1
  42. package/dist/controllers/export-template.controller.js +6 -4
  43. package/dist/controllers/export-template.controller.js.map +1 -1
  44. package/dist/controllers/export-transaction.controller.d.ts +1 -1
  45. package/dist/controllers/export-transaction.controller.js +1 -1
  46. package/dist/controllers/import-transaction-error-log.controller.d.ts +1 -1
  47. package/dist/controllers/import-transaction-error-log.controller.js +1 -1
  48. package/dist/controllers/import-transaction.controller.d.ts +1 -1
  49. package/dist/controllers/import-transaction.controller.d.ts.map +1 -1
  50. package/dist/controllers/import-transaction.controller.js +7 -7
  51. package/dist/controllers/import-transaction.controller.js.map +1 -1
  52. package/dist/controllers/list-of-values.controller.d.ts +1 -1
  53. package/dist/controllers/list-of-values.controller.js +1 -1
  54. package/dist/controllers/locale.controller.d.ts +1 -1
  55. package/dist/controllers/locale.controller.js +1 -1
  56. package/dist/controllers/mcp-audit-log.controller.d.ts +1 -1
  57. package/dist/controllers/mcp-audit-log.controller.js +1 -1
  58. package/dist/controllers/media.controller.d.ts +2 -2
  59. package/dist/controllers/media.controller.d.ts.map +1 -1
  60. package/dist/controllers/media.controller.js +13 -8
  61. package/dist/controllers/media.controller.js.map +1 -1
  62. package/dist/controllers/menu-item-metadata.controller.d.ts +1 -1
  63. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  64. package/dist/controllers/model-sequence.controller.d.ts +1 -1
  65. package/dist/controllers/model-sequence.controller.js +1 -1
  66. package/dist/controllers/module-package.controller.d.ts.map +1 -1
  67. package/dist/controllers/module-package.controller.js +2 -3
  68. package/dist/controllers/module-package.controller.js.map +1 -1
  69. package/dist/controllers/mq-message-queue.controller.d.ts +1 -1
  70. package/dist/controllers/mq-message-queue.controller.js +1 -1
  71. package/dist/controllers/mq-message.controller.d.ts +1 -1
  72. package/dist/controllers/mq-message.controller.js +1 -1
  73. package/dist/controllers/permission-metadata.controller.d.ts +1 -1
  74. package/dist/controllers/permission-metadata.controller.js +1 -1
  75. package/dist/controllers/role-metadata.controller.d.ts +1 -1
  76. package/dist/controllers/role-metadata.controller.js +1 -1
  77. package/dist/controllers/saved-filters.controller.d.ts +1 -1
  78. package/dist/controllers/saved-filters.controller.js +1 -1
  79. package/dist/controllers/scheduled-job.controller.d.ts +1 -1
  80. package/dist/controllers/scheduled-job.controller.js +1 -1
  81. package/dist/controllers/security-rule.controller.d.ts +1 -1
  82. package/dist/controllers/security-rule.controller.js +1 -1
  83. package/dist/controllers/sms-template.controller.d.ts +1 -1
  84. package/dist/controllers/sms-template.controller.js +1 -1
  85. package/dist/controllers/user-activity-history.controller.d.ts +1 -1
  86. package/dist/controllers/user-activity-history.controller.js +1 -1
  87. package/dist/controllers/user-view-metadata.controller.d.ts +1 -1
  88. package/dist/controllers/user-view-metadata.controller.js +1 -1
  89. package/dist/controllers/user.controller.d.ts +2 -2
  90. package/dist/controllers/user.controller.js +2 -2
  91. package/dist/controllers/view-metadata.controller.d.ts +3 -3
  92. package/dist/controllers/view-metadata.controller.js +1 -1
  93. package/dist/controllers/workflow-definition.controller.d.ts +38 -0
  94. package/dist/controllers/workflow-definition.controller.d.ts.map +1 -0
  95. package/dist/controllers/workflow-definition.controller.js +272 -0
  96. package/dist/controllers/workflow-definition.controller.js.map +1 -0
  97. package/dist/controllers/workflow-execution-artifact.controller.d.ts +24 -0
  98. package/dist/controllers/workflow-execution-artifact.controller.d.ts.map +1 -0
  99. package/dist/controllers/workflow-execution-artifact.controller.js +179 -0
  100. package/dist/controllers/workflow-execution-artifact.controller.js.map +1 -0
  101. package/dist/controllers/workflow-execution-log.controller.d.ts +24 -0
  102. package/dist/controllers/workflow-execution-log.controller.d.ts.map +1 -0
  103. package/dist/controllers/workflow-execution-log.controller.js +179 -0
  104. package/dist/controllers/workflow-execution-log.controller.js.map +1 -0
  105. package/dist/controllers/workflow-execution.controller.d.ts +29 -0
  106. package/dist/controllers/workflow-execution.controller.d.ts.map +1 -0
  107. package/dist/controllers/workflow-execution.controller.js +227 -0
  108. package/dist/controllers/workflow-execution.controller.js.map +1 -0
  109. package/dist/controllers/workflow-secret.controller.d.ts +24 -0
  110. package/dist/controllers/workflow-secret.controller.d.ts.map +1 -0
  111. package/dist/controllers/workflow-secret.controller.js +179 -0
  112. package/dist/controllers/workflow-secret.controller.js.map +1 -0
  113. package/dist/controllers/workflow-step-execution.controller.d.ts +24 -0
  114. package/dist/controllers/workflow-step-execution.controller.d.ts.map +1 -0
  115. package/dist/controllers/workflow-step-execution.controller.js +179 -0
  116. package/dist/controllers/workflow-step-execution.controller.js.map +1 -0
  117. package/dist/controllers/workflow-trigger-execution.controller.d.ts +24 -0
  118. package/dist/controllers/workflow-trigger-execution.controller.d.ts.map +1 -0
  119. package/dist/controllers/workflow-trigger-execution.controller.js +179 -0
  120. package/dist/controllers/workflow-trigger-execution.controller.js.map +1 -0
  121. package/dist/decorators/workflow-field-data-provider.decorator.d.ts +3 -0
  122. package/dist/decorators/workflow-field-data-provider.decorator.d.ts.map +1 -0
  123. package/dist/decorators/workflow-field-data-provider.decorator.js +11 -0
  124. package/dist/decorators/workflow-field-data-provider.decorator.js.map +1 -0
  125. package/dist/decorators/workflow-node-provider.decorator.d.ts +4 -0
  126. package/dist/decorators/workflow-node-provider.decorator.d.ts.map +1 -0
  127. package/dist/decorators/workflow-node-provider.decorator.js +13 -0
  128. package/dist/decorators/workflow-node-provider.decorator.js.map +1 -0
  129. package/dist/dtos/basic-filters.dto.d.ts +0 -1
  130. package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
  131. package/dist/dtos/basic-filters.dto.js +1 -6
  132. package/dist/dtos/basic-filters.dto.js.map +1 -1
  133. package/dist/dtos/create-workflow-definition.dto.d.ts +14 -0
  134. package/dist/dtos/create-workflow-definition.dto.d.ts.map +1 -0
  135. package/dist/dtos/create-workflow-definition.dto.js +92 -0
  136. package/dist/dtos/create-workflow-definition.dto.js.map +1 -0
  137. package/dist/dtos/create-workflow-execution-artifact.dto.d.ts +22 -0
  138. package/dist/dtos/create-workflow-execution-artifact.dto.d.ts.map +1 -0
  139. package/dist/dtos/create-workflow-execution-artifact.dto.js +139 -0
  140. package/dist/dtos/create-workflow-execution-artifact.dto.js.map +1 -0
  141. package/dist/dtos/create-workflow-execution-log.dto.d.ts +18 -0
  142. package/dist/dtos/create-workflow-execution-log.dto.d.ts.map +1 -0
  143. package/dist/dtos/create-workflow-execution-log.dto.js +116 -0
  144. package/dist/dtos/create-workflow-execution-log.dto.js.map +1 -0
  145. package/dist/dtos/create-workflow-execution.dto.d.ts +33 -0
  146. package/dist/dtos/create-workflow-execution.dto.d.ts.map +1 -0
  147. package/dist/dtos/create-workflow-execution.dto.js +186 -0
  148. package/dist/dtos/create-workflow-execution.dto.js.map +1 -0
  149. package/dist/dtos/create-workflow-secret.dto.d.ts +11 -0
  150. package/dist/dtos/create-workflow-secret.dto.d.ts.map +1 -0
  151. package/dist/dtos/create-workflow-secret.dto.js +74 -0
  152. package/dist/dtos/create-workflow-secret.dto.js.map +1 -0
  153. package/dist/dtos/create-workflow-step-execution.dto.d.ts +27 -0
  154. package/dist/dtos/create-workflow-step-execution.dto.d.ts.map +1 -0
  155. package/dist/dtos/create-workflow-step-execution.dto.js +171 -0
  156. package/dist/dtos/create-workflow-step-execution.dto.js.map +1 -0
  157. package/dist/dtos/create-workflow-trigger-execution.dto.d.ts +25 -0
  158. package/dist/dtos/create-workflow-trigger-execution.dto.d.ts.map +1 -0
  159. package/dist/dtos/create-workflow-trigger-execution.dto.js +158 -0
  160. package/dist/dtos/create-workflow-trigger-execution.dto.js.map +1 -0
  161. package/dist/dtos/execute-workflow.dto.d.ts +7 -0
  162. package/dist/dtos/execute-workflow.dto.d.ts.map +1 -0
  163. package/dist/dtos/execute-workflow.dto.js +11 -0
  164. package/dist/dtos/execute-workflow.dto.js.map +1 -0
  165. package/dist/dtos/update-workflow-definition.dto.d.ts +15 -0
  166. package/dist/dtos/update-workflow-definition.dto.d.ts.map +1 -0
  167. package/dist/dtos/update-workflow-definition.dto.js +97 -0
  168. package/dist/dtos/update-workflow-definition.dto.js.map +1 -0
  169. package/dist/dtos/update-workflow-execution-artifact.dto.d.ts +23 -0
  170. package/dist/dtos/update-workflow-execution-artifact.dto.d.ts.map +1 -0
  171. package/dist/dtos/update-workflow-execution-artifact.dto.js +143 -0
  172. package/dist/dtos/update-workflow-execution-artifact.dto.js.map +1 -0
  173. package/dist/dtos/update-workflow-execution-log.dto.d.ts +19 -0
  174. package/dist/dtos/update-workflow-execution-log.dto.d.ts.map +1 -0
  175. package/dist/dtos/update-workflow-execution-log.dto.js +121 -0
  176. package/dist/dtos/update-workflow-execution-log.dto.js.map +1 -0
  177. package/dist/dtos/update-workflow-execution.dto.d.ts +34 -0
  178. package/dist/dtos/update-workflow-execution.dto.d.ts.map +1 -0
  179. package/dist/dtos/update-workflow-execution.dto.js +190 -0
  180. package/dist/dtos/update-workflow-execution.dto.js.map +1 -0
  181. package/dist/dtos/update-workflow-secret.dto.d.ts +12 -0
  182. package/dist/dtos/update-workflow-secret.dto.d.ts.map +1 -0
  183. package/dist/dtos/update-workflow-secret.dto.js +80 -0
  184. package/dist/dtos/update-workflow-secret.dto.js.map +1 -0
  185. package/dist/dtos/update-workflow-step-execution.dto.d.ts +28 -0
  186. package/dist/dtos/update-workflow-step-execution.dto.d.ts.map +1 -0
  187. package/dist/dtos/update-workflow-step-execution.dto.js +175 -0
  188. package/dist/dtos/update-workflow-step-execution.dto.js.map +1 -0
  189. package/dist/dtos/update-workflow-trigger-execution.dto.d.ts +26 -0
  190. package/dist/dtos/update-workflow-trigger-execution.dto.d.ts.map +1 -0
  191. package/dist/dtos/update-workflow-trigger-execution.dto.js +163 -0
  192. package/dist/dtos/update-workflow-trigger-execution.dto.js.map +1 -0
  193. package/dist/dtos/validate-workflow-definition.dto.d.ts +4 -0
  194. package/dist/dtos/validate-workflow-definition.dto.d.ts.map +1 -0
  195. package/dist/dtos/validate-workflow-definition.dto.js +11 -0
  196. package/dist/dtos/validate-workflow-definition.dto.js.map +1 -0
  197. package/dist/entities/common.entity.d.ts +4 -0
  198. package/dist/entities/common.entity.d.ts.map +1 -1
  199. package/dist/entities/common.entity.js +25 -1
  200. package/dist/entities/common.entity.js.map +1 -1
  201. package/dist/entities/user.entity.d.ts.map +1 -1
  202. package/dist/entities/user.entity.js +36 -0
  203. package/dist/entities/user.entity.js.map +1 -1
  204. package/dist/entities/workflow-definition.entity.d.ts +15 -0
  205. package/dist/entities/workflow-definition.entity.d.ts.map +1 -0
  206. package/dist/entities/workflow-definition.entity.js +77 -0
  207. package/dist/entities/workflow-definition.entity.js.map +1 -0
  208. package/dist/entities/workflow-execution-artifact.entity.d.ts +23 -0
  209. package/dist/entities/workflow-execution-artifact.entity.d.ts.map +1 -0
  210. package/dist/entities/workflow-execution-artifact.entity.js +113 -0
  211. package/dist/entities/workflow-execution-artifact.entity.js.map +1 -0
  212. package/dist/entities/workflow-execution-log.entity.d.ts +19 -0
  213. package/dist/entities/workflow-execution-log.entity.d.ts.map +1 -0
  214. package/dist/entities/workflow-execution-log.entity.js +95 -0
  215. package/dist/entities/workflow-execution-log.entity.js.map +1 -0
  216. package/dist/entities/workflow-execution.entity.d.ts +28 -0
  217. package/dist/entities/workflow-execution.entity.d.ts.map +1 -0
  218. package/dist/entities/workflow-execution.entity.js +124 -0
  219. package/dist/entities/workflow-execution.entity.js.map +1 -0
  220. package/dist/entities/workflow-secret.entity.d.ts +12 -0
  221. package/dist/entities/workflow-secret.entity.d.ts.map +1 -0
  222. package/dist/entities/workflow-secret.entity.js +66 -0
  223. package/dist/entities/workflow-secret.entity.js.map +1 -0
  224. package/dist/entities/workflow-step-execution.entity.d.ts +28 -0
  225. package/dist/entities/workflow-step-execution.entity.d.ts.map +1 -0
  226. package/dist/entities/workflow-step-execution.entity.js +138 -0
  227. package/dist/entities/workflow-step-execution.entity.js.map +1 -0
  228. package/dist/entities/workflow-trigger-execution.entity.d.ts +26 -0
  229. package/dist/entities/workflow-trigger-execution.entity.d.ts.map +1 -0
  230. package/dist/entities/workflow-trigger-execution.entity.js +127 -0
  231. package/dist/entities/workflow-trigger-execution.entity.js.map +1 -0
  232. package/dist/factories/mail.factory.d.ts.map +1 -1
  233. package/dist/factories/mail.factory.js +4 -0
  234. package/dist/factories/mail.factory.js.map +1 -1
  235. package/dist/factories/sms.factory.d.ts.map +1 -1
  236. package/dist/factories/sms.factory.js +4 -1
  237. package/dist/factories/sms.factory.js.map +1 -1
  238. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts +1 -0
  239. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
  240. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +18 -11
  241. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js.map +1 -1
  242. package/dist/helpers/file-download.helper.d.ts +9 -0
  243. package/dist/helpers/file-download.helper.d.ts.map +1 -0
  244. package/dist/helpers/file-download.helper.js +14 -0
  245. package/dist/helpers/file-download.helper.js.map +1 -0
  246. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  247. package/dist/helpers/model-metadata-helper.service.js +30 -1
  248. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  249. package/dist/helpers/solid-registry.d.ts +5 -1
  250. package/dist/helpers/solid-registry.d.ts.map +1 -1
  251. package/dist/helpers/solid-registry.js +18 -1
  252. package/dist/helpers/solid-registry.js.map +1 -1
  253. package/dist/index.d.ts +59 -0
  254. package/dist/index.d.ts.map +1 -1
  255. package/dist/index.js +59 -0
  256. package/dist/index.js.map +1 -1
  257. package/dist/interfaces/workflow-node-handler.interface.d.ts +5 -0
  258. package/dist/interfaces/workflow-node-handler.interface.d.ts.map +1 -0
  259. package/dist/interfaces/workflow-node-handler.interface.js +3 -0
  260. package/dist/interfaces/workflow-node-handler.interface.js.map +1 -0
  261. package/dist/interfaces.d.ts +25 -0
  262. package/dist/interfaces.d.ts.map +1 -1
  263. package/dist/interfaces.js.map +1 -1
  264. package/dist/jobs/database/workflow-execution-publisher-database.service.d.ts +12 -0
  265. package/dist/jobs/database/workflow-execution-publisher-database.service.d.ts.map +1 -0
  266. package/dist/jobs/database/workflow-execution-publisher-database.service.js +39 -0
  267. package/dist/jobs/database/workflow-execution-publisher-database.service.js.map +1 -0
  268. package/dist/jobs/database/workflow-execution-queue-options-database.d.ts +8 -0
  269. package/dist/jobs/database/workflow-execution-queue-options-database.d.ts.map +1 -0
  270. package/dist/jobs/database/workflow-execution-queue-options-database.js +10 -0
  271. package/dist/jobs/database/workflow-execution-queue-options-database.js.map +1 -0
  272. package/dist/jobs/database/workflow-execution-subscriber-database.service.d.ts +19 -0
  273. package/dist/jobs/database/workflow-execution-subscriber-database.service.d.ts.map +1 -0
  274. package/dist/jobs/database/workflow-execution-subscriber-database.service.js +55 -0
  275. package/dist/jobs/database/workflow-execution-subscriber-database.service.js.map +1 -0
  276. package/dist/jobs/rabbitmq/workflow-execution-publisher.service.d.ts +12 -0
  277. package/dist/jobs/rabbitmq/workflow-execution-publisher.service.d.ts.map +1 -0
  278. package/dist/jobs/rabbitmq/workflow-execution-publisher.service.js +39 -0
  279. package/dist/jobs/rabbitmq/workflow-execution-publisher.service.js.map +1 -0
  280. package/dist/jobs/rabbitmq/workflow-execution-queue-options.d.ts +8 -0
  281. package/dist/jobs/rabbitmq/workflow-execution-queue-options.d.ts.map +1 -0
  282. package/dist/jobs/rabbitmq/workflow-execution-queue-options.js +10 -0
  283. package/dist/jobs/rabbitmq/workflow-execution-queue-options.js.map +1 -0
  284. package/dist/jobs/rabbitmq/workflow-execution-subscriber.service.d.ts +17 -0
  285. package/dist/jobs/rabbitmq/workflow-execution-subscriber.service.d.ts.map +1 -0
  286. package/dist/jobs/rabbitmq/workflow-execution-subscriber.service.js +52 -0
  287. package/dist/jobs/rabbitmq/workflow-execution-subscriber.service.js.map +1 -0
  288. package/dist/jobs/redis/workflow-execution-publisher-redis.service.d.ts +12 -0
  289. package/dist/jobs/redis/workflow-execution-publisher-redis.service.d.ts.map +1 -0
  290. package/dist/jobs/redis/workflow-execution-publisher-redis.service.js +39 -0
  291. package/dist/jobs/redis/workflow-execution-publisher-redis.service.js.map +1 -0
  292. package/dist/jobs/redis/workflow-execution-queue-options-redis.d.ts +8 -0
  293. package/dist/jobs/redis/workflow-execution-queue-options-redis.d.ts.map +1 -0
  294. package/dist/jobs/redis/workflow-execution-queue-options-redis.js +10 -0
  295. package/dist/jobs/redis/workflow-execution-queue-options-redis.js.map +1 -0
  296. package/dist/jobs/redis/workflow-execution-subscriber-redis.service.d.ts +17 -0
  297. package/dist/jobs/redis/workflow-execution-subscriber-redis.service.d.ts.map +1 -0
  298. package/dist/jobs/redis/workflow-execution-subscriber-redis.service.js +52 -0
  299. package/dist/jobs/redis/workflow-execution-subscriber-redis.service.js.map +1 -0
  300. package/dist/repository/security-rule.repository.d.ts +1 -0
  301. package/dist/repository/security-rule.repository.d.ts.map +1 -1
  302. package/dist/repository/security-rule.repository.js +28 -7
  303. package/dist/repository/security-rule.repository.js.map +1 -1
  304. package/dist/repository/workflow-definition.repository.d.ts +12 -0
  305. package/dist/repository/workflow-definition.repository.d.ts.map +1 -0
  306. package/dist/repository/workflow-definition.repository.js +39 -0
  307. package/dist/repository/workflow-definition.repository.js.map +1 -0
  308. package/dist/repository/workflow-execution-artifact.repository.d.ts +12 -0
  309. package/dist/repository/workflow-execution-artifact.repository.d.ts.map +1 -0
  310. package/dist/repository/workflow-execution-artifact.repository.js +39 -0
  311. package/dist/repository/workflow-execution-artifact.repository.js.map +1 -0
  312. package/dist/repository/workflow-execution-log.repository.d.ts +12 -0
  313. package/dist/repository/workflow-execution-log.repository.d.ts.map +1 -0
  314. package/dist/repository/workflow-execution-log.repository.js +39 -0
  315. package/dist/repository/workflow-execution-log.repository.js.map +1 -0
  316. package/dist/repository/workflow-execution.repository.d.ts +12 -0
  317. package/dist/repository/workflow-execution.repository.d.ts.map +1 -0
  318. package/dist/repository/workflow-execution.repository.js +39 -0
  319. package/dist/repository/workflow-execution.repository.js.map +1 -0
  320. package/dist/repository/workflow-secret.repository.d.ts +12 -0
  321. package/dist/repository/workflow-secret.repository.d.ts.map +1 -0
  322. package/dist/repository/workflow-secret.repository.js +39 -0
  323. package/dist/repository/workflow-secret.repository.js.map +1 -0
  324. package/dist/repository/workflow-step-execution.repository.d.ts +12 -0
  325. package/dist/repository/workflow-step-execution.repository.d.ts.map +1 -0
  326. package/dist/repository/workflow-step-execution.repository.js +39 -0
  327. package/dist/repository/workflow-step-execution.repository.js.map +1 -0
  328. package/dist/repository/workflow-trigger-execution.repository.d.ts +12 -0
  329. package/dist/repository/workflow-trigger-execution.repository.d.ts.map +1 -0
  330. package/dist/repository/workflow-trigger-execution.repository.js +39 -0
  331. package/dist/repository/workflow-trigger-execution.repository.js.map +1 -0
  332. package/dist/seeders/module-metadata-seeder.service.d.ts +6 -0
  333. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  334. package/dist/seeders/module-metadata-seeder.service.js +185 -27
  335. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  336. package/dist/seeders/module-test-data.service.d.ts +3 -1
  337. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  338. package/dist/seeders/module-test-data.service.js +8 -2
  339. package/dist/seeders/module-test-data.service.js.map +1 -1
  340. package/dist/seeders/seed-data/solid-core-metadata.json +11494 -5570
  341. package/dist/services/authentication.service.d.ts +4 -1
  342. package/dist/services/authentication.service.d.ts.map +1 -1
  343. package/dist/services/authentication.service.js +52 -4
  344. package/dist/services/authentication.service.js.map +1 -1
  345. package/dist/services/chatter-message.service.d.ts +11 -0
  346. package/dist/services/chatter-message.service.d.ts.map +1 -1
  347. package/dist/services/chatter-message.service.js +53 -4
  348. package/dist/services/chatter-message.service.js.map +1 -1
  349. package/dist/services/crud-helper.service.d.ts +21 -3
  350. package/dist/services/crud-helper.service.d.ts.map +1 -1
  351. package/dist/services/crud-helper.service.js +129 -54
  352. package/dist/services/crud-helper.service.js.map +1 -1
  353. package/dist/services/crud.service.d.ts +14 -1
  354. package/dist/services/crud.service.d.ts.map +1 -1
  355. package/dist/services/crud.service.js +107 -67
  356. package/dist/services/crud.service.js.map +1 -1
  357. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  358. package/dist/services/datasource-introspection.service.js.map +1 -1
  359. package/dist/services/draft-publish-helper.service.d.ts +52 -0
  360. package/dist/services/draft-publish-helper.service.d.ts.map +1 -0
  361. package/dist/services/draft-publish-helper.service.js +368 -0
  362. package/dist/services/draft-publish-helper.service.js.map +1 -0
  363. package/dist/services/internationalisation-helper.service.d.ts +19 -0
  364. package/dist/services/internationalisation-helper.service.d.ts.map +1 -0
  365. package/dist/services/internationalisation-helper.service.js +107 -0
  366. package/dist/services/internationalisation-helper.service.js.map +1 -0
  367. package/dist/services/locale.service.d.ts +1 -1
  368. package/dist/services/media.service.d.ts +3 -2
  369. package/dist/services/media.service.d.ts.map +1 -1
  370. package/dist/services/media.service.js +44 -29
  371. package/dist/services/media.service.js.map +1 -1
  372. package/dist/services/metadata-validation.service.d.ts +7 -0
  373. package/dist/services/metadata-validation.service.d.ts.map +1 -0
  374. package/dist/services/metadata-validation.service.js +42 -0
  375. package/dist/services/metadata-validation.service.js.map +1 -0
  376. package/dist/services/model-metadata.service.d.ts.map +1 -1
  377. package/dist/services/model-metadata.service.js +2 -1
  378. package/dist/services/model-metadata.service.js.map +1 -1
  379. package/dist/services/object.utils.d.ts +2 -0
  380. package/dist/services/object.utils.d.ts.map +1 -0
  381. package/dist/services/object.utils.js +11 -0
  382. package/dist/services/object.utils.js.map +1 -0
  383. package/dist/services/settings/default-settings-provider.service.d.ts +46 -6
  384. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  385. package/dist/services/settings/default-settings-provider.service.js +29 -3
  386. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  387. package/dist/services/solid-introspect.service.d.ts +1 -0
  388. package/dist/services/solid-introspect.service.d.ts.map +1 -1
  389. package/dist/services/solid-introspect.service.js +12 -0
  390. package/dist/services/solid-introspect.service.js.map +1 -1
  391. package/dist/services/user.service.d.ts +2 -2
  392. package/dist/services/user.service.d.ts.map +1 -1
  393. package/dist/services/user.service.js +9 -3
  394. package/dist/services/user.service.js.map +1 -1
  395. package/dist/services/view-metadata.service.d.ts +6 -3
  396. package/dist/services/view-metadata.service.d.ts.map +1 -1
  397. package/dist/services/view-metadata.service.js +60 -63
  398. package/dist/services/view-metadata.service.js.map +1 -1
  399. package/dist/services/workflow/nodes/execution-fail.node.d.ts +6 -0
  400. package/dist/services/workflow/nodes/execution-fail.node.d.ts.map +1 -0
  401. package/dist/services/workflow/nodes/execution-fail.node.js +81 -0
  402. package/dist/services/workflow/nodes/execution-fail.node.js.map +1 -0
  403. package/dist/services/workflow/nodes/for-each.node.d.ts +8 -0
  404. package/dist/services/workflow/nodes/for-each.node.d.ts.map +1 -0
  405. package/dist/services/workflow/nodes/for-each.node.js +204 -0
  406. package/dist/services/workflow/nodes/for-each.node.js.map +1 -0
  407. package/dist/services/workflow/nodes/http-request.node.d.ts +13 -0
  408. package/dist/services/workflow/nodes/http-request.node.d.ts.map +1 -0
  409. package/dist/services/workflow/nodes/http-request.node.js +549 -0
  410. package/dist/services/workflow/nodes/http-request.node.js.map +1 -0
  411. package/dist/services/workflow/nodes/if.node.d.ts +6 -0
  412. package/dist/services/workflow/nodes/if.node.d.ts.map +1 -0
  413. package/dist/services/workflow/nodes/if.node.js +100 -0
  414. package/dist/services/workflow/nodes/if.node.js.map +1 -0
  415. package/dist/services/workflow/nodes/log-write.node.d.ts +6 -0
  416. package/dist/services/workflow/nodes/log-write.node.d.ts.map +1 -0
  417. package/dist/services/workflow/nodes/log-write.node.js +231 -0
  418. package/dist/services/workflow/nodes/log-write.node.js.map +1 -0
  419. package/dist/services/workflow/nodes/loop-until.node.d.ts +12 -0
  420. package/dist/services/workflow/nodes/loop-until.node.d.ts.map +1 -0
  421. package/dist/services/workflow/nodes/loop-until.node.js +281 -0
  422. package/dist/services/workflow/nodes/loop-until.node.js.map +1 -0
  423. package/dist/services/workflow/nodes/parallel.node.d.ts +6 -0
  424. package/dist/services/workflow/nodes/parallel.node.d.ts.map +1 -0
  425. package/dist/services/workflow/nodes/parallel.node.js +83 -0
  426. package/dist/services/workflow/nodes/parallel.node.js.map +1 -0
  427. package/dist/services/workflow/nodes/runtime-python.node.d.ts +13 -0
  428. package/dist/services/workflow/nodes/runtime-python.node.d.ts.map +1 -0
  429. package/dist/services/workflow/nodes/runtime-python.node.js +522 -0
  430. package/dist/services/workflow/nodes/runtime-python.node.js.map +1 -0
  431. package/dist/services/workflow/nodes/sequential.node.d.ts +6 -0
  432. package/dist/services/workflow/nodes/sequential.node.d.ts.map +1 -0
  433. package/dist/services/workflow/nodes/sequential.node.js +68 -0
  434. package/dist/services/workflow/nodes/sequential.node.js.map +1 -0
  435. package/dist/services/workflow/nodes/solidx-api.helpers.d.ts +25 -0
  436. package/dist/services/workflow/nodes/solidx-api.helpers.d.ts.map +1 -0
  437. package/dist/services/workflow/nodes/solidx-api.helpers.js +143 -0
  438. package/dist/services/workflow/nodes/solidx-api.helpers.js.map +1 -0
  439. package/dist/services/workflow/nodes/solidx-crud.nodes.d.ts +48 -0
  440. package/dist/services/workflow/nodes/solidx-crud.nodes.d.ts.map +1 -0
  441. package/dist/services/workflow/nodes/solidx-crud.nodes.js +475 -0
  442. package/dist/services/workflow/nodes/solidx-crud.nodes.js.map +1 -0
  443. package/dist/services/workflow/nodes/solidx-login.node.d.ts +6 -0
  444. package/dist/services/workflow/nodes/solidx-login.node.d.ts.map +1 -0
  445. package/dist/services/workflow/nodes/solidx-login.node.js +208 -0
  446. package/dist/services/workflow/nodes/solidx-login.node.js.map +1 -0
  447. package/dist/services/workflow/nodes/solidx-send-email.node.d.ts +11 -0
  448. package/dist/services/workflow/nodes/solidx-send-email.node.d.ts.map +1 -0
  449. package/dist/services/workflow/nodes/solidx-send-email.node.js +437 -0
  450. package/dist/services/workflow/nodes/solidx-send-email.node.js.map +1 -0
  451. package/dist/services/workflow/nodes/solidx-send-sms.node.d.ts +10 -0
  452. package/dist/services/workflow/nodes/solidx-send-sms.node.d.ts.map +1 -0
  453. package/dist/services/workflow/nodes/solidx-send-sms.node.js +347 -0
  454. package/dist/services/workflow/nodes/solidx-send-sms.node.js.map +1 -0
  455. package/dist/services/workflow/nodes/switch.node.d.ts +7 -0
  456. package/dist/services/workflow/nodes/switch.node.d.ts.map +1 -0
  457. package/dist/services/workflow/nodes/switch.node.js +120 -0
  458. package/dist/services/workflow/nodes/switch.node.js.map +1 -0
  459. package/dist/services/workflow/workflow-definition-metadata-sync.service.d.ts +19 -0
  460. package/dist/services/workflow/workflow-definition-metadata-sync.service.d.ts.map +1 -0
  461. package/dist/services/workflow/workflow-definition-metadata-sync.service.js +187 -0
  462. package/dist/services/workflow/workflow-definition-metadata-sync.service.js.map +1 -0
  463. package/dist/services/workflow/workflow-definition-validator.service.d.ts +13 -0
  464. package/dist/services/workflow/workflow-definition-validator.service.d.ts.map +1 -0
  465. package/dist/services/workflow/workflow-definition-validator.service.js +166 -0
  466. package/dist/services/workflow/workflow-definition-validator.service.js.map +1 -0
  467. package/dist/services/workflow/workflow-execution-writer.service.d.ts +26 -0
  468. package/dist/services/workflow/workflow-execution-writer.service.d.ts.map +1 -0
  469. package/dist/services/workflow/workflow-execution-writer.service.js +191 -0
  470. package/dist/services/workflow/workflow-execution-writer.service.js.map +1 -0
  471. package/dist/services/workflow/workflow-expression.service.d.ts +14 -0
  472. package/dist/services/workflow/workflow-expression.service.d.ts.map +1 -0
  473. package/dist/services/workflow/workflow-expression.service.js +157 -0
  474. package/dist/services/workflow/workflow-expression.service.js.map +1 -0
  475. package/dist/services/workflow/workflow-invocation.service.d.ts +11 -0
  476. package/dist/services/workflow/workflow-invocation.service.d.ts.map +1 -0
  477. package/dist/services/workflow/workflow-invocation.service.js +37 -0
  478. package/dist/services/workflow/workflow-invocation.service.js.map +1 -0
  479. package/dist/services/workflow/workflow-node-registry.service.d.ts +19 -0
  480. package/dist/services/workflow/workflow-node-registry.service.d.ts.map +1 -0
  481. package/dist/services/workflow/workflow-node-registry.service.js +117 -0
  482. package/dist/services/workflow/workflow-node-registry.service.js.map +1 -0
  483. package/dist/services/workflow/workflow-runtime.service.d.ts +61 -0
  484. package/dist/services/workflow/workflow-runtime.service.d.ts.map +1 -0
  485. package/dist/services/workflow/workflow-runtime.service.js +706 -0
  486. package/dist/services/workflow/workflow-runtime.service.js.map +1 -0
  487. package/dist/services/workflow/workflow-scheduled-trigger.job.d.ts +10 -0
  488. package/dist/services/workflow/workflow-scheduled-trigger.job.d.ts.map +1 -0
  489. package/dist/services/workflow/workflow-scheduled-trigger.job.js +37 -0
  490. package/dist/services/workflow/workflow-scheduled-trigger.job.js.map +1 -0
  491. package/dist/services/workflow-definition.service.d.ts +52 -0
  492. package/dist/services/workflow-definition.service.d.ts.map +1 -0
  493. package/dist/services/workflow-definition.service.js +251 -0
  494. package/dist/services/workflow-definition.service.js.map +1 -0
  495. package/dist/services/workflow-execution-artifact.service.d.ts +12 -0
  496. package/dist/services/workflow-execution-artifact.service.d.ts.map +1 -0
  497. package/dist/services/workflow-execution-artifact.service.js +38 -0
  498. package/dist/services/workflow-execution-artifact.service.js.map +1 -0
  499. package/dist/services/workflow-execution-log.service.d.ts +12 -0
  500. package/dist/services/workflow-execution-log.service.d.ts.map +1 -0
  501. package/dist/services/workflow-execution-log.service.js +38 -0
  502. package/dist/services/workflow-execution-log.service.js.map +1 -0
  503. package/dist/services/workflow-execution.service.d.ts +12 -0
  504. package/dist/services/workflow-execution.service.d.ts.map +1 -0
  505. package/dist/services/workflow-execution.service.js +38 -0
  506. package/dist/services/workflow-execution.service.js.map +1 -0
  507. package/dist/services/workflow-secret.service.d.ts +25 -0
  508. package/dist/services/workflow-secret.service.d.ts.map +1 -0
  509. package/dist/services/workflow-secret.service.js +152 -0
  510. package/dist/services/workflow-secret.service.js.map +1 -0
  511. package/dist/services/workflow-step-execution.service.d.ts +12 -0
  512. package/dist/services/workflow-step-execution.service.d.ts.map +1 -0
  513. package/dist/services/workflow-step-execution.service.js +38 -0
  514. package/dist/services/workflow-step-execution.service.js.map +1 -0
  515. package/dist/services/workflow-trigger-execution.service.d.ts +12 -0
  516. package/dist/services/workflow-trigger-execution.service.d.ts.map +1 -0
  517. package/dist/services/workflow-trigger-execution.service.js +38 -0
  518. package/dist/services/workflow-trigger-execution.service.js.map +1 -0
  519. package/dist/solid-core.module.d.ts.map +1 -1
  520. package/dist/solid-core.module.js +131 -1
  521. package/dist/solid-core.module.js.map +1 -1
  522. package/dist/testing/adapters/ui/playwright-adapter.d.ts +5 -0
  523. package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -1
  524. package/dist/testing/adapters/ui/playwright-adapter.js +17 -1
  525. package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -1
  526. package/dist/testing/adapters/ui/ui.types.d.ts +2 -0
  527. package/dist/testing/adapters/ui/ui.types.d.ts.map +1 -1
  528. package/dist/testing/adapters/ui/ui.types.js.map +1 -1
  529. package/dist/testing/steps/ui/actions.step.d.ts.map +1 -1
  530. package/dist/testing/steps/ui/actions.step.js +6 -2
  531. package/dist/testing/steps/ui/actions.step.js.map +1 -1
  532. package/dist/testing/steps/ui/assertions.step.d.ts.map +1 -1
  533. package/dist/testing/steps/ui/assertions.step.js +11 -3
  534. package/dist/testing/steps/ui/assertions.step.js.map +1 -1
  535. package/dist/testing/steps/ui/form.step.d.ts.map +1 -1
  536. package/dist/testing/steps/ui/form.step.js +9 -3
  537. package/dist/testing/steps/ui/form.step.js.map +1 -1
  538. package/dist/testing/steps/ui/manual.step.js +1 -1
  539. package/dist/testing/steps/ui/manual.step.js.map +1 -1
  540. package/dist/testing/steps/ui/navigation.step.d.ts.map +1 -1
  541. package/dist/testing/steps/ui/navigation.step.js +3 -1
  542. package/dist/testing/steps/ui/navigation.step.js.map +1 -1
  543. package/dist/transformers/empty-string-to-null-transformer.d.ts +4 -0
  544. package/dist/transformers/empty-string-to-null-transformer.d.ts.map +1 -0
  545. package/dist/transformers/empty-string-to-null-transformer.js +12 -0
  546. package/dist/transformers/empty-string-to-null-transformer.js.map +1 -0
  547. package/dist/types/workflow-dsl.types.d.ts +291 -0
  548. package/dist/types/workflow-dsl.types.d.ts.map +1 -0
  549. package/dist/types/workflow-dsl.types.js +3 -0
  550. package/dist/types/workflow-dsl.types.js.map +1 -0
  551. package/dist/types/workflow-execution-queue.types.d.ts +4 -0
  552. package/dist/types/workflow-execution-queue.types.d.ts.map +1 -0
  553. package/dist/types/workflow-execution-queue.types.js +3 -0
  554. package/dist/types/workflow-execution-queue.types.js.map +1 -0
  555. package/package.json +3 -2
  556. package/src/commands/run-tests.command.ts +47 -1
  557. package/src/commands/seed.command.ts +19 -0
  558. package/src/constants/chatter-message.constants.ts +12 -0
  559. package/src/constants/draft-publish-fields.ts +5 -0
  560. package/src/constants/media-file-types.ts +50 -0
  561. package/src/constants/user.constants.ts +13 -0
  562. package/src/controllers/chatter-message.controller.ts +8 -0
  563. package/src/controllers/export-template.controller.ts +5 -3
  564. package/src/controllers/import-transaction.controller.ts +6 -6
  565. package/src/controllers/media.controller.ts +17 -6
  566. package/src/controllers/module-package.controller.ts +2 -3
  567. package/src/controllers/workflow-definition.controller.ts +141 -0
  568. package/src/controllers/workflow-execution-artifact.controller.ts +93 -0
  569. package/src/controllers/workflow-execution-log.controller.ts +93 -0
  570. package/src/controllers/workflow-execution.controller.ts +126 -0
  571. package/src/controllers/workflow-secret.controller.ts +90 -0
  572. package/src/controllers/workflow-step-execution.controller.ts +93 -0
  573. package/src/controllers/workflow-trigger-execution.controller.ts +93 -0
  574. package/src/decorators/workflow-field-data-provider.decorator.ts +7 -0
  575. package/src/decorators/workflow-node-provider.decorator.ts +14 -0
  576. package/src/dtos/basic-filters.dto.ts +0 -4
  577. package/src/dtos/create-workflow-definition.dto.ts +60 -0
  578. package/src/dtos/create-workflow-execution-artifact.dto.ts +99 -0
  579. package/src/dtos/create-workflow-execution-log.dto.ts +80 -0
  580. package/src/dtos/create-workflow-execution.dto.ts +137 -0
  581. package/src/dtos/create-workflow-secret.dto.ts +44 -0
  582. package/src/dtos/create-workflow-step-execution.dto.ts +123 -0
  583. package/src/dtos/create-workflow-trigger-execution.dto.ts +114 -0
  584. package/src/dtos/execute-workflow.dto.ts +6 -0
  585. package/src/dtos/update-workflow-definition.dto.ts +67 -0
  586. package/src/dtos/update-workflow-execution-artifact.dto.ts +105 -0
  587. package/src/dtos/update-workflow-execution-log.dto.ts +87 -0
  588. package/src/dtos/update-workflow-execution.dto.ts +144 -0
  589. package/src/dtos/update-workflow-secret.dto.ts +53 -0
  590. package/src/dtos/update-workflow-step-execution.dto.ts +132 -0
  591. package/src/dtos/update-workflow-trigger-execution.dto.ts +122 -0
  592. package/src/dtos/validate-workflow-definition.dto.ts +3 -0
  593. package/src/entities/common.entity.ts +24 -0
  594. package/src/entities/user.entity.ts +53 -36
  595. package/src/entities/workflow-definition.entity.ts +43 -0
  596. package/src/entities/workflow-execution-artifact.entity.ts +72 -0
  597. package/src/entities/workflow-execution-log.entity.ts +58 -0
  598. package/src/entities/workflow-execution.entity.ts +82 -0
  599. package/src/entities/workflow-secret.entity.ts +33 -0
  600. package/src/entities/workflow-step-execution.entity.ts +88 -0
  601. package/src/entities/workflow-trigger-execution.entity.ts +82 -0
  602. package/src/factories/mail.factory.ts +7 -1
  603. package/src/factories/sms.factory.ts +4 -1
  604. package/src/helpers/field-crud-managers/MediaFieldCrudManager.ts +26 -12
  605. package/src/helpers/file-download.helper.ts +31 -0
  606. package/src/helpers/model-metadata-helper.service.ts +32 -1
  607. package/src/helpers/solid-registry.ts +22 -2
  608. package/src/index.ts +59 -0
  609. package/src/interfaces/workflow-node-handler.interface.ts +10 -0
  610. package/src/interfaces.ts +30 -0
  611. package/src/jobs/database/workflow-execution-publisher-database.service.ts +24 -0
  612. package/src/jobs/database/workflow-execution-queue-options-database.ts +9 -0
  613. package/src/jobs/database/workflow-execution-subscriber-database.service.ts +44 -0
  614. package/src/jobs/rabbitmq/workflow-execution-publisher.service.ts +24 -0
  615. package/src/jobs/rabbitmq/workflow-execution-queue-options.ts +9 -0
  616. package/src/jobs/rabbitmq/workflow-execution-subscriber.service.ts +42 -0
  617. package/src/jobs/redis/workflow-execution-publisher-redis.service.ts +24 -0
  618. package/src/jobs/redis/workflow-execution-queue-options-redis.ts +9 -0
  619. package/src/jobs/redis/workflow-execution-subscriber-redis.service.ts +42 -0
  620. package/src/repository/security-rule.repository.ts +52 -10
  621. package/src/repository/workflow-definition.repository.ts +19 -0
  622. package/src/repository/workflow-execution-artifact.repository.ts +19 -0
  623. package/src/repository/workflow-execution-log.repository.ts +19 -0
  624. package/src/repository/workflow-execution.repository.ts +19 -0
  625. package/src/repository/workflow-secret.repository.ts +19 -0
  626. package/src/repository/workflow-step-execution.repository.ts +19 -0
  627. package/src/repository/workflow-trigger-execution.repository.ts +19 -0
  628. package/src/seeders/module-metadata-seeder.service.ts +216 -40
  629. package/src/seeders/module-test-data.service.ts +6 -0
  630. package/src/seeders/seed-data/solid-core-metadata.json +11494 -5570
  631. package/src/services/authentication.service.ts +76 -5
  632. package/src/services/chatter-message.service.ts +107 -5
  633. package/src/services/crud-helper.service.ts +236 -56
  634. package/src/services/crud.service.ts +159 -104
  635. package/src/services/datasource-introspection.service.ts +5 -0
  636. package/src/services/draft-publish-helper.service.ts +529 -0
  637. package/src/services/internationalisation-helper.service.ts +148 -0
  638. package/src/services/media.service.ts +67 -36
  639. package/src/services/metadata-validation.service.ts +39 -0
  640. package/src/services/model-metadata.service.ts +4 -1
  641. package/src/services/object.utils.ts +10 -0
  642. package/src/services/settings/default-settings-provider.service.ts +35 -3
  643. package/src/services/solid-introspect.service.ts +19 -0
  644. package/src/services/user.service.ts +18 -3
  645. package/src/services/view-metadata.service.ts +80 -154
  646. package/src/services/workflow/nodes/execution-fail.node.ts +82 -0
  647. package/src/services/workflow/nodes/for-each.node.ts +231 -0
  648. package/src/services/workflow/nodes/http-request.node.ts +624 -0
  649. package/src/services/workflow/nodes/if.node.ts +100 -0
  650. package/src/services/workflow/nodes/log-write.node.ts +234 -0
  651. package/src/services/workflow/nodes/loop-until.node.ts +343 -0
  652. package/src/services/workflow/nodes/parallel.node.ts +88 -0
  653. package/src/services/workflow/nodes/runtime-python.node.ts +571 -0
  654. package/src/services/workflow/nodes/sequential.node.ts +65 -0
  655. package/src/services/workflow/nodes/solidx-api.helpers.ts +205 -0
  656. package/src/services/workflow/nodes/solidx-crud.nodes.ts +511 -0
  657. package/src/services/workflow/nodes/solidx-login.node.ts +222 -0
  658. package/src/services/workflow/nodes/solidx-send-email.node.ts +489 -0
  659. package/src/services/workflow/nodes/solidx-send-sms.node.ts +377 -0
  660. package/src/services/workflow/nodes/switch.node.ts +132 -0
  661. package/src/services/workflow/workflow-definition-metadata-sync.service.ts +196 -0
  662. package/src/services/workflow/workflow-definition-validator.service.ts +226 -0
  663. package/src/services/workflow/workflow-execution-writer.service.ts +244 -0
  664. package/src/services/workflow/workflow-expression.service.ts +180 -0
  665. package/src/services/workflow/workflow-invocation.service.ts +39 -0
  666. package/src/services/workflow/workflow-node-registry.service.ts +152 -0
  667. package/src/services/workflow/workflow-runtime.service.ts +934 -0
  668. package/src/services/workflow/workflow-scheduled-trigger.job.ts +33 -0
  669. package/src/services/workflow-definition.service.ts +293 -0
  670. package/src/services/workflow-execution-artifact.service.ts +20 -0
  671. package/src/services/workflow-execution-log.service.ts +20 -0
  672. package/src/services/workflow-execution.service.ts +20 -0
  673. package/src/services/workflow-secret.service.ts +161 -0
  674. package/src/services/workflow-step-execution.service.ts +20 -0
  675. package/src/services/workflow-trigger-execution.service.ts +20 -0
  676. package/src/solid-core.module.ts +144 -3
  677. package/src/testing/README.md +73 -2
  678. package/src/testing/adapters/ui/playwright-adapter.ts +25 -0
  679. package/src/testing/adapters/ui/ui.types.ts +2 -0
  680. package/src/testing/steps/ui/actions.step.ts +8 -4
  681. package/src/testing/steps/ui/assertions.step.ts +18 -5
  682. package/src/testing/steps/ui/form.step.ts +16 -6
  683. package/src/testing/steps/ui/manual.step.ts +1 -1
  684. package/src/testing/steps/ui/navigation.step.ts +4 -2
  685. package/src/transformers/empty-string-to-null-transformer.ts +11 -0
  686. package/src/types/workflow-dsl.types.ts +1030 -0
  687. package/src/types/workflow-execution-queue.types.ts +3 -0
@@ -1,11 +1,14 @@
1
- import { Brackets, SelectQueryBuilder, WhereExpressionBuilder } from "typeorm";
1
+ import { Brackets, EntityMetadata, SelectQueryBuilder, WhereExpressionBuilder } from "typeorm";
2
2
  import { BasicFilterDto } from "../dtos/basic-filters.dto";
3
3
  import { classify } from '../helpers/string.helper';
4
4
  import { ActiveUserData } from "src/interfaces/active-user-data.interface";
5
5
  import { SolidRegistry } from "src/helpers/solid-registry";
6
- import { BadRequestException, Logger } from "@nestjs/common";
6
+ import { BadRequestException, Injectable, Logger } from "@nestjs/common";
7
7
  import { ERROR_MESSAGES } from "src/constants/error-messages";
8
8
  import { buildCastToText } from "src/helpers/typeorm-db-helper";
9
+ import { DraftPublishHelperService } from "./draft-publish-helper.service";
10
+ import { InternationalisationHelperService } from "./internationalisation-helper.service";
11
+ import { normalizeObjectKeys } from "./object.utils";
9
12
 
10
13
  export enum FilterCombinator {
11
14
  AND = '$and',
@@ -17,10 +20,133 @@ export enum UserIdFields {
17
20
  UPDATED_BY = 'updatedBy'
18
21
  }
19
22
 
23
+ /** Aggregate functions permitted in the `fields` `fn(field)` syntax. */
24
+ const SUPPORTED_FIELD_FUNCTIONS = ['COUNT', 'SUM', 'AVG', 'MIN', 'MAX'];
25
+
26
+ /** Date granularities permitted in `groupBy` (`field:granularity`) and filter func-aliases. */
27
+ const SUPPORTED_GRANULARITIES = ['day', 'week', 'month', 'year'];
28
+
29
+ /**
30
+ * Outcome of resolving a user-supplied dotted path against real entity metadata.
31
+ * Every string here originates from TypeORM metadata, never from request input.
32
+ */
33
+ export interface ResolvedFieldPath {
34
+ /** Canonical relation property names for each hop traversed (excludes a column leaf). */
35
+ relationSegments: string[];
36
+ /** Canonical column property name, when the leaf is a column. */
37
+ leafProperty?: string;
38
+ /** True when the leaf itself is a relation (populate / nested-filter join). */
39
+ leafIsRelation: boolean;
40
+ }
41
+
42
+ @Injectable()
20
43
  export class CrudHelperService {
44
+ private readonly logger = new Logger(CrudHelperService.name);
45
+
21
46
  constructor(
47
+ private readonly draftPublishHelperService: DraftPublishHelperService,
48
+ private readonly internationalisationHelperService: InternationalisationHelperService,
22
49
  ) { }
23
- private readonly logger = new Logger(CrudHelperService.name);
50
+
51
+ /**
52
+ * Resolve a user-supplied dotted path (e.g. "customer.name") against real TypeORM metadata.
53
+ *
54
+ * SECURITY — this is the choke point that makes the filtering vocabulary safe.
55
+ * SQL can bind *values* as parameters but never *identifiers* (column names, aliases,
56
+ * ORDER BY expressions), so a client-chosen field name must be allow-listed instead.
57
+ * The caller's string is used ONLY as a lookup key; every value returned comes from
58
+ * ColumnMetadata/RelationMetadata, so callers build SQL exclusively from strings this
59
+ * codebase produced, never from request input.
60
+ *
61
+ * Throws BadRequestException on any segment that is not a real column/relation.
62
+ */
63
+ resolveFieldPathFromMetadata(
64
+ rootMetadata: EntityMetadata,
65
+ pathParts: string[],
66
+ { allowRelationLeaf = false }: { allowRelationLeaf?: boolean } = {}
67
+ ): ResolvedFieldPath {
68
+ // Fail closed: without metadata we cannot prove the identifier is safe.
69
+ if (!rootMetadata) throw new BadRequestException(`Cannot resolve field '${this.describeInvalidField(pathParts?.join('.'))}'`);
70
+ if (!pathParts?.length || pathParts.some(part => !part)) {
71
+ throw new BadRequestException(`Invalid field path '${this.describeInvalidField(pathParts?.join('.'))}'`);
72
+ }
73
+
74
+ let metadata = rootMetadata;
75
+ const relationSegments: string[] = [];
76
+
77
+ for (let i = 0; i < pathParts.length; i++) {
78
+ const isLeaf = i === pathParts.length - 1;
79
+ // `metadata` is the entity currently being walked; it advances one hop per segment.
80
+ // These lookups key on propertyName/propertyPath (NOT database name), so they are
81
+ // naming-strategy agnostic and resolve implicit relation FK columns correctly.
82
+ const relation = metadata.findRelationWithPropertyPath(pathParts[i]);
83
+ const column = metadata.findColumnWithPropertyName(pathParts[i]);
84
+
85
+ if (!isLeaf) {
86
+ // Interior segments must be relations so we can keep walking.
87
+ if (!relation) {
88
+ throw new BadRequestException(`Invalid relation '${this.describeInvalidField(pathParts[i])}' in '${this.describeInvalidField(pathParts.join('.'))}'`);
89
+ }
90
+ relationSegments.push(relation.propertyName); // canonical, from metadata
91
+ // THE HOP: advance to the entity on the other side so the NEXT iteration validates
92
+ // against that entity rather than the root. Consumed at the top of the next pass —
93
+ // it only looks unused here because `continue` follows immediately.
94
+ // e.g. "shop.customer.mcc": NbfTransaction -> CustomerLocation -> Customer.
95
+ // Without this, "customer" would be checked on NbfTransaction (wrongly accepted)
96
+ // and "mcc" on NbfTransaction (wrongly rejected).
97
+ metadata = relation.inverseEntityMetadata;
98
+ continue;
99
+ }
100
+
101
+ // Leaf ordering matters: a many-to-one name can match BOTH a relation and its FK column.
102
+ // populate (allowRelationLeaf) must treat it as a relation so it can be joined;
103
+ // sort/filter must treat it as a column so it compares on the FK, as today.
104
+ if (allowRelationLeaf && relation) {
105
+ relationSegments.push(relation.propertyName);
106
+ return { relationSegments, leafIsRelation: true };
107
+ }
108
+ if (column) {
109
+ return { relationSegments, leafProperty: column.propertyName, leafIsRelation: false };
110
+ }
111
+ throw new BadRequestException(`Invalid field '${this.describeInvalidField(pathParts[i])}' in '${this.describeInvalidField(pathParts.join('.'))}'`);
112
+ }
113
+
114
+ throw new BadRequestException(`Invalid field path '${this.describeInvalidField(pathParts.join('.'))}'`);
115
+ }
116
+
117
+ /**
118
+ * Query-builder flavoured wrapper around {@link resolveFieldPathFromMetadata}.
119
+ *
120
+ * `startAlias` matters for nested filters: applyFilters recurses into joined relations
121
+ * carrying that relation's alias, so the leaf must resolve against the joined entity
122
+ * rather than always the root.
123
+ */
124
+ resolveFieldPath(
125
+ qb: SelectQueryBuilder<any>,
126
+ pathParts: string[],
127
+ { allowRelationLeaf = false, startAlias }: { allowRelationLeaf?: boolean; startAlias?: string } = {}
128
+ ): ResolvedFieldPath {
129
+ const aliasMetadata = startAlias ? this.findAliasMetadata(qb, startAlias) : undefined;
130
+ const rootMetadata = aliasMetadata ?? qb?.expressionMap?.mainAlias?.metadata;
131
+ return this.resolveFieldPathFromMetadata(rootMetadata, pathParts, { allowRelationLeaf });
132
+ }
133
+
134
+ private findAliasMetadata(qb: SelectQueryBuilder<any>, alias: string): EntityMetadata | undefined {
135
+ const found = qb?.expressionMap?.aliases?.find(a => a.name === alias);
136
+ return found?.hasMetadata ? found.metadata : undefined;
137
+ }
138
+
139
+ /**
140
+ * Echo a rejected identifier back in a bounded way.
141
+ *
142
+ * Naming the bad field is what makes a 400 actionable for a legitimate typo, but reflecting an
143
+ * unbounded attacker-supplied string is needless: it hands an attacker a reliable echo channel
144
+ * and bloats logs. 80 characters is ample for a real field name.
145
+ */
146
+ private describeInvalidField(value: string): string {
147
+ const text = String(value ?? '');
148
+ return text.length > 80 ? `${text.slice(0, 80)}...` : text;
149
+ }
24
150
 
25
151
  private orderOptions(sort: any[] = []) {
26
152
  const orderOptions = {};
@@ -44,7 +170,7 @@ export class CrudHelperService {
44
170
  }
45
171
 
46
172
  applyFilters(qb: WhereExpressionBuilder, filters: any, alias: string = 'entity', selectQb: SelectQueryBuilder<any>) {
47
- const normalizedFilters = this.normalizeObjectKeys(filters);
173
+ const normalizedFilters = normalizeObjectKeys(filters);
48
174
  if (normalizedFilters.$and) {
49
175
  normalizedFilters.$and.forEach((andFilter: any) => {
50
176
  qb.andWhere(
@@ -63,7 +189,7 @@ export class CrudHelperService {
63
189
  // For individual conditions
64
190
  Object.keys(normalizedFilters).forEach(key => {
65
191
  const primaryFilterObj = normalizedFilters[key];
66
- const normalizedPrimaryFilterObj = this.normalizeObjectKeys(primaryFilterObj);
192
+ const normalizedPrimaryFilterObj = normalizeObjectKeys(primaryFilterObj);
67
193
 
68
194
  const [rawField, funcAlias] = key.split(':');
69
195
 
@@ -72,24 +198,38 @@ export class CrudHelperService {
72
198
  // if the key is an operator, then build the query based on the operator
73
199
  if (operatorOrField.startsWith('$')) {
74
200
  const operator = operatorOrField;
201
+ // SECURITY: resolve against the CURRENT alias (this method recurses into joined
202
+ // relations), so a nested filter key is checked on the joined entity rather than
203
+ // the root. Resolution is driven off `selectQb` because `qb` is a
204
+ // WhereExpressionBuilder and exposes no expressionMap.
205
+ const { leafProperty } = this.resolveFieldPath(selectQb, [rawField], { startAlias: alias });
75
206
  let columnExpression: string | undefined;
76
207
  if (funcAlias) {
77
208
  try {
78
- columnExpression = this.buildDateGranularityExpression(this.getDriver(selectQb), `${alias}.${rawField}`, funcAlias);
79
- } catch {
80
- throw new BadRequestException(`Unsupported field function '${funcAlias}'. Supported functions are: day, week, month, year.`);
209
+ columnExpression = this.buildDateGranularityExpression(this.getDriver(selectQb), `${alias}.${leafProperty}`, funcAlias);
210
+ } catch (error) {
211
+ // Surface the precise granularity message; keep the original fallback
212
+ // for driver-level failures.
213
+ if (error instanceof BadRequestException) throw error;
214
+ throw new BadRequestException(`Unsupported field function '${this.describeInvalidField(funcAlias)}'. Supported functions are: ${SUPPORTED_GRANULARITIES.join(', ')}.`);
81
215
  }
82
216
  }
83
- this.buildOperatorQuery(qb, alias, rawField, normalizedPrimaryFilterObj, operator, columnExpression);
217
+ this.buildOperatorQuery(qb, alias, leafProperty, normalizedPrimaryFilterObj, operator, columnExpression);
84
218
  return;
85
219
  }
86
220
  else { // Recursively call the applyFilters method to handle nested conditions
87
221
  if (funcAlias) {
88
222
  throw new BadRequestException(`Function alias ':${funcAlias}' is not valid on relation field '${rawField}'. It can only be applied to scalar fields.`);
89
223
  }
90
- const joinField = `${alias}.${rawField}`;
91
- if (!this.isRelationJoined(selectQb, joinField)) selectQb.leftJoin(joinField, rawField);
92
- this.applyFilters(qb, primaryFilterObj, rawField, selectQb);
224
+ // SECURITY: the nested key must be a real relation on the current entity.
225
+ const resolvedRelation = this.resolveFieldPath(selectQb, [rawField], { allowRelationLeaf: true, startAlias: alias });
226
+ if (!resolvedRelation.leafIsRelation) {
227
+ throw new BadRequestException(`'${this.describeInvalidField(rawField)}' is not a relation and cannot contain nested filters.`);
228
+ }
229
+ const relationName = resolvedRelation.relationSegments[resolvedRelation.relationSegments.length - 1];
230
+ const joinField = `${alias}.${relationName}`;
231
+ if (!this.isRelationJoined(selectQb, joinField)) selectQb.leftJoin(joinField, relationName);
232
+ this.applyFilters(qb, primaryFilterObj, relationName, selectQb);
93
233
  }
94
234
  });
95
235
  }
@@ -179,17 +319,6 @@ export class CrudHelperService {
179
319
  }
180
320
  }
181
321
 
182
- // Normalize the primary operator object by removing the surrounding brackets in the keys e.g [$eq] => $eq
183
- private normalizeObjectKeys(obj: any): any {
184
- return Object.keys(obj).reduce((acc, key) => {
185
- // Transform the key by removing surrounding brackets
186
- const newKey = key.replace(/^\[(.*)\]$/, '$1');
187
- // Assign the value to the transformed key in the accumulator object
188
- acc[newKey] = obj[key];
189
- return acc;
190
- }, {});
191
- }
192
-
193
322
  normalize(value: string | string[]): string[] {
194
323
  if (!value) return []; // if the value is nullish, then return an empty array
195
324
  return Array.isArray(value) ? value : [value]; // if the value is an array, return it as is, otherwise return it as an array
@@ -226,7 +355,7 @@ export class CrudHelperService {
226
355
  applySorting: boolean = true
227
356
  ): SelectQueryBuilder<any> { // TODO : Check how to pass a type to SelectQueryBuilder instead of any
228
357
  let { limit, offset, showSoftDeleted, filters } = basicFilterDto;
229
- const { fields, sort, populate = [], populateMedia = [], locale, status } = basicFilterDto;
358
+ const { fields, sort, populate = [], populateMedia = [], locale } = basicFilterDto;
230
359
 
231
360
  // Normalize the fields, sort, groupBy and populate options i.e (since they can be either a string or an array of strings, when coming from the request)
232
361
  const normalizedFields = this.normalize(fields);
@@ -257,34 +386,20 @@ export class CrudHelperService {
257
386
  }
258
387
  }
259
388
 
260
- let finalLocale = locale
261
389
  if (internationalisation) {
262
- // If locale is not provided in the filter dto, then assume it is the default locale to be used.
263
- if (!finalLocale) {
264
- //Get default locale from registry
265
- const solidRegistry = moduleRef.get(SolidRegistry, { strict: false });
266
- const defaultLocale = solidRegistry.getDefaultLocale();
267
- if(defaultLocale){
268
- finalLocale = defaultLocale.locale;
269
- }else{
270
- finalLocale = 'en';
271
- }
272
- }
390
+ // If locale is not provided in the filter dto, then assume it is the default locale to be used.
391
+ const finalLocale = locale || this.internationalisationHelperService.resolveDefaultLocaleName(moduleRef.get(SolidRegistry, { strict: false }));
273
392
  qb.andWhere(`${entityAlias}.localeName = :locale`, { locale: finalLocale });
274
393
  }
275
394
 
276
- if (draftPublishWorkflow && status) {
277
- if (basicFilterDto.status === 'published') {
278
- qb.andWhere(`${entityAlias}.publishedAt IS NOT NULL`);
279
- } else if (basicFilterDto.status === 'draft') {
280
- qb.andWhere(`${entityAlias}.publishedAt IS NULL`);
281
- }
395
+ if (draftPublishWorkflow) {
396
+ this.draftPublishHelperService.applyDraftPublishFilterDefaults(qb, filters, entityAlias);
282
397
  }
283
398
  // Depending upon the select option, apply the select clause
284
399
  if (normalizedFields && normalizedFields.length) {
285
400
  qb.select(normalizedFields.map(field => {
286
401
  // If the field contains a (, do not prefix the entity alias
287
- return this.wrapFieldWithAlias(field, entityAlias);
402
+ return this.wrapFieldWithAlias(qb, field, entityAlias);
288
403
  }));
289
404
  }
290
405
 
@@ -306,7 +421,10 @@ export class CrudHelperService {
306
421
  qb.addOrderBy(orderColumn, value);
307
422
  if (created) qb.addSelect(orderColumn);
308
423
  } else {
309
- qb.addOrderBy(`${entityAlias}.${field}`, value);
424
+ // SECURITY: resolve against real metadata and order by the canonical column
425
+ // name, never the raw input (addOrderBy accepts arbitrary SQL text).
426
+ const { leafProperty } = this.resolveFieldPath(qb, [field]);
427
+ qb.addOrderBy(`${entityAlias}.${leafProperty}`, value);
310
428
  }
311
429
  });
312
430
  if (!hasExplicitIdSort) {
@@ -321,7 +439,10 @@ export class CrudHelperService {
321
439
 
322
440
  if (showSoftDeleted === 'exclusive') {
323
441
  qb.withDeleted();
324
- qb.where(`${entityAlias}.deletedAt IS NOT NULL`);
442
+ // SECURITY: must be andWhere. `where()` REPLACES every previously registered condition,
443
+ // which discarded the user's filters, the locale/status predicates and — critically —
444
+ // the row-level security rules applied by createSecurityRuleAwareQueryBuilder.
445
+ qb.andWhere(`${entityAlias}.deletedAt IS NOT NULL`);
325
446
  }
326
447
 
327
448
  // Apply the pagination options & handle the case when the query has joins
@@ -364,14 +485,18 @@ export class CrudHelperService {
364
485
  }
365
486
 
366
487
  private ensureRelationPathJoined(qb: SelectQueryBuilder<any>, rootAlias: string, pathParts: string[]) {
488
+ // SECURITY: validate the whole path against real metadata before any segment reaches SQL,
489
+ // and build from the canonical names returned rather than the caller's strings. Covers
490
+ // dotted `sort`, `groupBy` and `aggregates`, which all route through here.
491
+ const resolved = this.resolveFieldPath(qb, pathParts);
367
492
  const mainAlias =
368
493
  qb.expressionMap?.mainAlias?.name ||
369
494
  qb.expressionMap?.aliases?.find(a => a.metadata)?.name ||
370
495
  qb.expressionMap?.aliases?.[0]?.name;
371
496
  let parentAlias = mainAlias || rootAlias;
372
497
  let leafJoinCreated = false;
373
- for (let i = 0; i < pathParts.length - 1; i++) {
374
- const part = pathParts[i];
498
+ for (let i = 0; i < resolved.relationSegments.length; i++) {
499
+ const part = resolved.relationSegments[i];
375
500
  const joinProperty = `${parentAlias}.${part}`;
376
501
  const existingAlias = this.getExistingJoinAlias(qb, joinProperty);
377
502
  const joinAlias = existingAlias ?? this.sanitizeAlias(`${parentAlias}_${part}`);
@@ -383,7 +508,7 @@ export class CrudHelperService {
383
508
  }
384
509
  parentAlias = joinAlias;
385
510
  }
386
- return { alias: parentAlias, property: pathParts[pathParts.length - 1], created: leafJoinCreated };
511
+ return { alias: parentAlias, property: resolved.leafProperty, created: leafJoinCreated };
387
512
  }
388
513
 
389
514
  private getDriver(qb: SelectQueryBuilder<any>) {
@@ -391,6 +516,16 @@ export class CrudHelperService {
391
516
  }
392
517
 
393
518
  private buildDateGranularityExpression(driver: string, columnExpr: string, granularity: string) {
519
+ // SECURITY: `granularity` is caller-supplied (groupBy `field:granularity`, or a filter
520
+ // func-alias) and is interpolated into a quoted SQL string literal in the postgres branch
521
+ // below. Validate it for EVERY driver here rather than per-driver: the whitelist used to be
522
+ // duplicated inside the mysql/mssql switches and simply absent for postgres, which is
523
+ // exactly how a quote break-out (`x'||(SELECT version())||'`) slipped through.
524
+ if (!SUPPORTED_GRANULARITIES.includes(granularity)) {
525
+ throw new BadRequestException(
526
+ `Unsupported granularity '${this.describeInvalidField(granularity)}'. Supported granularities are: ${SUPPORTED_GRANULARITIES.join(', ')}.`
527
+ );
528
+ }
394
529
  switch (driver) {
395
530
  case 'postgres':
396
531
  case 'cockroachdb':
@@ -507,7 +642,15 @@ export class CrudHelperService {
507
642
  const orderOptions = this.orderOptions(normalizedSort);
508
643
  const orderOptionKeys = Object.keys(orderOptions) as Array<keyof typeof orderOptions>;
509
644
  orderOptionKeys.forEach((key) => {
510
- const resolvedKey = aliasMap[key] || key as string;
645
+ // SECURITY: in a grouped query the only legally sortable names are the declared
646
+ // group/aggregate aliases. Falling back to the raw key spliced it into a quoted
647
+ // identifier, which an embedded double-quote could break out of.
648
+ const resolvedKey = aliasMap[key];
649
+ if (!resolvedKey) {
650
+ throw new BadRequestException(
651
+ `Cannot sort by '${this.describeInvalidField(String(key))}' on a grouped query. Sort only by a groupBy or aggregate field.`
652
+ );
653
+ }
511
654
  const value = orderOptions[key] as 'ASC' | 'DESC';
512
655
  qb.addOrderBy(`"${resolvedKey}"`, value);
513
656
  });
@@ -536,12 +679,18 @@ export class CrudHelperService {
536
679
  private buildJoinQueryForRelation(qb: SelectQueryBuilder<any>, entityAlias: string, relation: string) {
537
680
  // We split the joinProperty to get the alias of the entity we are joining
538
681
  const relationParts = relation.split('.');
682
+ // SECURITY: every segment must be a real relation on the entity being walked. The canonical
683
+ // names returned here are what get spliced below, so no request string reaches the join.
684
+ const { relationSegments, leafIsRelation } = this.resolveFieldPath(qb, relationParts, { allowRelationLeaf: true });
685
+ if (!leafIsRelation) {
686
+ throw new BadRequestException(`'${this.describeInvalidField(relation)}' is not a relation and cannot be populated.`);
687
+ }
539
688
  let parentAlias = entityAlias;
540
- relationParts.forEach((part, i) => {
689
+ relationSegments.forEach((part, i) => {
541
690
  const joinProperty = `${parentAlias}.${part}`;
542
691
  // Check if the relation is already joined, if not then join it
543
692
  if (!this.isRelationJoined(qb, joinProperty)) {
544
- const joinAlias = relationParts.slice(0, i + 1).join('_');
693
+ const joinAlias = this.sanitizeAlias(relationSegments.slice(0, i + 1).join('_'));
545
694
  qb.leftJoinAndSelect(joinProperty, joinAlias);
546
695
  }
547
696
  else {
@@ -549,18 +698,49 @@ export class CrudHelperService {
549
698
  //If the join is already present, it is probably because of the relation being passed in the where filter i.e applyFilters method
550
699
  qb.addSelect(`${part}`);
551
700
  }
701
+ // NOTE: deliberately left as `part` rather than the joinAlias. That is a pre-existing
702
+ // alias-chaining bug which breaks 3+ level populate; fixing it is tracked separately so
703
+ // this security change stays behaviour-preserving for queries that work today.
552
704
  parentAlias = part; // Update the parent alias for the next iteration
553
705
  });
554
706
  return qb;
555
707
  }
556
708
 
557
- private wrapFieldWithAlias(field: string, entityAlias: string): string {
558
- if (!this.isAggregateField(field)) return `${entityAlias}.${field}`;
709
+ private wrapFieldWithAlias(qb: SelectQueryBuilder<any>, field: string, entityAlias: string): string {
710
+ // SECURITY: `qb.select()` accepts arbitrary SQL text, so the field name must be resolved
711
+ // against real metadata and the canonical column name spliced instead of the raw input.
712
+ if (!this.isAggregateField(field)) {
713
+ return `${entityAlias}.${this.resolveOwnColumn(qb, field, 'fields')}`;
714
+ }
559
715
  // For aggregate fields, extract the field name from the aggregate function & wrap it with the entity alias, if it is not already wrapped
560
716
  const fieldParts = field.split('(');
561
- const aggregateFunction = fieldParts[0];
562
- const fieldName = fieldParts[1].replace(')', '');
563
- return `${aggregateFunction}(${entityAlias}.${fieldName})`;
717
+ const aggregateFunction = fieldParts[0].trim().toUpperCase();
718
+ // Whitelist the function name too, mirroring buildAggregateExpression.
719
+ if (!SUPPORTED_FIELD_FUNCTIONS.includes(aggregateFunction)) {
720
+ throw new BadRequestException(
721
+ `Unsupported field function '${this.describeInvalidField(fieldParts[0])}'. Supported functions are: ${SUPPORTED_FIELD_FUNCTIONS.join(', ')}.`
722
+ );
723
+ }
724
+ const fieldName = fieldParts[1].replace(')', '').trim();
725
+ return `${aggregateFunction}(${entityAlias}.${this.resolveOwnColumn(qb, fieldName, 'fields')})`;
726
+ }
727
+
728
+ /**
729
+ * Resolve a single-segment column on the root entity and return its canonical name.
730
+ *
731
+ * Related (dotted) paths are rejected rather than resolved: the caller emits
732
+ * `<rootAlias>.<column>` and builds no joins, so resolving a dotted path here would splice the
733
+ * leaf against the root alias and silently read the wrong column. Such paths previously
734
+ * produced invalid SQL, so rejecting them is the honest behaviour.
735
+ */
736
+ private resolveOwnColumn(qb: SelectQueryBuilder<any>, field: string, context: string): string {
737
+ const resolved = this.resolveFieldPath(qb, field.split('.'));
738
+ if (resolved.relationSegments.length) {
739
+ throw new BadRequestException(
740
+ `Related field '${this.describeInvalidField(field)}' is not supported in '${context}'. Use 'populate' to fetch related records.`
741
+ );
742
+ }
743
+ return resolved.leafProperty;
564
744
  }
565
745
 
566
746
  isAggregateField(field: string): boolean {