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

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 (517) hide show
  1. package/CHANGELOG.md +10107 -0
  2. package/CLAUDE.md +5 -6
  3. package/README.md +19 -0
  4. package/dist/commands/run-tests.command.d.ts +9 -1
  5. package/dist/commands/run-tests.command.d.ts.map +1 -1
  6. package/dist/commands/run-tests.command.js +69 -6
  7. package/dist/commands/run-tests.command.js.map +1 -1
  8. package/dist/commands/seed.command.d.ts +2 -0
  9. package/dist/commands/seed.command.d.ts.map +1 -1
  10. package/dist/commands/seed.command.js +21 -0
  11. package/dist/commands/seed.command.js.map +1 -1
  12. package/dist/config/cache.options.d.ts.map +1 -1
  13. package/dist/config/cache.options.js +2 -2
  14. package/dist/config/cache.options.js.map +1 -1
  15. package/dist/constants/chatter-message.constants.d.ts +1 -0
  16. package/dist/constants/chatter-message.constants.d.ts.map +1 -1
  17. package/dist/constants/chatter-message.constants.js +3 -1
  18. package/dist/constants/chatter-message.constants.js.map +1 -1
  19. package/dist/constants/draft-publish-fields.d.ts +2 -0
  20. package/dist/constants/draft-publish-fields.d.ts.map +1 -0
  21. package/dist/constants/draft-publish-fields.js +5 -0
  22. package/dist/constants/draft-publish-fields.js.map +1 -0
  23. package/dist/constants/error-messages.d.ts +7 -0
  24. package/dist/constants/error-messages.d.ts.map +1 -1
  25. package/dist/constants/error-messages.js +7 -0
  26. package/dist/constants/error-messages.js.map +1 -1
  27. package/dist/constants/media-file-types.d.ts +12 -0
  28. package/dist/constants/media-file-types.d.ts.map +1 -1
  29. package/dist/constants/media-file-types.js +66 -1
  30. package/dist/constants/media-file-types.js.map +1 -1
  31. package/dist/constants/success-messages.d.ts +3 -0
  32. package/dist/constants/success-messages.d.ts.map +1 -1
  33. package/dist/constants/success-messages.js +3 -0
  34. package/dist/constants/success-messages.js.map +1 -1
  35. package/dist/constants/user.constants.d.ts +2 -0
  36. package/dist/constants/user.constants.d.ts.map +1 -0
  37. package/dist/constants/user.constants.js +5 -0
  38. package/dist/constants/user.constants.js.map +1 -0
  39. package/dist/controllers/action-metadata.controller.d.ts +1 -1
  40. package/dist/controllers/action-metadata.controller.js +1 -1
  41. package/dist/controllers/agent-event.controller.d.ts +1 -1
  42. package/dist/controllers/agent-event.controller.js +1 -1
  43. package/dist/controllers/agent-session.controller.d.ts +1 -1
  44. package/dist/controllers/agent-session.controller.js +1 -1
  45. package/dist/controllers/authentication.controller.d.ts +1 -1
  46. package/dist/controllers/authentication.controller.d.ts.map +1 -1
  47. package/dist/controllers/authentication.controller.js +4 -3
  48. package/dist/controllers/authentication.controller.js.map +1 -1
  49. package/dist/controllers/chatter-message.controller.d.ts +5 -0
  50. package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
  51. package/dist/controllers/chatter-message.controller.js +14 -0
  52. package/dist/controllers/chatter-message.controller.js.map +1 -1
  53. package/dist/controllers/dashboard-user-layout.controller.d.ts +1 -1
  54. package/dist/controllers/dashboard-user-layout.controller.js +1 -1
  55. package/dist/controllers/email-template.controller.d.ts +1 -1
  56. package/dist/controllers/email-template.controller.js +1 -1
  57. package/dist/controllers/export-template.controller.d.ts +1 -1
  58. package/dist/controllers/export-template.controller.d.ts.map +1 -1
  59. package/dist/controllers/export-template.controller.js +6 -4
  60. package/dist/controllers/export-template.controller.js.map +1 -1
  61. package/dist/controllers/export-transaction.controller.d.ts +1 -1
  62. package/dist/controllers/export-transaction.controller.js +1 -1
  63. package/dist/controllers/field-metadata.controller.d.ts +2 -2
  64. package/dist/controllers/import-transaction-error-log.controller.d.ts +1 -1
  65. package/dist/controllers/import-transaction-error-log.controller.js +1 -1
  66. package/dist/controllers/import-transaction.controller.d.ts +1 -1
  67. package/dist/controllers/import-transaction.controller.d.ts.map +1 -1
  68. package/dist/controllers/import-transaction.controller.js +7 -7
  69. package/dist/controllers/import-transaction.controller.js.map +1 -1
  70. package/dist/controllers/list-of-values.controller.d.ts +1 -1
  71. package/dist/controllers/list-of-values.controller.js +1 -1
  72. package/dist/controllers/locale.controller.d.ts +1 -1
  73. package/dist/controllers/locale.controller.js +1 -1
  74. package/dist/controllers/mcp-audit-log.controller.d.ts +1 -1
  75. package/dist/controllers/mcp-audit-log.controller.js +1 -1
  76. package/dist/controllers/media.controller.d.ts +2 -2
  77. package/dist/controllers/media.controller.d.ts.map +1 -1
  78. package/dist/controllers/media.controller.js +13 -8
  79. package/dist/controllers/media.controller.js.map +1 -1
  80. package/dist/controllers/menu-item-metadata.controller.d.ts +1 -1
  81. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  82. package/dist/controllers/model-sequence.controller.d.ts +1 -1
  83. package/dist/controllers/model-sequence.controller.js +1 -1
  84. package/dist/controllers/module-package.controller.d.ts.map +1 -1
  85. package/dist/controllers/module-package.controller.js +2 -3
  86. package/dist/controllers/module-package.controller.js.map +1 -1
  87. package/dist/controllers/mpin-authentication.controller.d.ts +44 -0
  88. package/dist/controllers/mpin-authentication.controller.d.ts.map +1 -0
  89. package/dist/controllers/mpin-authentication.controller.js +102 -0
  90. package/dist/controllers/mpin-authentication.controller.js.map +1 -0
  91. package/dist/controllers/mq-message-queue.controller.d.ts +1 -1
  92. package/dist/controllers/mq-message-queue.controller.js +1 -1
  93. package/dist/controllers/mq-message.controller.d.ts +1 -1
  94. package/dist/controllers/mq-message.controller.js +1 -1
  95. package/dist/controllers/permission-metadata.controller.d.ts +1 -1
  96. package/dist/controllers/permission-metadata.controller.js +1 -1
  97. package/dist/controllers/role-metadata.controller.d.ts +1 -1
  98. package/dist/controllers/role-metadata.controller.js +1 -1
  99. package/dist/controllers/saved-filters.controller.d.ts +1 -1
  100. package/dist/controllers/saved-filters.controller.js +1 -1
  101. package/dist/controllers/scheduled-job.controller.d.ts +1 -1
  102. package/dist/controllers/scheduled-job.controller.js +1 -1
  103. package/dist/controllers/security-rule.controller.d.ts +1 -1
  104. package/dist/controllers/security-rule.controller.js +1 -1
  105. package/dist/controllers/sms-template.controller.d.ts +1 -1
  106. package/dist/controllers/sms-template.controller.js +1 -1
  107. package/dist/controllers/user-activity-history.controller.d.ts +1 -1
  108. package/dist/controllers/user-activity-history.controller.js +1 -1
  109. package/dist/controllers/user-view-metadata.controller.d.ts +1 -1
  110. package/dist/controllers/user-view-metadata.controller.js +1 -1
  111. package/dist/controllers/user.controller.d.ts +2 -2
  112. package/dist/controllers/user.controller.js +2 -2
  113. package/dist/controllers/view-metadata.controller.d.ts +2 -2
  114. package/dist/controllers/view-metadata.controller.js +1 -1
  115. package/dist/controllers/workflow-definition.controller.d.ts +1 -1
  116. package/dist/controllers/workflow-definition.controller.js +1 -1
  117. package/dist/controllers/workflow-execution-artifact.controller.d.ts +1 -1
  118. package/dist/controllers/workflow-execution-artifact.controller.js +1 -1
  119. package/dist/controllers/workflow-execution-log.controller.d.ts +1 -1
  120. package/dist/controllers/workflow-execution-log.controller.js +1 -1
  121. package/dist/controllers/workflow-execution.controller.d.ts +1 -1
  122. package/dist/controllers/workflow-execution.controller.js +1 -1
  123. package/dist/controllers/workflow-secret.controller.d.ts +1 -1
  124. package/dist/controllers/workflow-secret.controller.js +1 -1
  125. package/dist/controllers/workflow-step-execution.controller.d.ts +1 -1
  126. package/dist/controllers/workflow-step-execution.controller.js +1 -1
  127. package/dist/controllers/workflow-trigger-execution.controller.d.ts +1 -1
  128. package/dist/controllers/workflow-trigger-execution.controller.js +1 -1
  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/change-mpin.dto.d.ts +6 -0
  134. package/dist/dtos/change-mpin.dto.d.ts.map +1 -0
  135. package/dist/dtos/change-mpin.dto.js +39 -0
  136. package/dist/dtos/change-mpin.dto.js.map +1 -0
  137. package/dist/dtos/create-field-metadata.dto.d.ts +3 -6
  138. package/dist/dtos/create-field-metadata.dto.d.ts.map +1 -1
  139. package/dist/dtos/create-field-metadata.dto.js +15 -10
  140. package/dist/dtos/create-field-metadata.dto.js.map +1 -1
  141. package/dist/dtos/create-model-sequence.dto.d.ts +1 -1
  142. package/dist/dtos/create-model-sequence.dto.d.ts.map +1 -1
  143. package/dist/dtos/create-model-sequence.dto.js +1 -1
  144. package/dist/dtos/create-model-sequence.dto.js.map +1 -1
  145. package/dist/dtos/mpin-login.dto.d.ts +5 -0
  146. package/dist/dtos/mpin-login.dto.d.ts.map +1 -0
  147. package/dist/dtos/mpin-login.dto.js +33 -0
  148. package/dist/dtos/mpin-login.dto.js.map +1 -0
  149. package/dist/dtos/setup-mpin.dto.d.ts +7 -0
  150. package/dist/dtos/setup-mpin.dto.d.ts.map +1 -0
  151. package/dist/dtos/setup-mpin.dto.js +47 -0
  152. package/dist/dtos/setup-mpin.dto.js.map +1 -0
  153. package/dist/entities/common.entity.d.ts +4 -0
  154. package/dist/entities/common.entity.d.ts.map +1 -1
  155. package/dist/entities/common.entity.js +25 -1
  156. package/dist/entities/common.entity.js.map +1 -1
  157. package/dist/entities/dashboard-user-layout.entity.js +2 -2
  158. package/dist/entities/dashboard-user-layout.entity.js.map +1 -1
  159. package/dist/entities/field-metadata.entity.d.ts +1 -0
  160. package/dist/entities/field-metadata.entity.d.ts.map +1 -1
  161. package/dist/entities/field-metadata.entity.js +5 -1
  162. package/dist/entities/field-metadata.entity.js.map +1 -1
  163. package/dist/entities/saved-filters.entity.js +3 -3
  164. package/dist/entities/saved-filters.entity.js.map +1 -1
  165. package/dist/entities/user-device-credential.entity.d.ts +18 -0
  166. package/dist/entities/user-device-credential.entity.d.ts.map +1 -0
  167. package/dist/entities/user-device-credential.entity.js +91 -0
  168. package/dist/entities/user-device-credential.entity.js.map +1 -0
  169. package/dist/entities/user.entity.d.ts.map +1 -1
  170. package/dist/entities/user.entity.js +36 -0
  171. package/dist/entities/user.entity.js.map +1 -1
  172. package/dist/entities/view-metadata.entity.js.map +1 -1
  173. package/dist/entities/workflow-execution-artifact.entity.d.ts.map +1 -1
  174. package/dist/entities/workflow-execution-artifact.entity.js +4 -3
  175. package/dist/entities/workflow-execution-artifact.entity.js.map +1 -1
  176. package/dist/entities/workflow-execution-log.entity.d.ts.map +1 -1
  177. package/dist/entities/workflow-execution-log.entity.js +4 -3
  178. package/dist/entities/workflow-execution-log.entity.js.map +1 -1
  179. package/dist/entities/workflow-execution.entity.d.ts.map +1 -1
  180. package/dist/entities/workflow-execution.entity.js +3 -2
  181. package/dist/entities/workflow-execution.entity.js.map +1 -1
  182. package/dist/entities/workflow-secret.entity.d.ts.map +1 -1
  183. package/dist/entities/workflow-secret.entity.js +3 -2
  184. package/dist/entities/workflow-secret.entity.js.map +1 -1
  185. package/dist/entities/workflow-step-execution.entity.d.ts.map +1 -1
  186. package/dist/entities/workflow-step-execution.entity.js +3 -2
  187. package/dist/entities/workflow-step-execution.entity.js.map +1 -1
  188. package/dist/entities/workflow-trigger-execution.entity.d.ts.map +1 -1
  189. package/dist/entities/workflow-trigger-execution.entity.js +7 -6
  190. package/dist/entities/workflow-trigger-execution.entity.js.map +1 -1
  191. package/dist/factories/mail.factory.d.ts.map +1 -1
  192. package/dist/factories/mail.factory.js +4 -0
  193. package/dist/factories/mail.factory.js.map +1 -1
  194. package/dist/filters/http-exception.filter.d.ts.map +1 -1
  195. package/dist/filters/http-exception.filter.js +5 -1
  196. package/dist/filters/http-exception.filter.js.map +1 -1
  197. package/dist/helpers/bootstrap.helper.d.ts +5 -2
  198. package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
  199. package/dist/helpers/bootstrap.helper.js +7 -3
  200. package/dist/helpers/bootstrap.helper.js.map +1 -1
  201. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts +7 -0
  202. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
  203. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +66 -32
  204. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js.map +1 -1
  205. package/dist/helpers/file-download.helper.d.ts +9 -0
  206. package/dist/helpers/file-download.helper.d.ts.map +1 -0
  207. package/dist/helpers/file-download.helper.js +19 -0
  208. package/dist/helpers/file-download.helper.js.map +1 -0
  209. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  210. package/dist/helpers/model-metadata-helper.service.js +30 -1
  211. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  212. package/dist/helpers/security.helper.d.ts +5 -1
  213. package/dist/helpers/security.helper.d.ts.map +1 -1
  214. package/dist/helpers/security.helper.js +15 -4
  215. package/dist/helpers/security.helper.js.map +1 -1
  216. package/dist/helpers/solid-core-error-codes-provider.service.d.ts.map +1 -1
  217. package/dist/helpers/solid-core-error-codes-provider.service.js +45 -0
  218. package/dist/helpers/solid-core-error-codes-provider.service.js.map +1 -1
  219. package/dist/helpers/solid-microservice-adapter.service.d.ts.map +1 -1
  220. package/dist/helpers/solid-microservice-adapter.service.js +1 -1
  221. package/dist/helpers/solid-microservice-adapter.service.js.map +1 -1
  222. package/dist/helpers/solid-registry.js +1 -1
  223. package/dist/helpers/solid-registry.js.map +1 -1
  224. package/dist/helpers/typeorm-db-helper.d.ts.map +1 -1
  225. package/dist/helpers/typeorm-db-helper.js +9 -0
  226. package/dist/helpers/typeorm-db-helper.js.map +1 -1
  227. package/dist/index.d.ts +10 -0
  228. package/dist/index.d.ts.map +1 -1
  229. package/dist/index.js +10 -0
  230. package/dist/index.js.map +1 -1
  231. package/dist/interfaces/active-user-data.interface.d.ts +1 -0
  232. package/dist/interfaces/active-user-data.interface.d.ts.map +1 -1
  233. package/dist/interfaces/active-user-data.interface.js.map +1 -1
  234. package/dist/interfaces.d.ts +1 -0
  235. package/dist/interfaces.d.ts.map +1 -1
  236. package/dist/interfaces.js.map +1 -1
  237. package/dist/repository/user-device-credential.repository.d.ts +12 -0
  238. package/dist/repository/user-device-credential.repository.d.ts.map +1 -0
  239. package/dist/repository/user-device-credential.repository.js +34 -0
  240. package/dist/repository/user-device-credential.repository.js.map +1 -0
  241. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  242. package/dist/seeders/module-metadata-seeder.service.js +51 -30
  243. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  244. package/dist/seeders/module-test-data.service.d.ts +3 -1
  245. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  246. package/dist/seeders/module-test-data.service.js +8 -2
  247. package/dist/seeders/module-test-data.service.js.map +1 -1
  248. package/dist/seeders/seed-data/solid-core-metadata.json +290 -78
  249. package/dist/services/api-key.service.d.ts.map +1 -1
  250. package/dist/services/api-key.service.js +1 -1
  251. package/dist/services/api-key.service.js.map +1 -1
  252. package/dist/services/authentication.service.d.ts +9 -5
  253. package/dist/services/authentication.service.d.ts.map +1 -1
  254. package/dist/services/authentication.service.js +102 -23
  255. package/dist/services/authentication.service.js.map +1 -1
  256. package/dist/services/chatter-message.service.d.ts +16 -1
  257. package/dist/services/chatter-message.service.d.ts.map +1 -1
  258. package/dist/services/chatter-message.service.js +100 -16
  259. package/dist/services/chatter-message.service.js.map +1 -1
  260. package/dist/services/crud-helper.service.d.ts +6 -4
  261. package/dist/services/crud-helper.service.d.ts.map +1 -1
  262. package/dist/services/crud-helper.service.js +32 -48
  263. package/dist/services/crud-helper.service.js.map +1 -1
  264. package/dist/services/crud.service.d.ts +13 -1
  265. package/dist/services/crud.service.d.ts.map +1 -1
  266. package/dist/services/crud.service.js +94 -68
  267. package/dist/services/crud.service.js.map +1 -1
  268. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  269. package/dist/services/datasource-introspection.service.js.map +1 -1
  270. package/dist/services/draft-publish-helper.service.d.ts +53 -0
  271. package/dist/services/draft-publish-helper.service.d.ts.map +1 -0
  272. package/dist/services/draft-publish-helper.service.js +402 -0
  273. package/dist/services/draft-publish-helper.service.js.map +1 -0
  274. package/dist/services/field-metadata.service.d.ts +2 -2
  275. package/dist/services/field-metadata.service.d.ts.map +1 -1
  276. package/dist/services/field-metadata.service.js +4 -1
  277. package/dist/services/field-metadata.service.js.map +1 -1
  278. package/dist/services/internationalisation-helper.service.d.ts +19 -0
  279. package/dist/services/internationalisation-helper.service.d.ts.map +1 -0
  280. package/dist/services/internationalisation-helper.service.js +107 -0
  281. package/dist/services/internationalisation-helper.service.js.map +1 -0
  282. package/dist/services/locale.service.d.ts +1 -1
  283. package/dist/services/media-storage.utils.d.ts +1 -0
  284. package/dist/services/media-storage.utils.d.ts.map +1 -1
  285. package/dist/services/media-storage.utils.js +12 -1
  286. package/dist/services/media-storage.utils.js.map +1 -1
  287. package/dist/services/media.service.d.ts +3 -2
  288. package/dist/services/media.service.d.ts.map +1 -1
  289. package/dist/services/media.service.js +45 -29
  290. package/dist/services/media.service.js.map +1 -1
  291. package/dist/services/metadata-validation.service.d.ts +7 -0
  292. package/dist/services/metadata-validation.service.d.ts.map +1 -0
  293. package/dist/services/metadata-validation.service.js +42 -0
  294. package/dist/services/metadata-validation.service.js.map +1 -0
  295. package/dist/services/model-metadata.service.d.ts.map +1 -1
  296. package/dist/services/model-metadata.service.js +2 -1
  297. package/dist/services/model-metadata.service.js.map +1 -1
  298. package/dist/services/module-metadata.service.d.ts.map +1 -1
  299. package/dist/services/module-metadata.service.js +9 -1
  300. package/dist/services/module-metadata.service.js.map +1 -1
  301. package/dist/services/mpin.service.d.ts +67 -0
  302. package/dist/services/mpin.service.d.ts.map +1 -0
  303. package/dist/services/mpin.service.js +282 -0
  304. package/dist/services/mpin.service.js.map +1 -0
  305. package/dist/services/object.utils.d.ts +2 -0
  306. package/dist/services/object.utils.d.ts.map +1 -0
  307. package/dist/services/object.utils.js +11 -0
  308. package/dist/services/object.utils.js.map +1 -0
  309. package/dist/services/refresh-token-ids-storage.service.d.ts +25 -6
  310. package/dist/services/refresh-token-ids-storage.service.d.ts.map +1 -1
  311. package/dist/services/refresh-token-ids-storage.service.js +80 -42
  312. package/dist/services/refresh-token-ids-storage.service.js.map +1 -1
  313. package/dist/services/setting.service.d.ts.map +1 -1
  314. package/dist/services/setting.service.js +6 -1
  315. package/dist/services/setting.service.js.map +1 -1
  316. package/dist/services/settings/default-settings-provider.service.d.ts +248 -12
  317. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  318. package/dist/services/settings/default-settings-provider.service.js +143 -6
  319. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  320. package/dist/services/user.service.d.ts +2 -2
  321. package/dist/services/user.service.d.ts.map +1 -1
  322. package/dist/services/user.service.js +9 -3
  323. package/dist/services/user.service.js.map +1 -1
  324. package/dist/services/view-metadata.service.d.ts +1 -2
  325. package/dist/services/view-metadata.service.d.ts.map +1 -1
  326. package/dist/services/view-metadata.service.js +3 -55
  327. package/dist/services/view-metadata.service.js.map +1 -1
  328. package/dist/services/workflow/nodes/execution-fail.node.d.ts +6 -0
  329. package/dist/services/workflow/nodes/execution-fail.node.d.ts.map +1 -0
  330. package/dist/services/workflow/nodes/execution-fail.node.js +81 -0
  331. package/dist/services/workflow/nodes/execution-fail.node.js.map +1 -0
  332. package/dist/services/workflow/nodes/for-each.node.d.ts +2 -0
  333. package/dist/services/workflow/nodes/for-each.node.d.ts.map +1 -1
  334. package/dist/services/workflow/nodes/for-each.node.js +114 -5
  335. package/dist/services/workflow/nodes/for-each.node.js.map +1 -1
  336. package/dist/services/workflow/nodes/if.node.d.ts.map +1 -1
  337. package/dist/services/workflow/nodes/if.node.js +7 -0
  338. package/dist/services/workflow/nodes/if.node.js.map +1 -1
  339. package/dist/services/workflow/nodes/log-write.node.d.ts.map +1 -1
  340. package/dist/services/workflow/nodes/log-write.node.js +2 -0
  341. package/dist/services/workflow/nodes/log-write.node.js.map +1 -1
  342. package/dist/services/workflow/nodes/loop-until.node.d.ts +12 -0
  343. package/dist/services/workflow/nodes/loop-until.node.d.ts.map +1 -0
  344. package/dist/services/workflow/nodes/loop-until.node.js +281 -0
  345. package/dist/services/workflow/nodes/loop-until.node.js.map +1 -0
  346. package/dist/services/workflow/nodes/parallel.node.d.ts.map +1 -1
  347. package/dist/services/workflow/nodes/parallel.node.js +7 -0
  348. package/dist/services/workflow/nodes/parallel.node.js.map +1 -1
  349. package/dist/services/workflow/nodes/sequential.node.d.ts.map +1 -1
  350. package/dist/services/workflow/nodes/sequential.node.js +7 -0
  351. package/dist/services/workflow/nodes/sequential.node.js.map +1 -1
  352. package/dist/services/workflow/nodes/switch.node.d.ts.map +1 -1
  353. package/dist/services/workflow/nodes/switch.node.js +7 -0
  354. package/dist/services/workflow/nodes/switch.node.js.map +1 -1
  355. package/dist/services/workflow/workflow-definition-validator.service.d.ts.map +1 -1
  356. package/dist/services/workflow/workflow-definition-validator.service.js +5 -2
  357. package/dist/services/workflow/workflow-definition-validator.service.js.map +1 -1
  358. package/dist/services/workflow/workflow-expression.service.d.ts.map +1 -1
  359. package/dist/services/workflow/workflow-expression.service.js +5 -0
  360. package/dist/services/workflow/workflow-expression.service.js.map +1 -1
  361. package/dist/services/workflow/workflow-node-registry.service.d.ts +2 -1
  362. package/dist/services/workflow/workflow-node-registry.service.d.ts.map +1 -1
  363. package/dist/services/workflow/workflow-node-registry.service.js +7 -0
  364. package/dist/services/workflow/workflow-node-registry.service.js.map +1 -1
  365. package/dist/services/workflow/workflow-runtime.service.d.ts +8 -0
  366. package/dist/services/workflow/workflow-runtime.service.d.ts.map +1 -1
  367. package/dist/services/workflow/workflow-runtime.service.js +197 -32
  368. package/dist/services/workflow/workflow-runtime.service.js.map +1 -1
  369. package/dist/services/workflow-definition.service.d.ts +1 -1
  370. package/dist/solid-core.module.d.ts +1 -3
  371. package/dist/solid-core.module.d.ts.map +1 -1
  372. package/dist/solid-core.module.js +28 -40
  373. package/dist/solid-core.module.js.map +1 -1
  374. package/dist/testing/adapters/ui/playwright-adapter.d.ts +5 -0
  375. package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -1
  376. package/dist/testing/adapters/ui/playwright-adapter.js +17 -1
  377. package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -1
  378. package/dist/testing/adapters/ui/ui.types.d.ts +2 -0
  379. package/dist/testing/adapters/ui/ui.types.d.ts.map +1 -1
  380. package/dist/testing/adapters/ui/ui.types.js.map +1 -1
  381. package/dist/testing/reporter/console-reporter.d.ts +3 -0
  382. package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
  383. package/dist/testing/reporter/console-reporter.js +2 -0
  384. package/dist/testing/reporter/console-reporter.js.map +1 -1
  385. package/dist/testing/reporter/progress-reporter.d.ts +64 -0
  386. package/dist/testing/reporter/progress-reporter.d.ts.map +1 -0
  387. package/dist/testing/reporter/progress-reporter.js +224 -0
  388. package/dist/testing/reporter/progress-reporter.js.map +1 -0
  389. package/dist/testing/reporter/reporter.types.d.ts +3 -0
  390. package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
  391. package/dist/testing/reporter/reporter.types.js.map +1 -1
  392. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
  393. package/dist/testing/runner/run-from-metadata.js +1 -0
  394. package/dist/testing/runner/run-from-metadata.js.map +1 -1
  395. package/dist/testing/steps/ui/actions.step.d.ts.map +1 -1
  396. package/dist/testing/steps/ui/actions.step.js +6 -2
  397. package/dist/testing/steps/ui/actions.step.js.map +1 -1
  398. package/dist/testing/steps/ui/assertions.step.d.ts.map +1 -1
  399. package/dist/testing/steps/ui/assertions.step.js +11 -3
  400. package/dist/testing/steps/ui/assertions.step.js.map +1 -1
  401. package/dist/testing/steps/ui/form.step.d.ts.map +1 -1
  402. package/dist/testing/steps/ui/form.step.js +9 -3
  403. package/dist/testing/steps/ui/form.step.js.map +1 -1
  404. package/dist/testing/steps/ui/manual.step.js +1 -1
  405. package/dist/testing/steps/ui/manual.step.js.map +1 -1
  406. package/dist/testing/steps/ui/navigation.step.d.ts.map +1 -1
  407. package/dist/testing/steps/ui/navigation.step.js +3 -1
  408. package/dist/testing/steps/ui/navigation.step.js.map +1 -1
  409. package/dist/theme/theme-registry.d.ts +14 -0
  410. package/dist/theme/theme-registry.d.ts.map +1 -0
  411. package/dist/theme/theme-registry.js +147 -0
  412. package/dist/theme/theme-registry.js.map +1 -0
  413. package/dist/types/workflow-dsl.types.d.ts +14 -0
  414. package/dist/types/workflow-dsl.types.d.ts.map +1 -1
  415. package/dist/types/workflow-dsl.types.js.map +1 -1
  416. package/package.json +2 -2
  417. package/src/commands/run-tests.command.ts +64 -4
  418. package/src/commands/seed.command.ts +19 -0
  419. package/src/config/cache.options.ts +9 -1
  420. package/src/constants/chatter-message.constants.ts +12 -0
  421. package/src/constants/draft-publish-fields.ts +5 -0
  422. package/src/constants/error-messages.ts +14 -0
  423. package/src/constants/media-file-types.ts +128 -0
  424. package/src/constants/success-messages.ts +5 -0
  425. package/src/constants/user.constants.ts +13 -0
  426. package/src/controllers/authentication.controller.ts +5 -2
  427. package/src/controllers/chatter-message.controller.ts +8 -0
  428. package/src/controllers/export-template.controller.ts +5 -3
  429. package/src/controllers/import-transaction.controller.ts +6 -6
  430. package/src/controllers/media.controller.ts +17 -6
  431. package/src/controllers/module-package.controller.ts +2 -3
  432. package/src/controllers/mpin-authentication.controller.ts +67 -0
  433. package/src/dtos/basic-filters.dto.ts +0 -4
  434. package/src/dtos/change-mpin.dto.ts +18 -0
  435. package/src/dtos/create-field-metadata.dto.ts +17 -9
  436. package/src/dtos/create-model-sequence.dto.ts +1 -1
  437. package/src/dtos/mpin-login.dto.ts +24 -0
  438. package/src/dtos/setup-mpin.dto.ts +51 -0
  439. package/src/entities/common.entity.ts +24 -0
  440. package/src/entities/dashboard-user-layout.entity.ts +2 -2
  441. package/src/entities/field-metadata.entity.ts +3 -0
  442. package/src/entities/saved-filters.entity.ts +3 -3
  443. package/src/entities/user-device-credential.entity.ts +130 -0
  444. package/src/entities/user.entity.ts +53 -36
  445. package/src/entities/view-metadata.entity.ts +2 -2
  446. package/src/entities/workflow-execution-artifact.entity.ts +4 -3
  447. package/src/entities/workflow-execution-log.entity.ts +4 -3
  448. package/src/entities/workflow-execution.entity.ts +3 -2
  449. package/src/entities/workflow-secret.entity.ts +3 -2
  450. package/src/entities/workflow-step-execution.entity.ts +3 -2
  451. package/src/entities/workflow-trigger-execution.entity.ts +7 -6
  452. package/src/factories/mail.factory.ts +7 -1
  453. package/src/filters/http-exception.filter.ts +11 -1
  454. package/src/helpers/bootstrap.helper.ts +43 -6
  455. package/src/helpers/field-crud-managers/MediaFieldCrudManager.ts +90 -37
  456. package/src/helpers/file-download.helper.ts +45 -0
  457. package/src/helpers/model-metadata-helper.service.ts +32 -1
  458. package/src/helpers/security.helper.ts +35 -8
  459. package/src/helpers/solid-core-error-codes-provider.service.ts +53 -0
  460. package/src/helpers/solid-microservice-adapter.service.ts +6 -1
  461. package/src/helpers/solid-registry.ts +1 -1
  462. package/src/helpers/typeorm-db-helper.ts +12 -1
  463. package/src/index.ts +10 -0
  464. package/src/interfaces/active-user-data.interface.ts +9 -0
  465. package/src/interfaces.ts +1 -0
  466. package/src/repository/user-device-credential.repository.ts +17 -0
  467. package/src/seeders/module-metadata-seeder.service.ts +61 -39
  468. package/src/seeders/module-test-data.service.ts +6 -0
  469. package/src/seeders/seed-data/solid-core-metadata.json +290 -78
  470. package/src/services/api-key.service.ts +13 -1
  471. package/src/services/authentication.service.ts +203 -41
  472. package/src/services/chatter-message.service.ts +180 -19
  473. package/src/services/crud-helper.service.ts +35 -50
  474. package/src/services/crud.service.ts +132 -105
  475. package/src/services/datasource-introspection.service.ts +5 -0
  476. package/src/services/draft-publish-helper.service.ts +581 -0
  477. package/src/services/field-metadata.service.ts +5 -2
  478. package/src/services/internationalisation-helper.service.ts +148 -0
  479. package/src/services/media-storage.utils.ts +26 -1
  480. package/src/services/media.service.ts +68 -36
  481. package/src/services/metadata-validation.service.ts +39 -0
  482. package/src/services/model-metadata.service.ts +4 -1
  483. package/src/services/module-metadata.service.ts +10 -1
  484. package/src/services/mpin.service.ts +447 -0
  485. package/src/services/object.utils.ts +10 -0
  486. package/src/services/refresh-token-ids-storage.service.ts +229 -90
  487. package/src/services/setting.service.ts +8 -1
  488. package/src/services/settings/default-settings-provider.service.ts +154 -6
  489. package/src/services/user.service.ts +18 -3
  490. package/src/services/view-metadata.service.ts +5 -145
  491. package/src/services/workflow/nodes/execution-fail.node.ts +82 -0
  492. package/src/services/workflow/nodes/for-each.node.ts +140 -6
  493. package/src/services/workflow/nodes/if.node.ts +7 -0
  494. package/src/services/workflow/nodes/log-write.node.ts +2 -0
  495. package/src/services/workflow/nodes/loop-until.node.ts +343 -0
  496. package/src/services/workflow/nodes/parallel.node.ts +7 -0
  497. package/src/services/workflow/nodes/sequential.node.ts +7 -0
  498. package/src/services/workflow/nodes/switch.node.ts +7 -0
  499. package/src/services/workflow/workflow-definition-validator.service.ts +5 -2
  500. package/src/services/workflow/workflow-expression.service.ts +5 -0
  501. package/src/services/workflow/workflow-node-registry.service.ts +11 -0
  502. package/src/services/workflow/workflow-runtime.service.ts +274 -39
  503. package/src/solid-core.module.ts +46 -15
  504. package/src/testing/README.md +75 -3
  505. package/src/testing/adapters/ui/playwright-adapter.ts +25 -0
  506. package/src/testing/adapters/ui/ui.types.ts +2 -0
  507. package/src/testing/reporter/console-reporter.ts +4 -0
  508. package/src/testing/reporter/progress-reporter.ts +251 -0
  509. package/src/testing/reporter/reporter.types.ts +3 -0
  510. package/src/testing/runner/run-from-metadata.ts +1 -0
  511. package/src/testing/steps/ui/actions.step.ts +8 -4
  512. package/src/testing/steps/ui/assertions.step.ts +18 -5
  513. package/src/testing/steps/ui/form.step.ts +16 -6
  514. package/src/testing/steps/ui/manual.step.ts +1 -1
  515. package/src/testing/steps/ui/navigation.step.ts +4 -2
  516. package/src/theme/theme-registry.ts +181 -0
  517. package/src/types/workflow-dsl.types.ts +43 -0
@@ -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) {
@@ -399,6 +446,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
399
446
  ...commonOptions,
400
447
  mediaMaxSizeKb: fieldMetadata.mediaMaxSizeKb,
401
448
  mediaTypes: fieldMetadata.mediaTypes,
449
+ mediaAllowedExtensions: fieldMetadata.mediaAllowedExtensions,
402
450
  type: fieldMetadata.type as unknown as SolidMediaType
403
451
  };
404
452
  return new MediaFieldCrudManager(options);
@@ -528,9 +576,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
528
576
  var qb: SelectQueryBuilder<T> = await this.repo.createSecurityRuleAwareQueryBuilder(alias)
529
577
 
530
578
  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);
579
+ const groupFilterQb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef, FilterCombinator.AND, false, false);
534
580
 
535
581
  return this.crudHelperService.executeGroupPipeline(
536
582
  groupFilterQb, basicFilterDto, alias,
@@ -538,13 +584,12 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
538
584
  async (entities) => {
539
585
  if (populateUserIdFields?.length) await this.handlePopulateUserIdFields(populateUserIdFields, entities);
540
586
  if (populateMedia?.length) await this.handlePopulateMedia(populateMedia, entities);
541
- }
587
+ },
588
+ internationalisation, draftPublishWorkflow, this.moduleRef
542
589
  );
543
590
  }
544
591
  else {
545
- qb = (internationalisation && draftPublishWorkflow)
546
- ? this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef)
547
- : this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias);
592
+ qb = this.crudHelperService.buildFilterQuery(qb, basicFilterDto, alias, internationalisation, draftPublishWorkflow, this.moduleRef);
548
593
  const { meta, records } = await this.handleNonGroupFind(qb, populateUserIdFields, populateMedia, offset, limit, alias);
549
594
  return {
550
595
  meta,
@@ -573,6 +618,29 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
573
618
  return this.crudHelperService.pagedResponse(offset, limit, count, entities);
574
619
  }
575
620
 
621
+ /**
622
+ * Reduce a user to USER_SUMMARY_FIELDS as a plain object.
623
+ *
624
+ * Returning the hydrated entity is not good enough. A partially selected `User` is still
625
+ * built with `new User()`, so every property that has a TypeScript field initializer
626
+ * (`active`, `forcePasswordChange`, `lastLoginProvider`, `failedLoginAttempts`,
627
+ * `isAllowedToGenerateApiKeys`) is present on the instance holding its *default* rather
628
+ * than the value in the database - `active: true` for a user who may well be inactive.
629
+ * Serialization does not help: those defaults are real own properties. Copying the
630
+ * allowlist into a fresh object is what guarantees the response contains only columns
631
+ * actually read from the database.
632
+ */
633
+ protected toUserSummary(user: unknown): Partial<User> | null {
634
+ if (!user) {
635
+ return null;
636
+ }
637
+ const summary: Partial<User> = {};
638
+ for (const field of USER_SUMMARY_FIELDS) {
639
+ summary[field] = user[field] as never;
640
+ }
641
+ return summary;
642
+ }
643
+
576
644
  // entities is an array of T
577
645
  // T can contain createdBy and updatedBy fields
578
646
  // We need to populate the createdBy and updatedBy fields with the User entity
@@ -584,9 +652,15 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
584
652
  if (userId) {
585
653
  const user = await userRepository.findOne({
586
654
  where: { id: userId },
655
+ // SECURITY: a populated createdBy/updatedBy is only ever displayed as
656
+ // "who did this", so it must not ship the author's email, mobile, role
657
+ // assignments or API keys - let alone the credential columns, which
658
+ // survive here whenever User is subclassed (class-transformer resolves
659
+ // @Exclude() per class and does not inherit it).
660
+ select: USER_SUMMARY_FIELDS as unknown as (keyof User)[],
587
661
  });
588
662
  // @ts-ignore
589
- entity[userFieldPath] = user;
663
+ entity[userFieldPath] = this.toUserSummary(user);
590
664
  }
591
665
  }
592
666
  }
@@ -765,6 +839,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
765
839
  module: true,
766
840
  });
767
841
 
842
+ const solidRegistry = this.moduleRef.get(SolidRegistry, { strict: false });
768
843
  const entitiesForSave: T[] = [];
769
844
  for (const createDto of createDtos) {
770
845
  // Validate and transform each createDto sequentially
@@ -777,6 +852,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
777
852
  }
778
853
  transformedDto = await fieldManager.transformForCreate(createDto);
779
854
  }
855
+ this.internationalisationHelperService.applyCreateDefaults(model, transformedDto, solidRegistry);
780
856
  const entity = this.repo.create(transformedDto);
781
857
  entitiesForSave.push(entity as unknown as T);
782
858
  }
@@ -814,7 +890,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
814
890
 
815
891
 
816
892
 
817
- const removedEntities = [];
893
+ const removedEntities: T[] = [];
818
894
  for (let i = 0; i < ids.length; i++) {
819
895
  const id = ids[i]
820
896
  const entity = await this.repo.findOne({
@@ -823,36 +899,21 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
823
899
  } as unknown as FindOptionsWhere<T>,
824
900
  });
825
901
 
902
+ if (!entity) {
903
+ throw new Error(`Entity [${this.moduleName}.${this.modelName}] with id ${id} not found`);
904
+ }
905
+
826
906
  removedEntities.push(entity);
827
907
  }
828
908
 
829
909
 
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
- );
910
+ if (this.draftPublishHelperService.isDraftPublishEnabled(model)) {
911
+ this.draftPublishHelperService.assertDraftPublishDeleteAllowed(this.modelName, removedEntities);
839
912
  }
840
913
 
841
- if (publishedEntitiesExists.length > 0) {
842
- const publishedEntitiesExistsID = publishedEntitiesExists.map(x => x.id);
914
+ await this.internationalisationHelperService.deleteChildLocaleEntities(this.repo, model, ids);
843
915
 
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
916
+ return this.deleteEntitiesAndPromote(model, removedEntities);
856
917
  }
857
918
 
858
919
  async recover(id: number, solidRequestContext: any = {}) {
@@ -882,6 +943,10 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
882
943
  } as unknown as QueryDeepPartialEntity<T>
883
944
  );
884
945
 
946
+ if (this.draftPublishHelperService.isDraftPublishEnabled(loadedmodel)) {
947
+ await this.draftPublishHelperService.promoteRecoveredDraftPublishVersion(this.repo, softDeletedRows);
948
+ }
949
+
885
950
  return { message: SUCCESS_MESSAGES.RECORD_RECOVERED, data: softDeletedRows };
886
951
  } catch (error: any) {
887
952
  if (error instanceof QueryFailedError && (error as any).code === '23505') {
@@ -928,6 +993,14 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
928
993
  { deletedAt: null, deletedTracker: "not-deleted" } as unknown as QueryDeepPartialEntity<T>
929
994
  );
930
995
 
996
+ if (this.draftPublishHelperService.isDraftPublishEnabled(loadedmodel)) {
997
+ // Sequential: two ids in the same batch could belong to the same version
998
+ // chain, and each promotion clears isLatest across the whole chain first.
999
+ for (const entity of softDeletedRows) {
1000
+ await this.draftPublishHelperService.promoteRecoveredDraftPublishVersion(this.repo, entity);
1001
+ }
1002
+ }
1003
+
931
1004
  return { message: SUCCESS_MESSAGES.SELECTED_RECORDS_RECOVERED, recoveredIds: ids };
932
1005
  } catch (error: any) {
933
1006
  if (error instanceof QueryFailedError && (error as any).code === "23505") {
@@ -982,18 +1055,11 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
982
1055
  return model.userKeyField?.name || '';
983
1056
  }
984
1057
 
985
- /* Publish a record - sets publishedAt timestamp */
1058
+ /* Publish a record - marks the selected version as the active published version. */
986
1059
  async publishRecord(id: number, solidRequestContext: any = {}): Promise<T> {
987
1060
 
988
1061
  const model = await this.loadModel();
989
1062
 
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
1063
  // Check user permissions
998
1064
  if (solidRequestContext.activeUser) {
999
1065
  const hasPermission = this.crudHelperService.hasPublishPermissionOnModel(
@@ -1005,37 +1071,14 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
1005
1071
  }
1006
1072
  }
1007
1073
 
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
1074
+ return this.draftPublishHelperService.publishRecord(this.repo, model, this.modelName, id, solidRequestContext.activeUser);
1025
1075
  }
1026
1076
 
1027
- /* Unpublish a record - clears publishedAt timestamp */
1077
+ /* Unpublish a record - marks the selected version as not currently published. */
1028
1078
  async unpublishRecord(id: number, solidRequestContext: any = {}): Promise<T> {
1029
1079
 
1030
1080
  const model = await this.loadModel();
1031
1081
 
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
1082
  // Check user permissions
1040
1083
  if (solidRequestContext.activeUser) {
1041
1084
  const hasPermission = this.crudHelperService.hasUnpublishPermissionOnModel(
@@ -1047,23 +1090,7 @@ private async prepareManyToManyAuditSnapshot(entity: T,id: number,modelSingularN
1047
1090
  }
1048
1091
  }
1049
1092
 
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
1093
+ return this.draftPublishHelperService.unpublishRecord(this.repo, model, this.modelName, id, solidRequestContext.activeUser);
1067
1094
  }
1068
1095
 
1069
1096
  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",