@digitaldefiance/node-express-suite 3.7.3 → 3.7.5

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 (882) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +4 -5
  3. package/src/__tests__/fixtures/{index.d.ts → index.ts} +0 -1
  4. package/src/__tests__/fixtures/model-mocks.mock.ts +164 -0
  5. package/src/__tests__/helpers/application.mock.ts +89 -0
  6. package/src/__tests__/helpers/{index.d.ts → index.ts} +0 -1
  7. package/src/__tests__/helpers/setup-test-env.ts +202 -0
  8. package/src/__tests__/{index.d.ts → index.ts} +0 -1
  9. package/src/application-base.ts +548 -0
  10. package/src/application-concrete.ts +62 -0
  11. package/src/application.ts +330 -0
  12. package/src/backup-code.ts +348 -0
  13. package/src/builders/application-builder.ts +147 -0
  14. package/src/builders/{index.d.ts → index.ts} +0 -1
  15. package/src/constants.ts +89 -0
  16. package/src/container/{index.d.ts → index.ts} +0 -1
  17. package/src/container/service-container.ts +85 -0
  18. package/src/container/service-definitions.ts +23 -0
  19. package/src/controllers/base.ts +512 -0
  20. package/src/controllers/{index.d.ts → index.ts} +0 -1
  21. package/src/controllers/user.ts +1734 -0
  22. package/src/database/database-initializer.ts +13 -0
  23. package/src/database/{index.d.ts → index.ts} +0 -1
  24. package/src/decorators/base-controller.ts +91 -0
  25. package/src/decorators/controller.ts +152 -0
  26. package/src/decorators/{index.d.ts → index.ts} +0 -1
  27. package/src/decorators/zod-validation.ts +64 -0
  28. package/src/defaults.ts +259 -0
  29. package/src/documents/base.ts +17 -0
  30. package/src/documents/email-token.ts +20 -0
  31. package/src/documents/{index.d.ts → index.ts} +0 -1
  32. package/src/documents/mnemonic.ts +20 -0
  33. package/src/documents/role.ts +19 -0
  34. package/src/documents/used-direct-login-token.ts +18 -0
  35. package/src/documents/user-role.ts +20 -0
  36. package/src/documents/user.ts +20 -0
  37. package/src/enumerations/base-model-name.ts +47 -0
  38. package/src/enumerations/{index.d.ts → index.ts} +0 -1
  39. package/src/enumerations/length-encoding-type.ts +16 -0
  40. package/src/enumerations/schema-collection.ts +39 -0
  41. package/src/enumerations/symmetric-error-type.ts +13 -0
  42. package/src/environment.ts +859 -0
  43. package/src/errors/express-validation.ts +38 -0
  44. package/src/errors/{index.d.ts → index.ts} +0 -1
  45. package/src/errors/invalid-backup-code-version.ts +30 -0
  46. package/src/errors/invalid-jwt-token.ts +24 -0
  47. package/src/errors/invalid-model.ts +24 -0
  48. package/src/errors/invalid-new-password.ts +33 -0
  49. package/src/errors/invalid-password.ts +28 -0
  50. package/src/errors/missing-validated-data.ts +55 -0
  51. package/src/errors/mnemonic-or-password-required.ts +26 -0
  52. package/src/errors/model-not-registered.ts +24 -0
  53. package/src/errors/mongoose-validation.ts +56 -0
  54. package/src/errors/symmetric.ts +53 -0
  55. package/src/errors/token-expired.ts +24 -0
  56. package/src/get-language.ts +64 -0
  57. package/src/get-timezone.ts +76 -0
  58. package/src/{index.d.ts → index.ts} +44 -2
  59. package/src/interfaces/api-error-response.ts +15 -0
  60. package/src/interfaces/api-express-validation-error-response.ts +17 -0
  61. package/src/interfaces/api-message-response.ts +12 -0
  62. package/src/interfaces/api-mongo-validation-error-response.ts +17 -0
  63. package/src/interfaces/api-responses/backup-codes-response.ts +15 -0
  64. package/src/interfaces/api-responses/challenge-response.ts +17 -0
  65. package/src/interfaces/api-responses/code-count-response.ts +12 -0
  66. package/src/interfaces/api-responses/{index.d.ts → index.ts} +0 -1
  67. package/src/interfaces/api-responses/login-response.ts +18 -0
  68. package/src/interfaces/api-responses/mnemonic-response.ts +15 -0
  69. package/src/interfaces/api-responses/registration-response.ts +17 -0
  70. package/src/interfaces/api-responses/request-user-response.ts +16 -0
  71. package/src/interfaces/api-responses/user-settings-response.ts +19 -0
  72. package/src/interfaces/application.ts +40 -0
  73. package/src/interfaces/backend-objects/email-token.ts +18 -0
  74. package/src/interfaces/backend-objects/{index.d.ts → index.ts} +0 -1
  75. package/src/interfaces/backend-objects/request-user.ts +19 -0
  76. package/src/interfaces/backend-objects/role.ts +18 -0
  77. package/src/interfaces/backend-objects/user.ts +18 -0
  78. package/src/interfaces/checksum-config.ts +15 -0
  79. package/src/interfaces/checksum-consts.ts +23 -0
  80. package/src/interfaces/constants.ts +114 -0
  81. package/src/interfaces/controller-config.ts +54 -0
  82. package/src/interfaces/create-user-basics.ts +24 -0
  83. package/src/interfaces/csp-config.ts +32 -0
  84. package/src/interfaces/csp-definition.ts +71 -0
  85. package/src/interfaces/db-init-result.ts +17 -0
  86. package/src/interfaces/deep-partial.ts +14 -0
  87. package/src/interfaces/discriminator-collections.ts +21 -0
  88. package/src/interfaces/email-service.ts +26 -0
  89. package/src/interfaces/environment-mongo.ts +86 -0
  90. package/src/interfaces/environment.ts +191 -0
  91. package/src/interfaces/failable-result.ts +20 -0
  92. package/src/interfaces/fec-consts.ts +14 -0
  93. package/src/interfaces/flexible-csp.ts +35 -0
  94. package/src/interfaces/handleable-error-options.ts +19 -0
  95. package/src/interfaces/{index.d.ts → index.ts} +0 -1
  96. package/src/interfaces/jwt-consts.ts +33 -0
  97. package/src/interfaces/jwt-sign-response.ts +31 -0
  98. package/src/interfaces/models/email-token.ts +13 -0
  99. package/src/interfaces/models/{index.d.ts → index.ts} +0 -1
  100. package/src/interfaces/models/mnemonic.ts +14 -0
  101. package/src/interfaces/models/role.ts +13 -0
  102. package/src/interfaces/models/token-role.ts +23 -0
  103. package/src/interfaces/models/used-direct-login-token.ts +21 -0
  104. package/src/interfaces/models/user-role.ts +23 -0
  105. package/src/interfaces/models/user.ts +30 -0
  106. package/src/interfaces/mongo-errors.ts +14 -0
  107. package/src/interfaces/request-user.ts +80 -0
  108. package/src/interfaces/required-string-keys.ts +33 -0
  109. package/src/interfaces/schema.ts +43 -0
  110. package/src/interfaces/server-init-result.ts +48 -0
  111. package/src/interfaces/status-code-response.ts +20 -0
  112. package/src/interfaces/symmetric-encryption-results.d.ts.map +1 -1
  113. package/src/interfaces/symmetric-encryption-results.js.map +1 -1
  114. package/src/interfaces/symmetric-encryption-results.ts +15 -0
  115. package/src/interfaces/test-environment.ts +23 -0
  116. package/src/interfaces/token-response.ts +16 -0
  117. package/src/middleware-utils.ts +138 -0
  118. package/src/middlewares/authenticate-crypto.ts +237 -0
  119. package/src/middlewares/authenticate-token.ts +165 -0
  120. package/src/middlewares/cleanup-crypto.ts +47 -0
  121. package/src/middlewares/{index.d.ts → index.ts} +0 -1
  122. package/src/middlewares/set-global-context-language.ts +38 -0
  123. package/src/model-registry.ts +142 -0
  124. package/src/models/email-token.ts +49 -0
  125. package/src/models/{index.d.ts → index.ts} +0 -1
  126. package/src/models/mnemonic.ts +42 -0
  127. package/src/models/role.ts +38 -0
  128. package/src/models/used-direct-login-token.ts +49 -0
  129. package/src/models/user-role.ts +40 -0
  130. package/src/models/user.ts +42 -0
  131. package/src/pipeline/{index.d.ts → index.ts} +0 -1
  132. package/src/pipeline/pipeline-builder.ts +27 -0
  133. package/src/plugins/{index.d.ts → index.ts} +0 -1
  134. package/src/plugins/plugin-interface.ts +19 -0
  135. package/src/plugins/plugin-manager.ts +53 -0
  136. package/src/registry/email-service-registry.ts +76 -0
  137. package/src/registry/{index.d.ts → index.ts} +0 -1
  138. package/src/responses/{index.d.ts → index.ts} +0 -1
  139. package/src/responses/response-builder.ts +166 -0
  140. package/src/routers/api.ts +233 -0
  141. package/src/routers/app.ts +395 -0
  142. package/src/routers/base.ts +34 -0
  143. package/src/routers/{index.d.ts → index.ts} +0 -1
  144. package/src/routers/router-config.ts +34 -0
  145. package/src/routing/index.ts +1 -0
  146. package/src/routing/route-builder.ts +214 -0
  147. package/src/schemas/email-token.ts +112 -0
  148. package/src/schemas/{index.d.ts → index.ts} +0 -1
  149. package/src/schemas/mnemonic.ts +48 -0
  150. package/src/schemas/role.ts +153 -0
  151. package/src/schemas/schema.ts +185 -0
  152. package/src/schemas/used-direct-login-token.ts +58 -0
  153. package/src/schemas/user-role.ts +93 -0
  154. package/src/schemas/user.ts +244 -0
  155. package/src/services/backup-code.ts +327 -0
  156. package/src/services/base.ts +46 -0
  157. package/src/services/checksum.ts +189 -0
  158. package/src/services/database-initialization.ts +1653 -0
  159. package/src/services/db-init-cache.ts +28 -0
  160. package/src/services/direct-login-token.ts +83 -0
  161. package/src/services/dummy-email-service.ts +43 -0
  162. package/src/services/fec-usage-example.ts +123 -0
  163. package/src/services/fec.ts +399 -0
  164. package/src/services/{index.d.ts → index.ts} +0 -2
  165. package/src/services/jwt.ts +146 -0
  166. package/src/services/key-wrapping.ts +528 -0
  167. package/src/services/mnemonic.ts +174 -0
  168. package/src/services/request-user.ts +127 -0
  169. package/src/services/role.ts +417 -0
  170. package/src/services/symmetric.ts +164 -0
  171. package/src/services/system-user.ts +87 -0
  172. package/src/services/user.ts +2324 -0
  173. package/src/services/xor.ts +39 -0
  174. package/src/testing.ts +9 -0
  175. package/src/transactions/{index.d.ts → index.ts} +0 -1
  176. package/src/transactions/transaction-manager.ts +63 -0
  177. package/src/types/app-config.ts +36 -0
  178. package/src/types/controller-config.ts +28 -0
  179. package/src/types/{environment-variables.d.ts → environment-variables.ts} +32 -5
  180. package/src/types/{index.d.ts → index.ts} +0 -1
  181. package/src/types/{mongoose-helpers.d.ts → mongoose-helpers.ts} +8 -2
  182. package/src/types/mongoose-override.d.ts +1 -0
  183. package/src/types/mongoose.d.ts +1 -0
  184. package/src/types.ts +189 -0
  185. package/src/utils.ts +1116 -0
  186. package/src/validation/{index.d.ts → index.ts} +0 -1
  187. package/src/validation/validation-builder.ts +155 -0
  188. package/src/__tests__/fixtures/index.d.ts.map +0 -1
  189. package/src/__tests__/fixtures/index.js +0 -5
  190. package/src/__tests__/fixtures/index.js.map +0 -1
  191. package/src/__tests__/fixtures/model-mocks.mock.d.ts +0 -12
  192. package/src/__tests__/fixtures/model-mocks.mock.d.ts.map +0 -1
  193. package/src/__tests__/fixtures/model-mocks.mock.js +0 -102
  194. package/src/__tests__/fixtures/model-mocks.mock.js.map +0 -1
  195. package/src/__tests__/helpers/application.mock.d.ts +0 -8
  196. package/src/__tests__/helpers/application.mock.d.ts.map +0 -1
  197. package/src/__tests__/helpers/application.mock.js +0 -77
  198. package/src/__tests__/helpers/application.mock.js.map +0 -1
  199. package/src/__tests__/helpers/index.d.ts.map +0 -1
  200. package/src/__tests__/helpers/index.js +0 -7
  201. package/src/__tests__/helpers/index.js.map +0 -1
  202. package/src/__tests__/helpers/setup-test-env.d.ts +0 -12
  203. package/src/__tests__/helpers/setup-test-env.d.ts.map +0 -1
  204. package/src/__tests__/helpers/setup-test-env.js +0 -121
  205. package/src/__tests__/helpers/setup-test-env.js.map +0 -1
  206. package/src/__tests__/index.d.ts.map +0 -1
  207. package/src/__tests__/index.js +0 -6
  208. package/src/__tests__/index.js.map +0 -1
  209. package/src/application-base.d.ts +0 -123
  210. package/src/application-base.d.ts.map +0 -1
  211. package/src/application-base.js +0 -359
  212. package/src/application-base.js.map +0 -1
  213. package/src/application-concrete.d.ts +0 -13
  214. package/src/application-concrete.d.ts.map +0 -1
  215. package/src/application-concrete.js +0 -21
  216. package/src/application-concrete.js.map +0 -1
  217. package/src/application.d.ts +0 -29
  218. package/src/application.d.ts.map +0 -1
  219. package/src/application.js +0 -167
  220. package/src/application.js.map +0 -1
  221. package/src/backup-code.d.ts +0 -67
  222. package/src/backup-code.d.ts.map +0 -1
  223. package/src/backup-code.js +0 -238
  224. package/src/backup-code.js.map +0 -1
  225. package/src/builders/application-builder.d.ts +0 -35
  226. package/src/builders/application-builder.d.ts.map +0 -1
  227. package/src/builders/application-builder.js +0 -64
  228. package/src/builders/application-builder.js.map +0 -1
  229. package/src/builders/index.d.ts.map +0 -1
  230. package/src/builders/index.js +0 -5
  231. package/src/builders/index.js.map +0 -1
  232. package/src/constants.d.ts +0 -16
  233. package/src/constants.d.ts.map +0 -1
  234. package/src/constants.js +0 -58
  235. package/src/constants.js.map +0 -1
  236. package/src/container/index.d.ts.map +0 -1
  237. package/src/container/index.js +0 -6
  238. package/src/container/index.js.map +0 -1
  239. package/src/container/service-container.d.ts +0 -11
  240. package/src/container/service-container.d.ts.map +0 -1
  241. package/src/container/service-container.js +0 -38
  242. package/src/container/service-container.js.map +0 -1
  243. package/src/container/service-definitions.d.ts +0 -11
  244. package/src/container/service-definitions.d.ts.map +0 -1
  245. package/src/container/service-definitions.js +0 -13
  246. package/src/container/service-definitions.js.map +0 -1
  247. package/src/controllers/base.d.ts +0 -67
  248. package/src/controllers/base.d.ts.map +0 -1
  249. package/src/controllers/base.js +0 -305
  250. package/src/controllers/base.js.map +0 -1
  251. package/src/controllers/index.d.ts.map +0 -1
  252. package/src/controllers/index.js +0 -6
  253. package/src/controllers/index.js.map +0 -1
  254. package/src/controllers/user.d.ts +0 -49
  255. package/src/controllers/user.d.ts.map +0 -1
  256. package/src/controllers/user.js +0 -919
  257. package/src/controllers/user.js.map +0 -1
  258. package/src/database/database-initializer.d.ts +0 -7
  259. package/src/database/database-initializer.d.ts.map +0 -1
  260. package/src/database/database-initializer.js +0 -3
  261. package/src/database/database-initializer.js.map +0 -1
  262. package/src/database/index.d.ts.map +0 -1
  263. package/src/database/index.js +0 -5
  264. package/src/database/index.js.map +0 -1
  265. package/src/decorators/base-controller.d.ts +0 -11
  266. package/src/decorators/base-controller.d.ts.map +0 -1
  267. package/src/decorators/base-controller.js +0 -60
  268. package/src/decorators/base-controller.js.map +0 -1
  269. package/src/decorators/controller.d.ts +0 -38
  270. package/src/decorators/controller.d.ts.map +0 -1
  271. package/src/decorators/controller.js +0 -68
  272. package/src/decorators/controller.js.map +0 -1
  273. package/src/decorators/index.d.ts.map +0 -1
  274. package/src/decorators/index.js +0 -7
  275. package/src/decorators/index.js.map +0 -1
  276. package/src/decorators/zod-validation.d.ts +0 -5
  277. package/src/decorators/zod-validation.d.ts.map +0 -1
  278. package/src/decorators/zod-validation.js +0 -48
  279. package/src/decorators/zod-validation.js.map +0 -1
  280. package/src/defaults.d.ts +0 -7
  281. package/src/defaults.d.ts.map +0 -1
  282. package/src/defaults.js +0 -205
  283. package/src/defaults.js.map +0 -1
  284. package/src/documents/base.d.ts +0 -4
  285. package/src/documents/base.d.ts.map +0 -1
  286. package/src/documents/base.js +0 -3
  287. package/src/documents/base.js.map +0 -1
  288. package/src/documents/email-token.d.ts +0 -8
  289. package/src/documents/email-token.d.ts.map +0 -1
  290. package/src/documents/email-token.js +0 -3
  291. package/src/documents/email-token.js.map +0 -1
  292. package/src/documents/index.d.ts.map +0 -1
  293. package/src/documents/index.js +0 -3
  294. package/src/documents/index.js.map +0 -1
  295. package/src/documents/mnemonic.d.ts +0 -8
  296. package/src/documents/mnemonic.d.ts.map +0 -1
  297. package/src/documents/mnemonic.js +0 -3
  298. package/src/documents/mnemonic.js.map +0 -1
  299. package/src/documents/role.d.ts +0 -8
  300. package/src/documents/role.d.ts.map +0 -1
  301. package/src/documents/role.js +0 -3
  302. package/src/documents/role.js.map +0 -1
  303. package/src/documents/used-direct-login-token.d.ts +0 -5
  304. package/src/documents/used-direct-login-token.d.ts.map +0 -1
  305. package/src/documents/used-direct-login-token.js +0 -3
  306. package/src/documents/used-direct-login-token.js.map +0 -1
  307. package/src/documents/user-role.d.ts +0 -8
  308. package/src/documents/user-role.d.ts.map +0 -1
  309. package/src/documents/user-role.js +0 -3
  310. package/src/documents/user-role.js.map +0 -1
  311. package/src/documents/user.d.ts +0 -8
  312. package/src/documents/user.d.ts.map +0 -1
  313. package/src/documents/user.js +0 -3
  314. package/src/documents/user.js.map +0 -1
  315. package/src/enumerations/base-model-name.d.ts +0 -38
  316. package/src/enumerations/base-model-name.d.ts.map +0 -1
  317. package/src/enumerations/base-model-name.js +0 -34
  318. package/src/enumerations/base-model-name.js.map +0 -1
  319. package/src/enumerations/index.d.ts.map +0 -1
  320. package/src/enumerations/index.js +0 -8
  321. package/src/enumerations/index.js.map +0 -1
  322. package/src/enumerations/length-encoding-type.d.ts +0 -7
  323. package/src/enumerations/length-encoding-type.d.ts.map +0 -1
  324. package/src/enumerations/length-encoding-type.js +0 -11
  325. package/src/enumerations/length-encoding-type.js.map +0 -1
  326. package/src/enumerations/schema-collection.d.ts +0 -34
  327. package/src/enumerations/schema-collection.d.ts.map +0 -1
  328. package/src/enumerations/schema-collection.js +0 -38
  329. package/src/enumerations/schema-collection.js.map +0 -1
  330. package/src/enumerations/symmetric-error-type.d.ts +0 -5
  331. package/src/enumerations/symmetric-error-type.d.ts.map +0 -1
  332. package/src/enumerations/symmetric-error-type.js +0 -9
  333. package/src/enumerations/symmetric-error-type.js.map +0 -1
  334. package/src/environment.d.ts +0 -189
  335. package/src/environment.d.ts.map +0 -1
  336. package/src/environment.js +0 -641
  337. package/src/environment.js.map +0 -1
  338. package/src/errors/express-validation.d.ts +0 -9
  339. package/src/errors/express-validation.d.ts.map +0 -1
  340. package/src/errors/express-validation.js +0 -18
  341. package/src/errors/express-validation.js.map +0 -1
  342. package/src/errors/index.d.ts.map +0 -1
  343. package/src/errors/index.js +0 -16
  344. package/src/errors/index.js.map +0 -1
  345. package/src/errors/invalid-backup-code-version.d.ts +0 -6
  346. package/src/errors/invalid-backup-code-version.d.ts.map +0 -1
  347. package/src/errors/invalid-backup-code-version.js +0 -16
  348. package/src/errors/invalid-backup-code-version.js.map +0 -1
  349. package/src/errors/invalid-jwt-token.d.ts +0 -5
  350. package/src/errors/invalid-jwt-token.d.ts.map +0 -1
  351. package/src/errors/invalid-jwt-token.js +0 -12
  352. package/src/errors/invalid-jwt-token.js.map +0 -1
  353. package/src/errors/invalid-model.d.ts +0 -6
  354. package/src/errors/invalid-model.d.ts.map +0 -1
  355. package/src/errors/invalid-model.js +0 -14
  356. package/src/errors/invalid-model.js.map +0 -1
  357. package/src/errors/invalid-new-password.d.ts +0 -5
  358. package/src/errors/invalid-new-password.d.ts.map +0 -1
  359. package/src/errors/invalid-new-password.js +0 -14
  360. package/src/errors/invalid-new-password.js.map +0 -1
  361. package/src/errors/invalid-password.d.ts +0 -5
  362. package/src/errors/invalid-password.d.ts.map +0 -1
  363. package/src/errors/invalid-password.js +0 -14
  364. package/src/errors/invalid-password.js.map +0 -1
  365. package/src/errors/missing-validated-data.d.ts +0 -7
  366. package/src/errors/missing-validated-data.d.ts.map +0 -1
  367. package/src/errors/missing-validated-data.js +0 -36
  368. package/src/errors/missing-validated-data.js.map +0 -1
  369. package/src/errors/mnemonic-or-password-required.d.ts +0 -5
  370. package/src/errors/mnemonic-or-password-required.d.ts.map +0 -1
  371. package/src/errors/mnemonic-or-password-required.js +0 -14
  372. package/src/errors/mnemonic-or-password-required.js.map +0 -1
  373. package/src/errors/model-not-registered.d.ts +0 -6
  374. package/src/errors/model-not-registered.d.ts.map +0 -1
  375. package/src/errors/model-not-registered.js +0 -14
  376. package/src/errors/model-not-registered.js.map +0 -1
  377. package/src/errors/mongoose-validation.d.ts +0 -12
  378. package/src/errors/mongoose-validation.d.ts.map +0 -1
  379. package/src/errors/mongoose-validation.js +0 -17
  380. package/src/errors/mongoose-validation.js.map +0 -1
  381. package/src/errors/symmetric.d.ts +0 -8
  382. package/src/errors/symmetric.d.ts.map +0 -1
  383. package/src/errors/symmetric.js +0 -22
  384. package/src/errors/symmetric.js.map +0 -1
  385. package/src/errors/token-expired.d.ts +0 -5
  386. package/src/errors/token-expired.d.ts.map +0 -1
  387. package/src/errors/token-expired.js +0 -12
  388. package/src/errors/token-expired.js.map +0 -1
  389. package/src/get-language.d.ts +0 -2
  390. package/src/get-language.d.ts.map +0 -1
  391. package/src/get-language.js +0 -30
  392. package/src/get-language.js.map +0 -1
  393. package/src/get-timezone.d.ts +0 -2
  394. package/src/get-timezone.d.ts.map +0 -1
  395. package/src/get-timezone.js +0 -39
  396. package/src/get-timezone.js.map +0 -1
  397. package/src/index.d.ts.map +0 -1
  398. package/src/index.js +0 -80
  399. package/src/index.js.map +0 -1
  400. package/src/interfaces/api-error-response.d.ts +0 -5
  401. package/src/interfaces/api-error-response.d.ts.map +0 -1
  402. package/src/interfaces/api-error-response.js +0 -3
  403. package/src/interfaces/api-error-response.js.map +0 -1
  404. package/src/interfaces/api-express-validation-error-response.d.ts +0 -7
  405. package/src/interfaces/api-express-validation-error-response.d.ts.map +0 -1
  406. package/src/interfaces/api-express-validation-error-response.js +0 -3
  407. package/src/interfaces/api-express-validation-error-response.js.map +0 -1
  408. package/src/interfaces/api-message-response.d.ts +0 -4
  409. package/src/interfaces/api-message-response.d.ts.map +0 -1
  410. package/src/interfaces/api-message-response.js +0 -3
  411. package/src/interfaces/api-message-response.js.map +0 -1
  412. package/src/interfaces/api-mongo-validation-error-response.d.ts +0 -6
  413. package/src/interfaces/api-mongo-validation-error-response.d.ts.map +0 -1
  414. package/src/interfaces/api-mongo-validation-error-response.js +0 -3
  415. package/src/interfaces/api-mongo-validation-error-response.js.map +0 -1
  416. package/src/interfaces/api-responses/backup-codes-response.d.ts +0 -5
  417. package/src/interfaces/api-responses/backup-codes-response.d.ts.map +0 -1
  418. package/src/interfaces/api-responses/backup-codes-response.js +0 -3
  419. package/src/interfaces/api-responses/backup-codes-response.js.map +0 -1
  420. package/src/interfaces/api-responses/challenge-response.d.ts +0 -6
  421. package/src/interfaces/api-responses/challenge-response.d.ts.map +0 -1
  422. package/src/interfaces/api-responses/challenge-response.js +0 -3
  423. package/src/interfaces/api-responses/challenge-response.js.map +0 -1
  424. package/src/interfaces/api-responses/code-count-response.d.ts +0 -5
  425. package/src/interfaces/api-responses/code-count-response.d.ts.map +0 -1
  426. package/src/interfaces/api-responses/code-count-response.js +0 -3
  427. package/src/interfaces/api-responses/code-count-response.js.map +0 -1
  428. package/src/interfaces/api-responses/index.d.ts.map +0 -1
  429. package/src/interfaces/api-responses/index.js +0 -12
  430. package/src/interfaces/api-responses/index.js.map +0 -1
  431. package/src/interfaces/api-responses/login-response.d.ts +0 -8
  432. package/src/interfaces/api-responses/login-response.d.ts.map +0 -1
  433. package/src/interfaces/api-responses/login-response.js +0 -3
  434. package/src/interfaces/api-responses/login-response.js.map +0 -1
  435. package/src/interfaces/api-responses/mnemonic-response.d.ts +0 -5
  436. package/src/interfaces/api-responses/mnemonic-response.d.ts.map +0 -1
  437. package/src/interfaces/api-responses/mnemonic-response.js +0 -3
  438. package/src/interfaces/api-responses/mnemonic-response.js.map +0 -1
  439. package/src/interfaces/api-responses/registration-response.d.ts +0 -6
  440. package/src/interfaces/api-responses/registration-response.d.ts.map +0 -1
  441. package/src/interfaces/api-responses/registration-response.js +0 -3
  442. package/src/interfaces/api-responses/registration-response.js.map +0 -1
  443. package/src/interfaces/api-responses/request-user-response.d.ts +0 -6
  444. package/src/interfaces/api-responses/request-user-response.d.ts.map +0 -1
  445. package/src/interfaces/api-responses/request-user-response.js +0 -3
  446. package/src/interfaces/api-responses/request-user-response.js.map +0 -1
  447. package/src/interfaces/api-responses/user-settings-response.d.ts +0 -12
  448. package/src/interfaces/api-responses/user-settings-response.d.ts.map +0 -1
  449. package/src/interfaces/api-responses/user-settings-response.js +0 -3
  450. package/src/interfaces/api-responses/user-settings-response.js.map +0 -1
  451. package/src/interfaces/application.d.ts +0 -17
  452. package/src/interfaces/application.d.ts.map +0 -1
  453. package/src/interfaces/application.js +0 -3
  454. package/src/interfaces/application.js.map +0 -1
  455. package/src/interfaces/backend-objects/email-token.d.ts +0 -4
  456. package/src/interfaces/backend-objects/email-token.d.ts.map +0 -1
  457. package/src/interfaces/backend-objects/email-token.js +0 -3
  458. package/src/interfaces/backend-objects/email-token.js.map +0 -1
  459. package/src/interfaces/backend-objects/index.d.ts.map +0 -1
  460. package/src/interfaces/backend-objects/index.js +0 -8
  461. package/src/interfaces/backend-objects/index.js.map +0 -1
  462. package/src/interfaces/backend-objects/request-user.d.ts +0 -5
  463. package/src/interfaces/backend-objects/request-user.d.ts.map +0 -1
  464. package/src/interfaces/backend-objects/request-user.js +0 -3
  465. package/src/interfaces/backend-objects/request-user.js.map +0 -1
  466. package/src/interfaces/backend-objects/role.d.ts +0 -4
  467. package/src/interfaces/backend-objects/role.d.ts.map +0 -1
  468. package/src/interfaces/backend-objects/role.js +0 -3
  469. package/src/interfaces/backend-objects/role.js.map +0 -1
  470. package/src/interfaces/backend-objects/user.d.ts +0 -4
  471. package/src/interfaces/backend-objects/user.d.ts.map +0 -1
  472. package/src/interfaces/backend-objects/user.js +0 -3
  473. package/src/interfaces/backend-objects/user.js.map +0 -1
  474. package/src/interfaces/checksum-config.d.ts +0 -5
  475. package/src/interfaces/checksum-config.d.ts.map +0 -1
  476. package/src/interfaces/checksum-config.js +0 -3
  477. package/src/interfaces/checksum-config.js.map +0 -1
  478. package/src/interfaces/checksum-consts.d.ts +0 -11
  479. package/src/interfaces/checksum-consts.d.ts.map +0 -1
  480. package/src/interfaces/checksum-consts.js +0 -3
  481. package/src/interfaces/checksum-consts.js.map +0 -1
  482. package/src/interfaces/constants.d.ts +0 -102
  483. package/src/interfaces/constants.d.ts.map +0 -1
  484. package/src/interfaces/constants.js +0 -3
  485. package/src/interfaces/constants.js.map +0 -1
  486. package/src/interfaces/controller-config.d.ts +0 -21
  487. package/src/interfaces/controller-config.d.ts.map +0 -1
  488. package/src/interfaces/controller-config.js +0 -3
  489. package/src/interfaces/controller-config.js.map +0 -1
  490. package/src/interfaces/create-user-basics.d.ts +0 -18
  491. package/src/interfaces/create-user-basics.d.ts.map +0 -1
  492. package/src/interfaces/create-user-basics.js +0 -3
  493. package/src/interfaces/create-user-basics.js.map +0 -1
  494. package/src/interfaces/csp-config.d.ts +0 -7
  495. package/src/interfaces/csp-config.d.ts.map +0 -1
  496. package/src/interfaces/csp-config.js +0 -13
  497. package/src/interfaces/csp-config.js.map +0 -1
  498. package/src/interfaces/csp-definition.d.ts +0 -13
  499. package/src/interfaces/csp-definition.d.ts.map +0 -1
  500. package/src/interfaces/csp-definition.js +0 -22
  501. package/src/interfaces/csp-definition.js.map +0 -1
  502. package/src/interfaces/db-init-result.d.ts +0 -5
  503. package/src/interfaces/db-init-result.d.ts.map +0 -1
  504. package/src/interfaces/db-init-result.js +0 -3
  505. package/src/interfaces/db-init-result.js.map +0 -1
  506. package/src/interfaces/deep-partial.d.ts +0 -4
  507. package/src/interfaces/deep-partial.d.ts.map +0 -1
  508. package/src/interfaces/deep-partial.js +0 -3
  509. package/src/interfaces/deep-partial.js.map +0 -1
  510. package/src/interfaces/discriminator-collections.d.ts +0 -7
  511. package/src/interfaces/discriminator-collections.d.ts.map +0 -1
  512. package/src/interfaces/discriminator-collections.js +0 -3
  513. package/src/interfaces/discriminator-collections.js.map +0 -1
  514. package/src/interfaces/email-service.d.ts +0 -4
  515. package/src/interfaces/email-service.d.ts.map +0 -1
  516. package/src/interfaces/email-service.js +0 -3
  517. package/src/interfaces/email-service.js.map +0 -1
  518. package/src/interfaces/environment-mongo.d.ts +0 -76
  519. package/src/interfaces/environment-mongo.d.ts.map +0 -1
  520. package/src/interfaces/environment-mongo.js +0 -3
  521. package/src/interfaces/environment-mongo.js.map +0 -1
  522. package/src/interfaces/environment.d.ts +0 -180
  523. package/src/interfaces/environment.d.ts.map +0 -1
  524. package/src/interfaces/environment.js +0 -3
  525. package/src/interfaces/environment.js.map +0 -1
  526. package/src/interfaces/failable-result.d.ts +0 -7
  527. package/src/interfaces/failable-result.d.ts.map +0 -1
  528. package/src/interfaces/failable-result.js +0 -3
  529. package/src/interfaces/failable-result.js.map +0 -1
  530. package/src/interfaces/fec-consts.d.ts +0 -5
  531. package/src/interfaces/fec-consts.d.ts.map +0 -1
  532. package/src/interfaces/fec-consts.js +0 -3
  533. package/src/interfaces/fec-consts.js.map +0 -1
  534. package/src/interfaces/flexible-csp.d.ts +0 -8
  535. package/src/interfaces/flexible-csp.d.ts.map +0 -1
  536. package/src/interfaces/flexible-csp.js +0 -14
  537. package/src/interfaces/flexible-csp.js.map +0 -1
  538. package/src/interfaces/handleable-error-options.d.ts +0 -7
  539. package/src/interfaces/handleable-error-options.d.ts.map +0 -1
  540. package/src/interfaces/handleable-error-options.js +0 -3
  541. package/src/interfaces/handleable-error-options.js.map +0 -1
  542. package/src/interfaces/index.d.ts.map +0 -1
  543. package/src/interfaces/index.js +0 -38
  544. package/src/interfaces/index.js.map +0 -1
  545. package/src/interfaces/jwt-consts.d.ts +0 -11
  546. package/src/interfaces/jwt-consts.d.ts.map +0 -1
  547. package/src/interfaces/jwt-consts.js +0 -3
  548. package/src/interfaces/jwt-consts.js.map +0 -1
  549. package/src/interfaces/jwt-sign-response.d.ts +0 -11
  550. package/src/interfaces/jwt-sign-response.d.ts.map +0 -1
  551. package/src/interfaces/jwt-sign-response.js +0 -3
  552. package/src/interfaces/jwt-sign-response.js.map +0 -1
  553. package/src/interfaces/models/email-token.d.ts +0 -6
  554. package/src/interfaces/models/email-token.d.ts.map +0 -1
  555. package/src/interfaces/models/email-token.js +0 -3
  556. package/src/interfaces/models/email-token.js.map +0 -1
  557. package/src/interfaces/models/index.d.ts.map +0 -1
  558. package/src/interfaces/models/index.js +0 -11
  559. package/src/interfaces/models/index.js.map +0 -1
  560. package/src/interfaces/models/mnemonic.d.ts +0 -6
  561. package/src/interfaces/models/mnemonic.d.ts.map +0 -1
  562. package/src/interfaces/models/mnemonic.js +0 -3
  563. package/src/interfaces/models/mnemonic.js.map +0 -1
  564. package/src/interfaces/models/role.d.ts +0 -6
  565. package/src/interfaces/models/role.d.ts.map +0 -1
  566. package/src/interfaces/models/role.js +0 -3
  567. package/src/interfaces/models/role.js.map +0 -1
  568. package/src/interfaces/models/token-role.d.ts +0 -11
  569. package/src/interfaces/models/token-role.d.ts.map +0 -1
  570. package/src/interfaces/models/token-role.js +0 -3
  571. package/src/interfaces/models/token-role.js.map +0 -1
  572. package/src/interfaces/models/used-direct-login-token.d.ts +0 -11
  573. package/src/interfaces/models/used-direct-login-token.d.ts.map +0 -1
  574. package/src/interfaces/models/used-direct-login-token.js +0 -3
  575. package/src/interfaces/models/used-direct-login-token.js.map +0 -1
  576. package/src/interfaces/models/user-role.d.ts +0 -11
  577. package/src/interfaces/models/user-role.d.ts.map +0 -1
  578. package/src/interfaces/models/user-role.js +0 -3
  579. package/src/interfaces/models/user-role.js.map +0 -1
  580. package/src/interfaces/models/user.d.ts +0 -11
  581. package/src/interfaces/models/user.d.ts.map +0 -1
  582. package/src/interfaces/models/user.js +0 -3
  583. package/src/interfaces/models/user.js.map +0 -1
  584. package/src/interfaces/mongo-errors.d.ts +0 -5
  585. package/src/interfaces/mongo-errors.d.ts.map +0 -1
  586. package/src/interfaces/mongo-errors.js +0 -3
  587. package/src/interfaces/mongo-errors.js.map +0 -1
  588. package/src/interfaces/request-user.d.ts +0 -58
  589. package/src/interfaces/request-user.d.ts.map +0 -1
  590. package/src/interfaces/request-user.js +0 -3
  591. package/src/interfaces/request-user.js.map +0 -1
  592. package/src/interfaces/required-string-keys.d.ts +0 -22
  593. package/src/interfaces/required-string-keys.d.ts.map +0 -1
  594. package/src/interfaces/required-string-keys.js +0 -3
  595. package/src/interfaces/required-string-keys.js.map +0 -1
  596. package/src/interfaces/schema.d.ts +0 -29
  597. package/src/interfaces/schema.d.ts.map +0 -1
  598. package/src/interfaces/schema.js +0 -3
  599. package/src/interfaces/schema.js.map +0 -1
  600. package/src/interfaces/server-init-result.d.ts +0 -35
  601. package/src/interfaces/server-init-result.d.ts.map +0 -1
  602. package/src/interfaces/server-init-result.js +0 -3
  603. package/src/interfaces/server-init-result.js.map +0 -1
  604. package/src/interfaces/status-code-response.d.ts +0 -7
  605. package/src/interfaces/status-code-response.d.ts.map +0 -1
  606. package/src/interfaces/status-code-response.js +0 -3
  607. package/src/interfaces/status-code-response.js.map +0 -1
  608. package/src/interfaces/symmetric-encryption-results.d.ts +0 -5
  609. package/src/interfaces/test-environment.d.ts +0 -12
  610. package/src/interfaces/test-environment.d.ts.map +0 -1
  611. package/src/interfaces/test-environment.js +0 -3
  612. package/src/interfaces/test-environment.js.map +0 -1
  613. package/src/interfaces/token-response.d.ts +0 -5
  614. package/src/interfaces/token-response.d.ts.map +0 -1
  615. package/src/interfaces/token-response.js +0 -3
  616. package/src/interfaces/token-response.js.map +0 -1
  617. package/src/middleware-utils.d.ts +0 -8
  618. package/src/middleware-utils.d.ts.map +0 -1
  619. package/src/middleware-utils.js +0 -94
  620. package/src/middleware-utils.js.map +0 -1
  621. package/src/middlewares/authenticate-crypto.d.ts +0 -10
  622. package/src/middlewares/authenticate-crypto.d.ts.map +0 -1
  623. package/src/middlewares/authenticate-crypto.js +0 -126
  624. package/src/middlewares/authenticate-crypto.js.map +0 -1
  625. package/src/middlewares/authenticate-token.d.ts +0 -21
  626. package/src/middlewares/authenticate-token.d.ts.map +0 -1
  627. package/src/middlewares/authenticate-token.js +0 -104
  628. package/src/middlewares/authenticate-token.js.map +0 -1
  629. package/src/middlewares/cleanup-crypto.d.ts +0 -7
  630. package/src/middlewares/cleanup-crypto.d.ts.map +0 -1
  631. package/src/middlewares/cleanup-crypto.js +0 -32
  632. package/src/middlewares/cleanup-crypto.js.map +0 -1
  633. package/src/middlewares/index.d.ts.map +0 -1
  634. package/src/middlewares/index.js +0 -8
  635. package/src/middlewares/index.js.map +0 -1
  636. package/src/middlewares/set-global-context-language.d.ts +0 -3
  637. package/src/middlewares/set-global-context-language.d.ts.map +0 -1
  638. package/src/middlewares/set-global-context-language.js +0 -14
  639. package/src/middlewares/set-global-context-language.js.map +0 -1
  640. package/src/model-registry.d.ts +0 -23
  641. package/src/model-registry.d.ts.map +0 -1
  642. package/src/model-registry.js +0 -47
  643. package/src/model-registry.js.map +0 -1
  644. package/src/models/email-token.d.ts +0 -8
  645. package/src/models/email-token.d.ts.map +0 -1
  646. package/src/models/email-token.js +0 -11
  647. package/src/models/email-token.js.map +0 -1
  648. package/src/models/index.d.ts.map +0 -1
  649. package/src/models/index.js +0 -10
  650. package/src/models/index.js.map +0 -1
  651. package/src/models/mnemonic.d.ts +0 -8
  652. package/src/models/mnemonic.d.ts.map +0 -1
  653. package/src/models/mnemonic.js +0 -11
  654. package/src/models/mnemonic.js.map +0 -1
  655. package/src/models/role.d.ts +0 -8
  656. package/src/models/role.d.ts.map +0 -1
  657. package/src/models/role.js +0 -11
  658. package/src/models/role.js.map +0 -1
  659. package/src/models/used-direct-login-token.d.ts +0 -8
  660. package/src/models/used-direct-login-token.d.ts.map +0 -1
  661. package/src/models/used-direct-login-token.js +0 -11
  662. package/src/models/used-direct-login-token.js.map +0 -1
  663. package/src/models/user-role.d.ts +0 -7
  664. package/src/models/user-role.d.ts.map +0 -1
  665. package/src/models/user-role.js +0 -10
  666. package/src/models/user-role.js.map +0 -1
  667. package/src/models/user.d.ts +0 -8
  668. package/src/models/user.d.ts.map +0 -1
  669. package/src/models/user.js +0 -11
  670. package/src/models/user.js.map +0 -1
  671. package/src/pipeline/index.d.ts.map +0 -1
  672. package/src/pipeline/index.js +0 -5
  673. package/src/pipeline/index.js.map +0 -1
  674. package/src/pipeline/pipeline-builder.d.ts +0 -8
  675. package/src/pipeline/pipeline-builder.d.ts.map +0 -1
  676. package/src/pipeline/pipeline-builder.js +0 -18
  677. package/src/pipeline/pipeline-builder.js.map +0 -1
  678. package/src/plugins/index.d.ts.map +0 -1
  679. package/src/plugins/index.js +0 -6
  680. package/src/plugins/index.js.map +0 -1
  681. package/src/plugins/plugin-interface.d.ts +0 -9
  682. package/src/plugins/plugin-interface.d.ts.map +0 -1
  683. package/src/plugins/plugin-interface.js +0 -3
  684. package/src/plugins/plugin-interface.js.map +0 -1
  685. package/src/plugins/plugin-manager.d.ts +0 -13
  686. package/src/plugins/plugin-manager.d.ts.map +0 -1
  687. package/src/plugins/plugin-manager.js +0 -37
  688. package/src/plugins/plugin-manager.js.map +0 -1
  689. package/src/registry/email-service-registry.d.ts +0 -27
  690. package/src/registry/email-service-registry.d.ts.map +0 -1
  691. package/src/registry/email-service-registry.js +0 -42
  692. package/src/registry/email-service-registry.js.map +0 -1
  693. package/src/registry/index.d.ts.map +0 -1
  694. package/src/registry/index.js +0 -6
  695. package/src/registry/index.js.map +0 -1
  696. package/src/responses/index.d.ts.map +0 -1
  697. package/src/responses/index.js +0 -5
  698. package/src/responses/index.js.map +0 -1
  699. package/src/responses/response-builder.d.ts +0 -24
  700. package/src/responses/response-builder.d.ts.map +0 -1
  701. package/src/responses/response-builder.js +0 -63
  702. package/src/responses/response-builder.js.map +0 -1
  703. package/src/routers/api.d.ts +0 -28
  704. package/src/routers/api.d.ts.map +0 -1
  705. package/src/routers/api.js +0 -80
  706. package/src/routers/api.js.map +0 -1
  707. package/src/routers/app.d.ts +0 -33
  708. package/src/routers/app.d.ts.map +0 -1
  709. package/src/routers/app.js +0 -228
  710. package/src/routers/app.js.map +0 -1
  711. package/src/routers/base.d.ts +0 -9
  712. package/src/routers/base.d.ts.map +0 -1
  713. package/src/routers/base.js +0 -14
  714. package/src/routers/base.js.map +0 -1
  715. package/src/routers/index.d.ts.map +0 -1
  716. package/src/routers/index.js +0 -7
  717. package/src/routers/index.js.map +0 -1
  718. package/src/routers/router-config.d.ts +0 -18
  719. package/src/routers/router-config.d.ts.map +0 -1
  720. package/src/routers/router-config.js +0 -8
  721. package/src/routers/router-config.js.map +0 -1
  722. package/src/routing/index.d.ts +0 -2
  723. package/src/routing/index.d.ts.map +0 -1
  724. package/src/routing/index.js +0 -5
  725. package/src/routing/index.js.map +0 -1
  726. package/src/routing/route-builder.d.ts +0 -36
  727. package/src/routing/route-builder.d.ts.map +0 -1
  728. package/src/routing/route-builder.js +0 -86
  729. package/src/routing/route-builder.js.map +0 -1
  730. package/src/schemas/email-token.d.ts +0 -49
  731. package/src/schemas/email-token.d.ts.map +0 -1
  732. package/src/schemas/email-token.js +0 -55
  733. package/src/schemas/email-token.js.map +0 -1
  734. package/src/schemas/index.d.ts.map +0 -1
  735. package/src/schemas/index.js +0 -11
  736. package/src/schemas/index.js.map +0 -1
  737. package/src/schemas/mnemonic.d.ts +0 -27
  738. package/src/schemas/mnemonic.d.ts.map +0 -1
  739. package/src/schemas/mnemonic.js +0 -31
  740. package/src/schemas/mnemonic.js.map +0 -1
  741. package/src/schemas/role.d.ts +0 -42
  742. package/src/schemas/role.d.ts.map +0 -1
  743. package/src/schemas/role.js +0 -89
  744. package/src/schemas/role.js.map +0 -1
  745. package/src/schemas/schema.d.ts +0 -42
  746. package/src/schemas/schema.d.ts.map +0 -1
  747. package/src/schemas/schema.js +0 -70
  748. package/src/schemas/schema.js.map +0 -1
  749. package/src/schemas/used-direct-login-token.d.ts +0 -37
  750. package/src/schemas/used-direct-login-token.d.ts.map +0 -1
  751. package/src/schemas/used-direct-login-token.js +0 -24
  752. package/src/schemas/used-direct-login-token.js.map +0 -1
  753. package/src/schemas/user-role.d.ts +0 -39
  754. package/src/schemas/user-role.d.ts.map +0 -1
  755. package/src/schemas/user-role.js +0 -55
  756. package/src/schemas/user-role.js.map +0 -1
  757. package/src/schemas/user.d.ts +0 -24
  758. package/src/schemas/user.d.ts.map +0 -1
  759. package/src/schemas/user.js +0 -195
  760. package/src/schemas/user.js.map +0 -1
  761. package/src/services/backup-code.d.ts +0 -76
  762. package/src/services/backup-code.d.ts.map +0 -1
  763. package/src/services/backup-code.js +0 -185
  764. package/src/services/backup-code.js.map +0 -1
  765. package/src/services/base.d.ts +0 -11
  766. package/src/services/base.d.ts.map +0 -1
  767. package/src/services/base.js +0 -15
  768. package/src/services/base.js.map +0 -1
  769. package/src/services/checksum.d.ts +0 -69
  770. package/src/services/checksum.d.ts.map +0 -1
  771. package/src/services/checksum.js +0 -145
  772. package/src/services/checksum.js.map +0 -1
  773. package/src/services/crc.d.ts +0 -87
  774. package/src/services/crc.d.ts.map +0 -1
  775. package/src/services/crc.js +0 -198
  776. package/src/services/crc.js.map +0 -1
  777. package/src/services/database-initialization.d.ts +0 -111
  778. package/src/services/database-initialization.d.ts.map +0 -1
  779. package/src/services/database-initialization.js +0 -878
  780. package/src/services/database-initialization.js.map +0 -1
  781. package/src/services/db-init-cache.d.ts +0 -10
  782. package/src/services/db-init-cache.d.ts.map +0 -1
  783. package/src/services/db-init-cache.js +0 -3
  784. package/src/services/db-init-cache.js.map +0 -1
  785. package/src/services/direct-login-token.d.ts +0 -7
  786. package/src/services/direct-login-token.d.ts.map +0 -1
  787. package/src/services/direct-login-token.js +0 -41
  788. package/src/services/direct-login-token.js.map +0 -1
  789. package/src/services/dummy-email-service.d.ts +0 -11
  790. package/src/services/dummy-email-service.d.ts.map +0 -1
  791. package/src/services/dummy-email-service.js +0 -16
  792. package/src/services/dummy-email-service.js.map +0 -1
  793. package/src/services/fec-usage-example.d.ts +0 -38
  794. package/src/services/fec-usage-example.d.ts.map +0 -1
  795. package/src/services/fec-usage-example.js +0 -75
  796. package/src/services/fec-usage-example.js.map +0 -1
  797. package/src/services/fec.d.ts +0 -46
  798. package/src/services/fec.d.ts.map +0 -1
  799. package/src/services/fec.js +0 -214
  800. package/src/services/fec.js.map +0 -1
  801. package/src/services/index.d.ts.map +0 -1
  802. package/src/services/index.js +0 -23
  803. package/src/services/index.js.map +0 -1
  804. package/src/services/jwt.d.ts +0 -30
  805. package/src/services/jwt.d.ts.map +0 -1
  806. package/src/services/jwt.js +0 -90
  807. package/src/services/jwt.js.map +0 -1
  808. package/src/services/key-wrapping.d.ts +0 -61
  809. package/src/services/key-wrapping.d.ts.map +0 -1
  810. package/src/services/key-wrapping.js +0 -307
  811. package/src/services/key-wrapping.js.map +0 -1
  812. package/src/services/mnemonic.d.ts +0 -62
  813. package/src/services/mnemonic.d.ts.map +0 -1
  814. package/src/services/mnemonic.js +0 -114
  815. package/src/services/mnemonic.js.map +0 -1
  816. package/src/services/request-user.d.ts +0 -23
  817. package/src/services/request-user.d.ts.map +0 -1
  818. package/src/services/request-user.js +0 -68
  819. package/src/services/request-user.js.map +0 -1
  820. package/src/services/role.d.ts +0 -87
  821. package/src/services/role.d.ts.map +0 -1
  822. package/src/services/role.js +0 -279
  823. package/src/services/role.js.map +0 -1
  824. package/src/services/symmetric.d.ts +0 -42
  825. package/src/services/symmetric.d.ts.map +0 -1
  826. package/src/services/symmetric.js +0 -101
  827. package/src/services/symmetric.js.map +0 -1
  828. package/src/services/system-user.d.ts +0 -16
  829. package/src/services/system-user.d.ts.map +0 -1
  830. package/src/services/system-user.js +0 -46
  831. package/src/services/system-user.js.map +0 -1
  832. package/src/services/user.d.ts +0 -345
  833. package/src/services/user.d.ts.map +0 -1
  834. package/src/services/user.js +0 -1447
  835. package/src/services/user.js.map +0 -1
  836. package/src/services/xor.d.ts +0 -24
  837. package/src/services/xor.d.ts.map +0 -1
  838. package/src/services/xor.js +0 -37
  839. package/src/services/xor.js.map +0 -1
  840. package/src/testing.d.ts +0 -3
  841. package/src/testing.d.ts.map +0 -1
  842. package/src/testing.js +0 -7
  843. package/src/testing.js.map +0 -1
  844. package/src/transactions/index.d.ts.map +0 -1
  845. package/src/transactions/index.js +0 -5
  846. package/src/transactions/index.js.map +0 -1
  847. package/src/transactions/transaction-manager.d.ts +0 -12
  848. package/src/transactions/transaction-manager.d.ts.map +0 -1
  849. package/src/transactions/transaction-manager.js +0 -30
  850. package/src/transactions/transaction-manager.js.map +0 -1
  851. package/src/types/app-config.d.ts +0 -16
  852. package/src/types/app-config.d.ts.map +0 -1
  853. package/src/types/app-config.js +0 -3
  854. package/src/types/app-config.js.map +0 -1
  855. package/src/types/controller-config.d.ts +0 -14
  856. package/src/types/controller-config.d.ts.map +0 -1
  857. package/src/types/controller-config.js +0 -3
  858. package/src/types/controller-config.js.map +0 -1
  859. package/src/types/environment-variables.d.ts.map +0 -1
  860. package/src/types/environment-variables.js +0 -39
  861. package/src/types/environment-variables.js.map +0 -1
  862. package/src/types/index.d.ts.map +0 -1
  863. package/src/types/index.js +0 -6
  864. package/src/types/index.js.map +0 -1
  865. package/src/types/mongoose-helpers.d.ts.map +0 -1
  866. package/src/types/mongoose-helpers.js +0 -6
  867. package/src/types/mongoose-helpers.js.map +0 -1
  868. package/src/types.d.ts +0 -104
  869. package/src/types.d.ts.map +0 -1
  870. package/src/types.js +0 -14
  871. package/src/types.js.map +0 -1
  872. package/src/utils.d.ts +0 -211
  873. package/src/utils.d.ts.map +0 -1
  874. package/src/utils.js +0 -818
  875. package/src/utils.js.map +0 -1
  876. package/src/validation/index.d.ts.map +0 -1
  877. package/src/validation/index.js +0 -5
  878. package/src/validation/index.js.map +0 -1
  879. package/src/validation/validation-builder.d.ts +0 -32
  880. package/src/validation/validation-builder.d.ts.map +0 -1
  881. package/src/validation/validation-builder.js +0 -81
  882. package/src/validation/validation-builder.js.map +0 -1
@@ -0,0 +1,1653 @@
1
+ /**
2
+ * @fileoverview Service for initializing the database with default users, roles, and relationships.
3
+ * Handles creation of system, admin, and member users with encrypted credentials and backup codes.
4
+ * @module services/database-initialization
5
+ */
6
+
7
+ import {
8
+ ECIES,
9
+ EmailString,
10
+ IECIESConfig,
11
+ MemberType,
12
+ SecureBuffer,
13
+ SecureString,
14
+ stringToUint8Array,
15
+ } from '@digitaldefiance/ecies-lib';
16
+ import {
17
+ TranslatableGenericError,
18
+ TranslatableHandleableGenericError,
19
+ } from '@digitaldefiance/i18n-lib';
20
+ import { Connection } from '@digitaldefiance/mongoose-types';
21
+ import {
22
+ Member as BackendMember,
23
+ ECIESService,
24
+ getEnhancedNodeIdProvider,
25
+ PlatformID,
26
+ } from '@digitaldefiance/node-ecies-lib';
27
+ import {
28
+ AccountStatus,
29
+ getSuiteCoreI18nEngine,
30
+ IFailableResult,
31
+ SuiteCoreComponentId,
32
+ SuiteCoreStringKey,
33
+ TranslatableSuiteError,
34
+ TranslatableSuiteHandleableError,
35
+ } from '@digitaldefiance/suite-core-lib';
36
+ import { crc32 } from 'crc';
37
+ import { createHash, randomBytes } from 'crypto';
38
+ import * as fs from 'fs';
39
+ import * as path from 'path';
40
+ import { BackupCode } from '../backup-code';
41
+ import { IMnemonicDocument } from '../documents/mnemonic';
42
+ import { IRoleDocument } from '../documents/role';
43
+ import { IUserDocument } from '../documents/user';
44
+ import { IUserRoleDocument } from '../documents/user-role';
45
+ import { BaseModelName } from '../enumerations/base-model-name';
46
+ import { Environment } from '../environment';
47
+ import { IDBInitResult } from '../interfaces';
48
+ import { IApplication } from '../interfaces/application';
49
+ import { IServerInitResult } from '../interfaces/server-init-result';
50
+ import { ModelRegistry } from '../model-registry';
51
+ import { KeyWrappingService } from '../services/key-wrapping';
52
+ import { debugLog, directLog, withTransaction } from '../utils';
53
+ import { BackupCodeService } from './backup-code';
54
+ import { MnemonicService } from './mnemonic';
55
+ import { RoleService } from './role';
56
+ import { SystemUserService } from './system-user';
57
+
58
+ /**
59
+ * Service for initializing the database with default users, roles, and relationships.
60
+ * Manages creation of system, admin, and member accounts with encrypted credentials.
61
+ */
62
+ export abstract class DatabaseInitializationService {
63
+ /**
64
+ * Static initialization state management to prevent concurrent initialization.
65
+ * @private
66
+ */
67
+ protected static initializationPromises = new Map<
68
+ string,
69
+ Promise<IFailableResult<IServerInitResult>>
70
+ >();
71
+ /** Initialization lock to prevent race conditions */
72
+ protected static initializationLock = new Map<string, boolean>();
73
+
74
+ /**
75
+ * Default i18n translation function for database initialization messages.
76
+ * @param str String key to translate
77
+ * @param variables Template variables
78
+ * @param language Target language
79
+ * @param application Application instance
80
+ * @returns Translated string
81
+ */
82
+ protected static defaultI18nTFunc(
83
+ str: string,
84
+ variables?: Record<string, unknown>,
85
+ language?: string,
86
+ application?: IApplication,
87
+ ): string {
88
+ // Handles template strings with {{component.key}} syntax
89
+ return getSuiteCoreI18nEngine(
90
+ application ? { constants: application.constants } : undefined,
91
+ ).t(str, variables, language);
92
+ }
93
+
94
+ /**
95
+ * Gets the mnemonic or generates a new one if not present.
96
+ * @template TID Platform-specific ID type
97
+ * @param mnemonic Existing mnemonic or undefined
98
+ * @param eciesService ECIES service to generate a new mnemonic
99
+ * @returns Existing or new mnemonic
100
+ */
101
+ public static mnemonicOrNew<TID extends PlatformID = Buffer>(
102
+ mnemonic: SecureString | undefined,
103
+ eciesService: ECIESService<TID>,
104
+ ): SecureString {
105
+ return mnemonic && mnemonic.hasValue
106
+ ? mnemonic
107
+ : eciesService.generateNewMnemonic();
108
+ }
109
+ /**
110
+ * Generates a cache key for a user based on their details.
111
+ * @template TID Platform-specific ID type
112
+ * @param username Username
113
+ * @param email Email address
114
+ * @param mnemonic Mnemonic
115
+ * @param id User ID
116
+ * @returns Generated cache key as hex string
117
+ */
118
+ public static cacheKey<TID extends PlatformID = Buffer>(
119
+ username: string,
120
+ email: EmailString,
121
+ mnemonic: SecureString,
122
+ id: TID,
123
+ ): string {
124
+ const idProvider = getEnhancedNodeIdProvider<TID>();
125
+ const combined = `${username}|${email.email}|${mnemonic.value}|${idProvider.idToString(
126
+ id,
127
+ )}`;
128
+ const buffer = stringToUint8Array(combined);
129
+ const crcHash = crc32(Buffer.from(buffer));
130
+ return crcHash.toString(16).padStart(8, '0');
131
+ }
132
+ /**
133
+ * Gets a cached BackendMember or creates a new one if not cached.
134
+ * @template TID Platform-specific ID type
135
+ * @param username Username
136
+ * @param email Email address
137
+ * @param mnemonic Mnemonic or undefined to generate a new one
138
+ * @param memberType Type of member (Admin, Member, System)
139
+ * @param eciesService ECIES service to handle key generation
140
+ * @param memberId Optional specific member ID to use
141
+ * @param createdBy Optional ID of the user who created this member
142
+ * @returns Cached or newly created BackendMember and the mnemonic used
143
+ */
144
+ public static cacheOrNew<TID extends PlatformID = Buffer>(
145
+ username: string,
146
+ email: EmailString,
147
+ mnemonic: SecureString | undefined,
148
+ memberType: MemberType,
149
+ eciesService: ECIESService<TID>,
150
+ memberId?: TID,
151
+ createdBy?: TID,
152
+ ): {
153
+ member: BackendMember<TID>;
154
+ mnemonic: SecureString;
155
+ } {
156
+ const idProvider = getEnhancedNodeIdProvider<TID>();
157
+ const m = this.mnemonicOrNew(mnemonic, eciesService);
158
+
159
+ const newId: TID = memberId ? memberId : idProvider.generateTyped();
160
+ const key = DatabaseInitializationService.cacheKey(
161
+ username,
162
+ email,
163
+ m,
164
+ newId,
165
+ );
166
+ if (!global.__MEMBER_CACHE__) {
167
+ global.__MEMBER_CACHE__ = new Map<
168
+ string,
169
+ {
170
+ member: BackendMember<TID>;
171
+ mnemonic: SecureString;
172
+ }
173
+ >();
174
+ }
175
+ if (!global.__MEMBER_CACHE__.has(key)) {
176
+ const { wallet } = eciesService.walletAndSeedFromMnemonic(m);
177
+
178
+ // Get private key from wallet
179
+ const privateKey = wallet.getPrivateKey();
180
+ // Get compressed public key (already includes prefix)
181
+ const publicKeyWithPrefix = eciesService.getPublicKey(
182
+ Buffer.from(privateKey),
183
+ );
184
+
185
+ const user: BackendMember<TID> = new BackendMember<TID>(
186
+ eciesService,
187
+ memberType,
188
+ username,
189
+ email,
190
+ publicKeyWithPrefix,
191
+ new SecureBuffer(privateKey),
192
+ wallet,
193
+ newId,
194
+ undefined,
195
+ undefined,
196
+ createdBy,
197
+ );
198
+ global.__MEMBER_CACHE__.set(key, {
199
+ mnemonic: m,
200
+ member: user as unknown as BackendMember<TID>,
201
+ });
202
+ return { mnemonic: m, member: user };
203
+ } else {
204
+ return global.__MEMBER_CACHE__.get(key)! as {
205
+ mnemonic: SecureString;
206
+ member: BackendMember<TID>;
207
+ };
208
+ }
209
+ }
210
+
211
+ /**
212
+ * Generates a random password meeting security requirements.
213
+ * @param length Length of the password
214
+ * @returns Generated password string
215
+ */
216
+ public static generatePassword(length: number): string {
217
+ const specialCharacters = "!@#$%^&*()_+-=[]{};':|,.<>/?";
218
+ const numbers = '0123456789';
219
+ const letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
220
+
221
+ // Get a random character from a string
222
+ const getRandomChar = (chars: string): string => {
223
+ // amazonq-ignore-next-line false positive
224
+ const randomIndex = randomBytes(1)[0] % chars.length;
225
+ return chars[randomIndex];
226
+ };
227
+
228
+ // Start with one of each required character type
229
+ // amazonq-ignore-next-line false positive
230
+ let password = '';
231
+ password += getRandomChar(letters);
232
+ password += getRandomChar(numbers);
233
+ password += getRandomChar(specialCharacters);
234
+
235
+ // Fill the rest with random characters from all types
236
+ const allCharacters = specialCharacters + numbers + letters;
237
+ for (let i = password.length; i < length; i++) {
238
+ password += getRandomChar(allCharacters);
239
+ }
240
+
241
+ // Shuffle the password characters to avoid predictable pattern
242
+ const chars = password.split('');
243
+ for (let i = chars.length - 1; i > 0; i--) {
244
+ // amazonq-ignore-next-line already fixed
245
+ const j = randomBytes(1)[0] % (i + 1);
246
+ [chars[i], chars[j]] = [chars[j], chars[i]];
247
+ }
248
+ return chars.join('');
249
+ }
250
+
251
+ /**
252
+ * Drops the database.
253
+ * @param connection Database connection
254
+ * @returns True if the database was dropped, false if not connected
255
+ */
256
+ public static async dropDatabase(connection: Connection): Promise<boolean> {
257
+ if (!connection.db) return false;
258
+ debugLog(
259
+ true,
260
+ 'warn',
261
+ this.defaultI18nTFunc('{{SuiteCoreStringKey.Admin_DroppingDatabase}}'),
262
+ );
263
+ return connection.db.dropDatabase();
264
+ }
265
+
266
+ public static getInitOptions<TID extends PlatformID = Buffer>(
267
+ application: IApplication<TID>,
268
+ ): {
269
+ adminId?: TID;
270
+ adminMnemonic?: SecureString;
271
+ adminPassword?: SecureString;
272
+ adminRoleId?: TID;
273
+ adminUserRoleId?: TID;
274
+ adminBackupCodes?: BackupCode[];
275
+ memberId?: TID;
276
+ memberMnemonic?: SecureString;
277
+ memberPassword?: SecureString;
278
+ memberRoleId?: TID;
279
+ memberUserRoleId?: TID;
280
+ memberBackupCodes?: BackupCode[];
281
+ systemId?: TID;
282
+ systemMnemonic?: SecureString;
283
+ systemPassword?: SecureString;
284
+ systemRoleId?: TID;
285
+ systemUserRoleId?: TID;
286
+ systemBackupCodes?: BackupCode[];
287
+ } {
288
+ const env = application.environment as Environment<TID>;
289
+ return {
290
+ adminId: env.adminId,
291
+ adminMnemonic: env.adminMnemonic?.hasValue
292
+ ? env.adminMnemonic
293
+ : undefined,
294
+ adminPassword: env.adminPassword?.hasValue
295
+ ? env.adminPassword
296
+ : undefined,
297
+ adminRoleId: env.adminRoleId as TID,
298
+ adminUserRoleId: env.adminUserRoleId,
299
+ adminBackupCodes: env.adminBackupCodes,
300
+ memberId: env.memberId,
301
+ memberMnemonic: env.memberMnemonic?.hasValue
302
+ ? env.memberMnemonic
303
+ : undefined,
304
+ memberPassword: env.memberPassword?.hasValue
305
+ ? env.memberPassword
306
+ : undefined,
307
+ memberRoleId: env.memberRoleId as TID,
308
+ memberUserRoleId: env.memberUserRoleId,
309
+ memberBackupCodes: env.memberBackupCodes,
310
+ systemId: env.systemId,
311
+ systemMnemonic: env.systemMnemonic?.hasValue
312
+ ? env.systemMnemonic
313
+ : undefined,
314
+ systemPassword: env.systemPassword?.hasValue
315
+ ? env.systemPassword
316
+ : undefined,
317
+ systemRoleId: env.systemRoleId as TID,
318
+ systemUserRoleId: env.systemUserRoleId,
319
+ systemBackupCodes: env.systemBackupCodes,
320
+ };
321
+ }
322
+
323
+ public static serverInitResultHash<TID extends PlatformID = Buffer>(
324
+ serverInitResult: IServerInitResult<TID>,
325
+ ): string {
326
+ const h = createHash('sha256');
327
+ const idProvider = getEnhancedNodeIdProvider<TID>();
328
+ h.update(idProvider.idToString(serverInitResult.adminUser._id as TID));
329
+ h.update(idProvider.idToString(serverInitResult.adminRole._id as TID));
330
+ h.update(idProvider.idToString(serverInitResult.adminUserRole._id as TID));
331
+ h.update(serverInitResult.adminUsername);
332
+ h.update(serverInitResult.adminEmail);
333
+ h.update(serverInitResult.adminMnemonic);
334
+ h.update(serverInitResult.adminPassword);
335
+ h.update(serverInitResult.adminUser.publicKey);
336
+ serverInitResult.adminBackupCodes.map((bc) => h.update(bc));
337
+ h.update(idProvider.idToString(serverInitResult.memberUser._id as TID));
338
+ h.update(idProvider.idToString(serverInitResult.memberRole._id as TID));
339
+ h.update(idProvider.idToString(serverInitResult.memberUserRole._id as TID));
340
+ h.update(serverInitResult.memberUsername);
341
+ h.update(serverInitResult.memberEmail);
342
+ h.update(serverInitResult.memberMnemonic);
343
+ h.update(serverInitResult.memberPassword);
344
+ h.update(serverInitResult.memberUser.publicKey);
345
+ serverInitResult.memberBackupCodes.map((bc) => h.update(bc));
346
+ h.update(idProvider.idToString(serverInitResult.systemUser._id as TID));
347
+ h.update(idProvider.idToString(serverInitResult.systemRole._id as TID));
348
+ h.update(idProvider.idToString(serverInitResult.systemUserRole._id as TID));
349
+ h.update(serverInitResult.systemUsername);
350
+ h.update(serverInitResult.systemEmail);
351
+ h.update(serverInitResult.systemMnemonic);
352
+ h.update(serverInitResult.systemPassword);
353
+ h.update(serverInitResult.systemUser.publicKey);
354
+ serverInitResult.systemBackupCodes.map((bc) => h.update(bc));
355
+ return h.digest('hex');
356
+ }
357
+
358
+ /**
359
+ * Initializes the user database with default users and roles using dependency injection.
360
+ * @template TID Platform-specific ID type
361
+ * @param application Application instance
362
+ * @param keyWrappingService Key wrapping service
363
+ * @param mnemonicService Mnemonic service
364
+ * @param eciesService ECIES service
365
+ * @param roleService Role service
366
+ * @param backupCodeService Backup code service
367
+ * @returns Result of the initialization
368
+ */
369
+ public static async initUserDbWithServices<TID extends PlatformID = Buffer>(
370
+ application: IApplication<TID>,
371
+ keyWrappingService: KeyWrappingService,
372
+ mnemonicService: MnemonicService<TID>,
373
+ eciesService: ECIESService<TID>,
374
+ roleService: RoleService<TID>,
375
+ backupCodeService: BackupCodeService<TID>,
376
+ ): Promise<IDBInitResult<IServerInitResult<TID>>> {
377
+ const engine = getSuiteCoreI18nEngine({ constants: application.constants });
378
+ const isTestEnvironment = process.env['NODE_ENV'] === 'test';
379
+ const options =
380
+ DatabaseInitializationService.getInitOptions<TID>(application);
381
+ const effectiveIdGenerator: () => TID = (() =>
382
+ application.constants.idProvider.fromBytes(
383
+ application.constants.idProvider.generate(),
384
+ ) as TID) as () => TID;
385
+ const UserModel = ModelRegistry.instance.getTypedModel<
386
+ IUserDocument<string, TID>
387
+ >(BaseModelName.User);
388
+ const RoleModel = ModelRegistry.instance.getTypedModel<IRoleDocument<TID>>(
389
+ BaseModelName.Role,
390
+ );
391
+ const adminUserId: TID = options.adminId ?? effectiveIdGenerator();
392
+ const adminRoleId: TID = options.adminRoleId ?? effectiveIdGenerator();
393
+ const adminUserRoleId: TID =
394
+ options.adminUserRoleId ?? effectiveIdGenerator();
395
+ const memberUserId: TID = options.memberId ?? effectiveIdGenerator();
396
+ const memberRoleId: TID = options.memberRoleId ?? effectiveIdGenerator();
397
+ const memberUserRoleId: TID =
398
+ options.memberUserRoleId ?? effectiveIdGenerator();
399
+ const systemUserId: TID = options.systemId ?? effectiveIdGenerator();
400
+ const systemRoleId: TID = options.systemRoleId ?? effectiveIdGenerator();
401
+ const systemUserRoleId: TID =
402
+ options.systemUserRoleId ?? effectiveIdGenerator();
403
+
404
+ // Check for existing users and roles with optimized queries
405
+ // Use lean() for better performance on read-only operations
406
+ const [existingUsers, existingRoles] = await Promise.all([
407
+ UserModel.find({
408
+ username: {
409
+ $in: [
410
+ application.constants.SystemUser,
411
+ application.constants.AdministratorUser,
412
+ application.constants.MemberUser,
413
+ ],
414
+ },
415
+ }).lean(),
416
+ RoleModel.find({
417
+ name: {
418
+ $in: [
419
+ application.constants.AdministratorRole,
420
+ application.constants.MemberRole,
421
+ application.constants.SystemRole,
422
+ ],
423
+ },
424
+ }).lean(),
425
+ ]);
426
+
427
+ if (existingUsers.length > 0 || existingRoles.length > 0) {
428
+ // Database is already initialized, return the existing data
429
+ const existingAdminUser = existingUsers.find(
430
+ (u) => u.username === application.constants.AdministratorUser,
431
+ );
432
+ const existingMemberUser = existingUsers.find(
433
+ (u) => u.username === application.constants.MemberUser,
434
+ );
435
+ const existingSystemUser = existingUsers.find(
436
+ (u) => u.username === application.constants.SystemUser,
437
+ );
438
+
439
+ if (existingAdminUser && existingMemberUser && existingSystemUser) {
440
+ const adminUserDoc = UserModel.hydrate(existingAdminUser);
441
+ const memberUserDoc = UserModel.hydrate(existingMemberUser);
442
+ const systemUserDoc = UserModel.hydrate(existingSystemUser);
443
+
444
+ // Try to construct a minimal result from existing data
445
+ // Note: This is a fallback case and some data may not be available
446
+ const UserRoleModel = ModelRegistry.instance.getTypedModel<
447
+ IUserRoleDocument<TID>
448
+ >(BaseModelName.UserRole);
449
+ const [
450
+ adminRole,
451
+ memberRole,
452
+ systemRole,
453
+ adminUserRole,
454
+ memberUserRole,
455
+ systemUserRole,
456
+ ] = await Promise.all([
457
+ RoleModel.findOne({ name: application.constants.AdministratorRole }),
458
+ RoleModel.findOne({ name: application.constants.MemberRole }),
459
+ RoleModel.findOne({ name: application.constants.SystemRole }),
460
+ UserRoleModel.findOne({ userId: adminUserDoc._id }),
461
+ UserRoleModel.findOne({ userId: memberUserDoc._id }),
462
+ UserRoleModel.findOne({ userId: systemUserDoc._id }),
463
+ ]);
464
+
465
+ // detailed case
466
+ if (
467
+ adminRole &&
468
+ memberRole &&
469
+ systemRole &&
470
+ adminUserRole &&
471
+ memberUserRole &&
472
+ systemUserRole
473
+ ) {
474
+ return {
475
+ alreadyInitialized: true,
476
+ success: false,
477
+ data: {
478
+ adminRole,
479
+ adminUserRole,
480
+ adminUser: adminUserDoc,
481
+ adminUsername: adminUserDoc.username,
482
+ adminEmail: adminUserDoc.email,
483
+ adminMnemonic: '', // Not available in fallback
484
+ adminPassword: '', // Not available in fallback
485
+ adminBackupCodes: [], // Not available in fallback
486
+ adminMember: {} as BackendMember<TID>, // Not available in fallback
487
+ memberRole,
488
+ memberUserRole,
489
+ memberUser: memberUserDoc,
490
+ memberUsername: memberUserDoc.username,
491
+ memberEmail: memberUserDoc.email,
492
+ memberMnemonic: '', // Not available in fallback
493
+ memberPassword: '', // Not available in fallback
494
+ memberBackupCodes: [], // Not available in fallback
495
+ memberMember: {} as BackendMember<TID>, // Not available in fallback
496
+ systemRole,
497
+ systemUserRole,
498
+ systemUser: systemUserDoc,
499
+ systemUsername: systemUserDoc.username,
500
+ systemEmail: systemUserDoc.email,
501
+ systemMnemonic: '', // Not available in fallback
502
+ systemPassword: '', // Not available in fallback
503
+ systemBackupCodes: [], // Not available in fallback
504
+ systemMember: {} as BackendMember<TID>, // Not available in fallback
505
+ },
506
+ message: engine.translate(
507
+ SuiteCoreComponentId,
508
+ SuiteCoreStringKey.Admin_DatabaseAlreadyInitialized,
509
+ ),
510
+ error: new Error(
511
+ engine.translate(
512
+ SuiteCoreComponentId,
513
+ SuiteCoreStringKey.Admin_DatabaseAlreadyInitialized,
514
+ ),
515
+ ),
516
+ };
517
+ }
518
+ }
519
+
520
+ // basic case
521
+ return {
522
+ alreadyInitialized: true,
523
+ success: false,
524
+ message: engine.translate(
525
+ SuiteCoreComponentId,
526
+ SuiteCoreStringKey.Admin_DatabaseAlreadyInitialized,
527
+ ),
528
+ error: new Error(
529
+ engine.translate(
530
+ SuiteCoreComponentId,
531
+ SuiteCoreStringKey.Admin_DatabaseAlreadyInitialized,
532
+ ),
533
+ ),
534
+ };
535
+ }
536
+
537
+ debugLog(
538
+ application.environment.detailedDebug,
539
+ 'log',
540
+ engine.translate(
541
+ SuiteCoreComponentId,
542
+ SuiteCoreStringKey.Admin_SettingUpUsersAndRoles,
543
+ ),
544
+ );
545
+ const now = new Date();
546
+
547
+ // Add a small random delay in test environments to reduce collision probability
548
+ if (isTestEnvironment) {
549
+ const delay = (randomBytes(1)[0] % 50) + 10; // 10-60ms random delay (reduced)
550
+ await new Promise((resolve) => setTimeout(resolve, delay));
551
+ }
552
+
553
+ try {
554
+ // Use test-optimized settings for better performance
555
+ const transactionOptions = isTestEnvironment
556
+ ? { timeoutMs: 15000, retryAttempts: 2 } // Reduced timeout and retries for tests
557
+ : { timeoutMs: 120000 }; // Keep original production timeout
558
+
559
+ const result = await withTransaction<{
560
+ adminRole: IRoleDocument<TID>;
561
+ memberRole: IRoleDocument<TID>;
562
+ systemRole: IRoleDocument<TID>;
563
+ systemDoc: IUserDocument<string, TID>;
564
+ systemUserRoleDoc: IUserRoleDocument<TID>;
565
+ systemPassword: string;
566
+ systemMnemonic: string;
567
+ systemBackupCodes: BackupCode[];
568
+ systemMember: BackendMember<TID>;
569
+ adminDoc: IUserDocument<string, TID>;
570
+ adminUserRoleDoc: IUserRoleDocument<TID>;
571
+ adminPassword: string;
572
+ adminMnemonic: string;
573
+ adminBackupCodes: BackupCode[];
574
+ adminMember: BackendMember<TID>;
575
+ memberDoc: IUserDocument<string, TID>;
576
+ memberUserRoleDoc: IUserRoleDocument<TID>;
577
+ memberPassword: string;
578
+ memberMnemonic: string;
579
+ memberBackupCodes: BackupCode[];
580
+ memberUser: BackendMember<TID>;
581
+ }>(
582
+ application.db.connection,
583
+ application.environment.mongo.useTransactions,
584
+ undefined,
585
+ async (sess) => {
586
+ // Check if admin role already exists
587
+ let adminRole = await RoleModel.findOne({
588
+ name: application.constants.AdministratorRole,
589
+ }).session(sess ?? null);
590
+ if (!adminRole) {
591
+ const adminRoleDocs = await RoleModel.create(
592
+ [
593
+ {
594
+ _id: adminRoleId as TID,
595
+ name: application.constants.AdministratorRole,
596
+ admin: true,
597
+ member: true,
598
+ system: false,
599
+ child: false,
600
+ createdAt: now,
601
+ updatedAt: now,
602
+ createdBy: systemUserId as TID,
603
+ updatedBy: systemUserId as TID,
604
+ },
605
+ ],
606
+ { session: sess },
607
+ );
608
+ if (adminRoleDocs.length !== 1) {
609
+ throw new TranslatableSuiteError(
610
+ SuiteCoreStringKey.Error_FailedToCreateRoleTemplate,
611
+ {
612
+ NAME: application.constants.AdministratorRole,
613
+ },
614
+ );
615
+ }
616
+ adminRole = adminRoleDocs[0];
617
+ }
618
+
619
+ // Check if member role already exists
620
+ let memberRole = await RoleModel.findOne({
621
+ name: application.constants.MemberRole,
622
+ }).session(sess ?? null);
623
+ if (!memberRole) {
624
+ const memberRoleDocs = await RoleModel.create(
625
+ [
626
+ {
627
+ _id: memberRoleId as TID,
628
+ name: application.constants.MemberRole,
629
+ admin: false,
630
+ member: true,
631
+ child: false,
632
+ system: false,
633
+ createdAt: now,
634
+ updatedAt: now,
635
+ createdBy: systemUserId as TID,
636
+ updatedBy: systemUserId as TID,
637
+ },
638
+ ],
639
+ { session: sess },
640
+ );
641
+ if (memberRoleDocs.length !== 1) {
642
+ throw new TranslatableSuiteError(
643
+ SuiteCoreStringKey.Error_FailedToCreateRoleTemplate,
644
+ {
645
+ NAME: engine.translate(
646
+ SuiteCoreComponentId,
647
+ SuiteCoreStringKey.Common_Member,
648
+ ),
649
+ },
650
+ );
651
+ }
652
+ memberRole = memberRoleDocs[0];
653
+ }
654
+
655
+ // Check if system role already exists
656
+ let systemRole = await RoleModel.findOne({
657
+ name: application.constants.SystemRole,
658
+ }).session(sess ?? null);
659
+ if (!systemRole) {
660
+ const systemRoleDocs = await RoleModel.create(
661
+ [
662
+ {
663
+ _id: systemRoleId as TID,
664
+ name: application.constants.SystemRole,
665
+ admin: true,
666
+ member: true,
667
+ system: true,
668
+ child: false,
669
+ createdAt: now,
670
+ updatedAt: now,
671
+ createdBy: systemUserId as TID,
672
+ updatedBy: systemUserId as TID,
673
+ },
674
+ ],
675
+ { session: sess },
676
+ );
677
+ if (systemRoleDocs.length !== 1) {
678
+ throw new TranslatableSuiteError(
679
+ SuiteCoreStringKey.Error_FailedToCreateRoleTemplate,
680
+ );
681
+ }
682
+ systemRole = systemRoleDocs[0];
683
+ }
684
+
685
+ const systemUser = DatabaseInitializationService.cacheOrNew<TID>(
686
+ application.constants.SystemUser,
687
+ new EmailString(application.constants.SystemEmail),
688
+ options.systemMnemonic!,
689
+ MemberType.System,
690
+ eciesService,
691
+ systemUserId as TID,
692
+ systemUserId as TID,
693
+ );
694
+ backupCodeService.setSystemUser(systemUser.member);
695
+ SystemUserService.setSystemUser(
696
+ systemUser.member,
697
+ application.constants,
698
+ );
699
+ // Encrypt mnemonic for recovery
700
+ const systemEncryptedMnemonic = systemUser.member
701
+ .encryptData(Buffer.from(systemUser.mnemonic.value ?? '', 'utf-8'))
702
+ .toString('hex');
703
+ const systemMnemonicDoc = await mnemonicService.addMnemonic(
704
+ systemUser.mnemonic,
705
+ sess,
706
+ );
707
+ if (!systemMnemonicDoc) {
708
+ throw new Error(
709
+ engine.translate(
710
+ SuiteCoreComponentId,
711
+ SuiteCoreStringKey.Error_FailedToStoreUserMnemonicTemplate,
712
+ {
713
+ NAME: engine.translate(
714
+ SuiteCoreComponentId,
715
+ SuiteCoreStringKey.Common_System,
716
+ ),
717
+ },
718
+ ),
719
+ );
720
+ }
721
+ const systemPasswordSecure = options.systemPassword
722
+ ? options.systemPassword
723
+ : new SecureString(this.generatePassword(16));
724
+
725
+ const systemWrapped = keyWrappingService.wrapSecret(
726
+ systemUser.member.privateKey!,
727
+ systemPasswordSecure,
728
+ application.constants,
729
+ );
730
+ const systemBackupCodes =
731
+ options.systemBackupCodes ?? BackupCode.generateBackupCodes();
732
+ const encryptedSystemBackupCodes =
733
+ await BackupCode.encryptBackupCodes(
734
+ systemUser.member,
735
+ systemUser.member,
736
+ systemBackupCodes,
737
+ );
738
+ const systemDocs = await UserModel.create(
739
+ [
740
+ {
741
+ _id: systemUserId as TID,
742
+ username: application.constants.SystemUser,
743
+ email: application.constants.SystemEmail,
744
+ publicKey: systemUser.member.publicKey.toString('hex'),
745
+ duressPasswords: [],
746
+ mnemonicRecovery: systemEncryptedMnemonic,
747
+ mnemonicId: systemMnemonicDoc._id,
748
+ passwordWrappedPrivateKey: systemWrapped,
749
+ backupCodes: encryptedSystemBackupCodes,
750
+ timezone: application.environment.timezone,
751
+ siteLanguage: 'en-US',
752
+ emailVerified: true,
753
+ darkMode: false,
754
+ accountStatus: AccountStatus.Active,
755
+ directChallenge: true, // allow direct challenge login by default
756
+ createdAt: now,
757
+ updatedAt: now,
758
+ createdBy: systemUserId as TID,
759
+ updatedBy: systemUserId as TID,
760
+ },
761
+ ],
762
+ { session: sess },
763
+ );
764
+ if (systemDocs.length !== 1) {
765
+ throw new Error(
766
+ engine.translate(
767
+ SuiteCoreComponentId,
768
+ SuiteCoreStringKey.Error_FailedToCreateUserTemplate,
769
+ {
770
+ NAME: engine.translate(
771
+ SuiteCoreComponentId,
772
+ SuiteCoreStringKey.Common_System,
773
+ ),
774
+ },
775
+ ),
776
+ );
777
+ }
778
+
779
+ const systemDoc = systemDocs[0];
780
+
781
+ // Create admin user-role relationship
782
+ const systemUserRoleDoc = await roleService.addUserToRole(
783
+ systemRoleId as TID,
784
+ systemUserId as TID,
785
+ systemUserId as TID,
786
+ sess,
787
+ systemUserRoleId,
788
+ );
789
+
790
+ if (!systemUser.mnemonic.value) {
791
+ throw new Error(
792
+ engine.translate(
793
+ SuiteCoreComponentId,
794
+ SuiteCoreStringKey.Error_MnemonicIsNullTemplate,
795
+ {
796
+ NAME: SuiteCoreStringKey.Common_System,
797
+ },
798
+ ),
799
+ );
800
+ }
801
+
802
+ const adminUser = DatabaseInitializationService.cacheOrNew<TID>(
803
+ application.constants.AdministratorUser,
804
+ new EmailString(application.constants.AdministratorEmail),
805
+ options.adminMnemonic,
806
+ MemberType.User,
807
+ eciesService,
808
+ adminUserId as TID,
809
+ systemDoc._id,
810
+ );
811
+ // Encrypt mnemonic for recovery
812
+ const adminEncryptedMnemonic = adminUser.member
813
+ .encryptData(Buffer.from(adminUser.mnemonic.value ?? '', 'utf-8'))
814
+ .toString('hex');
815
+ const adminMnemonicDoc = await mnemonicService.addMnemonic(
816
+ adminUser.mnemonic,
817
+ sess,
818
+ );
819
+ if (!adminMnemonicDoc) {
820
+ throw new Error(
821
+ engine.translate(
822
+ SuiteCoreComponentId,
823
+ SuiteCoreStringKey.Error_FailedToStoreUserMnemonicTemplate,
824
+ {
825
+ NAME: engine.translate(
826
+ SuiteCoreComponentId,
827
+ SuiteCoreStringKey.Common_Admin,
828
+ ),
829
+ },
830
+ ),
831
+ );
832
+ }
833
+ const adminPasswordSecure = options.adminPassword
834
+ ? options.adminPassword
835
+ : new SecureString(this.generatePassword(16));
836
+
837
+ const adminWrapped = keyWrappingService.wrapSecret(
838
+ adminUser.member.privateKey!,
839
+ adminPasswordSecure,
840
+ );
841
+ const adminBackupCodes =
842
+ options.adminBackupCodes ?? BackupCode.generateBackupCodes();
843
+ const encryptedAdminBackupCodes = await BackupCode.encryptBackupCodes(
844
+ adminUser.member,
845
+ systemUser.member,
846
+ adminBackupCodes,
847
+ );
848
+ const adminDocs = await UserModel.create(
849
+ [
850
+ {
851
+ _id: adminUserId as TID,
852
+ username: application.constants.AdministratorUser,
853
+ email: application.constants.AdministratorEmail,
854
+ publicKey: adminUser.member.publicKey.toString('hex'),
855
+ duressPasswords: [],
856
+ mnemonicRecovery: adminEncryptedMnemonic,
857
+ mnemonicId: adminMnemonicDoc._id,
858
+ passwordWrappedPrivateKey: adminWrapped,
859
+ backupCodes: encryptedAdminBackupCodes,
860
+ timezone: application.environment.timezone,
861
+ siteLanguage: 'en-US',
862
+ emailVerified: true,
863
+ accountStatus: AccountStatus.Active,
864
+ directChallenge: true,
865
+ createdAt: now,
866
+ updatedAt: now,
867
+ createdBy: systemUserId as TID,
868
+ updatedBy: systemUserId as TID,
869
+ },
870
+ ],
871
+ { session: sess },
872
+ );
873
+ if (adminDocs.length !== 1) {
874
+ throw new Error(
875
+ engine.translate(
876
+ SuiteCoreComponentId,
877
+ SuiteCoreStringKey.Error_FailedToCreateUserTemplate,
878
+ {
879
+ NAME: engine.translate(
880
+ SuiteCoreComponentId,
881
+ SuiteCoreStringKey.Common_Admin,
882
+ ),
883
+ },
884
+ ),
885
+ );
886
+ }
887
+
888
+ const adminDoc = adminDocs[0];
889
+
890
+ // Create admin user-role relationship
891
+ const adminUserRoleDoc = await roleService.addUserToRole(
892
+ adminRoleId as TID,
893
+ adminUserId as TID,
894
+ systemUserId as TID,
895
+ sess,
896
+ adminUserRoleId,
897
+ );
898
+
899
+ if (!adminUser.mnemonic.value) {
900
+ throw new Error(
901
+ engine.translate(
902
+ SuiteCoreComponentId,
903
+ SuiteCoreStringKey.Error_MnemonicIsNullTemplate,
904
+ {
905
+ NAME: engine.translate(
906
+ SuiteCoreComponentId,
907
+ SuiteCoreStringKey.Common_Admin,
908
+ ),
909
+ },
910
+ ),
911
+ );
912
+ }
913
+
914
+ const memberUser = DatabaseInitializationService.cacheOrNew<TID>(
915
+ application.constants.MemberUser,
916
+ new EmailString(application.constants.MemberEmail),
917
+ options.memberMnemonic,
918
+ MemberType.User,
919
+ eciesService,
920
+ memberUserId as TID,
921
+ systemDoc._id,
922
+ );
923
+ const memberPasswordSecure = options.memberPassword
924
+ ? options.memberPassword
925
+ : new SecureString(this.generatePassword(16));
926
+
927
+ const memberMnemonicDoc = await mnemonicService.addMnemonic(
928
+ memberUser.mnemonic,
929
+ sess,
930
+ );
931
+ if (!memberMnemonicDoc) {
932
+ throw new Error(
933
+ engine.translate(
934
+ SuiteCoreComponentId,
935
+ SuiteCoreStringKey.Error_FailedToStoreUserMnemonicTemplate,
936
+ {
937
+ NAME: engine.translate(
938
+ SuiteCoreComponentId,
939
+ SuiteCoreStringKey.Common_Member,
940
+ ),
941
+ },
942
+ ),
943
+ );
944
+ }
945
+
946
+ // Encrypt mnemonic for recovery
947
+ const encryptedMemberMnemonic = memberUser.member
948
+ .encryptData(Buffer.from(memberUser.mnemonic.value ?? '', 'utf-8'))
949
+ .toString('hex');
950
+ const memberWrapped = keyWrappingService.wrapSecret(
951
+ memberUser.member.privateKey!,
952
+ memberPasswordSecure,
953
+ );
954
+ const memberBackupCodes =
955
+ options.memberBackupCodes ?? BackupCode.generateBackupCodes();
956
+ const encryptedMemberBackupCodes =
957
+ await BackupCode.encryptBackupCodes(
958
+ memberUser.member,
959
+ systemUser.member,
960
+ memberBackupCodes,
961
+ );
962
+ const memberDocs = await UserModel.create(
963
+ [
964
+ {
965
+ _id: memberUserId as TID,
966
+ username: application.constants.MemberUser,
967
+ email: application.constants.MemberEmail,
968
+ publicKey: memberUser.member.publicKey.toString('hex'),
969
+ mnemonicId: memberMnemonicDoc._id,
970
+ mnemonicRecovery: encryptedMemberMnemonic,
971
+ passwordWrappedPrivateKey: memberWrapped,
972
+ backupCodes: encryptedMemberBackupCodes,
973
+ duressPasswords: [],
974
+ timezone: application.environment.timezone,
975
+ siteLanguage: 'en-US',
976
+ emailVerified: true,
977
+ accountStatus: AccountStatus.Active,
978
+ directChallenge: true,
979
+ createdAt: now,
980
+ updatedAt: now,
981
+ createdBy: systemUserId as TID,
982
+ updatedBy: systemUserId as TID,
983
+ },
984
+ ],
985
+ { session: sess },
986
+ );
987
+ if (memberDocs.length !== 1) {
988
+ throw new Error(
989
+ engine.translate(
990
+ SuiteCoreComponentId,
991
+ SuiteCoreStringKey.Error_FailedToCreateUserTemplate,
992
+ {
993
+ NAME: engine.translate(
994
+ SuiteCoreComponentId,
995
+ SuiteCoreStringKey.Common_Member,
996
+ ),
997
+ },
998
+ ),
999
+ );
1000
+ }
1001
+
1002
+ const memberDoc = memberDocs[0];
1003
+
1004
+ // Create member user-role relationship
1005
+ const memberUserRoleDoc = await roleService.addUserToRole(
1006
+ memberRoleId as TID,
1007
+ memberUserId as TID,
1008
+ systemUserId as TID,
1009
+ sess,
1010
+ memberUserRoleId,
1011
+ );
1012
+
1013
+ if (!memberUser.mnemonic.value) {
1014
+ throw new Error(
1015
+ engine.translate(
1016
+ SuiteCoreComponentId,
1017
+ SuiteCoreStringKey.Error_MnemonicIsNullTemplate,
1018
+ {
1019
+ NAME: engine.translate(
1020
+ SuiteCoreComponentId,
1021
+ SuiteCoreStringKey.Common_Member,
1022
+ ),
1023
+ },
1024
+ ),
1025
+ );
1026
+ }
1027
+
1028
+ return {
1029
+ adminRole,
1030
+ memberRole,
1031
+ systemRole,
1032
+ systemDoc,
1033
+ systemUserRoleDoc,
1034
+ systemPassword: systemPasswordSecure.notNullValue,
1035
+ systemMnemonic: systemUser.mnemonic.notNullValue,
1036
+ systemBackupCodes: systemBackupCodes,
1037
+ systemMember: systemUser.member,
1038
+ adminDoc,
1039
+ adminUserRoleDoc,
1040
+ adminPassword: adminPasswordSecure.notNullValue,
1041
+ adminMnemonic: adminUser.mnemonic.notNullValue,
1042
+ adminBackupCodes: adminBackupCodes,
1043
+ adminMember: adminUser.member,
1044
+ memberDoc,
1045
+ memberUserRoleDoc,
1046
+ memberPassword: memberPasswordSecure.notNullValue,
1047
+ memberMnemonic: memberUser.mnemonic.notNullValue,
1048
+ memberBackupCodes: memberBackupCodes,
1049
+ memberUser: memberUser.member,
1050
+ };
1051
+ },
1052
+ transactionOptions,
1053
+ );
1054
+
1055
+ return {
1056
+ alreadyInitialized: false,
1057
+ success: true,
1058
+ data: {
1059
+ adminRole: result.adminRole,
1060
+ adminUserRole: result.adminUserRoleDoc,
1061
+ adminUser: result.adminDoc,
1062
+ adminUsername: result.adminDoc.username,
1063
+ adminEmail: result.adminDoc.email,
1064
+ adminMnemonic: result.adminMnemonic,
1065
+ adminPassword: result.adminPassword,
1066
+ adminBackupCodes: result.adminBackupCodes.map((bc) => bc.value ?? ''),
1067
+ adminMember: result.adminMember,
1068
+ memberRole: result.memberRole,
1069
+ memberUserRole: result.memberUserRoleDoc,
1070
+ memberUser: result.memberDoc,
1071
+ memberUsername: result.memberDoc.username,
1072
+ memberEmail: result.memberDoc.email,
1073
+ memberMnemonic: result.memberMnemonic,
1074
+ memberPassword: result.memberPassword,
1075
+ memberBackupCodes: result.memberBackupCodes.map(
1076
+ (bc) => bc.value ?? '',
1077
+ ),
1078
+ memberMember: result.memberUser,
1079
+ systemRole: result.systemRole,
1080
+ systemUserRole: result.systemUserRoleDoc,
1081
+ systemUser: result.systemDoc,
1082
+ systemUsername: result.systemDoc.username,
1083
+ systemEmail: result.systemDoc.email,
1084
+ systemMnemonic: result.systemMnemonic,
1085
+ systemPassword: result.systemPassword,
1086
+ systemBackupCodes: result.systemBackupCodes.map(
1087
+ (bc) => bc.value ?? '',
1088
+ ),
1089
+ systemMember: result.systemMember,
1090
+ },
1091
+ };
1092
+ } catch (error) {
1093
+ // Check if it's a translatable error and display cleanly
1094
+ if (
1095
+ error instanceof TranslatableGenericError ||
1096
+ error instanceof TranslatableHandleableGenericError ||
1097
+ error instanceof TranslatableSuiteError ||
1098
+ error instanceof TranslatableSuiteHandleableError
1099
+ ) {
1100
+ return {
1101
+ alreadyInitialized: false,
1102
+ success: false,
1103
+ message: (error as Error).message,
1104
+ error: error as Error,
1105
+ };
1106
+ }
1107
+
1108
+ return {
1109
+ alreadyInitialized: false,
1110
+ success: false,
1111
+ message: engine.translate(
1112
+ SuiteCoreComponentId,
1113
+ SuiteCoreStringKey.Admin_Error_FailedToInitializeUserDatabase,
1114
+ ),
1115
+ error:
1116
+ error instanceof Error
1117
+ ? error
1118
+ : new Error(
1119
+ engine.translate(
1120
+ SuiteCoreComponentId,
1121
+ SuiteCoreStringKey.Admin_Error_FailedToInitializeUserDatabase,
1122
+ ),
1123
+ ),
1124
+ };
1125
+ }
1126
+ }
1127
+
1128
+ public static serverInitResultsToDotEnv<TID extends PlatformID = Buffer>(
1129
+ serverInitResult: IServerInitResult<TID>,
1130
+ ): string {
1131
+ const idProvider = getEnhancedNodeIdProvider<TID>();
1132
+ return `ADMIN_ID="${idProvider.idToString(serverInitResult.adminUser._id as TID)}"
1133
+ ADMIN_MNEMONIC="${serverInitResult.adminMnemonic}"
1134
+ ADMIN_ROLE_ID="${idProvider.idToString(serverInitResult.adminRole._id as TID)}"
1135
+ ADMIN_USER_ROLE_ID="${idProvider.idToString(serverInitResult.adminUserRole._id as TID)}"
1136
+ ADMIN_PASSWORD="${serverInitResult.adminPassword}"
1137
+ MEMBER_ID="${idProvider.idToString(serverInitResult.memberUser._id as TID)}"
1138
+ MEMBER_MNEMONIC="${serverInitResult.memberMnemonic}"
1139
+ MEMBER_ROLE_ID="${idProvider.idToString(serverInitResult.memberRole._id as TID)}"
1140
+ MEMBER_USER_ROLE_ID="${idProvider.idToString(serverInitResult.memberUserRole._id as TID)}"
1141
+ MEMBER_PASSWORD="${serverInitResult.memberPassword}"
1142
+ SYSTEM_ID="${idProvider.idToString(serverInitResult.systemUser._id as TID)}"
1143
+ SYSTEM_MNEMONIC="${serverInitResult.systemMnemonic}"
1144
+ SYSTEM_PUBLIC_KEY="${serverInitResult.systemUser.publicKey}"
1145
+ SYSTEM_ROLE_ID="${idProvider.idToString(serverInitResult.systemRole._id as TID)}"
1146
+ SYSTEM_USER_ROLE_ID="${idProvider.idToString(serverInitResult.systemUserRole._id as TID)}"
1147
+ SYSTEM_PASSWORD="${serverInitResult.systemPassword}"
1148
+ `;
1149
+ }
1150
+
1151
+ public static printServerInitResults<TID extends PlatformID = Buffer>(
1152
+ result: IServerInitResult<TID>,
1153
+ printDotEnv: boolean = true,
1154
+ ): void {
1155
+ const idProvider = getEnhancedNodeIdProvider<TID>();
1156
+ debugLog(
1157
+ true,
1158
+ 'log',
1159
+ this.defaultI18nTFunc(
1160
+ '\n=== {{SuiteCoreStringKey.Admin_AccountCredentials}} ===',
1161
+ ),
1162
+ );
1163
+ directLog(
1164
+ true,
1165
+ 'log',
1166
+ this.defaultI18nTFunc(
1167
+ '{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_ID}}: {id}',
1168
+ {
1169
+ id: idProvider.idToString(result.systemUser._id as TID),
1170
+ },
1171
+ ),
1172
+ );
1173
+ directLog(
1174
+ true,
1175
+ 'log',
1176
+ this.defaultI18nTFunc(
1177
+ '{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Role}}: {roleName}',
1178
+ {
1179
+ roleName: result.systemRole.name,
1180
+ },
1181
+ ),
1182
+ );
1183
+ directLog(
1184
+ true,
1185
+ 'log',
1186
+ this.defaultI18nTFunc(
1187
+ '{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {roleId}',
1188
+ {
1189
+ roleId: idProvider.idToString(result.systemRole._id as TID),
1190
+ },
1191
+ ),
1192
+ );
1193
+ directLog(
1194
+ true,
1195
+ 'log',
1196
+ this.defaultI18nTFunc(
1197
+ '{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_User}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {userRoleId}',
1198
+ {
1199
+ userRoleId: idProvider.idToString(result.systemUserRole._id as TID),
1200
+ },
1201
+ ),
1202
+ );
1203
+ directLog(
1204
+ true,
1205
+ 'log',
1206
+ this.defaultI18nTFunc(
1207
+ '{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Username}}: {username}',
1208
+ {
1209
+ username: result.systemUsername,
1210
+ },
1211
+ ),
1212
+ );
1213
+ directLog(
1214
+ true,
1215
+ 'log',
1216
+ this.defaultI18nTFunc(
1217
+ '{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Email}}: {email}',
1218
+ {
1219
+ email: result.systemEmail,
1220
+ },
1221
+ ),
1222
+ );
1223
+ directLog(
1224
+ true,
1225
+ 'log',
1226
+ this.defaultI18nTFunc(
1227
+ '{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Password}}: {password}',
1228
+ {
1229
+ password: result.systemPassword,
1230
+ },
1231
+ ),
1232
+ );
1233
+ directLog(
1234
+ true,
1235
+ 'log',
1236
+ this.defaultI18nTFunc(
1237
+ '{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Mnemonic}}: {mnemonic}',
1238
+ {
1239
+ mnemonic: result.systemMnemonic,
1240
+ },
1241
+ ),
1242
+ );
1243
+ directLog(
1244
+ true,
1245
+ 'log',
1246
+ this.defaultI18nTFunc(
1247
+ '{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_PublicKey}}: {publicKey}',
1248
+ {
1249
+ publicKey: result.systemUser.publicKey,
1250
+ },
1251
+ ),
1252
+ );
1253
+ directLog(
1254
+ true,
1255
+ 'log',
1256
+ `${this.defaultI18nTFunc(
1257
+ '{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_BackupCodes}}',
1258
+ )}: ${result.systemBackupCodes.join(', ')}`,
1259
+ );
1260
+ directLog(true, 'log', '');
1261
+ directLog(
1262
+ true,
1263
+ 'log',
1264
+ this.defaultI18nTFunc(
1265
+ '{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_ID}}: {id}',
1266
+ {
1267
+ id: idProvider.idToString(result.adminUser._id as TID),
1268
+ },
1269
+ ),
1270
+ );
1271
+ directLog(
1272
+ true,
1273
+ 'log',
1274
+ this.defaultI18nTFunc(
1275
+ '{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Role}}: {roleName}',
1276
+ {
1277
+ roleName: result.adminRole.name,
1278
+ },
1279
+ ),
1280
+ );
1281
+ directLog(
1282
+ true,
1283
+ 'log',
1284
+ this.defaultI18nTFunc(
1285
+ '{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {roleId}',
1286
+ {
1287
+ roleId: idProvider.idToString(result.adminRole._id as TID),
1288
+ },
1289
+ ),
1290
+ );
1291
+ directLog(
1292
+ true,
1293
+ 'log',
1294
+ this.defaultI18nTFunc(
1295
+ '{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_User}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {userRoleId}',
1296
+ {
1297
+ userRoleId: idProvider.idToString(result.adminUserRole._id as TID),
1298
+ },
1299
+ ),
1300
+ );
1301
+ directLog(
1302
+ true,
1303
+ 'log',
1304
+ this.defaultI18nTFunc(
1305
+ '{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Username}}: {username}',
1306
+ {
1307
+ username: result.adminUsername,
1308
+ },
1309
+ ),
1310
+ );
1311
+ directLog(
1312
+ true,
1313
+ 'log',
1314
+ this.defaultI18nTFunc(
1315
+ '{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Email}}: {email}',
1316
+ {
1317
+ email: result.adminEmail,
1318
+ },
1319
+ ),
1320
+ );
1321
+ directLog(
1322
+ true,
1323
+ 'log',
1324
+ this.defaultI18nTFunc(
1325
+ '{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Password}}: {password}',
1326
+ {
1327
+ password: result.adminPassword,
1328
+ },
1329
+ ),
1330
+ );
1331
+ directLog(
1332
+ true,
1333
+ 'log',
1334
+ this.defaultI18nTFunc(
1335
+ '{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Mnemonic}}: {mnemonic}',
1336
+ {
1337
+ mnemonic: result.adminMnemonic,
1338
+ },
1339
+ ),
1340
+ );
1341
+ directLog(
1342
+ true,
1343
+ 'log',
1344
+ this.defaultI18nTFunc(
1345
+ '{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_PublicKey}}: {publicKey}',
1346
+ {
1347
+ publicKey: result.adminUser.publicKey,
1348
+ },
1349
+ ),
1350
+ );
1351
+ directLog(
1352
+ true,
1353
+ 'log',
1354
+ `${this.defaultI18nTFunc(
1355
+ '{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_BackupCodes}}',
1356
+ )}: ${result.adminBackupCodes.join(', ')}`,
1357
+ );
1358
+ directLog(true, 'log', '');
1359
+ directLog(
1360
+ true,
1361
+ 'log',
1362
+ this.defaultI18nTFunc(
1363
+ '{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_ID}}: {id}',
1364
+ {
1365
+ id: idProvider.idToString(result.memberUser._id as TID),
1366
+ },
1367
+ ),
1368
+ );
1369
+ directLog(
1370
+ true,
1371
+ 'log',
1372
+ this.defaultI18nTFunc(
1373
+ '{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Role}}: {roleName}',
1374
+ {
1375
+ roleName: result.memberRole.name,
1376
+ },
1377
+ ),
1378
+ );
1379
+ directLog(
1380
+ true,
1381
+ 'log',
1382
+ this.defaultI18nTFunc(
1383
+ '{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {roleId}',
1384
+ {
1385
+ roleId: idProvider.idToString(result.memberRole._id as TID),
1386
+ },
1387
+ ),
1388
+ );
1389
+ directLog(
1390
+ true,
1391
+ 'log',
1392
+ this.defaultI18nTFunc(
1393
+ '{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_User}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {userRoleId}',
1394
+ {
1395
+ userRoleId: idProvider.idToString(result.memberUserRole._id as TID),
1396
+ },
1397
+ ),
1398
+ );
1399
+ directLog(
1400
+ true,
1401
+ 'log',
1402
+ this.defaultI18nTFunc(
1403
+ '{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Username}}: {username}',
1404
+ {
1405
+ username: result.memberUsername,
1406
+ },
1407
+ ),
1408
+ );
1409
+ directLog(
1410
+ true,
1411
+ 'log',
1412
+ this.defaultI18nTFunc(
1413
+ '{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Email}}: {email}',
1414
+ {
1415
+ email: result.memberEmail,
1416
+ },
1417
+ ),
1418
+ );
1419
+ directLog(
1420
+ true,
1421
+ 'log',
1422
+ this.defaultI18nTFunc(
1423
+ '{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Password}}: {password}',
1424
+ {
1425
+ password: result.memberPassword,
1426
+ },
1427
+ ),
1428
+ );
1429
+ directLog(
1430
+ true,
1431
+ 'log',
1432
+ this.defaultI18nTFunc(
1433
+ '{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Mnemonic}}: {mnemonic}',
1434
+ {
1435
+ mnemonic: result.memberMnemonic,
1436
+ },
1437
+ ),
1438
+ );
1439
+ directLog(
1440
+ true,
1441
+ 'log',
1442
+ this.defaultI18nTFunc(
1443
+ '{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_PublicKey}}: {publicKey}',
1444
+ {
1445
+ publicKey: result.memberUser.publicKey,
1446
+ },
1447
+ ),
1448
+ );
1449
+ directLog(
1450
+ true,
1451
+ 'log',
1452
+ `${this.defaultI18nTFunc(
1453
+ '{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_BackupCodes}}',
1454
+ )}: ${result.memberBackupCodes.join(', ')}`,
1455
+ );
1456
+ directLog(
1457
+ true,
1458
+ 'log',
1459
+ this.defaultI18nTFunc(
1460
+ '\n=== {{SuiteCoreStringKey.Admin_EndCredentials}} ===',
1461
+ ),
1462
+ );
1463
+
1464
+ if (printDotEnv) {
1465
+ directLog(true, 'log', '');
1466
+ debugLog(
1467
+ true,
1468
+ 'log',
1469
+ this.defaultI18nTFunc(
1470
+ '=== {{SuiteCoreStringKey.Admin_DotEnvFormat}} ===',
1471
+ ),
1472
+ );
1473
+ debugLog(
1474
+ true,
1475
+ 'log',
1476
+ this.defaultI18nTFunc(
1477
+ '=== {{SuiteCoreStringKey.Admin_EndDotEnvFormat}} ===',
1478
+ ),
1479
+ );
1480
+ }
1481
+ }
1482
+
1483
+ public static setEnvFromInitResults<TID extends PlatformID = Buffer>(
1484
+ result: IServerInitResult<TID>,
1485
+ ): void {
1486
+ const idProvider = getEnhancedNodeIdProvider<TID>();
1487
+ process.env['ADMIN_ID'] = idProvider.idToString(
1488
+ result.adminUser._id as TID,
1489
+ );
1490
+ process.env['ADMIN_PUBLIC_KEY'] = result.adminUser.publicKey;
1491
+ process.env['ADMIN_MNEMONIC'] = result.adminMnemonic;
1492
+ process.env['ADMIN_PASSWORD'] = result.adminPassword;
1493
+ process.env['ADMIN_ROLE_ID'] = idProvider.idToString(
1494
+ result.adminRole._id as TID,
1495
+ );
1496
+ process.env['ADMIN_USER_ROLE_ID'] = idProvider.idToString(
1497
+ result.adminUserRole._id as TID,
1498
+ );
1499
+ //
1500
+ process.env['MEMBER_ID'] = idProvider.idToString(
1501
+ result.memberUser._id as TID,
1502
+ );
1503
+ process.env['MEMBER_PUBLIC_KEY'] = result.memberUser.publicKey;
1504
+ process.env['MEMBER_MNEMONIC'] = result.memberMnemonic;
1505
+ process.env['MEMBER_PASSWORD'] = result.memberPassword;
1506
+ process.env['MEMBER_ROLE_ID'] = idProvider.idToString(
1507
+ result.memberRole._id as TID,
1508
+ );
1509
+ process.env['MEMBER_USER_ROLE_ID'] = idProvider.idToString(
1510
+ result.memberUserRole._id as TID,
1511
+ );
1512
+ //
1513
+ process.env['SYSTEM_ID'] = idProvider.idToString(
1514
+ result.systemUser._id as TID,
1515
+ );
1516
+ process.env['SYSTEM_PUBLIC_KEY'] = result.systemUser.publicKey;
1517
+ process.env['SYSTEM_MNEMONIC'] = result.systemMnemonic;
1518
+ process.env['SYSTEM_PASSWORD'] = result.systemPassword;
1519
+ process.env['SYSTEM_ROLE_ID'] = idProvider.idToString(
1520
+ result.systemRole._id as TID,
1521
+ );
1522
+ process.env['SYSTEM_USER_ROLE_ID'] = idProvider.idToString(
1523
+ result.systemUserRole._id as TID,
1524
+ );
1525
+ }
1526
+
1527
+ /**
1528
+ * Write initialization results to a .env file
1529
+ * Updates or adds the credential variables in the specified .env file
1530
+ * @param envFilePath Path to the .env file to update
1531
+ * @param result The initialization results containing credentials
1532
+ * @param idToString Function to convert IDs to strings
1533
+ */
1534
+ public static writeEnvFile<TID extends PlatformID = Buffer>(
1535
+ envFilePath: string,
1536
+ result: IServerInitResult<TID>,
1537
+ ): void {
1538
+ const idProvider = getEnhancedNodeIdProvider<TID>();
1539
+ // Ensure the directory exists
1540
+ const dir = path.dirname(envFilePath);
1541
+ if (!fs.existsSync(dir)) {
1542
+ fs.mkdirSync(dir, { recursive: true });
1543
+ }
1544
+
1545
+ // Read existing .env file or create empty content
1546
+ let envContent = '';
1547
+ if (fs.existsSync(envFilePath)) {
1548
+ envContent = fs.readFileSync(envFilePath, 'utf-8');
1549
+ }
1550
+
1551
+ // Define the credentials to update
1552
+ const credentials = {
1553
+ ADMIN_ID: idProvider.idToString(result.adminUser._id as TID),
1554
+ ADMIN_MNEMONIC: result.adminMnemonic,
1555
+ ADMIN_ROLE_ID: idProvider.idToString(result.adminRole._id as TID),
1556
+ ADMIN_USER_ROLE_ID: idProvider.idToString(
1557
+ result.adminUserRole._id as TID,
1558
+ ),
1559
+ ADMIN_PASSWORD: result.adminPassword,
1560
+ MEMBER_ID: idProvider.idToString(result.memberUser._id as TID),
1561
+ MEMBER_MNEMONIC: result.memberMnemonic,
1562
+ MEMBER_ROLE_ID: idProvider.idToString(result.memberRole._id as TID),
1563
+ MEMBER_USER_ROLE_ID: idProvider.idToString(
1564
+ result.memberUserRole._id as TID,
1565
+ ),
1566
+ MEMBER_PASSWORD: result.memberPassword,
1567
+ SYSTEM_ID: idProvider.idToString(result.systemUser._id as TID),
1568
+ SYSTEM_MNEMONIC: result.systemMnemonic,
1569
+ SYSTEM_PUBLIC_KEY: result.systemUser.publicKey,
1570
+ SYSTEM_ROLE_ID: idProvider.idToString(result.systemRole._id as TID),
1571
+ SYSTEM_USER_ROLE_ID: idProvider.idToString(
1572
+ result.systemUserRole._id as TID,
1573
+ ),
1574
+ SYSTEM_PASSWORD: result.systemPassword,
1575
+ };
1576
+
1577
+ // Update or add each credential
1578
+ for (const [key, value] of Object.entries(credentials)) {
1579
+ const regex = new RegExp(`^${key}=.*$`, 'm');
1580
+ const newLine = `${key}="${value}"`;
1581
+
1582
+ if (regex.test(envContent)) {
1583
+ // Update existing line
1584
+ envContent = envContent.replace(regex, newLine);
1585
+ } else {
1586
+ // Add new line (append to end)
1587
+ if (envContent && !envContent.endsWith('\n')) {
1588
+ envContent += '\n';
1589
+ }
1590
+ envContent += newLine + '\n';
1591
+ }
1592
+ }
1593
+
1594
+ // Write back to file
1595
+ fs.writeFileSync(envFilePath, envContent, 'utf-8');
1596
+ debugLog(
1597
+ true,
1598
+ 'log',
1599
+ this.defaultI18nTFunc(
1600
+ '{{SuiteCoreStringKey.Admin_CredentialsWrittenToEnv}}',
1601
+ {
1602
+ path: envFilePath,
1603
+ },
1604
+ ),
1605
+ );
1606
+ }
1607
+
1608
+ /**
1609
+ * Initializes the user database with default users and roles (convenience method).
1610
+ * Creates necessary services and calls initUserDbWithServices.
1611
+ * @template TID Platform-specific ID type
1612
+ * @param application Application instance
1613
+ * @returns Result of the initialization
1614
+ */
1615
+ public static async initUserDb<TID extends PlatformID = Buffer>(
1616
+ application: IApplication<TID>,
1617
+ ): Promise<IFailableResult<IServerInitResult<TID>>> {
1618
+ const mnemonicModel = ModelRegistry.instance.getTypedModel<
1619
+ IMnemonicDocument<TID>
1620
+ >(BaseModelName.Mnemonic);
1621
+ const mnemonicService = new MnemonicService(
1622
+ mnemonicModel,
1623
+ application.environment.mnemonicHmacSecret,
1624
+ application.constants,
1625
+ );
1626
+ const config: IECIESConfig = {
1627
+ curveName: ECIES.CURVE_NAME,
1628
+ primaryKeyDerivationPath: ECIES.PRIMARY_KEY_DERIVATION_PATH,
1629
+ mnemonicStrength: ECIES.MNEMONIC_STRENGTH,
1630
+ symmetricAlgorithm: ECIES.SYMMETRIC_ALGORITHM_CONFIGURATION,
1631
+ symmetricKeyBits: ECIES.SYMMETRIC.KEY_BITS,
1632
+ symmetricKeyMode: ECIES.SYMMETRIC.MODE,
1633
+ };
1634
+ const eciesService = new ECIESService<TID>(config);
1635
+ const roleService = new RoleService<TID>(application);
1636
+ const keyWrappingService = new KeyWrappingService();
1637
+ const backupCodeService = new BackupCodeService<TID>(
1638
+ application,
1639
+ eciesService,
1640
+ keyWrappingService,
1641
+ roleService,
1642
+ );
1643
+
1644
+ return this.initUserDbWithServices<TID>(
1645
+ application,
1646
+ keyWrappingService,
1647
+ mnemonicService,
1648
+ eciesService,
1649
+ roleService,
1650
+ backupCodeService,
1651
+ );
1652
+ }
1653
+ }