@solidxai/core 0.1.13-beta.2 → 0.1.13-beta.20

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 (512) hide show
  1. package/CHANGELOG.md +9517 -0
  2. package/README.md +19 -0
  3. package/dist/commands/run-tests.command.d.ts +9 -1
  4. package/dist/commands/run-tests.command.d.ts.map +1 -1
  5. package/dist/commands/run-tests.command.js +69 -6
  6. package/dist/commands/run-tests.command.js.map +1 -1
  7. package/dist/commands/seed.command.d.ts +2 -0
  8. package/dist/commands/seed.command.d.ts.map +1 -1
  9. package/dist/commands/seed.command.js +21 -0
  10. package/dist/commands/seed.command.js.map +1 -1
  11. package/dist/config/cache.options.d.ts.map +1 -1
  12. package/dist/config/cache.options.js +2 -2
  13. package/dist/config/cache.options.js.map +1 -1
  14. package/dist/constants/chatter-message.constants.d.ts +1 -0
  15. package/dist/constants/chatter-message.constants.d.ts.map +1 -1
  16. package/dist/constants/chatter-message.constants.js +3 -1
  17. package/dist/constants/chatter-message.constants.js.map +1 -1
  18. package/dist/constants/draft-publish-fields.d.ts +2 -0
  19. package/dist/constants/draft-publish-fields.d.ts.map +1 -0
  20. package/dist/constants/draft-publish-fields.js +5 -0
  21. package/dist/constants/draft-publish-fields.js.map +1 -0
  22. package/dist/constants/error-messages.d.ts +7 -0
  23. package/dist/constants/error-messages.d.ts.map +1 -1
  24. package/dist/constants/error-messages.js +7 -0
  25. package/dist/constants/error-messages.js.map +1 -1
  26. package/dist/constants/media-file-types.d.ts +12 -0
  27. package/dist/constants/media-file-types.d.ts.map +1 -1
  28. package/dist/constants/media-file-types.js +65 -1
  29. package/dist/constants/media-file-types.js.map +1 -1
  30. package/dist/constants/success-messages.d.ts +3 -0
  31. package/dist/constants/success-messages.d.ts.map +1 -1
  32. package/dist/constants/success-messages.js +3 -0
  33. package/dist/constants/success-messages.js.map +1 -1
  34. package/dist/constants/user.constants.d.ts +2 -0
  35. package/dist/constants/user.constants.d.ts.map +1 -0
  36. package/dist/constants/user.constants.js +5 -0
  37. package/dist/constants/user.constants.js.map +1 -0
  38. package/dist/controllers/action-metadata.controller.d.ts +1 -1
  39. package/dist/controllers/action-metadata.controller.js +1 -1
  40. package/dist/controllers/agent-event.controller.d.ts +1 -1
  41. package/dist/controllers/agent-event.controller.js +1 -1
  42. package/dist/controllers/agent-session.controller.d.ts +1 -1
  43. package/dist/controllers/agent-session.controller.js +1 -1
  44. package/dist/controllers/authentication.controller.d.ts +1 -1
  45. package/dist/controllers/authentication.controller.d.ts.map +1 -1
  46. package/dist/controllers/authentication.controller.js +4 -3
  47. package/dist/controllers/authentication.controller.js.map +1 -1
  48. package/dist/controllers/chatter-message.controller.d.ts +5 -0
  49. package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
  50. package/dist/controllers/chatter-message.controller.js +14 -0
  51. package/dist/controllers/chatter-message.controller.js.map +1 -1
  52. package/dist/controllers/dashboard-user-layout.controller.d.ts +1 -1
  53. package/dist/controllers/dashboard-user-layout.controller.js +1 -1
  54. package/dist/controllers/email-template.controller.d.ts +1 -1
  55. package/dist/controllers/email-template.controller.js +1 -1
  56. package/dist/controllers/export-template.controller.d.ts +1 -1
  57. package/dist/controllers/export-template.controller.d.ts.map +1 -1
  58. package/dist/controllers/export-template.controller.js +6 -4
  59. package/dist/controllers/export-template.controller.js.map +1 -1
  60. package/dist/controllers/export-transaction.controller.d.ts +1 -1
  61. package/dist/controllers/export-transaction.controller.js +1 -1
  62. package/dist/controllers/field-metadata.controller.d.ts +2 -2
  63. package/dist/controllers/import-transaction-error-log.controller.d.ts +1 -1
  64. package/dist/controllers/import-transaction-error-log.controller.js +1 -1
  65. package/dist/controllers/import-transaction.controller.d.ts +1 -1
  66. package/dist/controllers/import-transaction.controller.d.ts.map +1 -1
  67. package/dist/controllers/import-transaction.controller.js +7 -7
  68. package/dist/controllers/import-transaction.controller.js.map +1 -1
  69. package/dist/controllers/list-of-values.controller.d.ts +1 -1
  70. package/dist/controllers/list-of-values.controller.js +1 -1
  71. package/dist/controllers/locale.controller.d.ts +1 -1
  72. package/dist/controllers/locale.controller.js +1 -1
  73. package/dist/controllers/mcp-audit-log.controller.d.ts +1 -1
  74. package/dist/controllers/mcp-audit-log.controller.js +1 -1
  75. package/dist/controllers/media.controller.d.ts +2 -2
  76. package/dist/controllers/media.controller.d.ts.map +1 -1
  77. package/dist/controllers/media.controller.js +13 -8
  78. package/dist/controllers/media.controller.js.map +1 -1
  79. package/dist/controllers/menu-item-metadata.controller.d.ts +1 -1
  80. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  81. package/dist/controllers/model-sequence.controller.d.ts +1 -1
  82. package/dist/controllers/model-sequence.controller.js +1 -1
  83. package/dist/controllers/module-package.controller.d.ts.map +1 -1
  84. package/dist/controllers/module-package.controller.js +2 -3
  85. package/dist/controllers/module-package.controller.js.map +1 -1
  86. package/dist/controllers/mpin-authentication.controller.d.ts +44 -0
  87. package/dist/controllers/mpin-authentication.controller.d.ts.map +1 -0
  88. package/dist/controllers/mpin-authentication.controller.js +102 -0
  89. package/dist/controllers/mpin-authentication.controller.js.map +1 -0
  90. package/dist/controllers/mq-message-queue.controller.d.ts +1 -1
  91. package/dist/controllers/mq-message-queue.controller.js +1 -1
  92. package/dist/controllers/mq-message.controller.d.ts +1 -1
  93. package/dist/controllers/mq-message.controller.js +1 -1
  94. package/dist/controllers/permission-metadata.controller.d.ts +1 -1
  95. package/dist/controllers/permission-metadata.controller.js +1 -1
  96. package/dist/controllers/role-metadata.controller.d.ts +1 -1
  97. package/dist/controllers/role-metadata.controller.js +1 -1
  98. package/dist/controllers/saved-filters.controller.d.ts +1 -1
  99. package/dist/controllers/saved-filters.controller.js +1 -1
  100. package/dist/controllers/scheduled-job.controller.d.ts +1 -1
  101. package/dist/controllers/scheduled-job.controller.js +1 -1
  102. package/dist/controllers/security-rule.controller.d.ts +1 -1
  103. package/dist/controllers/security-rule.controller.js +1 -1
  104. package/dist/controllers/sms-template.controller.d.ts +1 -1
  105. package/dist/controllers/sms-template.controller.js +1 -1
  106. package/dist/controllers/user-activity-history.controller.d.ts +1 -1
  107. package/dist/controllers/user-activity-history.controller.js +1 -1
  108. package/dist/controllers/user-view-metadata.controller.d.ts +1 -1
  109. package/dist/controllers/user-view-metadata.controller.js +1 -1
  110. package/dist/controllers/user.controller.d.ts +2 -2
  111. package/dist/controllers/user.controller.js +2 -2
  112. package/dist/controllers/view-metadata.controller.d.ts +2 -2
  113. package/dist/controllers/view-metadata.controller.js +1 -1
  114. package/dist/controllers/workflow-definition.controller.d.ts +1 -1
  115. package/dist/controllers/workflow-definition.controller.js +1 -1
  116. package/dist/controllers/workflow-execution-artifact.controller.d.ts +1 -1
  117. package/dist/controllers/workflow-execution-artifact.controller.js +1 -1
  118. package/dist/controllers/workflow-execution-log.controller.d.ts +1 -1
  119. package/dist/controllers/workflow-execution-log.controller.js +1 -1
  120. package/dist/controllers/workflow-execution.controller.d.ts +1 -1
  121. package/dist/controllers/workflow-execution.controller.js +1 -1
  122. package/dist/controllers/workflow-secret.controller.d.ts +1 -1
  123. package/dist/controllers/workflow-secret.controller.js +1 -1
  124. package/dist/controllers/workflow-step-execution.controller.d.ts +1 -1
  125. package/dist/controllers/workflow-step-execution.controller.js +1 -1
  126. package/dist/controllers/workflow-trigger-execution.controller.d.ts +1 -1
  127. package/dist/controllers/workflow-trigger-execution.controller.js +1 -1
  128. package/dist/dtos/basic-filters.dto.d.ts +0 -1
  129. package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
  130. package/dist/dtos/basic-filters.dto.js +1 -6
  131. package/dist/dtos/basic-filters.dto.js.map +1 -1
  132. package/dist/dtos/change-mpin.dto.d.ts +6 -0
  133. package/dist/dtos/change-mpin.dto.d.ts.map +1 -0
  134. package/dist/dtos/change-mpin.dto.js +39 -0
  135. package/dist/dtos/change-mpin.dto.js.map +1 -0
  136. package/dist/dtos/create-field-metadata.dto.d.ts +2 -6
  137. package/dist/dtos/create-field-metadata.dto.d.ts.map +1 -1
  138. package/dist/dtos/create-field-metadata.dto.js +4 -10
  139. package/dist/dtos/create-field-metadata.dto.js.map +1 -1
  140. package/dist/dtos/create-model-sequence.dto.d.ts +1 -1
  141. package/dist/dtos/create-model-sequence.dto.d.ts.map +1 -1
  142. package/dist/dtos/create-model-sequence.dto.js +1 -1
  143. package/dist/dtos/create-model-sequence.dto.js.map +1 -1
  144. package/dist/dtos/mpin-login.dto.d.ts +5 -0
  145. package/dist/dtos/mpin-login.dto.d.ts.map +1 -0
  146. package/dist/dtos/mpin-login.dto.js +33 -0
  147. package/dist/dtos/mpin-login.dto.js.map +1 -0
  148. package/dist/dtos/setup-mpin.dto.d.ts +7 -0
  149. package/dist/dtos/setup-mpin.dto.d.ts.map +1 -0
  150. package/dist/dtos/setup-mpin.dto.js +47 -0
  151. package/dist/dtos/setup-mpin.dto.js.map +1 -0
  152. package/dist/entities/common.entity.d.ts +4 -0
  153. package/dist/entities/common.entity.d.ts.map +1 -1
  154. package/dist/entities/common.entity.js +25 -1
  155. package/dist/entities/common.entity.js.map +1 -1
  156. package/dist/entities/dashboard-user-layout.entity.js +2 -2
  157. package/dist/entities/dashboard-user-layout.entity.js.map +1 -1
  158. package/dist/entities/saved-filters.entity.js +3 -3
  159. package/dist/entities/saved-filters.entity.js.map +1 -1
  160. package/dist/entities/user-device-credential.entity.d.ts +18 -0
  161. package/dist/entities/user-device-credential.entity.d.ts.map +1 -0
  162. package/dist/entities/user-device-credential.entity.js +91 -0
  163. package/dist/entities/user-device-credential.entity.js.map +1 -0
  164. package/dist/entities/user.entity.d.ts.map +1 -1
  165. package/dist/entities/user.entity.js +36 -0
  166. package/dist/entities/user.entity.js.map +1 -1
  167. package/dist/entities/view-metadata.entity.js.map +1 -1
  168. package/dist/entities/workflow-execution-artifact.entity.d.ts.map +1 -1
  169. package/dist/entities/workflow-execution-artifact.entity.js +4 -3
  170. package/dist/entities/workflow-execution-artifact.entity.js.map +1 -1
  171. package/dist/entities/workflow-execution-log.entity.d.ts.map +1 -1
  172. package/dist/entities/workflow-execution-log.entity.js +4 -3
  173. package/dist/entities/workflow-execution-log.entity.js.map +1 -1
  174. package/dist/entities/workflow-execution.entity.d.ts.map +1 -1
  175. package/dist/entities/workflow-execution.entity.js +3 -2
  176. package/dist/entities/workflow-execution.entity.js.map +1 -1
  177. package/dist/entities/workflow-secret.entity.d.ts.map +1 -1
  178. package/dist/entities/workflow-secret.entity.js +3 -2
  179. package/dist/entities/workflow-secret.entity.js.map +1 -1
  180. package/dist/entities/workflow-step-execution.entity.d.ts.map +1 -1
  181. package/dist/entities/workflow-step-execution.entity.js +3 -2
  182. package/dist/entities/workflow-step-execution.entity.js.map +1 -1
  183. package/dist/entities/workflow-trigger-execution.entity.d.ts.map +1 -1
  184. package/dist/entities/workflow-trigger-execution.entity.js +7 -6
  185. package/dist/entities/workflow-trigger-execution.entity.js.map +1 -1
  186. package/dist/factories/mail.factory.d.ts.map +1 -1
  187. package/dist/factories/mail.factory.js +4 -0
  188. package/dist/factories/mail.factory.js.map +1 -1
  189. package/dist/filters/http-exception.filter.d.ts.map +1 -1
  190. package/dist/filters/http-exception.filter.js +5 -1
  191. package/dist/filters/http-exception.filter.js.map +1 -1
  192. package/dist/helpers/bootstrap.helper.d.ts +5 -2
  193. package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
  194. package/dist/helpers/bootstrap.helper.js +7 -3
  195. package/dist/helpers/bootstrap.helper.js.map +1 -1
  196. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts +1 -0
  197. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
  198. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +18 -11
  199. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js.map +1 -1
  200. package/dist/helpers/file-download.helper.d.ts +9 -0
  201. package/dist/helpers/file-download.helper.d.ts.map +1 -0
  202. package/dist/helpers/file-download.helper.js +19 -0
  203. package/dist/helpers/file-download.helper.js.map +1 -0
  204. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  205. package/dist/helpers/model-metadata-helper.service.js +30 -1
  206. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  207. package/dist/helpers/security.helper.d.ts +5 -1
  208. package/dist/helpers/security.helper.d.ts.map +1 -1
  209. package/dist/helpers/security.helper.js +15 -4
  210. package/dist/helpers/security.helper.js.map +1 -1
  211. package/dist/helpers/solid-core-error-codes-provider.service.d.ts.map +1 -1
  212. package/dist/helpers/solid-core-error-codes-provider.service.js +45 -0
  213. package/dist/helpers/solid-core-error-codes-provider.service.js.map +1 -1
  214. package/dist/helpers/solid-microservice-adapter.service.d.ts.map +1 -1
  215. package/dist/helpers/solid-microservice-adapter.service.js +1 -1
  216. package/dist/helpers/solid-microservice-adapter.service.js.map +1 -1
  217. package/dist/helpers/solid-registry.js +1 -1
  218. package/dist/helpers/solid-registry.js.map +1 -1
  219. package/dist/helpers/typeorm-db-helper.d.ts.map +1 -1
  220. package/dist/helpers/typeorm-db-helper.js +9 -0
  221. package/dist/helpers/typeorm-db-helper.js.map +1 -1
  222. package/dist/index.d.ts +10 -0
  223. package/dist/index.d.ts.map +1 -1
  224. package/dist/index.js +10 -0
  225. package/dist/index.js.map +1 -1
  226. package/dist/interfaces/active-user-data.interface.d.ts +1 -0
  227. package/dist/interfaces/active-user-data.interface.d.ts.map +1 -1
  228. package/dist/interfaces/active-user-data.interface.js.map +1 -1
  229. package/dist/interfaces.d.ts +1 -0
  230. package/dist/interfaces.d.ts.map +1 -1
  231. package/dist/interfaces.js.map +1 -1
  232. package/dist/repository/user-device-credential.repository.d.ts +12 -0
  233. package/dist/repository/user-device-credential.repository.d.ts.map +1 -0
  234. package/dist/repository/user-device-credential.repository.js +34 -0
  235. package/dist/repository/user-device-credential.repository.js.map +1 -0
  236. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  237. package/dist/seeders/module-metadata-seeder.service.js +51 -30
  238. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  239. package/dist/seeders/module-test-data.service.d.ts +3 -1
  240. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  241. package/dist/seeders/module-test-data.service.js +8 -2
  242. package/dist/seeders/module-test-data.service.js.map +1 -1
  243. package/dist/seeders/seed-data/solid-core-metadata.json +290 -78
  244. package/dist/services/api-key.service.d.ts.map +1 -1
  245. package/dist/services/api-key.service.js +1 -1
  246. package/dist/services/api-key.service.js.map +1 -1
  247. package/dist/services/authentication.service.d.ts +9 -5
  248. package/dist/services/authentication.service.d.ts.map +1 -1
  249. package/dist/services/authentication.service.js +102 -23
  250. package/dist/services/authentication.service.js.map +1 -1
  251. package/dist/services/chatter-message.service.d.ts +15 -1
  252. package/dist/services/chatter-message.service.d.ts.map +1 -1
  253. package/dist/services/chatter-message.service.js +56 -4
  254. package/dist/services/chatter-message.service.js.map +1 -1
  255. package/dist/services/crud-helper.service.d.ts +6 -4
  256. package/dist/services/crud-helper.service.d.ts.map +1 -1
  257. package/dist/services/crud-helper.service.js +32 -48
  258. package/dist/services/crud-helper.service.js.map +1 -1
  259. package/dist/services/crud.service.d.ts +13 -1
  260. package/dist/services/crud.service.d.ts.map +1 -1
  261. package/dist/services/crud.service.js +93 -68
  262. package/dist/services/crud.service.js.map +1 -1
  263. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  264. package/dist/services/datasource-introspection.service.js.map +1 -1
  265. package/dist/services/draft-publish-helper.service.d.ts +53 -0
  266. package/dist/services/draft-publish-helper.service.d.ts.map +1 -0
  267. package/dist/services/draft-publish-helper.service.js +402 -0
  268. package/dist/services/draft-publish-helper.service.js.map +1 -0
  269. package/dist/services/field-metadata.service.d.ts +2 -2
  270. package/dist/services/field-metadata.service.d.ts.map +1 -1
  271. package/dist/services/field-metadata.service.js +2 -1
  272. package/dist/services/field-metadata.service.js.map +1 -1
  273. package/dist/services/internationalisation-helper.service.d.ts +19 -0
  274. package/dist/services/internationalisation-helper.service.d.ts.map +1 -0
  275. package/dist/services/internationalisation-helper.service.js +107 -0
  276. package/dist/services/internationalisation-helper.service.js.map +1 -0
  277. package/dist/services/locale.service.d.ts +1 -1
  278. package/dist/services/media-storage.utils.d.ts +1 -0
  279. package/dist/services/media-storage.utils.d.ts.map +1 -1
  280. package/dist/services/media-storage.utils.js +12 -1
  281. package/dist/services/media-storage.utils.js.map +1 -1
  282. package/dist/services/media.service.d.ts +3 -2
  283. package/dist/services/media.service.d.ts.map +1 -1
  284. package/dist/services/media.service.js +44 -29
  285. package/dist/services/media.service.js.map +1 -1
  286. package/dist/services/metadata-validation.service.d.ts +7 -0
  287. package/dist/services/metadata-validation.service.d.ts.map +1 -0
  288. package/dist/services/metadata-validation.service.js +42 -0
  289. package/dist/services/metadata-validation.service.js.map +1 -0
  290. package/dist/services/model-metadata.service.d.ts.map +1 -1
  291. package/dist/services/model-metadata.service.js +2 -1
  292. package/dist/services/model-metadata.service.js.map +1 -1
  293. package/dist/services/module-metadata.service.d.ts.map +1 -1
  294. package/dist/services/module-metadata.service.js +2 -1
  295. package/dist/services/module-metadata.service.js.map +1 -1
  296. package/dist/services/mpin.service.d.ts +67 -0
  297. package/dist/services/mpin.service.d.ts.map +1 -0
  298. package/dist/services/mpin.service.js +282 -0
  299. package/dist/services/mpin.service.js.map +1 -0
  300. package/dist/services/object.utils.d.ts +2 -0
  301. package/dist/services/object.utils.d.ts.map +1 -0
  302. package/dist/services/object.utils.js +11 -0
  303. package/dist/services/object.utils.js.map +1 -0
  304. package/dist/services/refresh-token-ids-storage.service.d.ts +25 -6
  305. package/dist/services/refresh-token-ids-storage.service.d.ts.map +1 -1
  306. package/dist/services/refresh-token-ids-storage.service.js +80 -42
  307. package/dist/services/refresh-token-ids-storage.service.js.map +1 -1
  308. package/dist/services/setting.service.d.ts.map +1 -1
  309. package/dist/services/setting.service.js +2 -1
  310. package/dist/services/setting.service.js.map +1 -1
  311. package/dist/services/settings/default-settings-provider.service.d.ts +228 -12
  312. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  313. package/dist/services/settings/default-settings-provider.service.js +129 -6
  314. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  315. package/dist/services/user.service.d.ts +2 -2
  316. package/dist/services/user.service.d.ts.map +1 -1
  317. package/dist/services/user.service.js +9 -3
  318. package/dist/services/user.service.js.map +1 -1
  319. package/dist/services/view-metadata.service.d.ts +1 -2
  320. package/dist/services/view-metadata.service.d.ts.map +1 -1
  321. package/dist/services/view-metadata.service.js +3 -55
  322. package/dist/services/view-metadata.service.js.map +1 -1
  323. package/dist/services/workflow/nodes/execution-fail.node.d.ts +6 -0
  324. package/dist/services/workflow/nodes/execution-fail.node.d.ts.map +1 -0
  325. package/dist/services/workflow/nodes/execution-fail.node.js +81 -0
  326. package/dist/services/workflow/nodes/execution-fail.node.js.map +1 -0
  327. package/dist/services/workflow/nodes/for-each.node.d.ts +2 -0
  328. package/dist/services/workflow/nodes/for-each.node.d.ts.map +1 -1
  329. package/dist/services/workflow/nodes/for-each.node.js +114 -5
  330. package/dist/services/workflow/nodes/for-each.node.js.map +1 -1
  331. package/dist/services/workflow/nodes/if.node.d.ts.map +1 -1
  332. package/dist/services/workflow/nodes/if.node.js +7 -0
  333. package/dist/services/workflow/nodes/if.node.js.map +1 -1
  334. package/dist/services/workflow/nodes/log-write.node.d.ts.map +1 -1
  335. package/dist/services/workflow/nodes/log-write.node.js +2 -0
  336. package/dist/services/workflow/nodes/log-write.node.js.map +1 -1
  337. package/dist/services/workflow/nodes/loop-until.node.d.ts +12 -0
  338. package/dist/services/workflow/nodes/loop-until.node.d.ts.map +1 -0
  339. package/dist/services/workflow/nodes/loop-until.node.js +281 -0
  340. package/dist/services/workflow/nodes/loop-until.node.js.map +1 -0
  341. package/dist/services/workflow/nodes/parallel.node.d.ts.map +1 -1
  342. package/dist/services/workflow/nodes/parallel.node.js +7 -0
  343. package/dist/services/workflow/nodes/parallel.node.js.map +1 -1
  344. package/dist/services/workflow/nodes/sequential.node.d.ts.map +1 -1
  345. package/dist/services/workflow/nodes/sequential.node.js +7 -0
  346. package/dist/services/workflow/nodes/sequential.node.js.map +1 -1
  347. package/dist/services/workflow/nodes/switch.node.d.ts.map +1 -1
  348. package/dist/services/workflow/nodes/switch.node.js +7 -0
  349. package/dist/services/workflow/nodes/switch.node.js.map +1 -1
  350. package/dist/services/workflow/workflow-definition-validator.service.d.ts.map +1 -1
  351. package/dist/services/workflow/workflow-definition-validator.service.js +5 -2
  352. package/dist/services/workflow/workflow-definition-validator.service.js.map +1 -1
  353. package/dist/services/workflow/workflow-expression.service.d.ts.map +1 -1
  354. package/dist/services/workflow/workflow-expression.service.js +5 -0
  355. package/dist/services/workflow/workflow-expression.service.js.map +1 -1
  356. package/dist/services/workflow/workflow-node-registry.service.d.ts +2 -1
  357. package/dist/services/workflow/workflow-node-registry.service.d.ts.map +1 -1
  358. package/dist/services/workflow/workflow-node-registry.service.js +7 -0
  359. package/dist/services/workflow/workflow-node-registry.service.js.map +1 -1
  360. package/dist/services/workflow/workflow-runtime.service.d.ts +8 -0
  361. package/dist/services/workflow/workflow-runtime.service.d.ts.map +1 -1
  362. package/dist/services/workflow/workflow-runtime.service.js +197 -32
  363. package/dist/services/workflow/workflow-runtime.service.js.map +1 -1
  364. package/dist/services/workflow-definition.service.d.ts +1 -1
  365. package/dist/solid-core.module.d.ts +1 -3
  366. package/dist/solid-core.module.d.ts.map +1 -1
  367. package/dist/solid-core.module.js +22 -40
  368. package/dist/solid-core.module.js.map +1 -1
  369. package/dist/testing/adapters/ui/playwright-adapter.d.ts +5 -0
  370. package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -1
  371. package/dist/testing/adapters/ui/playwright-adapter.js +17 -1
  372. package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -1
  373. package/dist/testing/adapters/ui/ui.types.d.ts +2 -0
  374. package/dist/testing/adapters/ui/ui.types.d.ts.map +1 -1
  375. package/dist/testing/adapters/ui/ui.types.js.map +1 -1
  376. package/dist/testing/reporter/console-reporter.d.ts +3 -0
  377. package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
  378. package/dist/testing/reporter/console-reporter.js +2 -0
  379. package/dist/testing/reporter/console-reporter.js.map +1 -1
  380. package/dist/testing/reporter/progress-reporter.d.ts +64 -0
  381. package/dist/testing/reporter/progress-reporter.d.ts.map +1 -0
  382. package/dist/testing/reporter/progress-reporter.js +224 -0
  383. package/dist/testing/reporter/progress-reporter.js.map +1 -0
  384. package/dist/testing/reporter/reporter.types.d.ts +3 -0
  385. package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
  386. package/dist/testing/reporter/reporter.types.js.map +1 -1
  387. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
  388. package/dist/testing/runner/run-from-metadata.js +1 -0
  389. package/dist/testing/runner/run-from-metadata.js.map +1 -1
  390. package/dist/testing/steps/ui/actions.step.d.ts.map +1 -1
  391. package/dist/testing/steps/ui/actions.step.js +6 -2
  392. package/dist/testing/steps/ui/actions.step.js.map +1 -1
  393. package/dist/testing/steps/ui/assertions.step.d.ts.map +1 -1
  394. package/dist/testing/steps/ui/assertions.step.js +11 -3
  395. package/dist/testing/steps/ui/assertions.step.js.map +1 -1
  396. package/dist/testing/steps/ui/form.step.d.ts.map +1 -1
  397. package/dist/testing/steps/ui/form.step.js +9 -3
  398. package/dist/testing/steps/ui/form.step.js.map +1 -1
  399. package/dist/testing/steps/ui/manual.step.js +1 -1
  400. package/dist/testing/steps/ui/manual.step.js.map +1 -1
  401. package/dist/testing/steps/ui/navigation.step.d.ts.map +1 -1
  402. package/dist/testing/steps/ui/navigation.step.js +3 -1
  403. package/dist/testing/steps/ui/navigation.step.js.map +1 -1
  404. package/dist/theme/theme-registry.d.ts +14 -0
  405. package/dist/theme/theme-registry.d.ts.map +1 -0
  406. package/dist/theme/theme-registry.js +147 -0
  407. package/dist/theme/theme-registry.js.map +1 -0
  408. package/dist/types/workflow-dsl.types.d.ts +14 -0
  409. package/dist/types/workflow-dsl.types.d.ts.map +1 -1
  410. package/dist/types/workflow-dsl.types.js.map +1 -1
  411. package/package.json +2 -2
  412. package/postman/mpin.postman_collection.json +1045 -0
  413. package/src/commands/run-tests.command.ts +64 -4
  414. package/src/commands/seed.command.ts +19 -0
  415. package/src/config/cache.options.ts +9 -1
  416. package/src/constants/chatter-message.constants.ts +12 -0
  417. package/src/constants/draft-publish-fields.ts +5 -0
  418. package/src/constants/error-messages.ts +14 -0
  419. package/src/constants/media-file-types.ts +127 -0
  420. package/src/constants/success-messages.ts +5 -0
  421. package/src/constants/user.constants.ts +13 -0
  422. package/src/controllers/authentication.controller.ts +5 -2
  423. package/src/controllers/chatter-message.controller.ts +8 -0
  424. package/src/controllers/export-template.controller.ts +5 -3
  425. package/src/controllers/import-transaction.controller.ts +6 -6
  426. package/src/controllers/media.controller.ts +17 -6
  427. package/src/controllers/module-package.controller.ts +2 -3
  428. package/src/controllers/mpin-authentication.controller.ts +67 -0
  429. package/src/dtos/basic-filters.dto.ts +0 -4
  430. package/src/dtos/change-mpin.dto.ts +18 -0
  431. package/src/dtos/create-field-metadata.dto.ts +4 -9
  432. package/src/dtos/create-model-sequence.dto.ts +1 -1
  433. package/src/dtos/mpin-login.dto.ts +24 -0
  434. package/src/dtos/setup-mpin.dto.ts +51 -0
  435. package/src/entities/common.entity.ts +24 -0
  436. package/src/entities/dashboard-user-layout.entity.ts +2 -2
  437. package/src/entities/saved-filters.entity.ts +3 -3
  438. package/src/entities/user-device-credential.entity.ts +130 -0
  439. package/src/entities/user.entity.ts +53 -36
  440. package/src/entities/view-metadata.entity.ts +2 -2
  441. package/src/entities/workflow-execution-artifact.entity.ts +4 -3
  442. package/src/entities/workflow-execution-log.entity.ts +4 -3
  443. package/src/entities/workflow-execution.entity.ts +3 -2
  444. package/src/entities/workflow-secret.entity.ts +3 -2
  445. package/src/entities/workflow-step-execution.entity.ts +3 -2
  446. package/src/entities/workflow-trigger-execution.entity.ts +7 -6
  447. package/src/factories/mail.factory.ts +7 -1
  448. package/src/filters/http-exception.filter.ts +11 -1
  449. package/src/helpers/bootstrap.helper.ts +43 -6
  450. package/src/helpers/field-crud-managers/MediaFieldCrudManager.ts +26 -12
  451. package/src/helpers/file-download.helper.ts +45 -0
  452. package/src/helpers/model-metadata-helper.service.ts +32 -1
  453. package/src/helpers/security.helper.ts +35 -8
  454. package/src/helpers/solid-core-error-codes-provider.service.ts +53 -0
  455. package/src/helpers/solid-microservice-adapter.service.ts +6 -1
  456. package/src/helpers/solid-registry.ts +1 -1
  457. package/src/helpers/typeorm-db-helper.ts +12 -1
  458. package/src/index.ts +10 -0
  459. package/src/interfaces/active-user-data.interface.ts +9 -0
  460. package/src/interfaces.ts +1 -0
  461. package/src/repository/user-device-credential.repository.ts +17 -0
  462. package/src/seeders/module-metadata-seeder.service.ts +61 -39
  463. package/src/seeders/module-test-data.service.ts +6 -0
  464. package/src/seeders/seed-data/solid-core-metadata.json +290 -78
  465. package/src/services/api-key.service.ts +13 -1
  466. package/src/services/authentication.service.ts +203 -41
  467. package/src/services/chatter-message.service.ts +124 -5
  468. package/src/services/crud-helper.service.ts +35 -50
  469. package/src/services/crud.service.ts +131 -105
  470. package/src/services/datasource-introspection.service.ts +5 -0
  471. package/src/services/draft-publish-helper.service.ts +581 -0
  472. package/src/services/field-metadata.service.ts +3 -2
  473. package/src/services/internationalisation-helper.service.ts +148 -0
  474. package/src/services/media-storage.utils.ts +26 -1
  475. package/src/services/media.service.ts +67 -36
  476. package/src/services/metadata-validation.service.ts +39 -0
  477. package/src/services/model-metadata.service.ts +4 -1
  478. package/src/services/module-metadata.service.ts +3 -1
  479. package/src/services/mpin.service.ts +447 -0
  480. package/src/services/object.utils.ts +10 -0
  481. package/src/services/refresh-token-ids-storage.service.ts +229 -90
  482. package/src/services/setting.service.ts +3 -1
  483. package/src/services/settings/default-settings-provider.service.ts +140 -6
  484. package/src/services/user.service.ts +18 -3
  485. package/src/services/view-metadata.service.ts +5 -145
  486. package/src/services/workflow/nodes/execution-fail.node.ts +82 -0
  487. package/src/services/workflow/nodes/for-each.node.ts +140 -6
  488. package/src/services/workflow/nodes/if.node.ts +7 -0
  489. package/src/services/workflow/nodes/log-write.node.ts +2 -0
  490. package/src/services/workflow/nodes/loop-until.node.ts +343 -0
  491. package/src/services/workflow/nodes/parallel.node.ts +7 -0
  492. package/src/services/workflow/nodes/sequential.node.ts +7 -0
  493. package/src/services/workflow/nodes/switch.node.ts +7 -0
  494. package/src/services/workflow/workflow-definition-validator.service.ts +5 -2
  495. package/src/services/workflow/workflow-expression.service.ts +5 -0
  496. package/src/services/workflow/workflow-node-registry.service.ts +11 -0
  497. package/src/services/workflow/workflow-runtime.service.ts +274 -39
  498. package/src/solid-core.module.ts +33 -15
  499. package/src/testing/README.md +75 -3
  500. package/src/testing/adapters/ui/playwright-adapter.ts +25 -0
  501. package/src/testing/adapters/ui/ui.types.ts +2 -0
  502. package/src/testing/reporter/console-reporter.ts +4 -0
  503. package/src/testing/reporter/progress-reporter.ts +251 -0
  504. package/src/testing/reporter/reporter.types.ts +3 -0
  505. package/src/testing/runner/run-from-metadata.ts +1 -0
  506. package/src/testing/steps/ui/actions.step.ts +8 -4
  507. package/src/testing/steps/ui/assertions.step.ts +18 -5
  508. package/src/testing/steps/ui/form.step.ts +16 -6
  509. package/src/testing/steps/ui/manual.step.ts +1 -1
  510. package/src/testing/steps/ui/navigation.step.ts +4 -2
  511. package/src/theme/theme-registry.ts +181 -0
  512. package/src/types/workflow-dsl.types.ts +43 -0
@@ -3,9 +3,12 @@ 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',
@@ -36,10 +39,14 @@ export interface ResolvedFieldPath {
36
39
  leafIsRelation: boolean;
37
40
  }
38
41
 
42
+ @Injectable()
39
43
  export class CrudHelperService {
44
+ private readonly logger = new Logger(CrudHelperService.name);
45
+
40
46
  constructor(
47
+ private readonly draftPublishHelperService: DraftPublishHelperService,
48
+ private readonly internationalisationHelperService: InternationalisationHelperService,
41
49
  ) { }
42
- private readonly logger = new Logger(CrudHelperService.name);
43
50
 
44
51
  /**
45
52
  * Resolve a user-supplied dotted path (e.g. "customer.name") against real TypeORM metadata.
@@ -163,7 +170,7 @@ export class CrudHelperService {
163
170
  }
164
171
 
165
172
  applyFilters(qb: WhereExpressionBuilder, filters: any, alias: string = 'entity', selectQb: SelectQueryBuilder<any>) {
166
- const normalizedFilters = this.normalizeObjectKeys(filters);
173
+ const normalizedFilters = normalizeObjectKeys(filters);
167
174
  if (normalizedFilters.$and) {
168
175
  normalizedFilters.$and.forEach((andFilter: any) => {
169
176
  qb.andWhere(
@@ -182,7 +189,7 @@ export class CrudHelperService {
182
189
  // For individual conditions
183
190
  Object.keys(normalizedFilters).forEach(key => {
184
191
  const primaryFilterObj = normalizedFilters[key];
185
- const normalizedPrimaryFilterObj = this.normalizeObjectKeys(primaryFilterObj);
192
+ const normalizedPrimaryFilterObj = normalizeObjectKeys(primaryFilterObj);
186
193
 
187
194
  const [rawField, funcAlias] = key.split(':');
188
195
 
@@ -312,17 +319,6 @@ export class CrudHelperService {
312
319
  }
313
320
  }
314
321
 
315
- // Normalize the primary operator object by removing the surrounding brackets in the keys e.g [$eq] => $eq
316
- private normalizeObjectKeys(obj: any): any {
317
- return Object.keys(obj).reduce((acc, key) => {
318
- // Transform the key by removing surrounding brackets
319
- const newKey = key.replace(/^\[(.*)\]$/, '$1');
320
- // Assign the value to the transformed key in the accumulator object
321
- acc[newKey] = obj[key];
322
- return acc;
323
- }, {});
324
- }
325
-
326
322
  normalize(value: string | string[]): string[] {
327
323
  if (!value) return []; // if the value is nullish, then return an empty array
328
324
  return Array.isArray(value) ? value : [value]; // if the value is an array, return it as is, otherwise return it as an array
@@ -359,7 +355,7 @@ export class CrudHelperService {
359
355
  applySorting: boolean = true
360
356
  ): SelectQueryBuilder<any> { // TODO : Check how to pass a type to SelectQueryBuilder instead of any
361
357
  let { limit, offset, showSoftDeleted, filters } = basicFilterDto;
362
- const { fields, sort, populate = [], populateMedia = [], locale, status } = basicFilterDto;
358
+ const { fields, sort, populate = [], populateMedia = [], locale } = basicFilterDto;
363
359
 
364
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)
365
361
  const normalizedFields = this.normalize(fields);
@@ -390,28 +386,14 @@ export class CrudHelperService {
390
386
  }
391
387
  }
392
388
 
393
- let finalLocale = locale
394
389
  if (internationalisation) {
395
- // If locale is not provided in the filter dto, then assume it is the default locale to be used.
396
- if (!finalLocale) {
397
- //Get default locale from registry
398
- const solidRegistry = moduleRef.get(SolidRegistry, { strict: false });
399
- const defaultLocale = solidRegistry.getDefaultLocale();
400
- if(defaultLocale){
401
- finalLocale = defaultLocale.locale;
402
- }else{
403
- finalLocale = 'en';
404
- }
405
- }
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 }));
406
392
  qb.andWhere(`${entityAlias}.localeName = :locale`, { locale: finalLocale });
407
393
  }
408
394
 
409
- if (draftPublishWorkflow && status) {
410
- if (basicFilterDto.status === 'published') {
411
- qb.andWhere(`${entityAlias}.publishedAt IS NOT NULL`);
412
- } else if (basicFilterDto.status === 'draft') {
413
- qb.andWhere(`${entityAlias}.publishedAt IS NULL`);
414
- }
395
+ if (draftPublishWorkflow) {
396
+ this.draftPublishHelperService.applyDraftPublishFilterDefaults(qb, filters, entityAlias);
415
397
  }
416
398
  // Depending upon the select option, apply the select clause
417
399
  if (normalizedFields && normalizedFields.length) {
@@ -907,25 +889,25 @@ export class CrudHelperService {
907
889
  };
908
890
  }
909
891
 
910
- async countGroupedRecords(qb: SelectQueryBuilder<any>, basicFilterDto: BasicFilterDto, entityAlias: string) { //TODO : Check how to pass a type to SelectQueryBuilder instead of any
911
- const { limit, offset, ...rest } = basicFilterDto;
912
- const filteredDto = { ...rest, limit: undefined, offset: undefined };
892
+ // async countGroupedRecords(qb: SelectQueryBuilder<any>, basicFilterDto: BasicFilterDto, entityAlias: string, internationalisation?: boolean, draftPublishWorkflow?: boolean, moduleRef?: any) { //TODO : Check how to pass a type to SelectQueryBuilder instead of any
893
+ // const { limit, offset, ...rest } = basicFilterDto;
894
+ // const filteredDto = { ...rest, limit: undefined, offset: undefined };
913
895
 
914
- const filteredQB = this.buildFilterQuery(qb, filteredDto as BasicFilterDto, entityAlias, undefined, undefined, undefined, FilterCombinator.AND, false, false);
896
+ // const filteredQB = this.buildFilterQuery(qb, filteredDto as BasicFilterDto, entityAlias, internationalisation, draftPublishWorkflow, moduleRef, FilterCombinator.AND, false, false);
915
897
 
916
- const groupByFields = this.normalize(filteredDto.groupBy);
898
+ // const groupByFields = this.normalize(filteredDto.groupBy);
917
899
 
918
- if (!groupByFields || groupByFields.length === 0) {
919
- throw new Error(ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);
920
- }
900
+ // if (!groupByFields || groupByFields.length === 0) {
901
+ // throw new Error(ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);
902
+ // }
921
903
 
922
- this.applyGroupBySelections(filteredQB, groupByFields, entityAlias);
923
- this.applyAggregates(filteredQB, ['count'], entityAlias);
924
- filteredQB.limit(undefined).offset(undefined).take(undefined).skip(undefined);
904
+ // this.applyGroupBySelections(filteredQB, groupByFields, entityAlias);
905
+ // this.applyAggregates(filteredQB, ['count'], entityAlias);
906
+ // filteredQB.limit(undefined).offset(undefined).take(undefined).skip(undefined);
925
907
 
926
- const rawResults = await filteredQB.getRawMany();
927
- return rawResults.length;
928
- }
908
+ // const rawResults = await filteredQB.getRawMany();
909
+ // return rawResults.length;
910
+ // }
929
911
 
930
912
  hasReadPermissionOnModel = (activeUser: ActiveUserData, modelName: string) => {
931
913
  const permissionNames = [`${classify(modelName)}Controller.findOne`, `${classify(modelName)}Controller.findMany`];
@@ -998,7 +980,10 @@ export class CrudHelperService {
998
980
  basicFilterDto: BasicFilterDto,
999
981
  alias: string,
1000
982
  createQbFn: () => Promise<SelectQueryBuilder<T>>,
1001
- postProcessEntities?: (entities: T[]) => Promise<void>
983
+ postProcessEntities?: (entities: T[]) => Promise<void>,
984
+ internationalisation?: boolean,
985
+ draftPublishWorkflow?: boolean,
986
+ moduleRef?: any
1002
987
  ): Promise<{ meta: { totalRecords: number }; groupMeta: any[]; groupRecords: any[] }> {
1003
988
  const groupByFields = this.normalize(basicFilterDto.groupBy);
1004
989
  if (!groupByFields.length) throw new BadRequestException(ERROR_MESSAGES.INVALID_GROUP_BY_COUNT);
@@ -1033,7 +1018,7 @@ export class CrudHelperService {
1033
1018
  aggregates: undefined,
1034
1019
  sort: basicFilterDto.groupFilter?.sort,
1035
1020
  };
1036
- groupQb = this.buildFilterQuery(groupQb, groupFilterDto, alias);
1021
+ groupQb = this.buildFilterQuery(groupQb, groupFilterDto, alias, internationalisation, draftPublishWorkflow, moduleRef);
1037
1022
  groupQb = this.buildGroupByRecordsQuery(groupQb, group, alias, groupAliasMap, aggregateAliasMap, groupExpressionMap);
1038
1023
  const [entities, count] = await groupQb.getManyAndCount();
1039
1024
  if (postProcessEntities) await postProcessEntities(entities);
@@ -7,6 +7,7 @@ import { SolidBaseRepository } from "../repository/solid-base.repository";
7
7
  import { SettingService } from "./setting.service";
8
8
  import { ERROR_MESSAGES } from "src/constants/error-messages";
9
9
  import { SUCCESS_MESSAGES } from "src/constants/success-messages";
10
+ import { USER_SUMMARY_FIELDS } from "src/constants/user.constants";
10
11
  import { EntityManager, FindOptionsWhere, In, IsNull, Not, QueryFailedError, SelectQueryBuilder } from "typeorm";
11
12
  import { QueryDeepPartialEntity } from "typeorm/query-builder/QueryPartialEntity";
12
13
  import { BasicFilterDto } from "../dtos/basic-filters.dto";
@@ -36,6 +37,8 @@ import { ShortTextFieldCrudManager } from "../helpers/field-crud-managers/ShortT
36
37
  import { UUIDFieldCrudManager } from "../helpers/field-crud-managers/UUIDFieldCrudManager";
37
38
  import { ModelMetadataHelperService } from "src/helpers/model-metadata-helper.service";
38
39
  import { FieldCrudManager, MediaWithFullUrl } from "../interfaces";
40
+ import { DraftPublishHelperService } from "./draft-publish-helper.service";
41
+ import { InternationalisationHelperService } from "./internationalisation-helper.service";
39
42
  import { CrudHelperService, FilterCombinator, UserIdFields } from "./crud-helper.service";
40
43
  import { HashingService } from "./hashing.service";
41
44
  import { SolidRegistry } from "src/helpers/solid-registry";
@@ -49,6 +52,8 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
49
52
 
50
53
  private _modelMetadataService: ModelMetadataService;
51
54
  private _crudHelperService: CrudHelperService;
55
+ private _draftPublishHelperService: DraftPublishHelperService;
56
+ private _internationalisationHelperService: InternationalisationHelperService;
52
57
  private _discoveryService: DiscoveryService;
53
58
  private _settingService: SettingService;
54
59
 
@@ -69,6 +74,14 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
69
74
  return this._crudHelperService ??= this.moduleRef.get(CrudHelperService, { strict: false });
70
75
  }
71
76
 
77
+ protected get draftPublishHelperService(): DraftPublishHelperService {
78
+ return this._draftPublishHelperService ??= this.moduleRef.get(DraftPublishHelperService, { strict: false });
79
+ }
80
+
81
+ protected get internationalisationHelperService(): InternationalisationHelperService {
82
+ return this._internationalisationHelperService ??= this.moduleRef.get(InternationalisationHelperService, { strict: false });
83
+ }
84
+
72
85
  protected get discoveryService(): DiscoveryService {
73
86
  return this._discoveryService ??= this.moduleRef.get(DiscoveryService, { strict: false });
74
87
  }
@@ -77,6 +90,19 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
77
90
  return this._settingService ??= this.moduleRef.get(SettingService, { strict: false });
78
91
  }
79
92
 
93
+ private getDraftPublishCrudContext() {
94
+ return {
95
+ repo: this.repo,
96
+ modelName: this.modelName,
97
+ moduleName: this.moduleName,
98
+ validateAndTransformDto: this.validateAndTransformDto.bind(this),
99
+ saveMedia: this.saveMedia.bind(this),
100
+ getDatasourceDefaultEntityManager: this.getDatasourceDefaultEntityManager.bind(this),
101
+ getColumnDatabaseName: this.getColumnDatabaseName.bind(this),
102
+ escapeDatabaseName: this.escapeDatabaseName.bind(this),
103
+ };
104
+ }
105
+
80
106
  private async tryCreateAsExtensionUser(createDto: any): Promise<T | null> {
81
107
  if (this.repo.metadata?.parentEntityMetadata?.target !== User) return null;
82
108
  const registry = this.moduleRef.get(SolidRegistry, { strict: false });
@@ -122,8 +148,11 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
122
148
  try {
123
149
  // 5. Save the entity
124
150
  // For media, we need to use a storage provider and save the media, then save the associated uri against the entity or media table
151
+ this.draftPublishHelperService.applyCreateDefaults(model, createDto);
152
+ this.internationalisationHelperService.applyCreateDefaults(model, createDto, this.moduleRef.get(SolidRegistry, { strict: false }));
125
153
  const entity = this.repo.create(createDto);
126
- const savedEntity = await this.repo.save(entity) as unknown as T;
154
+ let savedEntity = await this.repo.save(entity) as unknown as T;
155
+ savedEntity = await this.draftPublishHelperService.ensureInitialEntityVersionId(model, this.repo, savedEntity);
127
156
 
128
157
  // 6. Save the media
129
158
  if (hasMediaFields) {
@@ -210,9 +239,10 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
210
239
  throw new Error(`Entity [${this.moduleName}.${this.modelName}] with id ${id} not found`);
211
240
  }
212
241
 
213
- if (model.draftPublishWorkflow === true && entity.publishedAt) {
214
- throw new BadRequestException(`Cannot update a published record for model ${this.modelName}. Unpublish it first.`
215
- );
242
+ this.draftPublishHelperService.assertUpdateAllowed(model, entity, this.modelName);
243
+
244
+ if (this.draftPublishHelperService.shouldCopyPublishedVersionForUpdate(model, entity)) {
245
+ return this.draftPublishHelperService.copyPublishedVersionAndUpdate(this.getDraftPublishCrudContext(), id, updateDto, files, isPartialUpdate, model);
216
246
  }
217
247
 
218
248
  // Capture pre-update many-to-many relation state for audit tracking
@@ -244,6 +274,18 @@ export class CRUDService<T extends CommonEntity> { // Add two generic value i.e
244
274
  return savedEntity;
245
275
  }
246
276
 
277
+ private getColumnDatabaseName(propertyName: string): string {
278
+ const column = this.repo.metadata.findColumnWithPropertyName(propertyName);
279
+ if (!column) {
280
+ throw new Error(`Column ${propertyName} not found in entity ${this.repo.metadata.name}`);
281
+ }
282
+ return column.databaseName;
283
+ }
284
+
285
+ private escapeDatabaseName(databaseName: string): string {
286
+ return this.repo.manager.connection.driver.escape(databaseName);
287
+ }
288
+
247
289
  /**
248
290
  * Captures the current state of audit-enabled many-to-many relations
249
291
  * before the entity is updated. The snapshot is attached to the entity
@@ -306,32 +348,37 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
306
348
  throw new Error(`Entity [${this.moduleName}.${this.modelName}] with id ${id} not found`);
307
349
  }
308
350
 
309
- if (model.draftPublishWorkflow === true && entity.publishedAt) {
310
- throw new BadRequestException(`Cannot update a published record for model ${this.modelName}, Unpublish it first.`);
351
+ const entitiesToDelete: T[] = [entity];
352
+ if (this.draftPublishHelperService.isDraftPublishEnabled(model)) {
353
+ this.draftPublishHelperService.assertDraftPublishDeleteAllowed(this.modelName, entitiesToDelete);
311
354
  }
312
355
 
313
- // If the model has internationalisation enabled, delete children with defaultEntityLocaleId === this entity's id
314
- if (model.internationalisation) {
315
- // Find all child entities where defaultEntityLocaleId === this entity's id
316
- const childEntities = await this.repo.find({
317
- where: { defaultEntityLocaleId: id } as any
318
- });
356
+ await this.internationalisationHelperService.deleteChildLocaleEntities(this.repo, model, [id]);
319
357
 
320
- if (childEntities.length > 0) {
321
- if (model.enableSoftDelete === true) {
322
- await this.repo.softRemove(childEntities);
323
- } else {
324
- await this.repo.remove(childEntities);
325
- }
326
- }
327
- }
358
+ return this.deleteEntitiesAndPromote(model, entitiesToDelete);
359
+ }
360
+
361
+ private async deleteEntitiesAndPromote(model: ModelMetadata, entitiesToDelete: T[]): Promise<T[]> {
362
+ const isDraftPublishEnabled = this.draftPublishHelperService.isDraftPublishEnabled(model);
363
+ const deletedLatestChainIds = isDraftPublishEnabled
364
+ ? this.draftPublishHelperService.getLatestDraftPublishChainIds(entitiesToDelete)
365
+ : [];
328
366
 
367
+ let deleteResult: T[];
329
368
  if (model.enableSoftDelete === true) {
330
- await this.repo.softRemove(entity);
331
- return this.repo.save(entity);
369
+ this.draftPublishHelperService.markDeletedDraftPublishVersionsAsNotLatest(model, entitiesToDelete);
370
+ await this.repo.softRemove(entitiesToDelete);
371
+ deleteResult = await this.repo.save(entitiesToDelete);
332
372
  } else {
333
- return this.repo.remove(entity);
373
+ deleteResult = await this.repo.remove(entitiesToDelete);
374
+ }
375
+
376
+ if (isDraftPublishEnabled) {
377
+ const deletedEntityIds = this.draftPublishHelperService.getEntityIds(entitiesToDelete);
378
+ await this.draftPublishHelperService.promoteLatestDraftPublishVersionAfterDelete(this.repo, deletedLatestChainIds, deletedEntityIds);
334
379
  }
380
+
381
+ return deleteResult;
335
382
  }
336
383
 
337
384
  private async fieldCrudManager(fieldMetadata: FieldMetadata, entityManager: EntityManager, isPartialUpdate: boolean = false, isUpdate: boolean = false, entityId?: number) {
@@ -528,9 +575,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
528
575
  var qb: SelectQueryBuilder<T> = await this.repo.createSecurityRuleAwareQueryBuilder(alias)
529
576
 
530
577
  if (basicFilterDto.groupBy?.length) {
531
- const groupFilterQb = (internationalisation && draftPublishWorkflow)
532
- ? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef, FilterCombinator.AND, false, false)
533
- : this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, undefined, undefined, undefined, FilterCombinator.AND, false, false);
578
+ const groupFilterQb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef, FilterCombinator.AND, false, false);
534
579
 
535
580
  return this.crudHelperService.executeGroupPipeline(
536
581
  groupFilterQb, basicFilterDto, alias,
@@ -538,13 +583,12 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
538
583
  async (entities) => {
539
584
  if (populateUserIdFields?.length) await this.handlePopulateUserIdFields(populateUserIdFields, entities);
540
585
  if (populateMedia?.length) await this.handlePopulateMedia(populateMedia, entities);
541
- }
586
+ },
587
+ internationalisation, draftPublishWorkflow, this.moduleRef
542
588
  );
543
589
  }
544
590
  else {
545
- qb = (internationalisation && draftPublishWorkflow)
546
- ? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef)
547
- : this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);
591
+ qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef);
548
592
  const { meta, records } = await this.handleNonGroupFind(qb, populateUserIdFields, populateMedia, offset, limit, alias);
549
593
  return {
550
594
  meta,
@@ -573,6 +617,29 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
573
617
  return this.crudHelperService.pagedResponse(offset, limit, count, entities);
574
618
  }
575
619
 
620
+ /**
621
+ * Reduce a user to USER_SUMMARY_FIELDS as a plain object.
622
+ *
623
+ * Returning the hydrated entity is not good enough. A partially selected `User` is still
624
+ * built with `new User()`, so every property that has a TypeScript field initializer
625
+ * (`active`, `forcePasswordChange`, `lastLoginProvider`, `failedLoginAttempts`,
626
+ * `isAllowedToGenerateApiKeys`) is present on the instance holding its *default* rather
627
+ * than the value in the database - `active: true` for a user who may well be inactive.
628
+ * Serialization does not help: those defaults are real own properties. Copying the
629
+ * allowlist into a fresh object is what guarantees the response contains only columns
630
+ * actually read from the database.
631
+ */
632
+ protected toUserSummary(user: unknown): Partial<User> | null {
633
+ if (!user) {
634
+ return null;
635
+ }
636
+ const summary: Partial<User> = {};
637
+ for (const field of USER_SUMMARY_FIELDS) {
638
+ summary[field] = user[field] as never;
639
+ }
640
+ return summary;
641
+ }
642
+
576
643
  // entities is an array of T
577
644
  // T can contain createdBy and updatedBy fields
578
645
  // We need to populate the createdBy and updatedBy fields with the User entity
@@ -584,9 +651,15 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
584
651
  if (userId) {
585
652
  const user = await userRepository.findOne({
586
653
  where: { id: userId },
654
+ // SECURITY: a populated createdBy/updatedBy is only ever displayed as
655
+ // "who did this", so it must not ship the author's email, mobile, role
656
+ // assignments or API keys - let alone the credential columns, which
657
+ // survive here whenever User is subclassed (class-transformer resolves
658
+ // @Exclude() per class and does not inherit it).
659
+ select: USER_SUMMARY_FIELDS as unknown as (keyof User)[],
587
660
  });
588
661
  // @ts-ignore
589
- entity[userFieldPath] = user;
662
+ entity[userFieldPath] = this.toUserSummary(user);
590
663
  }
591
664
  }
592
665
  }
@@ -765,6 +838,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
765
838
  module: true,
766
839
  });
767
840
 
841
+ const solidRegistry = this.moduleRef.get(SolidRegistry, { strict: false });
768
842
  const entitiesForSave: T[] = [];
769
843
  for (const createDto of createDtos) {
770
844
  // Validate and transform each createDto sequentially
@@ -777,6 +851,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
777
851
  }
778
852
  transformedDto = await fieldManager.transformForCreate(createDto);
779
853
  }
854
+ this.internationalisationHelperService.applyCreateDefaults(model, transformedDto, solidRegistry);
780
855
  const entity = this.repo.create(transformedDto);
781
856
  entitiesForSave.push(entity as unknown as T);
782
857
  }
@@ -814,7 +889,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
814
889
 
815
890
 
816
891
 
817
- const removedEntities = [];
892
+ const removedEntities: T[] = [];
818
893
  for (let i = 0; i < ids.length; i++) {
819
894
  const id = ids[i]
820
895
  const entity = await this.repo.findOne({
@@ -823,36 +898,21 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
823
898
  } as unknown as FindOptionsWhere<T>,
824
899
  });
825
900
 
901
+ if (!entity) {
902
+ throw new Error(`Entity [${this.moduleName}.${this.modelName}] with id ${id} not found`);
903
+ }
904
+
826
905
  removedEntities.push(entity);
827
906
  }
828
907
 
829
908
 
830
- // entity-level flag
831
- const isDraftPublishEnabled = model?.draftPublishWorkflow === true;
832
-
833
- let publishedEntitiesExists: T[] = [];
834
-
835
- if (isDraftPublishEnabled) {
836
- publishedEntitiesExists = removedEntities.filter(
837
- (x) => !!x?.publishedAt
838
- );
909
+ if (this.draftPublishHelperService.isDraftPublishEnabled(model)) {
910
+ this.draftPublishHelperService.assertDraftPublishDeleteAllowed(this.modelName, removedEntities);
839
911
  }
840
912
 
841
- if (publishedEntitiesExists.length > 0) {
842
- const publishedEntitiesExistsID = publishedEntitiesExists.map(x => x.id);
913
+ await this.internationalisationHelperService.deleteChildLocaleEntities(this.repo, model, ids);
843
914
 
844
- throw new BadRequestException(
845
- `Cannot delete published record(s) for model ${this.modelName} with Ids ${publishedEntitiesExistsID.join(', ')}. Unpublish them first.`
846
- );
847
- }
848
-
849
- if (model.enableSoftDelete === true) {
850
- await this.repo.softRemove(removedEntities);
851
- return this.repo.save(removedEntities);
852
- } else {
853
- return this.repo.remove(removedEntities);
854
- }
855
- // return removedEntities
915
+ return this.deleteEntitiesAndPromote(model, removedEntities);
856
916
  }
857
917
 
858
918
  async recover(id: number, solidRequestContext: any = {}) {
@@ -882,6 +942,10 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
882
942
  } as unknown as QueryDeepPartialEntity<T>
883
943
  );
884
944
 
945
+ if (this.draftPublishHelperService.isDraftPublishEnabled(loadedmodel)) {
946
+ await this.draftPublishHelperService.promoteRecoveredDraftPublishVersion(this.repo, softDeletedRows);
947
+ }
948
+
885
949
  return { message: SUCCESS_MESSAGES.RECORD_RECOVERED, data: softDeletedRows };
886
950
  } catch (error: any) {
887
951
  if (error instanceof QueryFailedError && (error as any).code === '23505') {
@@ -928,6 +992,14 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
928
992
  { deletedAt: null, deletedTracker: "not-deleted" } as unknown as QueryDeepPartialEntity<T>
929
993
  );
930
994
 
995
+ if (this.draftPublishHelperService.isDraftPublishEnabled(loadedmodel)) {
996
+ // Sequential: two ids in the same batch could belong to the same version
997
+ // chain, and each promotion clears isLatest across the whole chain first.
998
+ for (const entity of softDeletedRows) {
999
+ await this.draftPublishHelperService.promoteRecoveredDraftPublishVersion(this.repo, entity);
1000
+ }
1001
+ }
1002
+
931
1003
  return { message: SUCCESS_MESSAGES.SELECTED_RECORDS_RECOVERED, recoveredIds: ids };
932
1004
  } catch (error: any) {
933
1005
  if (error instanceof QueryFailedError && (error as any).code === "23505") {
@@ -982,18 +1054,11 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
982
1054
  return model.userKeyField?.name || '';
983
1055
  }
984
1056
 
985
- /* Publish a record - sets publishedAt timestamp */
1057
+ /* Publish a record - marks the selected version as the active published version. */
986
1058
  async publishRecord(id: number, solidRequestContext: any = {}): Promise<T> {
987
1059
 
988
1060
  const model = await this.loadModel();
989
1061
 
990
- // Check if publish workflow is enabled for this model
991
- if (!model.draftPublishWorkflow) {
992
- throw new BadRequestException(
993
- `Publish workflow is not enabled for ${this.modelName}`
994
- );
995
- }
996
-
997
1062
  // Check user permissions
998
1063
  if (solidRequestContext.activeUser) {
999
1064
  const hasPermission = this.crudHelperService.hasPublishPermissionOnModel(
@@ -1005,37 +1070,14 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
1005
1070
  }
1006
1071
  }
1007
1072
 
1008
- // Find the entity
1009
- const entity = await this.repo.findOne({ where: { id } as any });
1010
- if (!entity) {
1011
- throw new NotFoundException(`${this.modelName} with id ${id} not found`);
1012
- }
1013
-
1014
- // Check if already published
1015
- if (entity.publishedAt) {
1016
- throw new BadRequestException(
1017
- `${this.modelName} with id ${id} is already published`
1018
- );
1019
- }
1020
-
1021
- // Update publish status
1022
- const updatedEntity = await this.repo.save({ ...entity, publishedAt: new Date() });
1023
-
1024
- return updatedEntity
1073
+ return this.draftPublishHelperService.publishRecord(this.repo, model, this.modelName, id, solidRequestContext.activeUser);
1025
1074
  }
1026
1075
 
1027
- /* Unpublish a record - clears publishedAt timestamp */
1076
+ /* Unpublish a record - marks the selected version as not currently published. */
1028
1077
  async unpublishRecord(id: number, solidRequestContext: any = {}): Promise<T> {
1029
1078
 
1030
1079
  const model = await this.loadModel();
1031
1080
 
1032
- // Check if publish workflow is enabled for this model
1033
- if (!model.draftPublishWorkflow) {
1034
- throw new BadRequestException(
1035
- `Publish workflow is not enabled for ${this.modelName}`
1036
- );
1037
- }
1038
-
1039
1081
  // Check user permissions
1040
1082
  if (solidRequestContext.activeUser) {
1041
1083
  const hasPermission = this.crudHelperService.hasUnpublishPermissionOnModel(
@@ -1047,23 +1089,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
1047
1089
  }
1048
1090
  }
1049
1091
 
1050
- // Find the entity
1051
- const entity = await this.repo.findOne({ where: { id } as any });
1052
- if (!entity) {
1053
- throw new NotFoundException(`${this.modelName} with id ${id} not found`);
1054
- }
1055
-
1056
- // Check if already unpublished
1057
- if (!entity.publishedAt) {
1058
- throw new BadRequestException(
1059
- `${this.modelName} with id ${id} is already unpublished`
1060
- );
1061
- }
1062
-
1063
- // Update unpublish status
1064
- const updatedEntity = await this.repo.save({ ...entity, publishedAt: null });
1065
-
1066
- return updatedEntity
1092
+ return this.draftPublishHelperService.unpublishRecord(this.repo, model, this.modelName, id, solidRequestContext.activeUser);
1067
1093
  }
1068
1094
 
1069
1095
  private getDatasourceDefaultEntityManager() {
@@ -1680,6 +1680,11 @@ export class DatasourceIntrospectionService {
1680
1680
 
1681
1681
  private getLegacySuperclassFieldName(columnName: string, legacyTableType: LegacyTableType) {
1682
1682
  const normalized = columnName.toLowerCase();
1683
+ // LegacyCommonEntityWithExistingId doesn't declare the draft/publish versioning
1684
+ // columns (see DRAFT_PUBLISH_VERSIONING_FIELD_NAMES), so their ss_-prefixed column
1685
+ // names must not appear here — otherwise a table that still physically has one of
1686
+ // those columns would have it silently treated as superclass-handled and dropped
1687
+ // from introspection instead of being surfaced as a real column.
1683
1688
  const legacyFieldMap: Record<string, string> = {
1684
1689
  ss_created_at: "createdAt",
1685
1690
  ss_updated_at: "updatedAt",