@digitaldefiance/node-express-suite 3.6.19 → 3.6.21

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