@digitaldefiance/node-express-suite-mongo 4.23.0

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 (390) hide show
  1. package/README.md +152 -0
  2. package/package.json +51 -0
  3. package/src/__tests__/fixtures/index.d.ts +2 -0
  4. package/src/__tests__/fixtures/index.d.ts.map +1 -0
  5. package/src/__tests__/fixtures/index.js +5 -0
  6. package/src/__tests__/fixtures/index.js.map +1 -0
  7. package/src/__tests__/fixtures/model-mocks.mock.d.ts +12 -0
  8. package/src/__tests__/fixtures/model-mocks.mock.d.ts.map +1 -0
  9. package/src/__tests__/fixtures/model-mocks.mock.js +102 -0
  10. package/src/__tests__/fixtures/model-mocks.mock.js.map +1 -0
  11. package/src/__tests__/helpers/application.mock.d.ts +4 -0
  12. package/src/__tests__/helpers/application.mock.d.ts.map +1 -0
  13. package/src/__tests__/helpers/application.mock.js +35 -0
  14. package/src/__tests__/helpers/application.mock.js.map +1 -0
  15. package/src/__tests__/helpers/index.d.ts +5 -0
  16. package/src/__tests__/helpers/index.d.ts.map +1 -0
  17. package/src/__tests__/helpers/index.js +8 -0
  18. package/src/__tests__/helpers/index.js.map +1 -0
  19. package/src/__tests__/helpers/mongoose-memory.d.ts +14 -0
  20. package/src/__tests__/helpers/mongoose-memory.d.ts.map +1 -0
  21. package/src/__tests__/helpers/mongoose-memory.js +49 -0
  22. package/src/__tests__/helpers/mongoose-memory.js.map +1 -0
  23. package/src/__tests__/helpers/setup-test-env.d.ts +13 -0
  24. package/src/__tests__/helpers/setup-test-env.d.ts.map +1 -0
  25. package/src/__tests__/helpers/setup-test-env.js +131 -0
  26. package/src/__tests__/helpers/setup-test-env.js.map +1 -0
  27. package/src/__tests__/index.d.ts +3 -0
  28. package/src/__tests__/index.d.ts.map +1 -0
  29. package/src/__tests__/index.js +6 -0
  30. package/src/__tests__/index.js.map +1 -0
  31. package/src/builders/application-builder.d.ts +38 -0
  32. package/src/builders/application-builder.d.ts.map +1 -0
  33. package/src/builders/application-builder.js +82 -0
  34. package/src/builders/application-builder.js.map +1 -0
  35. package/src/builders/index.d.ts +2 -0
  36. package/src/builders/index.d.ts.map +1 -0
  37. package/src/builders/index.js +5 -0
  38. package/src/builders/index.js.map +1 -0
  39. package/src/controllers/index.d.ts +3 -0
  40. package/src/controllers/index.d.ts.map +1 -0
  41. package/src/controllers/index.js +6 -0
  42. package/src/controllers/index.js.map +1 -0
  43. package/src/controllers/mongo-base.d.ts +55 -0
  44. package/src/controllers/mongo-base.d.ts.map +1 -0
  45. package/src/controllers/mongo-base.js +108 -0
  46. package/src/controllers/mongo-base.js.map +1 -0
  47. package/src/controllers/user.d.ts +61 -0
  48. package/src/controllers/user.d.ts.map +1 -0
  49. package/src/controllers/user.js +944 -0
  50. package/src/controllers/user.js.map +1 -0
  51. package/src/documents/base.d.ts +15 -0
  52. package/src/documents/base.d.ts.map +1 -0
  53. package/src/documents/base.js +8 -0
  54. package/src/documents/base.js.map +1 -0
  55. package/src/documents/email-token.d.ts +15 -0
  56. package/src/documents/email-token.d.ts.map +1 -0
  57. package/src/documents/email-token.js +8 -0
  58. package/src/documents/email-token.js.map +1 -0
  59. package/src/documents/index.d.ts +8 -0
  60. package/src/documents/index.d.ts.map +1 -0
  61. package/src/documents/index.js +3 -0
  62. package/src/documents/index.js.map +1 -0
  63. package/src/documents/mnemonic.d.ts +16 -0
  64. package/src/documents/mnemonic.d.ts.map +1 -0
  65. package/src/documents/mnemonic.js +8 -0
  66. package/src/documents/mnemonic.js.map +1 -0
  67. package/src/documents/role.d.ts +15 -0
  68. package/src/documents/role.d.ts.map +1 -0
  69. package/src/documents/role.js +8 -0
  70. package/src/documents/role.js.map +1 -0
  71. package/src/documents/used-direct-login-token.d.ts +16 -0
  72. package/src/documents/used-direct-login-token.d.ts.map +1 -0
  73. package/src/documents/used-direct-login-token.js +8 -0
  74. package/src/documents/used-direct-login-token.js.map +1 -0
  75. package/src/documents/user-role.d.ts +16 -0
  76. package/src/documents/user-role.d.ts.map +1 -0
  77. package/src/documents/user-role.js +8 -0
  78. package/src/documents/user-role.js.map +1 -0
  79. package/src/documents/user.d.ts +16 -0
  80. package/src/documents/user.d.ts.map +1 -0
  81. package/src/documents/user.js +8 -0
  82. package/src/documents/user.js.map +1 -0
  83. package/src/enumerations/base-model-name.d.ts +43 -0
  84. package/src/enumerations/base-model-name.d.ts.map +1 -0
  85. package/src/enumerations/base-model-name.js +39 -0
  86. package/src/enumerations/base-model-name.js.map +1 -0
  87. package/src/enumerations/index.d.ts +3 -0
  88. package/src/enumerations/index.d.ts.map +1 -0
  89. package/src/enumerations/index.js +6 -0
  90. package/src/enumerations/index.js.map +1 -0
  91. package/src/enumerations/schema-collection.d.ts +39 -0
  92. package/src/enumerations/schema-collection.d.ts.map +1 -0
  93. package/src/enumerations/schema-collection.js +43 -0
  94. package/src/enumerations/schema-collection.js.map +1 -0
  95. package/src/errors/index.d.ts +5 -0
  96. package/src/errors/index.d.ts.map +1 -0
  97. package/src/errors/index.js +8 -0
  98. package/src/errors/index.js.map +1 -0
  99. package/src/errors/invalid-backup-code-version.d.ts +5 -0
  100. package/src/errors/invalid-backup-code-version.d.ts.map +1 -0
  101. package/src/errors/invalid-backup-code-version.js +14 -0
  102. package/src/errors/invalid-backup-code-version.js.map +1 -0
  103. package/src/errors/invalid-model.d.ts +18 -0
  104. package/src/errors/invalid-model.d.ts.map +1 -0
  105. package/src/errors/invalid-model.js +26 -0
  106. package/src/errors/invalid-model.js.map +1 -0
  107. package/src/errors/model-not-registered.d.ts +18 -0
  108. package/src/errors/model-not-registered.d.ts.map +1 -0
  109. package/src/errors/model-not-registered.js +26 -0
  110. package/src/errors/model-not-registered.js.map +1 -0
  111. package/src/errors/mongoose-validation.d.ts +28 -0
  112. package/src/errors/mongoose-validation.d.ts.map +1 -0
  113. package/src/errors/mongoose-validation.js +33 -0
  114. package/src/errors/mongoose-validation.js.map +1 -0
  115. package/src/index.d.ts +19 -0
  116. package/src/index.d.ts.map +1 -0
  117. package/src/index.js +31 -0
  118. package/src/index.js.map +1 -0
  119. package/src/interfaces/api-mongo-validation-error-response.d.ts +16 -0
  120. package/src/interfaces/api-mongo-validation-error-response.d.ts.map +1 -0
  121. package/src/interfaces/api-mongo-validation-error-response.js +8 -0
  122. package/src/interfaces/api-mongo-validation-error-response.js.map +1 -0
  123. package/src/interfaces/database-init-result-tx.d.ts +27 -0
  124. package/src/interfaces/database-init-result-tx.d.ts.map +1 -0
  125. package/src/interfaces/database-init-result-tx.js +3 -0
  126. package/src/interfaces/database-init-result-tx.js.map +1 -0
  127. package/src/interfaces/db-init-result.d.ts +16 -0
  128. package/src/interfaces/db-init-result.d.ts.map +1 -0
  129. package/src/interfaces/db-init-result.js +8 -0
  130. package/src/interfaces/db-init-result.js.map +1 -0
  131. package/src/interfaces/discriminator-collections.d.ts +17 -0
  132. package/src/interfaces/discriminator-collections.d.ts.map +1 -0
  133. package/src/interfaces/discriminator-collections.js +8 -0
  134. package/src/interfaces/discriminator-collections.js.map +1 -0
  135. package/src/interfaces/environment-mongo.d.ts +88 -0
  136. package/src/interfaces/environment-mongo.d.ts.map +1 -0
  137. package/src/interfaces/environment-mongo.js +8 -0
  138. package/src/interfaces/environment-mongo.js.map +1 -0
  139. package/src/interfaces/index.d.ts +13 -0
  140. package/src/interfaces/index.d.ts.map +1 -0
  141. package/src/interfaces/index.js +16 -0
  142. package/src/interfaces/index.js.map +1 -0
  143. package/src/interfaces/models/email-token.d.ts +12 -0
  144. package/src/interfaces/models/email-token.d.ts.map +1 -0
  145. package/src/interfaces/models/email-token.js +8 -0
  146. package/src/interfaces/models/email-token.js.map +1 -0
  147. package/src/interfaces/models/index.d.ts +8 -0
  148. package/src/interfaces/models/index.d.ts.map +1 -0
  149. package/src/interfaces/models/index.js +11 -0
  150. package/src/interfaces/models/index.js.map +1 -0
  151. package/src/interfaces/models/mnemonic.d.ts +13 -0
  152. package/src/interfaces/models/mnemonic.d.ts.map +1 -0
  153. package/src/interfaces/models/mnemonic.js +8 -0
  154. package/src/interfaces/models/mnemonic.js.map +1 -0
  155. package/src/interfaces/models/role.d.ts +12 -0
  156. package/src/interfaces/models/role.d.ts.map +1 -0
  157. package/src/interfaces/models/role.js +8 -0
  158. package/src/interfaces/models/role.js.map +1 -0
  159. package/src/interfaces/models/token-role.d.ts +19 -0
  160. package/src/interfaces/models/token-role.d.ts.map +1 -0
  161. package/src/interfaces/models/token-role.js +8 -0
  162. package/src/interfaces/models/token-role.js.map +1 -0
  163. package/src/interfaces/models/used-direct-login-token.d.ts +19 -0
  164. package/src/interfaces/models/used-direct-login-token.d.ts.map +1 -0
  165. package/src/interfaces/models/used-direct-login-token.js +8 -0
  166. package/src/interfaces/models/used-direct-login-token.js.map +1 -0
  167. package/src/interfaces/models/user-role.d.ts +19 -0
  168. package/src/interfaces/models/user-role.d.ts.map +1 -0
  169. package/src/interfaces/models/user-role.js +8 -0
  170. package/src/interfaces/models/user-role.js.map +1 -0
  171. package/src/interfaces/models/user.d.ts +21 -0
  172. package/src/interfaces/models/user.d.ts.map +1 -0
  173. package/src/interfaces/models/user.js +8 -0
  174. package/src/interfaces/models/user.js.map +1 -0
  175. package/src/interfaces/mongo-application.d.ts +47 -0
  176. package/src/interfaces/mongo-application.d.ts.map +1 -0
  177. package/src/interfaces/mongo-application.js +10 -0
  178. package/src/interfaces/mongo-application.js.map +1 -0
  179. package/src/interfaces/mongo-errors.d.ts +13 -0
  180. package/src/interfaces/mongo-errors.d.ts.map +1 -0
  181. package/src/interfaces/mongo-errors.js +8 -0
  182. package/src/interfaces/mongo-errors.js.map +1 -0
  183. package/src/interfaces/mongoose-document-store.d.ts +42 -0
  184. package/src/interfaces/mongoose-document-store.d.ts.map +1 -0
  185. package/src/interfaces/mongoose-document-store.js +10 -0
  186. package/src/interfaces/mongoose-document-store.js.map +1 -0
  187. package/src/interfaces/schema.d.ts +37 -0
  188. package/src/interfaces/schema.d.ts.map +1 -0
  189. package/src/interfaces/schema.js +8 -0
  190. package/src/interfaces/schema.js.map +1 -0
  191. package/src/interfaces/server-init-result.d.ts +45 -0
  192. package/src/interfaces/server-init-result.d.ts.map +1 -0
  193. package/src/interfaces/server-init-result.js +8 -0
  194. package/src/interfaces/server-init-result.js.map +1 -0
  195. package/src/interfaces/test-environment.d.ts +22 -0
  196. package/src/interfaces/test-environment.d.ts.map +1 -0
  197. package/src/interfaces/test-environment.js +8 -0
  198. package/src/interfaces/test-environment.js.map +1 -0
  199. package/src/model-registry.d.ts +79 -0
  200. package/src/model-registry.d.ts.map +1 -0
  201. package/src/model-registry.js +97 -0
  202. package/src/model-registry.js.map +1 -0
  203. package/src/models/email-token.d.ts +24 -0
  204. package/src/models/email-token.d.ts.map +1 -0
  205. package/src/models/email-token.js +16 -0
  206. package/src/models/email-token.js.map +1 -0
  207. package/src/models/index.d.ts +7 -0
  208. package/src/models/index.d.ts.map +1 -0
  209. package/src/models/index.js +10 -0
  210. package/src/models/index.js.map +1 -0
  211. package/src/models/mnemonic.d.ts +24 -0
  212. package/src/models/mnemonic.d.ts.map +1 -0
  213. package/src/models/mnemonic.js +27 -0
  214. package/src/models/mnemonic.js.map +1 -0
  215. package/src/models/role.d.ts +24 -0
  216. package/src/models/role.d.ts.map +1 -0
  217. package/src/models/role.js +27 -0
  218. package/src/models/role.js.map +1 -0
  219. package/src/models/used-direct-login-token.d.ts +24 -0
  220. package/src/models/used-direct-login-token.d.ts.map +1 -0
  221. package/src/models/used-direct-login-token.js +16 -0
  222. package/src/models/used-direct-login-token.js.map +1 -0
  223. package/src/models/user-role.d.ts +23 -0
  224. package/src/models/user-role.d.ts.map +1 -0
  225. package/src/models/user-role.js +26 -0
  226. package/src/models/user-role.js.map +1 -0
  227. package/src/models/user.d.ts +24 -0
  228. package/src/models/user.d.ts.map +1 -0
  229. package/src/models/user.js +27 -0
  230. package/src/models/user.js.map +1 -0
  231. package/src/mongo-application-concrete.d.ts +30 -0
  232. package/src/mongo-application-concrete.d.ts.map +1 -0
  233. package/src/mongo-application-concrete.js +46 -0
  234. package/src/mongo-application-concrete.js.map +1 -0
  235. package/src/plugins/index.d.ts +2 -0
  236. package/src/plugins/index.d.ts.map +1 -0
  237. package/src/plugins/index.js +5 -0
  238. package/src/plugins/index.js.map +1 -0
  239. package/src/plugins/mongo-database-plugin.d.ts +116 -0
  240. package/src/plugins/mongo-database-plugin.d.ts.map +1 -0
  241. package/src/plugins/mongo-database-plugin.js +230 -0
  242. package/src/plugins/mongo-database-plugin.js.map +1 -0
  243. package/src/routers/api.d.ts +29 -0
  244. package/src/routers/api.d.ts.map +1 -0
  245. package/src/routers/api.js +84 -0
  246. package/src/routers/api.js.map +1 -0
  247. package/src/routers/index.d.ts +2 -0
  248. package/src/routers/index.d.ts.map +1 -0
  249. package/src/routers/index.js +5 -0
  250. package/src/routers/index.js.map +1 -0
  251. package/src/schemas/email-token.d.ts +65 -0
  252. package/src/schemas/email-token.d.ts.map +1 -0
  253. package/src/schemas/email-token.js +68 -0
  254. package/src/schemas/email-token.js.map +1 -0
  255. package/src/schemas/index.d.ts +8 -0
  256. package/src/schemas/index.d.ts.map +1 -0
  257. package/src/schemas/index.js +11 -0
  258. package/src/schemas/index.js.map +1 -0
  259. package/src/schemas/mnemonic.d.ts +37 -0
  260. package/src/schemas/mnemonic.d.ts.map +1 -0
  261. package/src/schemas/mnemonic.js +41 -0
  262. package/src/schemas/mnemonic.js.map +1 -0
  263. package/src/schemas/role.d.ts +57 -0
  264. package/src/schemas/role.d.ts.map +1 -0
  265. package/src/schemas/role.js +102 -0
  266. package/src/schemas/role.js.map +1 -0
  267. package/src/schemas/schema.d.ts +62 -0
  268. package/src/schemas/schema.d.ts.map +1 -0
  269. package/src/schemas/schema.js +81 -0
  270. package/src/schemas/schema.js.map +1 -0
  271. package/src/schemas/used-direct-login-token.d.ts +49 -0
  272. package/src/schemas/used-direct-login-token.d.ts.map +1 -0
  273. package/src/schemas/used-direct-login-token.js +35 -0
  274. package/src/schemas/used-direct-login-token.js.map +1 -0
  275. package/src/schemas/user-role.d.ts +52 -0
  276. package/src/schemas/user-role.d.ts.map +1 -0
  277. package/src/schemas/user-role.js +67 -0
  278. package/src/schemas/user-role.js.map +1 -0
  279. package/src/schemas/user.d.ts +43 -0
  280. package/src/schemas/user.d.ts.map +1 -0
  281. package/src/schemas/user.js +214 -0
  282. package/src/schemas/user.js.map +1 -0
  283. package/src/services/backup-code.d.ts +118 -0
  284. package/src/services/backup-code.d.ts.map +1 -0
  285. package/src/services/backup-code.js +320 -0
  286. package/src/services/backup-code.js.map +1 -0
  287. package/src/services/database-initialization.d.ts +137 -0
  288. package/src/services/database-initialization.d.ts.map +1 -0
  289. package/src/services/database-initialization.js +911 -0
  290. package/src/services/database-initialization.js.map +1 -0
  291. package/src/services/db-init-cache.d.ts +18 -0
  292. package/src/services/db-init-cache.d.ts.map +1 -0
  293. package/src/services/db-init-cache.js +7 -0
  294. package/src/services/db-init-cache.js.map +1 -0
  295. package/src/services/direct-login-token.d.ts +28 -0
  296. package/src/services/direct-login-token.d.ts.map +1 -0
  297. package/src/services/direct-login-token.js +62 -0
  298. package/src/services/direct-login-token.js.map +1 -0
  299. package/src/services/index.d.ts +17 -0
  300. package/src/services/index.d.ts.map +1 -0
  301. package/src/services/index.js +20 -0
  302. package/src/services/index.js.map +1 -0
  303. package/src/services/jwt.d.ts +20 -0
  304. package/src/services/jwt.d.ts.map +1 -0
  305. package/src/services/jwt.js +79 -0
  306. package/src/services/jwt.js.map +1 -0
  307. package/src/services/mnemonic.d.ts +30 -0
  308. package/src/services/mnemonic.d.ts.map +1 -0
  309. package/src/services/mnemonic.js +80 -0
  310. package/src/services/mnemonic.js.map +1 -0
  311. package/src/services/mongo-authentication-provider.d.ts +27 -0
  312. package/src/services/mongo-authentication-provider.d.ts.map +1 -0
  313. package/src/services/mongo-authentication-provider.js +97 -0
  314. package/src/services/mongo-authentication-provider.js.map +1 -0
  315. package/src/services/mongo-backup-code-store.d.ts +40 -0
  316. package/src/services/mongo-backup-code-store.d.ts.map +1 -0
  317. package/src/services/mongo-backup-code-store.js +104 -0
  318. package/src/services/mongo-backup-code-store.js.map +1 -0
  319. package/src/services/mongo-base.d.ts +24 -0
  320. package/src/services/mongo-base.d.ts.map +1 -0
  321. package/src/services/mongo-base.js +28 -0
  322. package/src/services/mongo-base.js.map +1 -0
  323. package/src/services/mongoose-collection.d.ts +52 -0
  324. package/src/services/mongoose-collection.d.ts.map +1 -0
  325. package/src/services/mongoose-collection.js +326 -0
  326. package/src/services/mongoose-collection.js.map +1 -0
  327. package/src/services/mongoose-database.d.ts +64 -0
  328. package/src/services/mongoose-database.d.ts.map +1 -0
  329. package/src/services/mongoose-database.js +121 -0
  330. package/src/services/mongoose-database.js.map +1 -0
  331. package/src/services/mongoose-document-store.d.ts +108 -0
  332. package/src/services/mongoose-document-store.d.ts.map +1 -0
  333. package/src/services/mongoose-document-store.js +265 -0
  334. package/src/services/mongoose-document-store.js.map +1 -0
  335. package/src/services/mongoose-session-adapter.d.ts +39 -0
  336. package/src/services/mongoose-session-adapter.d.ts.map +1 -0
  337. package/src/services/mongoose-session-adapter.js +63 -0
  338. package/src/services/mongoose-session-adapter.js.map +1 -0
  339. package/src/services/request-user.d.ts +22 -0
  340. package/src/services/request-user.d.ts.map +1 -0
  341. package/src/services/request-user.js +66 -0
  342. package/src/services/request-user.js.map +1 -0
  343. package/src/services/role.d.ts +97 -0
  344. package/src/services/role.d.ts.map +1 -0
  345. package/src/services/role.js +288 -0
  346. package/src/services/role.js.map +1 -0
  347. package/src/services/user.d.ts +362 -0
  348. package/src/services/user.d.ts.map +1 -0
  349. package/src/services/user.js +1504 -0
  350. package/src/services/user.js.map +1 -0
  351. package/src/testing.d.ts +9 -0
  352. package/src/testing.d.ts.map +1 -0
  353. package/src/testing.js +12 -0
  354. package/src/testing.js.map +1 -0
  355. package/src/transactions/index.d.ts +2 -0
  356. package/src/transactions/index.d.ts.map +1 -0
  357. package/src/transactions/index.js +5 -0
  358. package/src/transactions/index.js.map +1 -0
  359. package/src/transactions/transaction-manager.d.ts +37 -0
  360. package/src/transactions/transaction-manager.d.ts.map +1 -0
  361. package/src/transactions/transaction-manager.js +50 -0
  362. package/src/transactions/transaction-manager.js.map +1 -0
  363. package/src/types/index.d.ts +26 -0
  364. package/src/types/index.d.ts.map +1 -0
  365. package/src/types/index.js +9 -0
  366. package/src/types/index.js.map +1 -0
  367. package/src/types/mongoose-helpers.d.ts +16 -0
  368. package/src/types/mongoose-helpers.d.ts.map +1 -0
  369. package/src/types/mongoose-helpers.js +8 -0
  370. package/src/types/mongoose-helpers.js.map +1 -0
  371. package/src/utils/default-mongo-uri-validator.d.ts +15 -0
  372. package/src/utils/default-mongo-uri-validator.d.ts.map +1 -0
  373. package/src/utils/default-mongo-uri-validator.js +46 -0
  374. package/src/utils/default-mongo-uri-validator.js.map +1 -0
  375. package/src/utils/index.d.ts +5 -0
  376. package/src/utils/index.d.ts.map +1 -0
  377. package/src/utils/index.js +8 -0
  378. package/src/utils/index.js.map +1 -0
  379. package/src/utils/mongo-error-response.d.ts +17 -0
  380. package/src/utils/mongo-error-response.d.ts.map +1 -0
  381. package/src/utils/mongo-error-response.js +21 -0
  382. package/src/utils/mongo-error-response.js.map +1 -0
  383. package/src/utils/mongo-transaction.d.ts +39 -0
  384. package/src/utils/mongo-transaction.d.ts.map +1 -0
  385. package/src/utils/mongo-transaction.js +131 -0
  386. package/src/utils/mongo-transaction.js.map +1 -0
  387. package/src/utils/object-id.d.ts +11 -0
  388. package/src/utils/object-id.d.ts.map +1 -0
  389. package/src/utils/object-id.js +17 -0
  390. package/src/utils/object-id.js.map +1 -0
@@ -0,0 +1,911 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Service for initializing the database with default users, roles, and relationships.
4
+ * Handles creation of system, admin, and member users with encrypted credentials and backup codes.
5
+ * @module services/database-initialization
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.DatabaseInitializationService = void 0;
9
+ const tslib_1 = require("tslib");
10
+ const ecies_lib_1 = require("@digitaldefiance/ecies-lib");
11
+ const i18n_lib_1 = require("@digitaldefiance/i18n-lib");
12
+ const node_ecies_lib_1 = require("@digitaldefiance/node-ecies-lib");
13
+ const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
14
+ const crc_1 = require("crc");
15
+ const crypto_1 = require("crypto");
16
+ const fs = tslib_1.__importStar(require("fs"));
17
+ const path = tslib_1.__importStar(require("path"));
18
+ const node_express_suite_1 = require("@digitaldefiance/node-express-suite");
19
+ const mongo_transaction_1 = require("../utils/mongo-transaction");
20
+ const model_registry_1 = require("../model-registry");
21
+ const mnemonic_1 = require("./mnemonic");
22
+ const base_model_name_1 = require("../enumerations/base-model-name");
23
+ const backup_code_1 = require("./backup-code");
24
+ const role_1 = require("./role");
25
+ /**
26
+ * Service for initializing the database with default users, roles, and relationships.
27
+ * Manages creation of system, admin, and member accounts with encrypted credentials.
28
+ */
29
+ class DatabaseInitializationService {
30
+ /**
31
+ * Static initialization state management to prevent concurrent initialization.
32
+ * @private
33
+ */
34
+ static initializationPromises = new Map();
35
+ /** Initialization lock to prevent race conditions */
36
+ static initializationLock = new Map();
37
+ /**
38
+ * Default i18n translation function for database initialization messages.
39
+ * @param str String key to translate
40
+ * @param variables Template variables
41
+ * @param language Target language
42
+ * @param application Application instance
43
+ * @returns Translated string
44
+ */
45
+ static defaultI18nTFunc(str, variables, language, application) {
46
+ // Handles template strings with {{component.key}} syntax
47
+ return (0, suite_core_lib_1.getSuiteCoreI18nEngine)(application ? { constants: application.constants } : undefined).t(str, variables, language);
48
+ }
49
+ /**
50
+ * Gets the mnemonic or generates a new one if not present.
51
+ * @template TID Platform-specific ID type
52
+ * @param mnemonic Existing mnemonic or undefined
53
+ * @param eciesService ECIES service to generate a new mnemonic
54
+ * @returns Existing or new mnemonic
55
+ */
56
+ static mnemonicOrNew(mnemonic, eciesService) {
57
+ return mnemonic && mnemonic.hasValue
58
+ ? mnemonic
59
+ : eciesService.generateNewMnemonic();
60
+ }
61
+ /**
62
+ * Generates a cache key for a user based on their details.
63
+ * @template TID Platform-specific ID type
64
+ * @param username Username
65
+ * @param email Email address
66
+ * @param mnemonic Mnemonic
67
+ * @param id User ID
68
+ * @returns Generated cache key as hex string
69
+ */
70
+ static cacheKey(username, email, mnemonic, id) {
71
+ const idProvider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
72
+ const combined = `${username}|${email.email}|${mnemonic.value}|${idProvider.idToString(id)}`;
73
+ const buffer = (0, ecies_lib_1.stringToUint8Array)(combined);
74
+ const crcHash = (0, crc_1.crc32)(Buffer.from(buffer));
75
+ return crcHash.toString(16).padStart(8, '0');
76
+ }
77
+ /**
78
+ * Gets a cached BackendMember or creates a new one if not cached.
79
+ * @template TID Platform-specific ID type
80
+ * @param username Username
81
+ * @param email Email address
82
+ * @param mnemonic Mnemonic or undefined to generate a new one
83
+ * @param memberType Type of member (Admin, Member, System)
84
+ * @param eciesService ECIES service to handle key generation
85
+ * @param memberId Optional specific member ID to use
86
+ * @param createdBy Optional ID of the user who created this member
87
+ * @returns Cached or newly created BackendMember and the mnemonic used
88
+ */
89
+ static cacheOrNew(username, email, mnemonic, memberType, eciesService, memberId, createdBy) {
90
+ const idProvider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
91
+ const m = this.mnemonicOrNew(mnemonic, eciesService);
92
+ const newId = memberId ? memberId : idProvider.generateTyped();
93
+ const key = DatabaseInitializationService.cacheKey(username, email, m, newId);
94
+ if (!global.__MEMBER_CACHE__) {
95
+ global.__MEMBER_CACHE__ = new Map();
96
+ }
97
+ if (!global.__MEMBER_CACHE__.has(key)) {
98
+ const { wallet } = eciesService.walletAndSeedFromMnemonic(m);
99
+ // Get private key from wallet
100
+ const privateKey = wallet.getPrivateKey();
101
+ // Get compressed public key (already includes prefix)
102
+ const publicKeyWithPrefix = eciesService.getPublicKey(Buffer.from(privateKey));
103
+ const user = new node_ecies_lib_1.Member(eciesService, memberType, username, email, publicKeyWithPrefix, new ecies_lib_1.SecureBuffer(privateKey), wallet, newId, undefined, undefined, createdBy);
104
+ global.__MEMBER_CACHE__.set(key, {
105
+ mnemonic: m,
106
+ member: user,
107
+ });
108
+ return { mnemonic: m, member: user };
109
+ }
110
+ else {
111
+ return global.__MEMBER_CACHE__.get(key);
112
+ }
113
+ }
114
+ /**
115
+ * Generates a random password meeting security requirements.
116
+ * @param length Length of the password
117
+ * @returns Generated password string
118
+ */
119
+ static generatePassword(length) {
120
+ const specialCharacters = "!@#$%^&*()_+-=[]{};':|,.<>/?";
121
+ const numbers = '0123456789';
122
+ const letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
123
+ // Get a random character from a string
124
+ const getRandomChar = (chars) => {
125
+ // amazonq-ignore-next-line false positive
126
+ const randomIndex = (0, crypto_1.randomBytes)(1)[0] % chars.length;
127
+ return chars[randomIndex];
128
+ };
129
+ // Start with one of each required character type
130
+ // amazonq-ignore-next-line false positive
131
+ let password = '';
132
+ password += getRandomChar(letters);
133
+ password += getRandomChar(numbers);
134
+ password += getRandomChar(specialCharacters);
135
+ // Fill the rest with random characters from all types
136
+ const allCharacters = specialCharacters + numbers + letters;
137
+ for (let i = password.length; i < length; i++) {
138
+ password += getRandomChar(allCharacters);
139
+ }
140
+ // Shuffle the password characters to avoid predictable pattern
141
+ const chars = password.split('');
142
+ for (let i = chars.length - 1; i > 0; i--) {
143
+ // amazonq-ignore-next-line already fixed
144
+ const j = (0, crypto_1.randomBytes)(1)[0] % (i + 1);
145
+ [chars[i], chars[j]] = [chars[j], chars[i]];
146
+ }
147
+ return chars.join('');
148
+ }
149
+ /**
150
+ * Drops the database.
151
+ * @param connection Database connection
152
+ * @returns True if the database was dropped, false if not connected
153
+ */
154
+ static async dropDatabase(connection) {
155
+ if (!connection.db)
156
+ return false;
157
+ (0, node_express_suite_1.debugLog)(true, 'warn', this.defaultI18nTFunc('{{SuiteCoreStringKey.Admin_DroppingDatabase}}'));
158
+ return connection.db.dropDatabase();
159
+ }
160
+ static getInitOptions(application) {
161
+ const env = application.environment;
162
+ return {
163
+ adminId: env.adminId,
164
+ adminMnemonic: env.adminMnemonic?.hasValue
165
+ ? env.adminMnemonic
166
+ : undefined,
167
+ adminPassword: env.adminPassword?.hasValue
168
+ ? env.adminPassword
169
+ : undefined,
170
+ adminRoleId: env.adminRoleId,
171
+ adminUserRoleId: env.adminUserRoleId,
172
+ adminBackupCodes: env.adminBackupCodes,
173
+ memberId: env.memberId,
174
+ memberMnemonic: env.memberMnemonic?.hasValue
175
+ ? env.memberMnemonic
176
+ : undefined,
177
+ memberPassword: env.memberPassword?.hasValue
178
+ ? env.memberPassword
179
+ : undefined,
180
+ memberRoleId: env.memberRoleId,
181
+ memberUserRoleId: env.memberUserRoleId,
182
+ memberBackupCodes: env.memberBackupCodes,
183
+ systemId: env.systemId,
184
+ systemMnemonic: env.systemMnemonic?.hasValue
185
+ ? env.systemMnemonic
186
+ : undefined,
187
+ systemPassword: env.systemPassword?.hasValue
188
+ ? env.systemPassword
189
+ : undefined,
190
+ systemRoleId: env.systemRoleId,
191
+ systemUserRoleId: env.systemUserRoleId,
192
+ systemBackupCodes: env.systemBackupCodes,
193
+ };
194
+ }
195
+ static serverInitResultHash(serverInitResult) {
196
+ const h = (0, crypto_1.createHash)('sha256');
197
+ const idProvider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
198
+ h.update(idProvider.idToString(serverInitResult.adminUser._id));
199
+ h.update(idProvider.idToString(serverInitResult.adminRole._id));
200
+ h.update(idProvider.idToString(serverInitResult.adminUserRole._id));
201
+ h.update(serverInitResult.adminUsername);
202
+ h.update(serverInitResult.adminEmail);
203
+ h.update(serverInitResult.adminMnemonic);
204
+ h.update(serverInitResult.adminPassword);
205
+ h.update(serverInitResult.adminUser.publicKey);
206
+ serverInitResult.adminBackupCodes.map((bc) => h.update(bc));
207
+ h.update(idProvider.idToString(serverInitResult.memberUser._id));
208
+ h.update(idProvider.idToString(serverInitResult.memberRole._id));
209
+ h.update(idProvider.idToString(serverInitResult.memberUserRole._id));
210
+ h.update(serverInitResult.memberUsername);
211
+ h.update(serverInitResult.memberEmail);
212
+ h.update(serverInitResult.memberMnemonic);
213
+ h.update(serverInitResult.memberPassword);
214
+ h.update(serverInitResult.memberUser.publicKey);
215
+ serverInitResult.memberBackupCodes.map((bc) => h.update(bc));
216
+ h.update(idProvider.idToString(serverInitResult.systemUser._id));
217
+ h.update(idProvider.idToString(serverInitResult.systemRole._id));
218
+ h.update(idProvider.idToString(serverInitResult.systemUserRole._id));
219
+ h.update(serverInitResult.systemUsername);
220
+ h.update(serverInitResult.systemEmail);
221
+ h.update(serverInitResult.systemMnemonic);
222
+ h.update(serverInitResult.systemPassword);
223
+ h.update(serverInitResult.systemUser.publicKey);
224
+ serverInitResult.systemBackupCodes.map((bc) => h.update(bc));
225
+ return h.digest('hex');
226
+ }
227
+ /**
228
+ * Initializes the user database with default users and roles using dependency injection.
229
+ * @template TID Platform-specific ID type
230
+ * @param application Application instance
231
+ * @param keyWrappingService Key wrapping service
232
+ * @param mnemonicService Mnemonic service
233
+ * @param eciesService ECIES service
234
+ * @param roleService Role service
235
+ * @param backupCodeService Backup code service
236
+ * @returns Result of the initialization
237
+ */
238
+ static async initUserDbWithServices(application, keyWrappingService, mnemonicService, eciesService, roleService, backupCodeService) {
239
+ const engine = (0, suite_core_lib_1.getSuiteCoreI18nEngine)({ constants: application.constants });
240
+ const isTestEnvironment = process.env['NODE_ENV'] === 'test';
241
+ const options = DatabaseInitializationService.getInitOptions(application);
242
+ const effectiveIdGenerator = (() => application.constants.idProvider.fromBytes(application.constants.idProvider.generate()));
243
+ const UserModel = model_registry_1.ModelRegistry.instance.getTypedModel(base_model_name_1.BaseModelName.User);
244
+ const RoleModel = model_registry_1.ModelRegistry.instance.getTypedModel(base_model_name_1.BaseModelName.Role);
245
+ const adminUserId = options.adminId ?? effectiveIdGenerator();
246
+ const adminRoleId = options.adminRoleId ?? effectiveIdGenerator();
247
+ const adminUserRoleId = options.adminUserRoleId ?? effectiveIdGenerator();
248
+ const memberUserId = options.memberId ?? effectiveIdGenerator();
249
+ const memberRoleId = options.memberRoleId ?? effectiveIdGenerator();
250
+ const memberUserRoleId = options.memberUserRoleId ?? effectiveIdGenerator();
251
+ const systemUserId = options.systemId ?? effectiveIdGenerator();
252
+ const systemRoleId = options.systemRoleId ?? effectiveIdGenerator();
253
+ const systemUserRoleId = options.systemUserRoleId ?? effectiveIdGenerator();
254
+ // Check for existing users and roles with optimized queries
255
+ // Use lean() for better performance on read-only operations
256
+ const [existingUsers, existingRoles] = await Promise.all([
257
+ UserModel.find({
258
+ username: {
259
+ $in: [
260
+ application.constants.SystemUser,
261
+ application.constants.AdministratorUser,
262
+ application.constants.MemberUser,
263
+ ],
264
+ },
265
+ }).lean(),
266
+ RoleModel.find({
267
+ name: {
268
+ $in: [
269
+ application.constants.AdministratorRole,
270
+ application.constants.MemberRole,
271
+ application.constants.SystemRole,
272
+ ],
273
+ },
274
+ }).lean(),
275
+ ]);
276
+ if (existingUsers.length > 0 || existingRoles.length > 0) {
277
+ // Database is already initialized, return the existing data
278
+ const existingAdminUser = existingUsers.find((u) => u.username === application.constants.AdministratorUser);
279
+ const existingMemberUser = existingUsers.find((u) => u.username === application.constants.MemberUser);
280
+ const existingSystemUser = existingUsers.find((u) => u.username === application.constants.SystemUser);
281
+ if (existingAdminUser && existingMemberUser && existingSystemUser) {
282
+ const adminUserDoc = UserModel.hydrate(existingAdminUser);
283
+ const memberUserDoc = UserModel.hydrate(existingMemberUser);
284
+ const systemUserDoc = UserModel.hydrate(existingSystemUser);
285
+ // Try to construct a minimal result from existing data
286
+ // Note: This is a fallback case and some data may not be available
287
+ const UserRoleModel = model_registry_1.ModelRegistry.instance.getTypedModel(base_model_name_1.BaseModelName.UserRole);
288
+ const [adminRole, memberRole, systemRole, adminUserRole, memberUserRole, systemUserRole,] = await Promise.all([
289
+ RoleModel.findOne({ name: application.constants.AdministratorRole }),
290
+ RoleModel.findOne({ name: application.constants.MemberRole }),
291
+ RoleModel.findOne({ name: application.constants.SystemRole }),
292
+ UserRoleModel.findOne({ userId: adminUserDoc._id }),
293
+ UserRoleModel.findOne({ userId: memberUserDoc._id }),
294
+ UserRoleModel.findOne({ userId: systemUserDoc._id }),
295
+ ]);
296
+ // detailed case
297
+ if (adminRole &&
298
+ memberRole &&
299
+ systemRole &&
300
+ adminUserRole &&
301
+ memberUserRole &&
302
+ systemUserRole) {
303
+ return {
304
+ alreadyInitialized: true,
305
+ success: false,
306
+ data: {
307
+ adminRole,
308
+ adminUserRole,
309
+ adminUser: adminUserDoc,
310
+ adminUsername: adminUserDoc.username,
311
+ adminEmail: adminUserDoc.email,
312
+ adminMnemonic: '', // Not available in fallback
313
+ adminPassword: '', // Not available in fallback
314
+ adminBackupCodes: [], // Not available in fallback
315
+ adminMember: {}, // Not available in fallback
316
+ memberRole,
317
+ memberUserRole,
318
+ memberUser: memberUserDoc,
319
+ memberUsername: memberUserDoc.username,
320
+ memberEmail: memberUserDoc.email,
321
+ memberMnemonic: '', // Not available in fallback
322
+ memberPassword: '', // Not available in fallback
323
+ memberBackupCodes: [], // Not available in fallback
324
+ memberMember: {}, // Not available in fallback
325
+ systemRole,
326
+ systemUserRole,
327
+ systemUser: systemUserDoc,
328
+ systemUsername: systemUserDoc.username,
329
+ systemEmail: systemUserDoc.email,
330
+ systemMnemonic: '', // Not available in fallback
331
+ systemPassword: '', // Not available in fallback
332
+ systemBackupCodes: [], // Not available in fallback
333
+ systemMember: {}, // Not available in fallback
334
+ },
335
+ message: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Admin_DatabaseAlreadyInitialized),
336
+ error: new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Admin_DatabaseAlreadyInitialized)),
337
+ };
338
+ }
339
+ }
340
+ // basic case
341
+ return {
342
+ alreadyInitialized: true,
343
+ success: false,
344
+ message: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Admin_DatabaseAlreadyInitialized),
345
+ error: new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Admin_DatabaseAlreadyInitialized)),
346
+ };
347
+ }
348
+ (0, node_express_suite_1.debugLog)(application.environment.detailedDebug, 'log', engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Admin_SettingUpUsersAndRoles));
349
+ const now = new Date();
350
+ // Add a small random delay in test environments to reduce collision probability
351
+ if (isTestEnvironment) {
352
+ const delay = ((0, crypto_1.randomBytes)(1)[0] % 50) + 10; // 10-60ms random delay (reduced)
353
+ await new Promise((resolve) => setTimeout(resolve, delay));
354
+ }
355
+ try {
356
+ // Use test-optimized settings for better performance
357
+ const transactionOptions = isTestEnvironment
358
+ ? { timeoutMs: 15000, retryAttempts: 2 } // Reduced timeout and retries for tests
359
+ : { timeoutMs: 120000 }; // Keep original production timeout
360
+ const result = await (0, mongo_transaction_1.withMongoTransaction)(application.db.connection, application.environment.mongo.useTransactions, undefined, async (sess) => {
361
+ // Check if admin role already exists
362
+ let adminRole = await RoleModel.findOne({
363
+ name: application.constants.AdministratorRole,
364
+ }).session(sess ?? null);
365
+ if (!adminRole) {
366
+ const adminRoleDocs = await RoleModel.create([
367
+ {
368
+ _id: adminRoleId,
369
+ name: application.constants.AdministratorRole,
370
+ admin: true,
371
+ member: true,
372
+ system: false,
373
+ child: false,
374
+ createdAt: now,
375
+ updatedAt: now,
376
+ createdBy: systemUserId,
377
+ updatedBy: systemUserId,
378
+ },
379
+ ], { session: sess });
380
+ if (adminRoleDocs.length !== 1) {
381
+ throw new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToCreateRoleTemplate, {
382
+ NAME: application.constants.AdministratorRole,
383
+ });
384
+ }
385
+ adminRole = adminRoleDocs[0];
386
+ }
387
+ // Check if member role already exists
388
+ let memberRole = await RoleModel.findOne({
389
+ name: application.constants.MemberRole,
390
+ }).session(sess ?? null);
391
+ if (!memberRole) {
392
+ const memberRoleDocs = await RoleModel.create([
393
+ {
394
+ _id: memberRoleId,
395
+ name: application.constants.MemberRole,
396
+ admin: false,
397
+ member: true,
398
+ child: false,
399
+ system: false,
400
+ createdAt: now,
401
+ updatedAt: now,
402
+ createdBy: systemUserId,
403
+ updatedBy: systemUserId,
404
+ },
405
+ ], { session: sess });
406
+ if (memberRoleDocs.length !== 1) {
407
+ throw new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToCreateRoleTemplate, {
408
+ NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_Member),
409
+ });
410
+ }
411
+ memberRole = memberRoleDocs[0];
412
+ }
413
+ // Check if system role already exists
414
+ let systemRole = await RoleModel.findOne({
415
+ name: application.constants.SystemRole,
416
+ }).session(sess ?? null);
417
+ if (!systemRole) {
418
+ const systemRoleDocs = await RoleModel.create([
419
+ {
420
+ _id: systemRoleId,
421
+ name: application.constants.SystemRole,
422
+ admin: true,
423
+ member: true,
424
+ system: true,
425
+ child: false,
426
+ createdAt: now,
427
+ updatedAt: now,
428
+ createdBy: systemUserId,
429
+ updatedBy: systemUserId,
430
+ },
431
+ ], { session: sess });
432
+ if (systemRoleDocs.length !== 1) {
433
+ throw new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToCreateRoleTemplate);
434
+ }
435
+ systemRole = systemRoleDocs[0];
436
+ }
437
+ const systemUser = DatabaseInitializationService.cacheOrNew(application.constants.SystemUser, application.environment.systemEmail, options.systemMnemonic, ecies_lib_1.MemberType.System, eciesService, systemUserId, systemUserId);
438
+ backupCodeService.setSystemUser(systemUser.member);
439
+ node_express_suite_1.SystemUserService.setSystemUser(systemUser.member, application.constants);
440
+ // Encrypt mnemonic for recovery
441
+ const systemEncryptedMnemonic = systemUser.member
442
+ .encryptData(Buffer.from(systemUser.mnemonic.value ?? '', 'utf-8'))
443
+ .toString('hex');
444
+ const systemMnemonicDoc = await mnemonicService.addMnemonic(systemUser.mnemonic, sess);
445
+ if (!systemMnemonicDoc) {
446
+ throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToStoreUserMnemonicTemplate, {
447
+ NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_System),
448
+ }));
449
+ }
450
+ const systemPasswordSecure = options.systemPassword
451
+ ? options.systemPassword
452
+ : new ecies_lib_1.SecureString(this.generatePassword(16));
453
+ const systemWrapped = keyWrappingService.wrapSecret(systemUser.member.privateKey, systemPasswordSecure, application.constants);
454
+ const systemBackupCodes = options.systemBackupCodes ?? node_express_suite_1.BackupCode.generateBackupCodes();
455
+ const encryptedSystemBackupCodes = await node_express_suite_1.BackupCode.encryptBackupCodes(systemUser.member, systemUser.member, systemBackupCodes);
456
+ const systemDocs = await UserModel.create([
457
+ {
458
+ _id: systemUserId,
459
+ username: application.constants.SystemUser,
460
+ email: application.environment.systemEmail.toString(),
461
+ publicKey: systemUser.member.publicKey.toString('hex'),
462
+ duressPasswords: [],
463
+ mnemonicRecovery: systemEncryptedMnemonic,
464
+ mnemonicId: systemMnemonicDoc._id,
465
+ passwordWrappedPrivateKey: systemWrapped,
466
+ backupCodes: encryptedSystemBackupCodes,
467
+ timezone: application.environment.timezone,
468
+ siteLanguage: 'en-US',
469
+ emailVerified: true,
470
+ darkMode: false,
471
+ accountStatus: suite_core_lib_1.AccountStatus.Active,
472
+ directChallenge: true, // allow direct challenge login by default
473
+ createdAt: now,
474
+ updatedAt: now,
475
+ createdBy: systemUserId,
476
+ updatedBy: systemUserId,
477
+ },
478
+ ], { session: sess });
479
+ if (systemDocs.length !== 1) {
480
+ throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToCreateUserTemplate, {
481
+ NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_System),
482
+ }));
483
+ }
484
+ const systemDoc = systemDocs[0];
485
+ // Create admin user-role relationship
486
+ const systemUserRoleDoc = await roleService.addUserToRole(systemRoleId, systemUserId, systemUserId, sess, systemUserRoleId);
487
+ if (!systemUser.mnemonic.value) {
488
+ throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_MnemonicIsNullTemplate, {
489
+ NAME: suite_core_lib_1.SuiteCoreStringKey.Common_System,
490
+ }));
491
+ }
492
+ const adminUser = DatabaseInitializationService.cacheOrNew(application.constants.AdministratorUser, application.environment.adminEmail, options.adminMnemonic, ecies_lib_1.MemberType.User, eciesService, adminUserId, systemDoc._id);
493
+ // Encrypt mnemonic for recovery
494
+ const adminEncryptedMnemonic = adminUser.member
495
+ .encryptData(Buffer.from(adminUser.mnemonic.value ?? '', 'utf-8'))
496
+ .toString('hex');
497
+ const adminMnemonicDoc = await mnemonicService.addMnemonic(adminUser.mnemonic, sess);
498
+ if (!adminMnemonicDoc) {
499
+ throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToStoreUserMnemonicTemplate, {
500
+ NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_Admin),
501
+ }));
502
+ }
503
+ const adminPasswordSecure = options.adminPassword
504
+ ? options.adminPassword
505
+ : new ecies_lib_1.SecureString(this.generatePassword(16));
506
+ const adminWrapped = keyWrappingService.wrapSecret(adminUser.member.privateKey, adminPasswordSecure);
507
+ const adminBackupCodes = options.adminBackupCodes ?? node_express_suite_1.BackupCode.generateBackupCodes();
508
+ const encryptedAdminBackupCodes = await node_express_suite_1.BackupCode.encryptBackupCodes(adminUser.member, systemUser.member, adminBackupCodes);
509
+ const adminDocs = await UserModel.create([
510
+ {
511
+ _id: adminUserId,
512
+ username: application.constants.AdministratorUser,
513
+ email: application.environment.adminEmail.toString(),
514
+ publicKey: adminUser.member.publicKey.toString('hex'),
515
+ duressPasswords: [],
516
+ mnemonicRecovery: adminEncryptedMnemonic,
517
+ mnemonicId: adminMnemonicDoc._id,
518
+ passwordWrappedPrivateKey: adminWrapped,
519
+ backupCodes: encryptedAdminBackupCodes,
520
+ timezone: application.environment.timezone,
521
+ siteLanguage: 'en-US',
522
+ emailVerified: true,
523
+ accountStatus: suite_core_lib_1.AccountStatus.Active,
524
+ directChallenge: true,
525
+ createdAt: now,
526
+ updatedAt: now,
527
+ createdBy: systemUserId,
528
+ updatedBy: systemUserId,
529
+ },
530
+ ], { session: sess });
531
+ if (adminDocs.length !== 1) {
532
+ throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToCreateUserTemplate, {
533
+ NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_Admin),
534
+ }));
535
+ }
536
+ const adminDoc = adminDocs[0];
537
+ // Create admin user-role relationship
538
+ const adminUserRoleDoc = await roleService.addUserToRole(adminRoleId, adminUserId, systemUserId, sess, adminUserRoleId);
539
+ if (!adminUser.mnemonic.value) {
540
+ throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_MnemonicIsNullTemplate, {
541
+ NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_Admin),
542
+ }));
543
+ }
544
+ const memberUser = DatabaseInitializationService.cacheOrNew(application.constants.MemberUser, application.environment.memberEmail, options.memberMnemonic, ecies_lib_1.MemberType.User, eciesService, memberUserId, systemDoc._id);
545
+ const memberPasswordSecure = options.memberPassword
546
+ ? options.memberPassword
547
+ : new ecies_lib_1.SecureString(this.generatePassword(16));
548
+ const memberMnemonicDoc = await mnemonicService.addMnemonic(memberUser.mnemonic, sess);
549
+ if (!memberMnemonicDoc) {
550
+ throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToStoreUserMnemonicTemplate, {
551
+ NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_Member),
552
+ }));
553
+ }
554
+ // Encrypt mnemonic for recovery
555
+ const encryptedMemberMnemonic = memberUser.member
556
+ .encryptData(Buffer.from(memberUser.mnemonic.value ?? '', 'utf-8'))
557
+ .toString('hex');
558
+ const memberWrapped = keyWrappingService.wrapSecret(memberUser.member.privateKey, memberPasswordSecure);
559
+ const memberBackupCodes = options.memberBackupCodes ?? node_express_suite_1.BackupCode.generateBackupCodes();
560
+ const encryptedMemberBackupCodes = await node_express_suite_1.BackupCode.encryptBackupCodes(memberUser.member, systemUser.member, memberBackupCodes);
561
+ const memberDocs = await UserModel.create([
562
+ {
563
+ _id: memberUserId,
564
+ username: application.constants.MemberUser,
565
+ email: application.environment.memberEmail.toString(),
566
+ publicKey: memberUser.member.publicKey.toString('hex'),
567
+ mnemonicId: memberMnemonicDoc._id,
568
+ mnemonicRecovery: encryptedMemberMnemonic,
569
+ passwordWrappedPrivateKey: memberWrapped,
570
+ backupCodes: encryptedMemberBackupCodes,
571
+ duressPasswords: [],
572
+ timezone: application.environment.timezone,
573
+ siteLanguage: 'en-US',
574
+ emailVerified: true,
575
+ accountStatus: suite_core_lib_1.AccountStatus.Active,
576
+ directChallenge: true,
577
+ createdAt: now,
578
+ updatedAt: now,
579
+ createdBy: systemUserId,
580
+ updatedBy: systemUserId,
581
+ },
582
+ ], { session: sess });
583
+ if (memberDocs.length !== 1) {
584
+ throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToCreateUserTemplate, {
585
+ NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_Member),
586
+ }));
587
+ }
588
+ const memberDoc = memberDocs[0];
589
+ // Create member user-role relationship
590
+ const memberUserRoleDoc = await roleService.addUserToRole(memberRoleId, memberUserId, systemUserId, sess, memberUserRoleId);
591
+ if (!memberUser.mnemonic.value) {
592
+ throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_MnemonicIsNullTemplate, {
593
+ NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_Member),
594
+ }));
595
+ }
596
+ return {
597
+ adminRole,
598
+ memberRole,
599
+ systemRole,
600
+ systemDoc,
601
+ systemUserRoleDoc,
602
+ systemPassword: systemPasswordSecure.notNullValue,
603
+ systemMnemonic: systemUser.mnemonic.notNullValue,
604
+ systemBackupCodes: systemBackupCodes,
605
+ systemMember: systemUser.member,
606
+ adminDoc,
607
+ adminUserRoleDoc,
608
+ adminPassword: adminPasswordSecure.notNullValue,
609
+ adminMnemonic: adminUser.mnemonic.notNullValue,
610
+ adminBackupCodes: adminBackupCodes,
611
+ adminMember: adminUser.member,
612
+ memberDoc,
613
+ memberUserRoleDoc,
614
+ memberPassword: memberPasswordSecure.notNullValue,
615
+ memberMnemonic: memberUser.mnemonic.notNullValue,
616
+ memberBackupCodes: memberBackupCodes,
617
+ memberUser: memberUser.member,
618
+ };
619
+ }, transactionOptions);
620
+ return {
621
+ alreadyInitialized: false,
622
+ success: true,
623
+ data: {
624
+ adminRole: result.adminRole,
625
+ adminUserRole: result.adminUserRoleDoc,
626
+ adminUser: result.adminDoc,
627
+ adminUsername: result.adminDoc.username,
628
+ adminEmail: result.adminDoc.email,
629
+ adminMnemonic: result.adminMnemonic,
630
+ adminPassword: result.adminPassword,
631
+ adminBackupCodes: result.adminBackupCodes.map((bc) => bc.value ?? ''),
632
+ adminMember: result.adminMember,
633
+ memberRole: result.memberRole,
634
+ memberUserRole: result.memberUserRoleDoc,
635
+ memberUser: result.memberDoc,
636
+ memberUsername: result.memberDoc.username,
637
+ memberEmail: result.memberDoc.email,
638
+ memberMnemonic: result.memberMnemonic,
639
+ memberPassword: result.memberPassword,
640
+ memberBackupCodes: result.memberBackupCodes.map((bc) => bc.value ?? ''),
641
+ memberMember: result.memberUser,
642
+ systemRole: result.systemRole,
643
+ systemUserRole: result.systemUserRoleDoc,
644
+ systemUser: result.systemDoc,
645
+ systemUsername: result.systemDoc.username,
646
+ systemEmail: result.systemDoc.email,
647
+ systemMnemonic: result.systemMnemonic,
648
+ systemPassword: result.systemPassword,
649
+ systemBackupCodes: result.systemBackupCodes.map((bc) => bc.value ?? ''),
650
+ systemMember: result.systemMember,
651
+ },
652
+ };
653
+ }
654
+ catch (error) {
655
+ // Check if it's a translatable error and display cleanly
656
+ if (error instanceof i18n_lib_1.TranslatableGenericError ||
657
+ error instanceof i18n_lib_1.TranslatableHandleableGenericError ||
658
+ error instanceof suite_core_lib_1.TranslatableSuiteError ||
659
+ error instanceof suite_core_lib_1.TranslatableSuiteHandleableError) {
660
+ return {
661
+ alreadyInitialized: false,
662
+ success: false,
663
+ message: error.message,
664
+ error: error,
665
+ };
666
+ }
667
+ return {
668
+ alreadyInitialized: false,
669
+ success: false,
670
+ message: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Admin_Error_FailedToInitializeUserDatabase),
671
+ error: error instanceof Error
672
+ ? error
673
+ : new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Admin_Error_FailedToInitializeUserDatabase)),
674
+ };
675
+ }
676
+ }
677
+ static serverInitResultsToDotEnv(serverInitResult) {
678
+ const idProvider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
679
+ return `ADMIN_ID="${idProvider.idToString(serverInitResult.adminUser._id)}"
680
+ ADMIN_EMAIL="${serverInitResult.adminEmail}"
681
+ ADMIN_MNEMONIC="${serverInitResult.adminMnemonic}"
682
+ ADMIN_ROLE_ID="${idProvider.idToString(serverInitResult.adminRole._id)}"
683
+ ADMIN_USER_ROLE_ID="${idProvider.idToString(serverInitResult.adminUserRole._id)}"
684
+ ADMIN_PASSWORD="${serverInitResult.adminPassword}"
685
+ MEMBER_ID="${idProvider.idToString(serverInitResult.memberUser._id)}"
686
+ MEMBER_EMAIL="${serverInitResult.memberEmail}"
687
+ MEMBER_MNEMONIC="${serverInitResult.memberMnemonic}"
688
+ MEMBER_ROLE_ID="${idProvider.idToString(serverInitResult.memberRole._id)}"
689
+ MEMBER_USER_ROLE_ID="${idProvider.idToString(serverInitResult.memberUserRole._id)}"
690
+ MEMBER_PASSWORD="${serverInitResult.memberPassword}"
691
+ SYSTEM_ID="${idProvider.idToString(serverInitResult.systemUser._id)}"
692
+ SYSTEM_EMAIL="${serverInitResult.systemEmail}"
693
+ SYSTEM_MNEMONIC="${serverInitResult.systemMnemonic}"
694
+ SYSTEM_PUBLIC_KEY="${serverInitResult.systemUser.publicKey}"
695
+ SYSTEM_ROLE_ID="${idProvider.idToString(serverInitResult.systemRole._id)}"
696
+ SYSTEM_USER_ROLE_ID="${idProvider.idToString(serverInitResult.systemUserRole._id)}"
697
+ SYSTEM_PASSWORD="${serverInitResult.systemPassword}"
698
+ `;
699
+ }
700
+ static printServerInitResults(result, printDotEnv = true) {
701
+ const idProvider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
702
+ (0, node_express_suite_1.debugLog)(true, 'log', this.defaultI18nTFunc('\n=== {{SuiteCoreStringKey.Admin_AccountCredentials}} ==='));
703
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_ID}}: {id}', {
704
+ id: idProvider.idToString(result.systemUser._id),
705
+ }));
706
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Role}}: {roleName}', {
707
+ roleName: result.systemRole.name,
708
+ }));
709
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {roleId}', {
710
+ roleId: idProvider.idToString(result.systemRole._id),
711
+ }));
712
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_User}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {userRoleId}', {
713
+ userRoleId: idProvider.idToString(result.systemUserRole._id),
714
+ }));
715
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Username}}: {username}', {
716
+ username: result.systemUsername,
717
+ }));
718
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Email}}: {email}', {
719
+ email: result.systemEmail,
720
+ }));
721
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Password}}: {password}', {
722
+ password: result.systemPassword,
723
+ }));
724
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Mnemonic}}: {mnemonic}', {
725
+ mnemonic: result.systemMnemonic,
726
+ }));
727
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_PublicKey}}: {publicKey}', {
728
+ publicKey: result.systemUser.publicKey,
729
+ }));
730
+ (0, node_express_suite_1.directLog)(true, 'log', `${this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_BackupCodes}}')}: ${result.systemBackupCodes.join(', ')}`);
731
+ (0, node_express_suite_1.directLog)(true, 'log', '');
732
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_ID}}: {id}', {
733
+ id: idProvider.idToString(result.adminUser._id),
734
+ }));
735
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Role}}: {roleName}', {
736
+ roleName: result.adminRole.name,
737
+ }));
738
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {roleId}', {
739
+ roleId: idProvider.idToString(result.adminRole._id),
740
+ }));
741
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_User}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {userRoleId}', {
742
+ userRoleId: idProvider.idToString(result.adminUserRole._id),
743
+ }));
744
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Username}}: {username}', {
745
+ username: result.adminUsername,
746
+ }));
747
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Email}}: {email}', {
748
+ email: result.adminEmail,
749
+ }));
750
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Password}}: {password}', {
751
+ password: result.adminPassword,
752
+ }));
753
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Mnemonic}}: {mnemonic}', {
754
+ mnemonic: result.adminMnemonic,
755
+ }));
756
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_PublicKey}}: {publicKey}', {
757
+ publicKey: result.adminUser.publicKey,
758
+ }));
759
+ (0, node_express_suite_1.directLog)(true, 'log', `${this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_BackupCodes}}')}: ${result.adminBackupCodes.join(', ')}`);
760
+ (0, node_express_suite_1.directLog)(true, 'log', '');
761
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_ID}}: {id}', {
762
+ id: idProvider.idToString(result.memberUser._id),
763
+ }));
764
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Role}}: {roleName}', {
765
+ roleName: result.memberRole.name,
766
+ }));
767
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {roleId}', {
768
+ roleId: idProvider.idToString(result.memberRole._id),
769
+ }));
770
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_User}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {userRoleId}', {
771
+ userRoleId: idProvider.idToString(result.memberUserRole._id),
772
+ }));
773
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Username}}: {username}', {
774
+ username: result.memberUsername,
775
+ }));
776
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Email}}: {email}', {
777
+ email: result.memberEmail,
778
+ }));
779
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Password}}: {password}', {
780
+ password: result.memberPassword,
781
+ }));
782
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Mnemonic}}: {mnemonic}', {
783
+ mnemonic: result.memberMnemonic,
784
+ }));
785
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_PublicKey}}: {publicKey}', {
786
+ publicKey: result.memberUser.publicKey,
787
+ }));
788
+ (0, node_express_suite_1.directLog)(true, 'log', `${this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_BackupCodes}}')}: ${result.memberBackupCodes.join(', ')}`);
789
+ (0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('\n=== {{SuiteCoreStringKey.Admin_EndCredentials}} ==='));
790
+ if (printDotEnv) {
791
+ (0, node_express_suite_1.directLog)(true, 'log', '');
792
+ (0, node_express_suite_1.debugLog)(true, 'log', this.defaultI18nTFunc('=== {{SuiteCoreStringKey.Admin_DotEnvFormat}} ==='));
793
+ (0, node_express_suite_1.debugLog)(true, 'log', this.defaultI18nTFunc('=== {{SuiteCoreStringKey.Admin_EndDotEnvFormat}} ==='));
794
+ }
795
+ }
796
+ static setEnvFromInitResults(result) {
797
+ const idProvider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
798
+ process.env['ADMIN_ID'] = idProvider.idToString(result.adminUser._id);
799
+ process.env['ADMIN_PUBLIC_KEY'] = result.adminUser.publicKey;
800
+ process.env['ADMIN_EMAIL'] = result.adminEmail;
801
+ process.env['ADMIN_MNEMONIC'] = result.adminMnemonic;
802
+ process.env['ADMIN_PASSWORD'] = result.adminPassword;
803
+ process.env['ADMIN_ROLE_ID'] = idProvider.idToString(result.adminRole._id);
804
+ process.env['ADMIN_USER_ROLE_ID'] = idProvider.idToString(result.adminUserRole._id);
805
+ //
806
+ process.env['MEMBER_ID'] = idProvider.idToString(result.memberUser._id);
807
+ process.env['MEMBER_PUBLIC_KEY'] = result.memberUser.publicKey;
808
+ process.env['MEMBER_EMAIL'] = result.memberEmail;
809
+ process.env['MEMBER_MNEMONIC'] = result.memberMnemonic;
810
+ process.env['MEMBER_PASSWORD'] = result.memberPassword;
811
+ process.env['MEMBER_ROLE_ID'] = idProvider.idToString(result.memberRole._id);
812
+ process.env['MEMBER_USER_ROLE_ID'] = idProvider.idToString(result.memberUserRole._id);
813
+ //
814
+ process.env['SYSTEM_ID'] = idProvider.idToString(result.systemUser._id);
815
+ process.env['SYSTEM_PUBLIC_KEY'] = result.systemUser.publicKey;
816
+ process.env['SYSTEM_EMAIL'] = result.systemEmail;
817
+ process.env['SYSTEM_MNEMONIC'] = result.systemMnemonic;
818
+ process.env['SYSTEM_PASSWORD'] = result.systemPassword;
819
+ process.env['SYSTEM_ROLE_ID'] = idProvider.idToString(result.systemRole._id);
820
+ process.env['SYSTEM_USER_ROLE_ID'] = idProvider.idToString(result.systemUserRole._id);
821
+ }
822
+ /**
823
+ * Write initialization results to a .env file
824
+ * Updates or adds the credential variables in the specified .env file
825
+ * @param envFilePath Path to the .env file to update
826
+ * @param result The initialization results containing credentials
827
+ * @param idToString Function to convert IDs to strings
828
+ */
829
+ static writeEnvFile(envFilePath, result) {
830
+ const idProvider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
831
+ // Ensure the directory exists
832
+ const dir = path.dirname(envFilePath);
833
+ if (!fs.existsSync(dir)) {
834
+ fs.mkdirSync(dir, { recursive: true });
835
+ }
836
+ // Read existing .env file or create empty content
837
+ let envContent = '';
838
+ if (fs.existsSync(envFilePath)) {
839
+ envContent = fs.readFileSync(envFilePath, 'utf-8');
840
+ }
841
+ // Define the credentials to update
842
+ const credentials = {
843
+ ADMIN_ID: idProvider.idToString(result.adminUser._id),
844
+ ADMIN_EMAIL: result.adminEmail,
845
+ ADMIN_MNEMONIC: result.adminMnemonic,
846
+ ADMIN_ROLE_ID: idProvider.idToString(result.adminRole._id),
847
+ ADMIN_USER_ROLE_ID: idProvider.idToString(result.adminUserRole._id),
848
+ ADMIN_PASSWORD: result.adminPassword,
849
+ MEMBER_ID: idProvider.idToString(result.memberUser._id),
850
+ MEMBER_EMAIL: result.memberEmail,
851
+ MEMBER_MNEMONIC: result.memberMnemonic,
852
+ MEMBER_ROLE_ID: idProvider.idToString(result.memberRole._id),
853
+ MEMBER_USER_ROLE_ID: idProvider.idToString(result.memberUserRole._id),
854
+ MEMBER_PASSWORD: result.memberPassword,
855
+ SYSTEM_ID: idProvider.idToString(result.systemUser._id),
856
+ SYSTEM_EMAIL: result.systemEmail,
857
+ SYSTEM_MNEMONIC: result.systemMnemonic,
858
+ SYSTEM_PUBLIC_KEY: result.systemUser.publicKey,
859
+ SYSTEM_ROLE_ID: idProvider.idToString(result.systemRole._id),
860
+ SYSTEM_USER_ROLE_ID: idProvider.idToString(result.systemUserRole._id),
861
+ SYSTEM_PASSWORD: result.systemPassword,
862
+ };
863
+ // Update or add each credential
864
+ for (const [key, value] of Object.entries(credentials)) {
865
+ const regex = new RegExp(`^${key}=.*$`, 'm');
866
+ const newLine = `${key}="${value}"`;
867
+ if (regex.test(envContent)) {
868
+ // Update existing line
869
+ envContent = envContent.replace(regex, newLine);
870
+ }
871
+ else {
872
+ // Add new line (append to end)
873
+ if (envContent && !envContent.endsWith('\n')) {
874
+ envContent += '\n';
875
+ }
876
+ envContent += newLine + '\n';
877
+ }
878
+ }
879
+ // Write back to file
880
+ fs.writeFileSync(envFilePath, envContent, 'utf-8');
881
+ (0, node_express_suite_1.debugLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Admin_CredentialsWrittenToEnv}}', {
882
+ path: envFilePath,
883
+ }));
884
+ }
885
+ /**
886
+ * Initializes the user database with default users and roles (convenience method).
887
+ * Creates necessary services and calls initUserDbWithServices.
888
+ * @template TID Platform-specific ID type
889
+ * @param application Application instance
890
+ * @returns Result of the initialization
891
+ */
892
+ static async initUserDb(application) {
893
+ const mnemonicModel = model_registry_1.ModelRegistry.instance.getTypedModel(base_model_name_1.BaseModelName.Mnemonic);
894
+ const mnemonicService = new mnemonic_1.MnemonicService(mnemonicModel, application.environment.mnemonicHmacSecret, application.constants);
895
+ const config = {
896
+ curveName: ecies_lib_1.ECIES.CURVE_NAME,
897
+ primaryKeyDerivationPath: ecies_lib_1.ECIES.PRIMARY_KEY_DERIVATION_PATH,
898
+ mnemonicStrength: ecies_lib_1.ECIES.MNEMONIC_STRENGTH,
899
+ symmetricAlgorithm: ecies_lib_1.ECIES.SYMMETRIC_ALGORITHM_CONFIGURATION,
900
+ symmetricKeyBits: ecies_lib_1.ECIES.SYMMETRIC.KEY_BITS,
901
+ symmetricKeyMode: ecies_lib_1.ECIES.SYMMETRIC.MODE,
902
+ };
903
+ const eciesService = new node_ecies_lib_1.ECIESService(config);
904
+ const roleService = new role_1.RoleService(application);
905
+ const keyWrappingService = new node_express_suite_1.KeyWrappingService();
906
+ const backupCodeService = new backup_code_1.BackupCodeService(application, eciesService, keyWrappingService, roleService);
907
+ return this.initUserDbWithServices(application, keyWrappingService, mnemonicService, eciesService, roleService, backupCodeService);
908
+ }
909
+ }
910
+ exports.DatabaseInitializationService = DatabaseInitializationService;
911
+ //# sourceMappingURL=database-initialization.js.map