@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,944 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview User controller handling authentication, registration, and user management endpoints.
4
+ * Provides comprehensive user operations including login, password management, and settings.
5
+ * @module controllers/user
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.UserController = 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 express_validator_1 = require("express-validator");
15
+ const zod_1 = require("zod");
16
+ const node_express_suite_1 = require("@digitaldefiance/node-express-suite");
17
+ const jwt_1 = require("../services/jwt");
18
+ const request_user_1 = require("../services/request-user");
19
+ const base_model_name_1 = require("../enumerations/base-model-name");
20
+ const backup_code_1 = require("../services/backup-code");
21
+ const role_1 = require("../services/role");
22
+ const user_1 = require("../services/user");
23
+ const mongo_transaction_1 = require("../utils/mongo-transaction");
24
+ const isString = (v) => typeof v === 'string';
25
+ const RegisterSchema = zod_1.z.object({
26
+ username: zod_1.z.string(),
27
+ email: zod_1.z.string(),
28
+ timezone: zod_1.z.string(),
29
+ password: zod_1.z.string().min(8).optional(),
30
+ mnemonic: zod_1.z.string().min(1).optional(),
31
+ });
32
+ const EmailLoginChallengeSchema = zod_1.z.object({
33
+ token: zod_1.z.string(),
34
+ signature: zod_1.z.string(),
35
+ email: zod_1.z.string().optional(),
36
+ username: zod_1.z.string().optional(),
37
+ });
38
+ const DirectLoginChallengeSchema = zod_1.z.object({
39
+ challenge: zod_1.z.string(),
40
+ signature: zod_1.z.string(),
41
+ email: zod_1.z.string().optional(),
42
+ username: zod_1.z.string().optional(),
43
+ });
44
+ /**
45
+ * User controller handling all user-related API endpoints.
46
+ * Manages authentication, registration, password operations, settings, and backup codes.
47
+ * @template TID Platform ID type
48
+ * @template TDate Date type
49
+ * @template TLanguage Site language string type
50
+ * @template TAccountStatus Account status string type
51
+ * @template TUser User base type
52
+ * @template TTokenRole Token role type
53
+ * @template TTokenUser Token user type
54
+ * @template TApplication Application type
55
+ */
56
+ let UserController = class UserController extends node_express_suite_1.DecoratorBaseController {
57
+ userService;
58
+ jwtService;
59
+ backupCodeService;
60
+ roleService;
61
+ eciesService;
62
+ systemUser;
63
+ constructor(application, jwtService, userService, backupCodeService, roleService, eciesService) {
64
+ super(application);
65
+ this.jwtService = jwtService;
66
+ this.userService = userService;
67
+ this.backupCodeService = backupCodeService;
68
+ this.roleService = roleService;
69
+ this.eciesService = eciesService;
70
+ this.systemUser = node_express_suite_1.SystemUserService.getSystemUser(application.environment, application.constants);
71
+ }
72
+ async tokenVerifiedResponse(req, _res, _next) {
73
+ if (!req.user) {
74
+ throw new i18n_lib_1.HandleableError(new Error((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_NoUserOnRequest)), {
75
+ statusCode: 401,
76
+ });
77
+ }
78
+ const user = {
79
+ id: req.user.id,
80
+ email: req.user.email,
81
+ username: req.user.username,
82
+ roles: req.user.roles || [],
83
+ rolePrivileges: req.user.rolePrivileges,
84
+ timezone: req.user.timezone,
85
+ currency: req.user.currency,
86
+ emailVerified: req.user.emailVerified,
87
+ darkMode: req.user.darkMode,
88
+ siteLanguage: req.user.siteLanguage,
89
+ directChallenge: req.user.directChallenge,
90
+ ...(req.user.lastLogin && { lastLogin: req.user.lastLogin }),
91
+ };
92
+ return {
93
+ statusCode: 200,
94
+ response: {
95
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_TokenValid),
96
+ user,
97
+ },
98
+ };
99
+ }
100
+ async refreshToken(req, _res, _next) {
101
+ const token = (0, node_express_suite_1.findAuthToken)(req.headers);
102
+ if (!token) {
103
+ throw new suite_core_lib_1.GenericValidationError((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_TokenMissing));
104
+ }
105
+ const tokenUser = await this.jwtService.verifyToken(token);
106
+ if (!tokenUser) {
107
+ throw new suite_core_lib_1.GenericValidationError((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_TokenInvalid));
108
+ }
109
+ const UserModel = this.application.getModel(base_model_name_1.BaseModelName.User);
110
+ const userDoc = await UserModel.findById(tokenUser.userId).select('-password');
111
+ if (!userDoc || userDoc.accountStatus !== suite_core_lib_1.AccountStatus.Active) {
112
+ throw new suite_core_lib_1.GenericValidationError((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UserNotFound));
113
+ }
114
+ const { token: newToken, roles } = await this.jwtService.signToken(userDoc, this.application.environment.jwtSecret, req.user?.siteLanguage ?? i18n_lib_1.LanguageCodes.EN_US);
115
+ return {
116
+ statusCode: 200,
117
+ response: {
118
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.TokenRefreshed),
119
+ user: request_user_1.RequestUserService.makeRequestUserDTO(userDoc, roles),
120
+ token: newToken,
121
+ serverPublicKey: this.application.environment.systemPublicKeyHex ?? '',
122
+ },
123
+ headers: {
124
+ Authorization: `Bearer ${newToken}`,
125
+ },
126
+ };
127
+ }
128
+ async register(req, _res, _next) {
129
+ return await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
130
+ return await (0, node_express_suite_1.requireValidatedFieldsAsync)(req, RegisterSchema, async ({ username, email, timezone, password, mnemonic }) => {
131
+ if (!isString(username) ||
132
+ !isString(email) ||
133
+ !isString(timezone)) {
134
+ throw new suite_core_lib_1.GenericValidationError((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_MissingValidatedData));
135
+ }
136
+ const { user, mnemonic: resultMnemonic, backupCodes, } = await this.userService.newUser(this.systemUser, {
137
+ username: username.trim(),
138
+ email: email.trim(),
139
+ timezone: timezone,
140
+ }, undefined, undefined, sess, this.application.environment.debug, password, mnemonic);
141
+ await this.userService.createAndSendEmailToken(user, suite_core_lib_1.EmailTokenType.AccountVerification, sess, this.application.environment.debug);
142
+ return {
143
+ statusCode: 201,
144
+ response: {
145
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Registration_Success, { MNEMONIC: resultMnemonic }),
146
+ mnemonic: resultMnemonic,
147
+ backupCodes,
148
+ },
149
+ };
150
+ });
151
+ }, {
152
+ timeoutMs: this.application.environment.mongo.transactionTimeout * 30,
153
+ });
154
+ }
155
+ async completeAccountVerification(_req, _res, _next) {
156
+ const { token } = this.validatedBody;
157
+ return await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
158
+ await this.userService.verifyAccountTokenAndComplete(token, sess);
159
+ return {
160
+ statusCode: 200,
161
+ response: {
162
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.EmailVerification_Success),
163
+ },
164
+ };
165
+ });
166
+ }
167
+ async setLanguage(req, _res, _next) {
168
+ return await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
169
+ const { language } = this.validatedBody;
170
+ if (!req.user) {
171
+ throw new i18n_lib_1.HandleableError(new Error((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_NoUserOnRequest)), { statusCode: 401 });
172
+ }
173
+ const user = await this.userService.updateSiteLanguage(req.user.id, language, sess);
174
+ return {
175
+ statusCode: 200,
176
+ response: {
177
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.LanguageUpdate_Success),
178
+ user,
179
+ },
180
+ };
181
+ });
182
+ }
183
+ async setDarkMode(req, _res, _next) {
184
+ return await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
185
+ const { darkMode } = this.validatedBody;
186
+ if (!req.user) {
187
+ throw new i18n_lib_1.HandleableError(new Error((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_NoUserOnRequest)), { statusCode: 401 });
188
+ }
189
+ const user = await this.userService.updateDarkMode(req.user.id, darkMode, sess);
190
+ return {
191
+ statusCode: 200,
192
+ response: {
193
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Settings_DarkModeSuccess),
194
+ user,
195
+ },
196
+ };
197
+ });
198
+ }
199
+ async getSettings(req, _res, _next) {
200
+ if (!req.user) {
201
+ throw new i18n_lib_1.HandleableError(new Error((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_NoUserOnRequest)), { statusCode: 401 });
202
+ }
203
+ const UserModel = this.application.getModel(base_model_name_1.BaseModelName.User);
204
+ const userDoc = await UserModel.findById(req.user.id);
205
+ return {
206
+ statusCode: 200,
207
+ response: {
208
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Settings_RetrievedSuccess),
209
+ settings: {
210
+ email: userDoc?.email || '',
211
+ timezone: userDoc?.timezone || '',
212
+ currency: userDoc?.currency || '',
213
+ siteLanguage: userDoc?.siteLanguage || '',
214
+ darkMode: userDoc?.darkMode || false,
215
+ directChallenge: userDoc?.directChallenge || false,
216
+ },
217
+ },
218
+ };
219
+ }
220
+ async updateSettings(req, _res, _next) {
221
+ return await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
222
+ const { email, timezone, siteLanguage, currency, darkMode, directChallenge, } = this.validatedBody;
223
+ if (!req.user) {
224
+ throw new i18n_lib_1.HandleableError(new Error((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_NoUserOnRequest)), { statusCode: 401 });
225
+ }
226
+ const user = await this.userService.updateUserSettings(req.user.id, {
227
+ ...(email !== undefined && { email: email }),
228
+ ...(timezone !== undefined && { timezone: timezone }),
229
+ ...(siteLanguage !== undefined && {
230
+ siteLanguage: siteLanguage,
231
+ }),
232
+ ...(currency !== undefined && { currency: currency }),
233
+ ...(darkMode !== undefined && { darkMode: darkMode }),
234
+ ...(directChallenge !== undefined && {
235
+ directChallenge: directChallenge,
236
+ }),
237
+ }, sess);
238
+ return {
239
+ statusCode: 200,
240
+ response: {
241
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Settings_SaveSuccess),
242
+ user,
243
+ },
244
+ };
245
+ });
246
+ }
247
+ async getBackupCodeCount(req, _res, _next) {
248
+ if (!req.user) {
249
+ throw new i18n_lib_1.HandleableError(new Error((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_NoUserOnRequest)), { statusCode: 401 });
250
+ }
251
+ const UserModel = this.application.getModel(base_model_name_1.BaseModelName.User);
252
+ const user = await UserModel.findById(req.user.id);
253
+ return {
254
+ statusCode: 200,
255
+ response: {
256
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.BackupCodes_RetrievedSuccess),
257
+ codeCount: user?.backupCodes?.length || 0,
258
+ },
259
+ };
260
+ }
261
+ async resetBackupCodes(req, _res, _next) {
262
+ if (!req.user || !req.eciesUser || !req.eciesUser.hasPrivateKey) {
263
+ throw new i18n_lib_1.HandleableError(new Error((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_NoUserOnRequest)), { statusCode: 401 });
264
+ }
265
+ const newBackupCodes = await this.userService.resetUserBackupCodes(req.eciesUser, this.systemUser);
266
+ const codes = newBackupCodes.map((c) => c.notNullValue);
267
+ newBackupCodes.forEach((c) => c.dispose());
268
+ return {
269
+ statusCode: 200,
270
+ response: {
271
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.BackupCodeRecovery_YourNewCodes),
272
+ backupCodes: codes,
273
+ },
274
+ };
275
+ }
276
+ async recoverMnemonic(req, _res, _next) {
277
+ return await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
278
+ if (!req.user) {
279
+ throw new i18n_lib_1.HandleableError(new Error((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidCredentials)), { statusCode: 401 });
280
+ }
281
+ else if (!req.eciesUser) {
282
+ throw new i18n_lib_1.HandleableError(new Error((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_MnemonicOrPasswordRequired)), { statusCode: 401 });
283
+ }
284
+ const { password } = this.validatedBody;
285
+ if (!isString(password)) {
286
+ throw new suite_core_lib_1.GenericValidationError((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_MissingValidatedData));
287
+ }
288
+ const provider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
289
+ const userDoc = await this.userService.findUserById(provider.idFromString(req.user.id), true, sess);
290
+ const mnemonic = await this.userService.recoverMnemonic(req.eciesUser, userDoc.mnemonicRecovery);
291
+ return {
292
+ statusCode: 200,
293
+ response: {
294
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.MnemonicRecovery_Success),
295
+ mnemonic: mnemonic.notNullValue,
296
+ },
297
+ };
298
+ });
299
+ }
300
+ async changePassword(req, _res, _next) {
301
+ return await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
302
+ const { currentPassword, newPassword } = this.validatedBody;
303
+ if (!req.user) {
304
+ throw new i18n_lib_1.HandleableError(new Error((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_NoUserOnRequest)), { statusCode: 401 });
305
+ }
306
+ if (!isString(currentPassword) || !isString(newPassword)) {
307
+ throw new suite_core_lib_1.GenericValidationError((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_MissingValidatedData));
308
+ }
309
+ await this.userService.changePassword(req.user.id, currentPassword, newPassword, sess);
310
+ return {
311
+ statusCode: 200,
312
+ response: {
313
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.PasswordChange_Success),
314
+ },
315
+ };
316
+ });
317
+ }
318
+ async requestDirectLogin(_req, _res, _next) {
319
+ const challenge = this.userService.generateDirectLoginChallenge();
320
+ return {
321
+ statusCode: 200,
322
+ response: {
323
+ challenge: challenge,
324
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Login_ChallengeGenerated),
325
+ serverPublicKey: this.application.environment.systemPublicKeyHex ?? '',
326
+ },
327
+ };
328
+ }
329
+ async directLoginChallenge(req, _res, _next) {
330
+ return await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
331
+ const { username, email, challenge, signature } = this
332
+ .validatedBody;
333
+ const { userDoc } = await this.userService.verifyDirectLoginChallenge(String(challenge), String(signature), username ? String(username) : undefined, email ? String(email) : undefined, sess);
334
+ const { token: jwtToken, roles } = await this.jwtService.signToken(userDoc, this.application.environment.jwtSecret, req.user?.siteLanguage ?? i18n_lib_1.LanguageCodes.EN_US);
335
+ return {
336
+ statusCode: 200,
337
+ response: {
338
+ user: request_user_1.RequestUserService.makeRequestUserDTO(userDoc, roles),
339
+ token: jwtToken,
340
+ serverPublicKey: this.application.environment.systemPublicKeyHex ?? '',
341
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.LoggedIn_Success),
342
+ },
343
+ };
344
+ });
345
+ }
346
+ async requestEmailLogin(_req, _res, _next) {
347
+ const { username, email } = this.validatedBody;
348
+ try {
349
+ await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
350
+ const userDoc = await this.userService.findUser(email, username, sess);
351
+ await this.userService.createAndSendEmailToken(userDoc, suite_core_lib_1.EmailTokenType.LoginRequest, sess, this.application.environment.debug);
352
+ });
353
+ }
354
+ catch {
355
+ // Suppress user-related errors for security
356
+ }
357
+ return {
358
+ statusCode: 200,
359
+ response: {
360
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Email_TokenSent),
361
+ },
362
+ };
363
+ }
364
+ async emailLoginChallenge(req, _res, _next) {
365
+ return await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
366
+ const { token, signature } = this.validatedBody;
367
+ const userDoc = await this.userService.validateEmailLoginTokenChallenge(String(token), String(signature), sess);
368
+ const { token: jwtToken, roles } = await this.jwtService.signToken(userDoc, this.application.environment.jwtSecret, req.user?.siteLanguage ?? i18n_lib_1.LanguageCodes.EN_US);
369
+ return {
370
+ statusCode: 200,
371
+ response: {
372
+ user: request_user_1.RequestUserService.makeRequestUserDTO(userDoc, roles),
373
+ token: jwtToken,
374
+ serverPublicKey: this.application.environment.systemPublicKeyHex ?? '',
375
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.LoggedIn_Success),
376
+ },
377
+ };
378
+ });
379
+ }
380
+ async resendVerification(_req, _res, _next) {
381
+ return await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
382
+ const { username, email } = this.validatedBody;
383
+ const UserModel = this.application.getModel(base_model_name_1.BaseModelName.User);
384
+ const query = {};
385
+ if (isString(username))
386
+ query.username = username;
387
+ else if (isString(email))
388
+ query.email = email;
389
+ else {
390
+ throw new suite_core_lib_1.GenericValidationError((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_MissingValidatedData));
391
+ }
392
+ const user = await UserModel.findOne(query).session(sess ?? null);
393
+ if (!user) {
394
+ throw new suite_core_lib_1.GenericValidationError((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UserNotFound), { statusCode: 404 });
395
+ }
396
+ await this.userService.resendEmailToken(user._id.toString(), suite_core_lib_1.EmailTokenType.AccountVerification, sess, this.application.environment.debug);
397
+ return {
398
+ statusCode: 200,
399
+ response: {
400
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.EmailVerification_Resent),
401
+ },
402
+ };
403
+ });
404
+ }
405
+ async useBackupCodeLogin(_req, _res, _next) {
406
+ return await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
407
+ const { code, newPassword, email, username } = this.validatedBody;
408
+ if (!code) {
409
+ throw new suite_core_lib_1.GenericValidationError((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_MissingValidatedData));
410
+ }
411
+ const recoverMnemonic = this.validatedBody?.['recoverMnemonic'] === 'true' ||
412
+ this.validatedBody?.['recoverMnemonic'] === true;
413
+ const userDoc = await this.userService.findUser(email, username, sess);
414
+ const { user, userDoc: updatedUserDoc, codeCount, } = await this.backupCodeService.recoverKeyWithBackupCode(userDoc, code, newPassword ? new ecies_lib_1.SecureString(newPassword) : undefined, sess);
415
+ let mnemonic;
416
+ if (recoverMnemonic) {
417
+ if (!updatedUserDoc) {
418
+ throw new Error('User document not found after backup code recovery');
419
+ }
420
+ mnemonic = await this.userService.recoverMnemonic(user, updatedUserDoc.mnemonicRecovery);
421
+ }
422
+ const { token, roles } = await this.jwtService.signToken(userDoc, this.application.environment.jwtSecret, i18n_lib_1.LanguageCodes.EN_US);
423
+ if (!updatedUserDoc) {
424
+ throw new Error('User document not found after backup code recovery');
425
+ }
426
+ this.userService.updateLastLogin(updatedUserDoc._id).catch(() => { });
427
+ return {
428
+ statusCode: 200,
429
+ response: {
430
+ user: request_user_1.RequestUserService.makeRequestUserDTO(userDoc, roles),
431
+ token: token,
432
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.BackupCodeRecovery_Success),
433
+ codeCount,
434
+ ...(recoverMnemonic && mnemonic
435
+ ? { mnemonic: mnemonic.value }
436
+ : {}),
437
+ serverPublicKey: this.application.environment.systemPublicKeyHex ?? '',
438
+ },
439
+ };
440
+ });
441
+ }
442
+ async forgotPassword(_req, _res, _next) {
443
+ return await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
444
+ const { email } = this.validatedBody;
445
+ const UserModel = this.application.getModel(base_model_name_1.BaseModelName.User);
446
+ if (!isString(email)) {
447
+ throw new suite_core_lib_1.GenericValidationError((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_MissingValidatedData));
448
+ }
449
+ const user = await UserModel.findOne({
450
+ email: email.toLowerCase(),
451
+ }).session(sess ?? null);
452
+ if (!user || !user.passwordWrappedPrivateKey) {
453
+ return {
454
+ statusCode: 200,
455
+ response: {
456
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.PasswordReset_Success),
457
+ },
458
+ };
459
+ }
460
+ // Mongoose document type doesn't exactly match UserDocument generic signature
461
+ // but the document has all required properties
462
+ await this.userService.createAndSendEmailToken(user, suite_core_lib_1.EmailTokenType.PasswordReset, sess, this.application.environment.debug);
463
+ return {
464
+ statusCode: 200,
465
+ response: {
466
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.PasswordReset_Success),
467
+ },
468
+ };
469
+ });
470
+ }
471
+ async verifyResetToken(req, _res, _next) {
472
+ const token = req.query['token'];
473
+ if (!token) {
474
+ throw new suite_core_lib_1.GenericValidationError((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_TokenMissing));
475
+ }
476
+ return await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
477
+ await this.userService.verifyEmailToken(token, suite_core_lib_1.EmailTokenType.PasswordReset, sess);
478
+ return {
479
+ statusCode: 200,
480
+ response: {
481
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_TokenValid),
482
+ },
483
+ };
484
+ });
485
+ }
486
+ async resetPassword(_req, _res, _next) {
487
+ return await (0, mongo_transaction_1.withMongoTransaction)(this.application.db.connection, this.application.environment.mongo.useTransactions, undefined, async (sess) => {
488
+ const { token, newPassword, password, currentPassword, mnemonic } = this.validatedBody;
489
+ const selectedNewPassword = (newPassword ?? password);
490
+ if (!isString(token) || !isString(selectedNewPassword)) {
491
+ throw new suite_core_lib_1.GenericValidationError((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_MissingValidatedData));
492
+ }
493
+ const credential = mnemonic ??
494
+ currentPassword;
495
+ if (!isString(credential)) {
496
+ throw new suite_core_lib_1.GenericValidationError((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_MissingValidatedData));
497
+ }
498
+ await this.userService.resetPasswordWithToken(token, selectedNewPassword, credential, sess);
499
+ return {
500
+ statusCode: 200,
501
+ response: {
502
+ message: (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.PasswordChange_Success),
503
+ },
504
+ };
505
+ });
506
+ }
507
+ };
508
+ exports.UserController = UserController;
509
+ tslib_1.__decorate([
510
+ (0, node_express_suite_1.Get)('/verify', { auth: true }),
511
+ tslib_1.__metadata("design:type", Function),
512
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
513
+ tslib_1.__metadata("design:returntype", Promise)
514
+ ], UserController.prototype, "tokenVerifiedResponse", null);
515
+ tslib_1.__decorate([
516
+ (0, node_express_suite_1.Get)('/refresh-token', { auth: true }),
517
+ tslib_1.__metadata("design:type", Function),
518
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
519
+ tslib_1.__metadata("design:returntype", Promise)
520
+ ], UserController.prototype, "refreshToken", null);
521
+ tslib_1.__decorate([
522
+ (0, node_express_suite_1.Post)('/register', {
523
+ schema: RegisterSchema,
524
+ validation: function (validationLanguage) {
525
+ const constants = this.constants;
526
+ return [
527
+ (0, express_validator_1.body)('username')
528
+ .matches(constants.UsernameRegex)
529
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UsernameRegexErrorTemplate, undefined, validationLanguage)),
530
+ (0, express_validator_1.body)('email')
531
+ .isEmail()
532
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidEmail, undefined, validationLanguage)),
533
+ (0, express_validator_1.body)('timezone')
534
+ .isString()
535
+ .custom((value) => (0, i18n_lib_1.isValidTimezone)(value))
536
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_TimezoneInvalid, undefined, validationLanguage)),
537
+ (0, express_validator_1.body)('password')
538
+ .optional()
539
+ .matches(constants.PasswordRegex)
540
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_PasswordRegexErrorTemplate)),
541
+ (0, express_validator_1.body)('mnemonic')
542
+ .optional()
543
+ .isString()
544
+ .trim()
545
+ .matches(constants.MnemonicRegex)
546
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_MnemonicRegex, undefined, validationLanguage)),
547
+ ];
548
+ },
549
+ }),
550
+ tslib_1.__metadata("design:type", Function),
551
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
552
+ tslib_1.__metadata("design:returntype", Promise)
553
+ ], UserController.prototype, "register", null);
554
+ tslib_1.__decorate([
555
+ (0, node_express_suite_1.Post)('/account-verification', {
556
+ validation: function (validationLanguage) {
557
+ const constants = this.constants;
558
+ return [
559
+ (0, express_validator_1.body)('token')
560
+ .not()
561
+ .isEmpty()
562
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_TokenRequired, undefined, validationLanguage))
563
+ .matches(new RegExp(`^[a-f0-9]{${constants.EmailTokenLength * 2}}$`))
564
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidToken, undefined, validationLanguage)),
565
+ ];
566
+ },
567
+ }),
568
+ tslib_1.__metadata("design:type", Function),
569
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
570
+ tslib_1.__metadata("design:returntype", Promise)
571
+ ], UserController.prototype, "completeAccountVerification", null);
572
+ tslib_1.__decorate([
573
+ (0, node_express_suite_1.Post)('/language', {
574
+ auth: true,
575
+ validation: function (validationLanguage) {
576
+ return [
577
+ (0, express_validator_1.body)('language')
578
+ .isString()
579
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidLanguage, undefined, validationLanguage))
580
+ .isIn(Object.values(i18n_lib_1.LanguageCodes))
581
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidLanguage, undefined, validationLanguage)),
582
+ ];
583
+ },
584
+ }),
585
+ tslib_1.__metadata("design:type", Function),
586
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
587
+ tslib_1.__metadata("design:returntype", Promise)
588
+ ], UserController.prototype, "setLanguage", null);
589
+ tslib_1.__decorate([
590
+ (0, node_express_suite_1.Post)('/dark-mode', {
591
+ auth: true,
592
+ validation: function (validationLanguage) {
593
+ return [
594
+ (0, express_validator_1.body)('darkMode')
595
+ .isBoolean()
596
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_Required, undefined, validationLanguage)),
597
+ ];
598
+ },
599
+ }),
600
+ tslib_1.__metadata("design:type", Function),
601
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
602
+ tslib_1.__metadata("design:returntype", Promise)
603
+ ], UserController.prototype, "setDarkMode", null);
604
+ tslib_1.__decorate([
605
+ (0, node_express_suite_1.Get)('/settings', { auth: true }),
606
+ tslib_1.__metadata("design:type", Function),
607
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
608
+ tslib_1.__metadata("design:returntype", Promise)
609
+ ], UserController.prototype, "getSettings", null);
610
+ tslib_1.__decorate([
611
+ (0, node_express_suite_1.Post)('/settings', {
612
+ auth: true,
613
+ validation: function (validationLanguage) {
614
+ return [
615
+ (0, express_validator_1.body)('email')
616
+ .optional()
617
+ .isEmail()
618
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidEmail, undefined, validationLanguage)),
619
+ (0, express_validator_1.body)('timezone')
620
+ .optional()
621
+ .isString()
622
+ .custom((value) => (0, i18n_lib_1.isValidTimezone)(value))
623
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_TimezoneInvalid, undefined, validationLanguage)),
624
+ (0, express_validator_1.body)('siteLanguage')
625
+ .optional()
626
+ .isString()
627
+ .isIn(Object.values(i18n_lib_1.LanguageCodes))
628
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidLanguage, undefined, validationLanguage)),
629
+ (0, express_validator_1.body)('currency')
630
+ .optional()
631
+ .isString()
632
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_CurrencyCodeRequired, undefined, validationLanguage)),
633
+ (0, express_validator_1.body)('darkMode')
634
+ .optional()
635
+ .isBoolean()
636
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_Required, undefined, validationLanguage)),
637
+ (0, express_validator_1.body)('directChallenge')
638
+ .optional()
639
+ .isBoolean()
640
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_Required, undefined, validationLanguage)),
641
+ ];
642
+ },
643
+ }),
644
+ tslib_1.__metadata("design:type", Function),
645
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
646
+ tslib_1.__metadata("design:returntype", Promise)
647
+ ], UserController.prototype, "updateSettings", null);
648
+ tslib_1.__decorate([
649
+ (0, node_express_suite_1.Get)('/backup-codes', { auth: true }),
650
+ tslib_1.__metadata("design:type", Function),
651
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
652
+ tslib_1.__metadata("design:returntype", Promise)
653
+ ], UserController.prototype, "getBackupCodeCount", null);
654
+ tslib_1.__decorate([
655
+ (0, node_express_suite_1.Post)('/backup-codes', {
656
+ auth: true,
657
+ cryptoAuth: true,
658
+ validation: function (validationLanguage) {
659
+ const constants = this.constants;
660
+ return [
661
+ (0, express_validator_1.body)().custom((value, { req }) => {
662
+ if (!req.body?.password && !req.body?.mnemonic) {
663
+ throw new node_express_suite_1.MnemonicOrPasswordRequiredError();
664
+ }
665
+ return true;
666
+ }),
667
+ (0, express_validator_1.body)('password')
668
+ .optional()
669
+ .notEmpty()
670
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_CurrentPasswordRequired, undefined, validationLanguage)),
671
+ (0, express_validator_1.body)('mnemonic')
672
+ .optional()
673
+ .notEmpty()
674
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_MnemonicRequired, undefined, validationLanguage))
675
+ .matches(constants.MnemonicRegex)
676
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_MnemonicRegex, undefined, validationLanguage)),
677
+ ];
678
+ },
679
+ }),
680
+ tslib_1.__metadata("design:type", Function),
681
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
682
+ tslib_1.__metadata("design:returntype", Promise)
683
+ ], UserController.prototype, "resetBackupCodes", null);
684
+ tslib_1.__decorate([
685
+ (0, node_express_suite_1.Post)('/recover-mnemonic', {
686
+ auth: true,
687
+ cryptoAuth: true,
688
+ validation: function (validationLanguage) {
689
+ return [
690
+ (0, express_validator_1.body)('password')
691
+ .isString()
692
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_CurrentPasswordRequired, undefined, validationLanguage)),
693
+ ];
694
+ },
695
+ }),
696
+ tslib_1.__metadata("design:type", Function),
697
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
698
+ tslib_1.__metadata("design:returntype", Promise)
699
+ ], UserController.prototype, "recoverMnemonic", null);
700
+ tslib_1.__decorate([
701
+ (0, node_express_suite_1.Post)('/change-password', {
702
+ auth: true,
703
+ validation: function (validationLanguage) {
704
+ const constants = this.constants;
705
+ return [
706
+ (0, express_validator_1.body)('currentPassword')
707
+ .notEmpty()
708
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_Required, undefined, validationLanguage)),
709
+ (0, express_validator_1.body)('newPassword')
710
+ .matches(constants.PasswordRegex)
711
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_PasswordRegexErrorTemplate))
712
+ .notEmpty()
713
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_Required, undefined, validationLanguage)),
714
+ ];
715
+ },
716
+ }),
717
+ tslib_1.__metadata("design:type", Function),
718
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
719
+ tslib_1.__metadata("design:returntype", Promise)
720
+ ], UserController.prototype, "changePassword", null);
721
+ tslib_1.__decorate([
722
+ (0, node_express_suite_1.Post)('/request-direct-login'),
723
+ tslib_1.__metadata("design:type", Function),
724
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
725
+ tslib_1.__metadata("design:returntype", Promise)
726
+ ], UserController.prototype, "requestDirectLogin", null);
727
+ tslib_1.__decorate([
728
+ (0, node_express_suite_1.Post)('/direct-challenge', {
729
+ schema: DirectLoginChallengeSchema,
730
+ validation: function (validationLanguage) {
731
+ const constants = this.constants;
732
+ return [
733
+ (0, express_validator_1.body)('challenge')
734
+ .not()
735
+ .isEmpty()
736
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidChallenge, undefined, validationLanguage))
737
+ .matches(new RegExp(`^[a-f0-9]{${(ecies_lib_1.UINT64_SIZE + 32 + ecies_lib_1.ECIES.SIGNATURE_SIZE) * 2}}$`))
738
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidChallenge, undefined, validationLanguage)),
739
+ (0, express_validator_1.body)('signature')
740
+ .not()
741
+ .isEmpty()
742
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidSignature))
743
+ .matches(new RegExp(`^[a-f0-9]{${ecies_lib_1.ECIES.SIGNATURE_SIZE * 2}}$`))
744
+ .withMessage(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidSignature),
745
+ (0, express_validator_1.body)().custom((value, { req }) => {
746
+ if (!req.body.username && !req.body.email) {
747
+ throw new suite_core_lib_1.UsernameOrEmailRequiredError();
748
+ }
749
+ return true;
750
+ }),
751
+ (0, express_validator_1.body)('username')
752
+ .optional()
753
+ .matches(constants.UsernameRegex)
754
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UsernameRegexErrorTemplate, undefined, validationLanguage)),
755
+ (0, express_validator_1.body)('email')
756
+ .optional()
757
+ .isEmail()
758
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidEmail, undefined, validationLanguage)),
759
+ ];
760
+ },
761
+ }),
762
+ tslib_1.__metadata("design:type", Function),
763
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
764
+ tslib_1.__metadata("design:returntype", Promise)
765
+ ], UserController.prototype, "directLoginChallenge", null);
766
+ tslib_1.__decorate([
767
+ (0, node_express_suite_1.Post)('/request-email-login', {
768
+ validation: function (validationLanguage) {
769
+ const constants = this.constants;
770
+ return [
771
+ (0, express_validator_1.body)().custom((value, { req }) => {
772
+ if (!req.body.username && !req.body.email) {
773
+ throw new suite_core_lib_1.UsernameOrEmailRequiredError();
774
+ }
775
+ return true;
776
+ }),
777
+ (0, express_validator_1.body)('username')
778
+ .optional()
779
+ .matches(constants.UsernameRegex)
780
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UsernameRegexErrorTemplate, undefined, validationLanguage)),
781
+ (0, express_validator_1.body)('email')
782
+ .optional()
783
+ .isEmail()
784
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidEmail, undefined, validationLanguage)),
785
+ ];
786
+ },
787
+ }),
788
+ tslib_1.__metadata("design:type", Function),
789
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
790
+ tslib_1.__metadata("design:returntype", Promise)
791
+ ], UserController.prototype, "requestEmailLogin", null);
792
+ tslib_1.__decorate([
793
+ (0, node_express_suite_1.Post)('/email-challenge', {
794
+ schema: EmailLoginChallengeSchema,
795
+ validation: function (validationLanguage) {
796
+ const constants = this.constants;
797
+ return [
798
+ (0, express_validator_1.body)('token')
799
+ .not()
800
+ .isEmpty()
801
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_TokenRequired, undefined, validationLanguage))
802
+ .matches(new RegExp(`^[a-f0-9]{${constants.EmailTokenLength * 2}}$`))
803
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidToken, undefined, validationLanguage)),
804
+ (0, express_validator_1.body)('signature')
805
+ .not()
806
+ .isEmpty()
807
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidSignature))
808
+ .matches(new RegExp(`^[a-f0-9]{${ecies_lib_1.ECIES.SIGNATURE_SIZE * 2}}$`))
809
+ .withMessage(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidSignature),
810
+ (0, express_validator_1.body)().custom((value, { req }) => {
811
+ if (!req.body.username && !req.body.email) {
812
+ throw new suite_core_lib_1.UsernameOrEmailRequiredError();
813
+ }
814
+ return true;
815
+ }),
816
+ (0, express_validator_1.body)('username')
817
+ .optional()
818
+ .matches(constants.UsernameRegex)
819
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UsernameRegexErrorTemplate, undefined, validationLanguage)),
820
+ (0, express_validator_1.body)('email')
821
+ .optional()
822
+ .isEmail()
823
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidEmail, undefined, validationLanguage)),
824
+ ];
825
+ },
826
+ }),
827
+ tslib_1.__metadata("design:type", Function),
828
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
829
+ tslib_1.__metadata("design:returntype", Promise)
830
+ ], UserController.prototype, "emailLoginChallenge", null);
831
+ tslib_1.__decorate([
832
+ (0, node_express_suite_1.Post)('/resend-verification', {
833
+ validation: function (validationLanguage) {
834
+ const constants = this.constants;
835
+ return [
836
+ (0, express_validator_1.body)().custom((value, { req }) => {
837
+ if (!req.body.username && !req.body.email) {
838
+ throw new suite_core_lib_1.UsernameOrEmailRequiredError();
839
+ }
840
+ return true;
841
+ }),
842
+ (0, express_validator_1.body)('username')
843
+ .optional()
844
+ .isString()
845
+ .matches(constants.UsernameRegex)
846
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UsernameRegexErrorTemplate, undefined, validationLanguage)),
847
+ (0, express_validator_1.body)('email').optional().isEmail(),
848
+ ];
849
+ },
850
+ }),
851
+ tslib_1.__metadata("design:type", Function),
852
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
853
+ tslib_1.__metadata("design:returntype", Promise)
854
+ ], UserController.prototype, "resendVerification", null);
855
+ tslib_1.__decorate([
856
+ (0, node_express_suite_1.Post)('/backup-code', {
857
+ validation: function (validationLanguage) {
858
+ const constants = this.constants;
859
+ return [
860
+ (0, express_validator_1.body)('email').optional().isEmail(),
861
+ (0, express_validator_1.body)('username')
862
+ .optional()
863
+ .matches(constants.UsernameRegex)
864
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UsernameRegexErrorTemplate, undefined, validationLanguage)),
865
+ (0, express_validator_1.body)('code')
866
+ .custom((value) => {
867
+ const normalized = node_express_suite_1.BackupCode.normalizeCode(value);
868
+ return (constants.BACKUP_CODES.DisplayRegex.test(value) ||
869
+ constants.BACKUP_CODES.NormalizedHexRegex.test(normalized));
870
+ })
871
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidBackupCode, undefined, validationLanguage)),
872
+ (0, express_validator_1.body)('recoverMnemonic').isBoolean().optional(),
873
+ (0, express_validator_1.body)('newPassword')
874
+ .optional()
875
+ .matches(constants.PasswordRegex)
876
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_PasswordRegexErrorTemplate, undefined, validationLanguage)),
877
+ ];
878
+ },
879
+ }),
880
+ tslib_1.__metadata("design:type", Function),
881
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
882
+ tslib_1.__metadata("design:returntype", Promise)
883
+ ], UserController.prototype, "useBackupCodeLogin", null);
884
+ tslib_1.__decorate([
885
+ (0, node_express_suite_1.Post)('/forgot-password', {
886
+ validation: function (validationLanguage) {
887
+ return [
888
+ (0, express_validator_1.body)('email')
889
+ .isEmail()
890
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidEmail, undefined, validationLanguage)),
891
+ ];
892
+ },
893
+ }),
894
+ tslib_1.__metadata("design:type", Function),
895
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
896
+ tslib_1.__metadata("design:returntype", Promise)
897
+ ], UserController.prototype, "forgotPassword", null);
898
+ tslib_1.__decorate([
899
+ (0, node_express_suite_1.Get)('/verify-reset-token'),
900
+ tslib_1.__metadata("design:type", Function),
901
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
902
+ tslib_1.__metadata("design:returntype", Promise)
903
+ ], UserController.prototype, "verifyResetToken", null);
904
+ tslib_1.__decorate([
905
+ (0, node_express_suite_1.Post)('/reset-password', {
906
+ validation: function (validationLanguage) {
907
+ const constants = this.constants;
908
+ return [
909
+ (0, express_validator_1.body)('token')
910
+ .not()
911
+ .isEmpty()
912
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_TokenRequired, undefined, validationLanguage))
913
+ .matches(new RegExp(`^[a-f0-9]{${constants.EmailTokenLength * 2}}$`))
914
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_InvalidToken, undefined, validationLanguage)),
915
+ (0, express_validator_1.body)('newPassword')
916
+ .optional()
917
+ .isLength({ min: 8 })
918
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_PasswordMinLengthTemplate, undefined, validationLanguage))
919
+ .matches(constants.PasswordRegex)
920
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_PasswordRegexErrorTemplate, undefined, validationLanguage)),
921
+ (0, express_validator_1.body)('password')
922
+ .optional()
923
+ .isLength({ min: 8 })
924
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_PasswordMinLengthTemplate, undefined, validationLanguage))
925
+ .matches(constants.PasswordRegex)
926
+ .withMessage((0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_PasswordRegexErrorTemplate, undefined, validationLanguage)),
927
+ (0, express_validator_1.body)('currentPassword').optional().isString(),
928
+ (0, express_validator_1.body)('mnemonic').optional().isString(),
929
+ ];
930
+ },
931
+ }),
932
+ tslib_1.__metadata("design:type", Function),
933
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Function]),
934
+ tslib_1.__metadata("design:returntype", Promise)
935
+ ], UserController.prototype, "resetPassword", null);
936
+ exports.UserController = UserController = tslib_1.__decorate([
937
+ (0, node_express_suite_1.Controller)(),
938
+ tslib_1.__metadata("design:paramtypes", [Object, jwt_1.JwtService,
939
+ user_1.UserService,
940
+ backup_code_1.BackupCodeService,
941
+ role_1.RoleService,
942
+ node_ecies_lib_1.ECIESService])
943
+ ], UserController);
944
+ //# sourceMappingURL=user.js.map