@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
@@ -0,0 +1,18 @@
1
+ import { IsNotEmpty, IsString, MaxLength } from 'class-validator';
2
+
3
+ export class ChangeMpinDto {
4
+ @IsNotEmpty()
5
+ @IsString()
6
+ @MaxLength(128)
7
+ credentialRef: string;
8
+
9
+ @IsNotEmpty()
10
+ @IsString()
11
+ @MaxLength(32)
12
+ currentMpin: string;
13
+
14
+ @IsNotEmpty()
15
+ @IsString()
16
+ @MaxLength(32)
17
+ newMpin: string;
18
+ }
@@ -1,5 +1,6 @@
1
1
  import { ApiProperty } from '@nestjs/swagger';
2
2
  import { Transform, Type } from 'class-transformer';
3
+ import { MEDIA_CATEGORIES, MediaCategory } from '../constants/media-file-types';
3
4
 
4
5
  import {
5
6
  IsArray,
@@ -155,13 +156,7 @@ export enum DecryptWhenType {
155
156
  afterTransit = 'after-transit',
156
157
  }
157
158
 
158
- export enum MediaType {
159
- image = 'image',
160
- audio = 'audio',
161
- video = 'video',
162
- // document = 'document',
163
- file = 'file',
164
- }
159
+ export type MediaType = MediaCategory;
165
160
 
166
161
  export enum RelationType {
167
162
  manyToOne = 'many-to-one',
@@ -308,7 +303,7 @@ export class CreateFieldMetadataDto {
308
303
  private: boolean;
309
304
 
310
305
  @ApiProperty({ description: 'Allowed media types for the field. Only for type=mediaSingle,mediaMultiple', })
311
- @IsEnum(MediaType, { each: true })
306
+ @IsIn([...MEDIA_CATEGORIES], { each: true })
312
307
  @IsOptional()
313
308
  mediaTypes: MediaType[];
314
309
 
@@ -464,4 +459,4 @@ export class CreateFieldMetadataDto {
464
459
  @ApiProperty({ description: 'Is Primary Key Field', })
465
460
  @IsBoolean()
466
461
  isPrimaryKey?: boolean;
467
- }
462
+ }
@@ -35,7 +35,7 @@ export class CreateModelSequenceDto {
35
35
  @IsOptional()
36
36
  @IsInt()
37
37
  @ApiProperty()
38
- currentValue: number;
38
+ currentValue?: number;
39
39
  @IsOptional()
40
40
  @IsString()
41
41
  @ApiProperty()
@@ -0,0 +1,24 @@
1
+ import { IsNotEmpty, IsString, MaxLength } from 'class-validator';
2
+
3
+ /**
4
+ * Deliberately carries no identifier - no mobile, email or username.
5
+ *
6
+ * `credentialRef` is a server-issued 256-bit handle that already points at a
7
+ * single credential row, and therefore at a single user. That is what removes
8
+ * the user-enumeration surface a public login route would otherwise have: an
9
+ * attacker cannot probe "does this phone number have MPIN?" because there is
10
+ * nowhere to put a phone number.
11
+ */
12
+ export class MpinLoginDto {
13
+ // Bounded so a pathological payload never reaches the regex test or the
14
+ // hash comparison. The handle is always 64 hex characters.
15
+ @IsNotEmpty()
16
+ @IsString()
17
+ @MaxLength(128)
18
+ credentialRef: string;
19
+
20
+ @IsNotEmpty()
21
+ @IsString()
22
+ @MaxLength(32)
23
+ mpin: string;
24
+ }
@@ -0,0 +1,51 @@
1
+ import { IsNotEmpty, IsOptional, IsString, IsUUID, Matches, MaxLength } from 'class-validator';
2
+
3
+ export class SetupMpinDto {
4
+ /**
5
+ * Stable identifier for the physical device, generated once by the client.
6
+ * Validated as a UUID before it ever reaches a cache key or a bucket name,
7
+ * so it cannot smuggle delimiters into the keyspace.
8
+ */
9
+ @IsUUID()
10
+ deviceId: string;
11
+
12
+ /**
13
+ * A string, not a number, even though it looks like digits.
14
+ *
15
+ * A numeric MPIN cannot carry a leading zero: JSON forbids leading zeros in
16
+ * number literals, so a client serialising `012345` numerically emits
17
+ * `12345` and the server stores a five-digit MPIN the user never chose -
18
+ * which still satisfies the default `^\d{4,6}$` and so raises no error.
19
+ * `mpinRegex` is also tenant-configurable and may permit non-digits.
20
+ *
21
+ * Note this cannot be enforced here: the global ValidationPipe runs with
22
+ * `enableImplicitConversion`, so a numeric payload is coerced to a string
23
+ * before @IsString() sees it. Clients must send a quoted JSON string; that
24
+ * requirement is documented in the mobile integration guide.
25
+ *
26
+ * Length and shape are checked server-side against `mpinRegex`, since that
27
+ * setting is the single authority. This only bounds the input.
28
+ */
29
+ @IsNotEmpty()
30
+ @IsString()
31
+ @MaxLength(32)
32
+ mpin: string;
33
+
34
+ /**
35
+ * Rendered in a device-management list, so it is bounded here rather than
36
+ * trusting every consuming UI to escape it.
37
+ */
38
+ @IsOptional()
39
+ @IsString()
40
+ @MaxLength(64)
41
+ @Matches(/^[\w\s.'()-]*$/, {
42
+ message: 'deviceName may contain only letters, numbers, spaces and . \' ( ) - _',
43
+ })
44
+ deviceName?: string;
45
+
46
+ @IsOptional()
47
+ @IsString()
48
+ @MaxLength(32)
49
+ @Matches(/^[\w.-]*$/, { message: 'platform may contain only letters, numbers and . - _' })
50
+ platform?: string;
51
+ }
@@ -25,6 +25,30 @@ export abstract class CommonEntity {
25
25
  @Column({ name: 'published_at', default: null, nullable: true, transformer: LocalDateTimeTransformer })
26
26
  publishedAt: Date;
27
27
 
28
+ // Optional (not just nullable) because legacy tables (see LegacyCommonEntityWithExistingId)
29
+ // don't carry these versioning columns at all. CRUDService<T extends CommonEntity> is
30
+ // otherwise used for both plain and legacy entities, so these must stay structurally
31
+ // satisfiable by a type that never declares them.
32
+ @Expose()
33
+ @Column({ name: 'is_published', default: false })
34
+ @Index()
35
+ isPublished?: boolean;
36
+
37
+ @Expose()
38
+ @Column({ name: 'is_latest', default: true })
39
+ @Index()
40
+ isLatest?: boolean;
41
+
42
+ @Expose()
43
+ @Column({ type: "int", name: 'initial_entity_version_id', default: null, nullable: true })
44
+ @Index()
45
+ initialEntityVersionId?: number;
46
+
47
+ @Expose()
48
+ @Column({ name: 'published_tracker', default: "na" })
49
+ @Index()
50
+ publishedTracker?: string;
51
+
28
52
  @Expose()
29
53
  @Column({ type: "varchar", name: 'locale_name', default: null })
30
54
  localeName: string;
@@ -6,12 +6,12 @@ import { ModuleMetadata } from 'src/entities/module-metadata.entity'
6
6
  @Entity('ss_dashboard_user_layout')
7
7
  export class DashboardUserLayout extends CommonEntity {
8
8
  @Index()
9
- @ManyToOne(() => User, { onDelete: "CASCADE", nullable: false })
9
+ @ManyToOne(() => User, { nullable: false })
10
10
  @JoinColumn()
11
11
  user: User;
12
12
 
13
13
  @Index()
14
- @ManyToOne(() => ModuleMetadata, { onDelete: "CASCADE", nullable: false })
14
+ @ManyToOne(() => ModuleMetadata, { nullable: false })
15
15
  @JoinColumn()
16
16
  module: ModuleMetadata;
17
17
 
@@ -18,17 +18,17 @@ export class SavedFilters extends CommonEntity {
18
18
  isPrivate: boolean = false;
19
19
 
20
20
  @Index()
21
- @ManyToOne(() => User, { onDelete: "CASCADE", nullable: true })
21
+ @ManyToOne(() => User, { nullable: true })
22
22
  @JoinColumn()
23
23
  user: User;
24
24
 
25
25
  @Index()
26
- @ManyToOne(() => ModelMetadata, { onDelete: "CASCADE", nullable: false })
26
+ @ManyToOne(() => ModelMetadata, { nullable: false })
27
27
  @JoinColumn()
28
28
  model: ModelMetadata;
29
29
 
30
30
  @Index()
31
- @ManyToOne(() => ViewMetadata, { onDelete: "CASCADE", nullable: false })
31
+ @ManyToOne(() => ViewMetadata, { nullable: false })
32
32
  @JoinColumn()
33
33
  view: ViewMetadata;
34
34
 
@@ -0,0 +1,130 @@
1
+ import { Exclude, Expose } from "class-transformer";
2
+ import { CommonEntity } from "src/entities/common.entity";
3
+ import { Column, Entity, Index, ManyToOne } from "typeorm";
4
+ import { User } from "./user.entity";
5
+
6
+ /**
7
+ * A per-device MPIN credential.
8
+ *
9
+ * Login presents `credentialRef` (a server-issued opaque handle) plus the MPIN.
10
+ * The handle - not a mobile number or email - is what identifies the account,
11
+ * which is why the login route needs no identifier and offers no user
12
+ * enumeration surface.
13
+ */
14
+ @Entity("ss_user_device_credential")
15
+ // Non-unique: one physical device may legitimately hold credentials for
16
+ // several accounts, and each account setup mints its own row.
17
+ @Index(["user", "deviceId"])
18
+ @Exclude()
19
+ export class UserDeviceCredential extends CommonEntity {
20
+
21
+ // SHA-256 of the opaque handle, and the login lookup key. Never exposed:
22
+ // the raw handle is returned to the client once at setup and never stored.
23
+ // SHA-256 rather than bcrypt because the handle is 256 bits of randomness -
24
+ // there is nothing to brute-force, so a slow hash would only add latency.
25
+ // Same treatment as UserApiKey.hashedKey.
26
+ @Index({ unique: true })
27
+ @Column()
28
+ hashedCredentialRef: string;
29
+
30
+ // bcrypt hash of the MPIN, via HashingService. Never exposed - same
31
+ // treatment as User.password. Slow hashing is warranted here: a 4-6 digit
32
+ // secret is exactly the low-entropy case bcrypt exists for.
33
+ @Column()
34
+ hashedMpin: string;
35
+
36
+ // Mirrors User.passwordScheme / passwordSchemeVersion so
37
+ // HashingService.needsRehash can upgrade the hash on a successful login.
38
+ @Column()
39
+ mpinScheme: string;
40
+
41
+ /**
42
+ * The hashing *policy* version this row was hashed under - not a version of
43
+ * MPIN itself. It comes from `HashingService.currentVersion()`, which
44
+ * `BcryptService` currently returns as **2**, so freshly created rows read
45
+ * 2, exactly as `ss_user.password_scheme_version` does.
46
+ *
47
+ * It matters because `BcryptService.normalize` applies the configured
48
+ * pepper only when `version >= 2`. Storing the version per row means an
49
+ * older hash still verifies after the policy changes: `compare()` uses the
50
+ * version the row was written with, and `needsRehash()` upgrades it on the
51
+ * next successful login.
52
+ *
53
+ * The `default: 1` is inherited from the `User` precedent and is never
54
+ * reached, since every write path sets this explicitly. Note it would be
55
+ * *wrong* if it ever were: a row hashed at 2 but recorded as 1 would be
56
+ * compared without the pepper and could never authenticate.
57
+ */
58
+ @Column({ default: 1 })
59
+ mpinSchemeVersion: number;
60
+
61
+ // Client-supplied, stable for the physical device. Used for grouping and
62
+ // the device-management UI only - never a lookup key. Deliberately NOT
63
+ // unique: several accounts on one device share a deviceId.
64
+ @Expose()
65
+ @Column()
66
+ deviceId: string;
67
+
68
+ /**
69
+ * Human-readable natural key - `<username>-<deviceId>` - unique per row.
70
+ *
71
+ * Neither column alone can serve as the model's user key: `deviceId` is
72
+ * shared by every account on a device, and `deviceName` is nullable.
73
+ * Combining them is unique in both directions - one user across many
74
+ * devices, and many users on one device.
75
+ *
76
+ * Populated by MpinService rather than declared as a `computed` field in
77
+ * the metadata manifest. Computed fields are evaluated by
78
+ * ComputedFieldCrudManager on the generic CRUD path (`crud.service.ts`),
79
+ * which this service bypasses by writing through the repository directly,
80
+ * so a computed declaration would silently leave this null. It is also
81
+ * beyond ConcatComputedFieldProvider, which resolves `dto[field]` flatly
82
+ * within one model and cannot reach `username` across the user relation.
83
+ */
84
+ @Expose()
85
+ @Index({ unique: true })
86
+ @Column()
87
+ credentialKey: string;
88
+
89
+ @Expose()
90
+ @Column({ nullable: true })
91
+ deviceName: string;
92
+
93
+ @Expose()
94
+ @Column({ nullable: true })
95
+ platform: string;
96
+
97
+ // Revocation is a soft-delete: the row survives so that a correct MPIN can
98
+ // be answered with "this device was removed" rather than a baffling
99
+ // "incorrect MPIN". Only active rows count towards mpinMaxDevicesPerUser.
100
+ @Expose()
101
+ @Column({ default: true })
102
+ isActive: boolean;
103
+
104
+ // Cumulative, and reset only on a successful login - never when a lockout
105
+ // expires. That is what makes the second threshold detectable without a
106
+ // separate lockout counter.
107
+ @Expose()
108
+ @Column({ default: 0 })
109
+ failedAttempts: number;
110
+
111
+ @Expose()
112
+ @Column({ nullable: true })
113
+ lockedUntil: Date;
114
+
115
+ @Expose()
116
+ @Column({ nullable: true })
117
+ lastUsedAt: Date;
118
+
119
+ // Deliberately no inverse property on User. Nothing needs
120
+ // `user.deviceCredentials`, and leaving the most widely referenced entity
121
+ // in the system untouched keeps this feature purely additive.
122
+ //
123
+ // `nullable: false` because TypeORM makes relations nullable by default,
124
+ // which would let a credential exist with no owner. Such a row could never
125
+ // authenticate - loginWithMpin rejects it - so it would simply be dead
126
+ // data, but the database should refuse it outright. This also keeps the
127
+ // column honest against the metadata manifest, which declares it required.
128
+ @ManyToOne(() => User, { nullable: false })
129
+ user: User;
130
+ }
@@ -5,6 +5,23 @@ import { UserViewMetadata } from 'src/entities/user-view-metadata.entity'
5
5
  import { UserApiKey } from 'src/entities/user-api-key.entity'
6
6
  import { Exclude, Expose } from "class-transformer";
7
7
 
8
+ /**
9
+ * Serialization is locked down twice over, and both halves are load-bearing:
10
+ *
11
+ * - The class-level `@Exclude()` below makes User itself an allowlist: only `@Expose()`d
12
+ * properties are serialized.
13
+ * - Every other property additionally carries its own `@Exclude()`. That looks redundant
14
+ * here, and for `User` it is - but class-transformer resolves the *class-level* strategy
15
+ * with a direct lookup on the exact constructor (MetadataStorage.getStrategy), so a
16
+ * subclass inherits nothing and falls back to `exposeAll`. Since this entity is a
17
+ * `@TableInheritance` root that consuming projects extend (see
18
+ * IExtensionUserCreationProvider), an extension user that forgets its own `@Exclude()`
19
+ * would otherwise serialize the password hash and every OAuth/verification token.
20
+ * Property-level metadata *is* walked up the prototype chain, so the per-property
21
+ * decorators are what actually protect subclasses.
22
+ *
23
+ * Keep both. Adding a new column? Give it `@Expose()` or `@Exclude()` - never neither.
24
+ */
8
25
  @Entity("ss_user")
9
26
  @TableInheritance({ column: { type: "varchar", name: "type", default: "User" } })
10
27
  @Exclude()
@@ -30,7 +47,7 @@ export class User extends CommonEntity {
30
47
  mobile: string;
31
48
 
32
49
  @Column({ type: "varchar", nullable: true })
33
- // don't send to client
50
+ @Exclude()
34
51
  password: string;
35
52
 
36
53
  @Column({ nullable: true, default: true })
@@ -38,67 +55,67 @@ export class User extends CommonEntity {
38
55
  forcePasswordChange: boolean = true;
39
56
 
40
57
  @Column({ type: "varchar", default: "local" })
41
- // don't send to client
58
+ @Exclude()
42
59
  lastLoginProvider: string = "local";
43
60
 
44
61
  @Column({ type: "varchar", nullable: true })
45
- // don't send to client (test)
62
+ @Exclude()
46
63
  accessCode: string;
47
64
 
48
65
  @Column({ type: "varchar", nullable: true })
49
- // don't send to client
66
+ @Exclude()
50
67
  googleAccessToken: string;
51
68
 
52
69
  @Column({ type: "varchar", nullable: true })
53
- // don't send to client
70
+ @Exclude()
54
71
  googleId: string;
55
72
 
56
73
  @Column({ type: "varchar", nullable: true })
57
- // don't send to client
74
+ @Exclude()
58
75
  googleProfilePicture: string;
59
76
 
60
77
  @Column({ type: "varchar", nullable: true })
61
- // don't send to client
78
+ @Exclude()
62
79
  facebookId: string;
63
80
 
64
81
  @Column({ type: "varchar", nullable: true })
65
- // don't send to client
82
+ @Exclude()
66
83
  facebookAccessToken: string;
67
84
 
68
85
  @Column({ type: "varchar", nullable: true })
69
- // don't send to client
86
+ @Exclude()
70
87
  facebookProfilePicture: string;
71
88
 
72
89
  @Column({ type: "varchar", nullable: true })
73
- // don't send to client
90
+ @Exclude()
74
91
  appleId: string;
75
92
 
76
93
  @Column({ type: "varchar", nullable: true })
77
- // don't send to client
94
+ @Exclude()
78
95
  appleAccessToken: string;
79
96
 
80
97
  @Column({ type: "varchar", nullable: true })
81
- // don't send to client
98
+ @Exclude()
82
99
  microsoftId: string;
83
100
 
84
101
  @Column({ type: "varchar", nullable: true })
85
- // don't send to client
102
+ @Exclude()
86
103
  microsoftAccessToken: string;
87
104
 
88
105
  @Column({ type: "varchar", nullable: true })
89
- // don't send to client
106
+ @Exclude()
90
107
  microsoftProfilePicture: string;
91
108
 
92
109
  @Column({ type: "varchar", nullable: true })
93
- // don't send to client
110
+ @Exclude()
94
111
  microsoftActiveDirectoryId: string;
95
112
 
96
113
  @Column({ type: "varchar", nullable: true })
97
- // don't send to client
114
+ @Exclude()
98
115
  microsoftActiveDirectoryAccessToken: string;
99
116
 
100
117
  @Column({ type: "varchar", nullable: true })
101
- // don't send to client
118
+ @Exclude()
102
119
  microsoftActiveDirectoryProfilePicture: string;
103
120
 
104
121
  @Index()
@@ -107,63 +124,63 @@ export class User extends CommonEntity {
107
124
  active: boolean = true;
108
125
 
109
126
  @Column({ nullable: true })
110
- // don't send to client
127
+ @Exclude()
111
128
  forgotPasswordConfirmedAt: Date;
112
129
 
113
130
  @Column({ type: "varchar", nullable: true })
114
- // don't send to client
131
+ @Exclude()
115
132
  verificationTokenOnForgotPassword: string;
116
133
 
117
134
  @Column({ nullable: true })
118
- // don't send to client
135
+ @Exclude()
119
136
  verificationTokenOnForgotPasswordExpiresAt: Date;
120
137
 
121
138
  @Column({ nullable: true })
122
- // don't send to client
139
+ @Exclude()
123
140
  emailVerifiedOnRegistrationAt: Date;
124
141
 
125
142
  @Column({ type: "varchar", nullable: true })
126
- // don't send to client
143
+ @Exclude()
127
144
  emailVerificationTokenOnRegistration: string;
128
145
 
129
146
  @Column({ nullable: true })
130
- // don't send to client
147
+ @Exclude()
131
148
  emailVerificationTokenOnRegistrationExpiresAt: Date;
132
149
 
133
150
  @Column({ nullable: true })
134
- // don't send to client
151
+ @Exclude()
135
152
  mobileVerifiedOnRegistrationAt: Date;
136
153
 
137
154
  @Column({ type: "varchar", nullable: true })
138
- // don't send to client
155
+ @Exclude()
139
156
  mobileVerificationTokenOnRegistration: string;
140
157
 
141
158
  @Column({ nullable: true })
142
- // don't send to client
159
+ @Exclude()
143
160
  mobileVerificationTokenOnRegistrationExpiresAt: Date;
144
161
 
145
162
  @Column({ nullable: true })
146
- // don't send to client
163
+ @Exclude()
147
164
  emailVerifiedOnLoginAt: Date;
148
165
 
149
166
  @Column({ type: "varchar", nullable: true })
150
- // don't send to client
167
+ @Exclude()
151
168
  emailVerificationTokenOnLogin: string;
152
169
 
153
170
  @Column({ nullable: true })
154
- // don't send to client
171
+ @Exclude()
155
172
  emailVerificationTokenOnLoginExpiresAt: Date;
156
173
 
157
174
  @Column({ nullable: true })
158
- // don't send to client
175
+ @Exclude()
159
176
  mobileVerifiedOnLoginAt: Date;
160
177
 
161
178
  @Column({ type: "varchar", nullable: true })
162
- // don't send to client
179
+ @Exclude()
163
180
  mobileVerificationTokenOnLogin: string;
164
181
 
165
182
  @Column({ nullable: true })
166
- // don't send to client
183
+ @Exclude()
167
184
  mobileVerificationTokenOnLoginExpiresAt: Date;
168
185
 
169
186
  @Column({ type: "varchar", nullable: true })
@@ -176,18 +193,18 @@ export class User extends CommonEntity {
176
193
  roles: RoleMetadata[];
177
194
 
178
195
  @OneToMany(() => UserViewMetadata, userViewMetadata => userViewMetadata.user, { cascade: true })
179
- // don't send to client
196
+ @Exclude()
180
197
  userViewMetadata: UserViewMetadata[];
181
198
 
182
- // dont send to client
199
+ @Exclude()
183
200
  @Column({ type: "varchar", default: "bcrypt" })
184
201
  passwordScheme: string;
185
202
 
186
- // dont send to client
203
+ @Exclude()
187
204
  @Column({ type: "int", default: 1 })
188
205
  passwordSchemeVersion: number;
189
206
 
190
- // dont send to client
207
+ @Exclude()
191
208
  @Column({ nullable: true })
192
209
  rehashedAt: Date;
193
210
 
@@ -19,11 +19,11 @@ export class ViewMetadata extends CommonEntity {
19
19
  @Column({ name: "type", type: "varchar" })
20
20
  type: string;
21
21
 
22
- //TODO: To make this truly cross db compatible, we should avoid setting a db type
22
+ // TODO: To make this truly cross db compatible, we should avoid setting a db type
23
23
  @Column({ name: "context", type: "text" })
24
24
  context: any = "{}";
25
25
 
26
- //TODO: To make this truly cross db compatible, we should avoid setting a db type
26
+ // TODO: To make this truly cross db compatible, we should avoid setting a db type
27
27
  @Column({ name: "layout", type: "text" })
28
28
  layout: any;
29
29
 
@@ -2,6 +2,7 @@ import { CommonEntity } from 'src/entities/common.entity';
2
2
  import { Entity, Column, Index, JoinColumn, ManyToOne } from 'typeorm';
3
3
  import { WorkflowExecution } from './workflow-execution.entity';
4
4
  import { WorkflowStepExecution } from './workflow-step-execution.entity'
5
+ import { getColumnType } from 'src/helpers/typeorm-db-helper';
5
6
 
6
7
  @Entity('ss_workflow_execution_artifact')
7
8
  export class WorkflowExecutionArtifact extends CommonEntity {
@@ -10,12 +11,12 @@ export class WorkflowExecutionArtifact extends CommonEntity {
10
11
  artifactKey: string;
11
12
 
12
13
  @Index()
13
- @ManyToOne(() => WorkflowExecution, { onDelete: "CASCADE", nullable: false })
14
+ @ManyToOne(() => WorkflowExecution, { nullable: false })
14
15
  @JoinColumn()
15
16
  workflowExecution: WorkflowExecution;
16
17
 
17
18
  @Index()
18
- @ManyToOne(() => WorkflowStepExecution, { onDelete: "CASCADE", nullable: true })
19
+ @ManyToOne(() => WorkflowStepExecution, { nullable: true })
19
20
  @JoinColumn()
20
21
  workflowStepExecution: WorkflowStepExecution;
21
22
 
@@ -61,7 +62,7 @@ export class WorkflowExecutionArtifact extends CommonEntity {
61
62
  checksum: string;
62
63
 
63
64
  @Index()
64
- @Column({ type: "timestamp", nullable: true })
65
+ @Column({ nullable: true, ...getColumnType('datetime') })
65
66
  producedAt: Date;
66
67
 
67
68
  @Column({ type: "simple-json", nullable: true })
@@ -2,6 +2,7 @@ import { CommonEntity } from 'src/entities/common.entity';
2
2
  import { Entity, Column, Index, JoinColumn, ManyToOne } from 'typeorm';
3
3
  import { WorkflowExecution } from './workflow-execution.entity';
4
4
  import { WorkflowStepExecution } from './workflow-step-execution.entity'
5
+ import { getColumnType } from 'src/helpers/typeorm-db-helper';
5
6
 
6
7
  @Entity('ss_workflow_execution_log')
7
8
  export class WorkflowExecutionLog extends CommonEntity {
@@ -10,12 +11,12 @@ export class WorkflowExecutionLog extends CommonEntity {
10
11
  logKey: string;
11
12
 
12
13
  @Index()
13
- @ManyToOne(() => WorkflowExecution, { onDelete: "CASCADE", nullable: false })
14
+ @ManyToOne(() => WorkflowExecution, { nullable: false })
14
15
  @JoinColumn()
15
16
  workflowExecution: WorkflowExecution;
16
17
 
17
18
  @Index()
18
- @ManyToOne(() => WorkflowStepExecution, { onDelete: "CASCADE", nullable: true })
19
+ @ManyToOne(() => WorkflowStepExecution, { nullable: true })
19
20
  @JoinColumn()
20
21
  workflowStepExecution: WorkflowStepExecution;
21
22
 
@@ -47,7 +48,7 @@ export class WorkflowExecutionLog extends CommonEntity {
47
48
  sequenceNumber: number;
48
49
 
49
50
  @Index()
50
- @Column({ type: "timestamp" })
51
+ @Column({ ...getColumnType('datetime') })
51
52
  occurredAt: Date;
52
53
 
53
54
  @Column({ type: "simple-json", nullable: true })
@@ -4,6 +4,7 @@ import { WorkflowDefinition } from './workflow-definition.entity'
4
4
  import { WorkflowStepExecution } from './workflow-step-execution.entity';
5
5
  import { WorkflowExecutionLog } from './workflow-execution-log.entity';
6
6
  import { WorkflowExecutionArtifact } from './workflow-execution-artifact.entity';
7
+ import { getColumnType } from 'src/helpers/typeorm-db-helper';
7
8
 
8
9
  @Entity('ss_workflow_execution')
9
10
  export class WorkflowExecution extends CommonEntity {
@@ -32,11 +33,11 @@ export class WorkflowExecution extends CommonEntity {
32
33
  triggerType: string = "manual";
33
34
 
34
35
  @Index()
35
- @Column({ type: "timestamp", nullable: true })
36
+ @Column({ nullable: true, ...getColumnType('datetime') })
36
37
  startedAt: Date;
37
38
 
38
39
  @Index()
39
- @Column({ type: "timestamp", nullable: true })
40
+ @Column({ nullable: true, ...getColumnType('datetime') })
40
41
  finishedAt: Date;
41
42
 
42
43
  @Column({ type: "bigint", nullable: true })