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