@digitaldefiance/node-express-suite 3.6.13 → 3.6.15

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 (859) hide show
  1. package/package.json +9 -8
  2. package/src/__tests__/fixtures/index.d.ts +2 -0
  3. package/src/__tests__/fixtures/index.d.ts.map +1 -0
  4. package/src/__tests__/fixtures/index.js +5 -0
  5. package/src/__tests__/fixtures/index.js.map +1 -0
  6. package/src/__tests__/fixtures/model-mocks.mock.d.ts +6 -0
  7. package/src/__tests__/fixtures/model-mocks.mock.d.ts.map +1 -0
  8. package/src/__tests__/fixtures/model-mocks.mock.js +94 -0
  9. package/src/__tests__/fixtures/model-mocks.mock.js.map +1 -0
  10. package/src/__tests__/helpers/application.mock.d.ts +8 -0
  11. package/src/__tests__/helpers/application.mock.d.ts.map +1 -0
  12. package/src/__tests__/helpers/application.mock.js +77 -0
  13. package/src/__tests__/helpers/application.mock.js.map +1 -0
  14. package/src/__tests__/helpers/{index.ts → index.d.ts} +2 -1
  15. package/src/__tests__/helpers/index.d.ts.map +1 -0
  16. package/src/__tests__/helpers/index.js +7 -0
  17. package/src/__tests__/helpers/index.js.map +1 -0
  18. package/src/__tests__/helpers/setup-test-env.d.ts +12 -0
  19. package/src/__tests__/helpers/setup-test-env.d.ts.map +1 -0
  20. package/src/__tests__/helpers/setup-test-env.js +119 -0
  21. package/src/__tests__/helpers/setup-test-env.js.map +1 -0
  22. package/src/__tests__/index.d.ts +3 -0
  23. package/src/__tests__/index.d.ts.map +1 -0
  24. package/src/__tests__/index.js +6 -0
  25. package/src/__tests__/index.js.map +1 -0
  26. package/src/application-base.d.ts +122 -0
  27. package/src/application-base.d.ts.map +1 -0
  28. package/src/application-base.js +355 -0
  29. package/src/application-base.js.map +1 -0
  30. package/src/application-concrete.d.ts +12 -0
  31. package/src/application-concrete.d.ts.map +1 -0
  32. package/src/application-concrete.js +21 -0
  33. package/src/application-concrete.js.map +1 -0
  34. package/src/application.d.ts +28 -0
  35. package/src/application.d.ts.map +1 -0
  36. package/src/application.js +167 -0
  37. package/src/application.js.map +1 -0
  38. package/src/backup-code.d.ts +68 -0
  39. package/src/backup-code.d.ts.map +1 -0
  40. package/src/backup-code.js +238 -0
  41. package/src/backup-code.js.map +1 -0
  42. package/src/builders/application-builder.d.ts +34 -0
  43. package/src/builders/application-builder.d.ts.map +1 -0
  44. package/src/builders/application-builder.js +64 -0
  45. package/src/builders/application-builder.js.map +1 -0
  46. package/src/builders/{index.ts → index.d.ts} +1 -0
  47. package/src/builders/index.d.ts.map +1 -0
  48. package/src/builders/index.js +5 -0
  49. package/src/builders/index.js.map +1 -0
  50. package/src/constants.d.ts +16 -0
  51. package/src/constants.d.ts.map +1 -0
  52. package/src/constants.js +58 -0
  53. package/src/constants.js.map +1 -0
  54. package/src/container/{index.ts → index.d.ts} +1 -0
  55. package/src/container/index.d.ts.map +1 -0
  56. package/src/container/index.js +6 -0
  57. package/src/container/index.js.map +1 -0
  58. package/src/container/service-container.d.ts +11 -0
  59. package/src/container/service-container.d.ts.map +1 -0
  60. package/src/container/service-container.js +38 -0
  61. package/src/container/service-container.js.map +1 -0
  62. package/src/container/service-definitions.d.ts +11 -0
  63. package/src/container/service-definitions.d.ts.map +1 -0
  64. package/src/container/service-definitions.js +13 -0
  65. package/src/container/service-definitions.js.map +1 -0
  66. package/src/controllers/base.d.ts +66 -0
  67. package/src/controllers/base.d.ts.map +1 -0
  68. package/src/controllers/base.js +305 -0
  69. package/src/controllers/base.js.map +1 -0
  70. package/src/controllers/{index.ts → index.d.ts} +1 -0
  71. package/src/controllers/index.d.ts.map +1 -0
  72. package/src/controllers/index.js +6 -0
  73. package/src/controllers/index.js.map +1 -0
  74. package/src/controllers/user.d.ts +46 -0
  75. package/src/controllers/user.d.ts.map +1 -0
  76. package/src/controllers/user.js +918 -0
  77. package/src/controllers/user.js.map +1 -0
  78. package/src/database/{database-initializer.ts → database-initializer.d.ts} +3 -3
  79. package/src/database/database-initializer.d.ts.map +1 -0
  80. package/src/database/database-initializer.js +3 -0
  81. package/src/database/database-initializer.js.map +1 -0
  82. package/src/database/{index.ts → index.d.ts} +1 -0
  83. package/src/database/index.d.ts.map +1 -0
  84. package/src/database/index.js +5 -0
  85. package/src/database/index.js.map +1 -0
  86. package/src/decorators/base-controller.d.ts +10 -0
  87. package/src/decorators/base-controller.d.ts.map +1 -0
  88. package/src/decorators/base-controller.js +60 -0
  89. package/src/decorators/base-controller.js.map +1 -0
  90. package/src/decorators/controller.d.ts +38 -0
  91. package/src/decorators/controller.d.ts.map +1 -0
  92. package/src/decorators/controller.js +67 -0
  93. package/src/decorators/controller.js.map +1 -0
  94. package/src/decorators/{index.ts → index.d.ts} +1 -0
  95. package/src/decorators/index.d.ts.map +1 -0
  96. package/src/decorators/index.js +7 -0
  97. package/src/decorators/index.js.map +1 -0
  98. package/src/decorators/zod-validation.d.ts +5 -0
  99. package/src/decorators/zod-validation.d.ts.map +1 -0
  100. package/src/decorators/zod-validation.js +47 -0
  101. package/src/decorators/zod-validation.js.map +1 -0
  102. package/src/defaults.d.ts +7 -0
  103. package/src/defaults.d.ts.map +1 -0
  104. package/src/defaults.js +202 -0
  105. package/src/defaults.js.map +1 -0
  106. package/src/documents/base.d.ts +4 -0
  107. package/src/documents/base.d.ts.map +1 -0
  108. package/src/documents/base.js +3 -0
  109. package/src/documents/base.js.map +1 -0
  110. package/src/documents/{email-token.ts → email-token.d.ts} +3 -9
  111. package/src/documents/email-token.d.ts.map +1 -0
  112. package/src/documents/email-token.js +3 -0
  113. package/src/documents/email-token.js.map +1 -0
  114. package/src/documents/{index.ts → index.d.ts} +1 -0
  115. package/src/documents/index.d.ts.map +1 -0
  116. package/src/documents/index.js +3 -0
  117. package/src/documents/index.js.map +1 -0
  118. package/src/documents/{mnemonic.ts → mnemonic.d.ts} +2 -5
  119. package/src/documents/mnemonic.d.ts.map +1 -0
  120. package/src/documents/mnemonic.js +3 -0
  121. package/src/documents/mnemonic.js.map +1 -0
  122. package/src/documents/{role.ts → role.d.ts} +2 -5
  123. package/src/documents/role.d.ts.map +1 -0
  124. package/src/documents/role.js +3 -0
  125. package/src/documents/role.js.map +1 -0
  126. package/src/documents/{used-direct-login-token.ts → used-direct-login-token.d.ts} +2 -5
  127. package/src/documents/used-direct-login-token.d.ts.map +1 -0
  128. package/src/documents/used-direct-login-token.js +3 -0
  129. package/src/documents/used-direct-login-token.js.map +1 -0
  130. package/src/documents/{user-role.ts → user-role.d.ts} +2 -5
  131. package/src/documents/user-role.d.ts.map +1 -0
  132. package/src/documents/user-role.js +3 -0
  133. package/src/documents/user-role.js.map +1 -0
  134. package/src/documents/{user.ts → user.d.ts} +2 -5
  135. package/src/documents/user.d.ts.map +1 -0
  136. package/src/documents/user.js +3 -0
  137. package/src/documents/user.js.map +1 -0
  138. package/src/enumerations/base-model-name.d.ts +38 -0
  139. package/src/enumerations/base-model-name.d.ts.map +1 -0
  140. package/src/enumerations/base-model-name.js +34 -0
  141. package/src/enumerations/base-model-name.js.map +1 -0
  142. package/src/enumerations/{index.ts → index.d.ts} +1 -0
  143. package/src/enumerations/index.d.ts.map +1 -0
  144. package/src/enumerations/index.js +8 -0
  145. package/src/enumerations/index.js.map +1 -0
  146. package/src/enumerations/length-encoding-type.d.ts +7 -0
  147. package/src/enumerations/length-encoding-type.d.ts.map +1 -0
  148. package/src/enumerations/length-encoding-type.js +11 -0
  149. package/src/enumerations/length-encoding-type.js.map +1 -0
  150. package/src/enumerations/schema-collection.d.ts +34 -0
  151. package/src/enumerations/schema-collection.d.ts.map +1 -0
  152. package/src/enumerations/schema-collection.js +38 -0
  153. package/src/enumerations/schema-collection.js.map +1 -0
  154. package/src/enumerations/symmetric-error-type.d.ts +5 -0
  155. package/src/enumerations/symmetric-error-type.d.ts.map +1 -0
  156. package/src/enumerations/symmetric-error-type.js +9 -0
  157. package/src/enumerations/symmetric-error-type.js.map +1 -0
  158. package/src/environment.d.ts +190 -0
  159. package/src/environment.d.ts.map +1 -0
  160. package/src/environment.js +646 -0
  161. package/src/environment.js.map +1 -0
  162. package/src/errors/express-validation.d.ts +9 -0
  163. package/src/errors/express-validation.d.ts.map +1 -0
  164. package/src/errors/express-validation.js +18 -0
  165. package/src/errors/express-validation.js.map +1 -0
  166. package/src/errors/{index.ts → index.d.ts} +1 -0
  167. package/src/errors/index.d.ts.map +1 -0
  168. package/src/errors/index.js +16 -0
  169. package/src/errors/index.js.map +1 -0
  170. package/src/errors/invalid-backup-code-version.d.ts +6 -0
  171. package/src/errors/invalid-backup-code-version.d.ts.map +1 -0
  172. package/src/errors/invalid-backup-code-version.js +16 -0
  173. package/src/errors/invalid-backup-code-version.js.map +1 -0
  174. package/src/errors/invalid-jwt-token.d.ts +5 -0
  175. package/src/errors/invalid-jwt-token.d.ts.map +1 -0
  176. package/src/errors/invalid-jwt-token.js +12 -0
  177. package/src/errors/invalid-jwt-token.js.map +1 -0
  178. package/src/errors/invalid-model.d.ts +6 -0
  179. package/src/errors/invalid-model.d.ts.map +1 -0
  180. package/src/errors/invalid-model.js +14 -0
  181. package/src/errors/invalid-model.js.map +1 -0
  182. package/src/errors/invalid-new-password.d.ts +5 -0
  183. package/src/errors/invalid-new-password.d.ts.map +1 -0
  184. package/src/errors/invalid-new-password.js +14 -0
  185. package/src/errors/invalid-new-password.js.map +1 -0
  186. package/src/errors/invalid-password.d.ts +5 -0
  187. package/src/errors/invalid-password.d.ts.map +1 -0
  188. package/src/errors/invalid-password.js +14 -0
  189. package/src/errors/invalid-password.js.map +1 -0
  190. package/src/errors/missing-validated-data.d.ts +7 -0
  191. package/src/errors/missing-validated-data.d.ts.map +1 -0
  192. package/src/errors/missing-validated-data.js +36 -0
  193. package/src/errors/missing-validated-data.js.map +1 -0
  194. package/src/errors/mnemonic-or-password-required.d.ts +5 -0
  195. package/src/errors/mnemonic-or-password-required.d.ts.map +1 -0
  196. package/src/errors/mnemonic-or-password-required.js +14 -0
  197. package/src/errors/mnemonic-or-password-required.js.map +1 -0
  198. package/src/errors/model-not-registered.d.ts +6 -0
  199. package/src/errors/model-not-registered.d.ts.map +1 -0
  200. package/src/errors/model-not-registered.js +14 -0
  201. package/src/errors/model-not-registered.js.map +1 -0
  202. package/src/errors/mongoose-validation.d.ts +12 -0
  203. package/src/errors/mongoose-validation.d.ts.map +1 -0
  204. package/src/errors/mongoose-validation.js +17 -0
  205. package/src/errors/mongoose-validation.js.map +1 -0
  206. package/src/errors/symmetric.d.ts +8 -0
  207. package/src/errors/symmetric.d.ts.map +1 -0
  208. package/src/errors/symmetric.js +22 -0
  209. package/src/errors/symmetric.js.map +1 -0
  210. package/src/errors/token-expired.d.ts +5 -0
  211. package/src/errors/token-expired.d.ts.map +1 -0
  212. package/src/errors/token-expired.js +12 -0
  213. package/src/errors/token-expired.js.map +1 -0
  214. package/src/get-language.d.ts +2 -0
  215. package/src/get-language.d.ts.map +1 -0
  216. package/src/get-language.js +30 -0
  217. package/src/get-language.js.map +1 -0
  218. package/src/get-timezone.d.ts +2 -0
  219. package/src/get-timezone.d.ts.map +1 -0
  220. package/src/get-timezone.js +39 -0
  221. package/src/get-timezone.js.map +1 -0
  222. package/src/{index.ts → index.d.ts} +2 -3
  223. package/src/index.d.ts.map +1 -0
  224. package/src/index.js +43 -0
  225. package/src/index.js.map +1 -0
  226. package/src/interfaces/{api-error-response.ts → api-error-response.d.ts} +2 -2
  227. package/src/interfaces/api-error-response.d.ts.map +1 -0
  228. package/src/interfaces/api-error-response.js +3 -0
  229. package/src/interfaces/api-error-response.js.map +1 -0
  230. package/src/interfaces/api-express-validation-error-response.d.ts +7 -0
  231. package/src/interfaces/api-express-validation-error-response.d.ts.map +1 -0
  232. package/src/interfaces/api-express-validation-error-response.js +3 -0
  233. package/src/interfaces/api-express-validation-error-response.js.map +1 -0
  234. package/src/interfaces/api-message-response.d.ts +4 -0
  235. package/src/interfaces/api-message-response.d.ts.map +1 -0
  236. package/src/interfaces/api-message-response.js +3 -0
  237. package/src/interfaces/api-message-response.js.map +1 -0
  238. package/src/interfaces/{api-mongo-validation-error-response.ts → api-mongo-validation-error-response.d.ts} +2 -2
  239. package/src/interfaces/api-mongo-validation-error-response.d.ts.map +1 -0
  240. package/src/interfaces/api-mongo-validation-error-response.js +3 -0
  241. package/src/interfaces/api-mongo-validation-error-response.js.map +1 -0
  242. package/src/interfaces/api-responses/{backup-codes-response.ts → backup-codes-response.d.ts} +2 -2
  243. package/src/interfaces/api-responses/backup-codes-response.d.ts.map +1 -0
  244. package/src/interfaces/api-responses/backup-codes-response.js +3 -0
  245. package/src/interfaces/api-responses/backup-codes-response.js.map +1 -0
  246. package/src/interfaces/api-responses/{challenge-response.ts → challenge-response.d.ts} +3 -3
  247. package/src/interfaces/api-responses/challenge-response.d.ts.map +1 -0
  248. package/src/interfaces/api-responses/challenge-response.js +3 -0
  249. package/src/interfaces/api-responses/challenge-response.js.map +1 -0
  250. package/src/interfaces/api-responses/{code-count-response.ts → code-count-response.d.ts} +2 -2
  251. package/src/interfaces/api-responses/code-count-response.d.ts.map +1 -0
  252. package/src/interfaces/api-responses/code-count-response.js +3 -0
  253. package/src/interfaces/api-responses/code-count-response.js.map +1 -0
  254. package/src/interfaces/api-responses/{index.ts → index.d.ts} +2 -1
  255. package/src/interfaces/api-responses/index.d.ts.map +1 -0
  256. package/src/interfaces/api-responses/index.js +12 -0
  257. package/src/interfaces/api-responses/index.js.map +1 -0
  258. package/src/interfaces/api-responses/{login-response.ts → login-response.d.ts} +4 -4
  259. package/src/interfaces/api-responses/login-response.d.ts.map +1 -0
  260. package/src/interfaces/api-responses/login-response.js +3 -0
  261. package/src/interfaces/api-responses/login-response.js.map +1 -0
  262. package/src/interfaces/api-responses/{mnemonic-response.ts → mnemonic-response.d.ts} +2 -2
  263. package/src/interfaces/api-responses/mnemonic-response.d.ts.map +1 -0
  264. package/src/interfaces/api-responses/mnemonic-response.js +3 -0
  265. package/src/interfaces/api-responses/mnemonic-response.js.map +1 -0
  266. package/src/interfaces/api-responses/{registration-response.ts → registration-response.d.ts} +3 -3
  267. package/src/interfaces/api-responses/registration-response.d.ts.map +1 -0
  268. package/src/interfaces/api-responses/registration-response.js +3 -0
  269. package/src/interfaces/api-responses/registration-response.js.map +1 -0
  270. package/src/interfaces/api-responses/{request-user-response.ts → request-user-response.d.ts} +2 -2
  271. package/src/interfaces/api-responses/request-user-response.d.ts.map +1 -0
  272. package/src/interfaces/api-responses/request-user-response.js +3 -0
  273. package/src/interfaces/api-responses/request-user-response.js.map +1 -0
  274. package/src/interfaces/api-responses/user-settings-response.d.ts +12 -0
  275. package/src/interfaces/api-responses/user-settings-response.d.ts.map +1 -0
  276. package/src/interfaces/api-responses/user-settings-response.js +3 -0
  277. package/src/interfaces/api-responses/user-settings-response.js.map +1 -0
  278. package/src/interfaces/application.d.ts +16 -0
  279. package/src/interfaces/application.d.ts.map +1 -0
  280. package/src/interfaces/application.js +3 -0
  281. package/src/interfaces/application.js.map +1 -0
  282. package/src/interfaces/backend-objects/email-token.d.ts +4 -0
  283. package/src/interfaces/backend-objects/email-token.d.ts.map +1 -0
  284. package/src/interfaces/backend-objects/email-token.js +3 -0
  285. package/src/interfaces/backend-objects/email-token.js.map +1 -0
  286. package/src/interfaces/backend-objects/{index.ts → index.d.ts} +1 -0
  287. package/src/interfaces/backend-objects/index.d.ts.map +1 -0
  288. package/src/interfaces/backend-objects/index.js +8 -0
  289. package/src/interfaces/backend-objects/index.js.map +1 -0
  290. package/src/interfaces/backend-objects/request-user.d.ts +5 -0
  291. package/src/interfaces/backend-objects/request-user.d.ts.map +1 -0
  292. package/src/interfaces/backend-objects/request-user.js +3 -0
  293. package/src/interfaces/backend-objects/request-user.js.map +1 -0
  294. package/src/interfaces/backend-objects/{role.ts → role.d.ts} +1 -1
  295. package/src/interfaces/backend-objects/role.d.ts.map +1 -0
  296. package/src/interfaces/backend-objects/role.js +3 -0
  297. package/src/interfaces/backend-objects/role.js.map +1 -0
  298. package/src/interfaces/backend-objects/user.d.ts +4 -0
  299. package/src/interfaces/backend-objects/user.d.ts.map +1 -0
  300. package/src/interfaces/backend-objects/user.js +3 -0
  301. package/src/interfaces/backend-objects/user.js.map +1 -0
  302. package/src/interfaces/checksum-config.d.ts +5 -0
  303. package/src/interfaces/checksum-config.d.ts.map +1 -0
  304. package/src/interfaces/checksum-config.js +3 -0
  305. package/src/interfaces/checksum-config.js.map +1 -0
  306. package/src/interfaces/checksum-consts.d.ts +11 -0
  307. package/src/interfaces/checksum-consts.d.ts.map +1 -0
  308. package/src/interfaces/checksum-consts.js +3 -0
  309. package/src/interfaces/checksum-consts.js.map +1 -0
  310. package/src/interfaces/constants.d.ts +98 -0
  311. package/src/interfaces/constants.d.ts.map +1 -0
  312. package/src/interfaces/constants.js +3 -0
  313. package/src/interfaces/constants.js.map +1 -0
  314. package/src/interfaces/controller-config.d.ts +21 -0
  315. package/src/interfaces/controller-config.d.ts.map +1 -0
  316. package/src/interfaces/controller-config.js +3 -0
  317. package/src/interfaces/controller-config.js.map +1 -0
  318. package/src/interfaces/create-user-basics.d.ts +18 -0
  319. package/src/interfaces/create-user-basics.d.ts.map +1 -0
  320. package/src/interfaces/create-user-basics.js +3 -0
  321. package/src/interfaces/create-user-basics.js.map +1 -0
  322. package/src/interfaces/csp-config.d.ts +7 -0
  323. package/src/interfaces/csp-config.d.ts.map +1 -0
  324. package/src/interfaces/csp-config.js +13 -0
  325. package/src/interfaces/csp-config.js.map +1 -0
  326. package/src/interfaces/csp-definition.d.ts +13 -0
  327. package/src/interfaces/csp-definition.d.ts.map +1 -0
  328. package/src/interfaces/csp-definition.js +23 -0
  329. package/src/interfaces/csp-definition.js.map +1 -0
  330. package/src/interfaces/{db-init-result.ts → db-init-result.d.ts} +3 -3
  331. package/src/interfaces/db-init-result.d.ts.map +1 -0
  332. package/src/interfaces/db-init-result.js +3 -0
  333. package/src/interfaces/db-init-result.js.map +1 -0
  334. package/src/interfaces/deep-partial.d.ts +4 -0
  335. package/src/interfaces/deep-partial.d.ts.map +1 -0
  336. package/src/interfaces/deep-partial.js +3 -0
  337. package/src/interfaces/deep-partial.js.map +1 -0
  338. package/src/interfaces/{discriminator-collections.ts → discriminator-collections.d.ts} +3 -3
  339. package/src/interfaces/discriminator-collections.d.ts.map +1 -0
  340. package/src/interfaces/discriminator-collections.js +3 -0
  341. package/src/interfaces/discriminator-collections.js.map +1 -0
  342. package/src/interfaces/email-service.d.ts +4 -0
  343. package/src/interfaces/email-service.d.ts.map +1 -0
  344. package/src/interfaces/email-service.js +3 -0
  345. package/src/interfaces/email-service.js.map +1 -0
  346. package/src/interfaces/environment-mongo.d.ts +76 -0
  347. package/src/interfaces/environment-mongo.d.ts.map +1 -0
  348. package/src/interfaces/environment-mongo.js +3 -0
  349. package/src/interfaces/environment-mongo.js.map +1 -0
  350. package/src/interfaces/environment.d.ts +184 -0
  351. package/src/interfaces/environment.d.ts.map +1 -0
  352. package/src/interfaces/environment.js +3 -0
  353. package/src/interfaces/environment.js.map +1 -0
  354. package/src/interfaces/failable-result.d.ts +7 -0
  355. package/src/interfaces/failable-result.d.ts.map +1 -0
  356. package/src/interfaces/failable-result.js +3 -0
  357. package/src/interfaces/failable-result.js.map +1 -0
  358. package/src/interfaces/fec-consts.d.ts +5 -0
  359. package/src/interfaces/fec-consts.d.ts.map +1 -0
  360. package/src/interfaces/fec-consts.js +3 -0
  361. package/src/interfaces/fec-consts.js.map +1 -0
  362. package/src/interfaces/flexible-csp.d.ts +8 -0
  363. package/src/interfaces/flexible-csp.d.ts.map +1 -0
  364. package/src/interfaces/flexible-csp.js +14 -0
  365. package/src/interfaces/flexible-csp.js.map +1 -0
  366. package/src/interfaces/handleable-error-options.d.ts +7 -0
  367. package/src/interfaces/handleable-error-options.d.ts.map +1 -0
  368. package/src/interfaces/handleable-error-options.js +3 -0
  369. package/src/interfaces/handleable-error-options.js.map +1 -0
  370. package/src/interfaces/{index.ts → index.d.ts} +1 -0
  371. package/src/interfaces/index.d.ts.map +1 -0
  372. package/src/interfaces/index.js +38 -0
  373. package/src/interfaces/index.js.map +1 -0
  374. package/src/interfaces/jwt-consts.d.ts +11 -0
  375. package/src/interfaces/jwt-consts.d.ts.map +1 -0
  376. package/src/interfaces/jwt-consts.js +3 -0
  377. package/src/interfaces/jwt-consts.js.map +1 -0
  378. package/src/interfaces/jwt-sign-response.d.ts +11 -0
  379. package/src/interfaces/jwt-sign-response.d.ts.map +1 -0
  380. package/src/interfaces/jwt-sign-response.js +3 -0
  381. package/src/interfaces/jwt-sign-response.js.map +1 -0
  382. package/src/interfaces/models/{email-token.ts → email-token.d.ts} +1 -1
  383. package/src/interfaces/models/email-token.d.ts.map +1 -0
  384. package/src/interfaces/models/email-token.js +3 -0
  385. package/src/interfaces/models/email-token.js.map +1 -0
  386. package/src/interfaces/models/{index.ts → index.d.ts} +1 -0
  387. package/src/interfaces/models/index.d.ts.map +1 -0
  388. package/src/interfaces/models/index.js +11 -0
  389. package/src/interfaces/models/index.js.map +1 -0
  390. package/src/interfaces/models/{mnemonic.ts → mnemonic.d.ts} +1 -1
  391. package/src/interfaces/models/mnemonic.d.ts.map +1 -0
  392. package/src/interfaces/models/mnemonic.js +3 -0
  393. package/src/interfaces/models/mnemonic.js.map +1 -0
  394. package/src/interfaces/models/{role.ts → role.d.ts} +1 -1
  395. package/src/interfaces/models/role.d.ts.map +1 -0
  396. package/src/interfaces/models/role.js +3 -0
  397. package/src/interfaces/models/role.js.map +1 -0
  398. package/src/interfaces/models/{token-role.ts → token-role.d.ts} +1 -1
  399. package/src/interfaces/models/token-role.d.ts.map +1 -0
  400. package/src/interfaces/models/token-role.js +3 -0
  401. package/src/interfaces/models/token-role.js.map +1 -0
  402. package/src/interfaces/models/{used-direct-login-token.ts → used-direct-login-token.d.ts} +2 -3
  403. package/src/interfaces/models/used-direct-login-token.d.ts.map +1 -0
  404. package/src/interfaces/models/used-direct-login-token.js +3 -0
  405. package/src/interfaces/models/used-direct-login-token.js.map +1 -0
  406. package/src/interfaces/models/{user-role.ts → user-role.d.ts} +1 -1
  407. package/src/interfaces/models/user-role.d.ts.map +1 -0
  408. package/src/interfaces/models/user-role.js +3 -0
  409. package/src/interfaces/models/user-role.js.map +1 -0
  410. package/src/interfaces/models/{user.ts → user.d.ts} +3 -11
  411. package/src/interfaces/models/user.d.ts.map +1 -0
  412. package/src/interfaces/models/user.js +3 -0
  413. package/src/interfaces/models/user.js.map +1 -0
  414. package/src/interfaces/mongo-errors.d.ts +5 -0
  415. package/src/interfaces/mongo-errors.d.ts.map +1 -0
  416. package/src/interfaces/mongo-errors.js +3 -0
  417. package/src/interfaces/mongo-errors.js.map +1 -0
  418. package/src/interfaces/request-user.d.ts +58 -0
  419. package/src/interfaces/request-user.d.ts.map +1 -0
  420. package/src/interfaces/request-user.js +3 -0
  421. package/src/interfaces/request-user.js.map +1 -0
  422. package/src/interfaces/required-string-keys.d.ts +22 -0
  423. package/src/interfaces/required-string-keys.d.ts.map +1 -0
  424. package/src/interfaces/required-string-keys.js +3 -0
  425. package/src/interfaces/required-string-keys.js.map +1 -0
  426. package/src/interfaces/schema.d.ts +29 -0
  427. package/src/interfaces/schema.d.ts.map +1 -0
  428. package/src/interfaces/schema.js +3 -0
  429. package/src/interfaces/schema.js.map +1 -0
  430. package/src/interfaces/server-init-result.d.ts +36 -0
  431. package/src/interfaces/server-init-result.d.ts.map +1 -0
  432. package/src/interfaces/server-init-result.js +3 -0
  433. package/src/interfaces/server-init-result.js.map +1 -0
  434. package/src/interfaces/status-code-response.d.ts +7 -0
  435. package/src/interfaces/status-code-response.d.ts.map +1 -0
  436. package/src/interfaces/status-code-response.js +3 -0
  437. package/src/interfaces/status-code-response.js.map +1 -0
  438. package/src/interfaces/symmetric-encryption-results.d.ts +3 -3
  439. package/src/interfaces/symmetric-encryption-results.d.ts.map +1 -1
  440. package/src/interfaces/symmetric-encryption-results.js.map +1 -1
  441. package/src/interfaces/{test-environment.ts → test-environment.d.ts} +6 -6
  442. package/src/interfaces/test-environment.d.ts.map +1 -0
  443. package/src/interfaces/test-environment.js +3 -0
  444. package/src/interfaces/test-environment.js.map +1 -0
  445. package/src/interfaces/{token-response.ts → token-response.d.ts} +2 -2
  446. package/src/interfaces/token-response.d.ts.map +1 -0
  447. package/src/interfaces/token-response.js +3 -0
  448. package/src/interfaces/token-response.js.map +1 -0
  449. package/src/middlewares/authenticate-crypto.d.ts +10 -0
  450. package/src/middlewares/authenticate-crypto.d.ts.map +1 -0
  451. package/src/middlewares/authenticate-crypto.js +126 -0
  452. package/src/middlewares/authenticate-crypto.js.map +1 -0
  453. package/src/middlewares/authenticate-token.d.ts +21 -0
  454. package/src/middlewares/authenticate-token.d.ts.map +1 -0
  455. package/src/middlewares/authenticate-token.js +104 -0
  456. package/src/middlewares/authenticate-token.js.map +1 -0
  457. package/src/middlewares/cleanup-crypto.d.ts +7 -0
  458. package/src/middlewares/cleanup-crypto.d.ts.map +1 -0
  459. package/src/middlewares/cleanup-crypto.js +32 -0
  460. package/src/middlewares/cleanup-crypto.js.map +1 -0
  461. package/src/middlewares/{index.ts → index.d.ts} +1 -0
  462. package/src/middlewares/index.d.ts.map +1 -0
  463. package/src/middlewares/index.js +8 -0
  464. package/src/middlewares/index.js.map +1 -0
  465. package/src/middlewares/set-global-context-language.d.ts +3 -0
  466. package/src/middlewares/set-global-context-language.d.ts.map +1 -0
  467. package/src/middlewares/set-global-context-language.js +14 -0
  468. package/src/middlewares/set-global-context-language.js.map +1 -0
  469. package/src/middlewares.d.ts +8 -0
  470. package/src/middlewares.d.ts.map +1 -0
  471. package/src/middlewares.js +89 -0
  472. package/src/middlewares.js.map +1 -0
  473. package/src/model-registry.d.ts +23 -0
  474. package/src/model-registry.d.ts.map +1 -0
  475. package/src/model-registry.js +47 -0
  476. package/src/model-registry.js.map +1 -0
  477. package/src/models/email-token.d.ts +35 -11
  478. package/src/models/email-token.d.ts.map +1 -0
  479. package/src/models/email-token.js +11 -0
  480. package/src/models/email-token.js.map +1 -0
  481. package/src/models/{index.ts → index.d.ts} +1 -0
  482. package/src/models/index.d.ts.map +1 -0
  483. package/src/models/index.js +10 -0
  484. package/src/models/index.js.map +1 -0
  485. package/src/models/mnemonic.d.ts +35 -11
  486. package/src/models/mnemonic.d.ts.map +1 -0
  487. package/src/models/mnemonic.js +11 -0
  488. package/src/models/mnemonic.js.map +1 -0
  489. package/src/models/role.d.ts +35 -11
  490. package/src/models/role.d.ts.map +1 -0
  491. package/src/models/role.js +11 -0
  492. package/src/models/role.js.map +1 -0
  493. package/src/models/used-direct-login-token.d.ts +35 -11
  494. package/src/models/used-direct-login-token.d.ts.map +1 -0
  495. package/src/models/used-direct-login-token.js +11 -0
  496. package/src/models/used-direct-login-token.js.map +1 -0
  497. package/src/models/user-role.d.ts +3 -10
  498. package/src/models/user-role.d.ts.map +1 -0
  499. package/src/models/user-role.js +10 -0
  500. package/src/models/user-role.js.map +1 -0
  501. package/src/models/user.d.ts +3 -16
  502. package/src/models/user.d.ts.map +1 -0
  503. package/src/models/user.js +11 -0
  504. package/src/models/user.js.map +1 -0
  505. package/src/pipeline/{index.ts → index.d.ts} +1 -0
  506. package/src/pipeline/index.d.ts.map +1 -0
  507. package/src/pipeline/index.js +5 -0
  508. package/src/pipeline/index.js.map +1 -0
  509. package/src/pipeline/pipeline-builder.d.ts +8 -0
  510. package/src/pipeline/pipeline-builder.d.ts.map +1 -0
  511. package/src/pipeline/pipeline-builder.js +18 -0
  512. package/src/pipeline/pipeline-builder.js.map +1 -0
  513. package/src/plugins/{index.ts → index.d.ts} +1 -0
  514. package/src/plugins/index.d.ts.map +1 -0
  515. package/src/plugins/index.js +6 -0
  516. package/src/plugins/index.js.map +1 -0
  517. package/src/plugins/plugin-interface.d.ts +8 -0
  518. package/src/plugins/plugin-interface.d.ts.map +1 -0
  519. package/src/plugins/plugin-interface.js +3 -0
  520. package/src/plugins/plugin-interface.js.map +1 -0
  521. package/src/plugins/plugin-manager.d.ts +12 -0
  522. package/src/plugins/plugin-manager.d.ts.map +1 -0
  523. package/src/plugins/plugin-manager.js +37 -0
  524. package/src/plugins/plugin-manager.js.map +1 -0
  525. package/src/registry/email-service-registry.d.ts +27 -0
  526. package/src/registry/email-service-registry.d.ts.map +1 -0
  527. package/src/registry/email-service-registry.js +42 -0
  528. package/src/registry/email-service-registry.js.map +1 -0
  529. package/src/registry/{index.ts → index.d.ts} +1 -0
  530. package/src/registry/index.d.ts.map +1 -0
  531. package/src/registry/index.js +6 -0
  532. package/src/registry/index.js.map +1 -0
  533. package/src/responses/{index.ts → index.d.ts} +1 -0
  534. package/src/responses/index.d.ts.map +1 -0
  535. package/src/responses/index.js +5 -0
  536. package/src/responses/index.js.map +1 -0
  537. package/src/responses/response-builder.d.ts +24 -0
  538. package/src/responses/response-builder.d.ts.map +1 -0
  539. package/src/responses/response-builder.js +63 -0
  540. package/src/responses/response-builder.js.map +1 -0
  541. package/src/routers/api.d.ts +28 -0
  542. package/src/routers/api.d.ts.map +1 -0
  543. package/src/routers/api.js +80 -0
  544. package/src/routers/api.js.map +1 -0
  545. package/src/routers/app.d.ts +32 -0
  546. package/src/routers/app.d.ts.map +1 -0
  547. package/src/routers/app.js +228 -0
  548. package/src/routers/app.js.map +1 -0
  549. package/src/routers/base.d.ts +8 -0
  550. package/src/routers/base.d.ts.map +1 -0
  551. package/src/routers/base.js +14 -0
  552. package/src/routers/base.js.map +1 -0
  553. package/src/routers/{index.ts → index.d.ts} +1 -0
  554. package/src/routers/index.d.ts.map +1 -0
  555. package/src/routers/index.js +7 -0
  556. package/src/routers/index.js.map +1 -0
  557. package/src/routers/router-config.d.ts +18 -0
  558. package/src/routers/router-config.d.ts.map +1 -0
  559. package/src/routers/router-config.js +8 -0
  560. package/src/routers/router-config.js.map +1 -0
  561. package/src/routing/index.d.ts +2 -0
  562. package/src/routing/index.d.ts.map +1 -0
  563. package/src/routing/index.js +5 -0
  564. package/src/routing/index.js.map +1 -0
  565. package/src/routing/route-builder.d.ts +36 -0
  566. package/src/routing/route-builder.d.ts.map +1 -0
  567. package/src/routing/route-builder.js +86 -0
  568. package/src/routing/route-builder.js.map +1 -0
  569. package/src/schemas/email-token.d.ts +47 -13
  570. package/src/schemas/email-token.d.ts.map +1 -0
  571. package/src/schemas/email-token.js +55 -0
  572. package/src/schemas/email-token.js.map +1 -0
  573. package/src/schemas/{index.ts → index.d.ts} +1 -0
  574. package/src/schemas/index.d.ts.map +1 -0
  575. package/src/schemas/index.js +11 -0
  576. package/src/schemas/index.js.map +1 -0
  577. package/src/schemas/mnemonic.d.ts +26 -10
  578. package/src/schemas/mnemonic.d.ts.map +1 -0
  579. package/src/schemas/mnemonic.js +31 -0
  580. package/src/schemas/mnemonic.js.map +1 -0
  581. package/src/schemas/role.d.ts +40 -13
  582. package/src/schemas/role.d.ts.map +1 -0
  583. package/src/schemas/role.js +88 -0
  584. package/src/schemas/role.js.map +1 -0
  585. package/src/schemas/schema.d.ts +42 -0
  586. package/src/schemas/schema.d.ts.map +1 -0
  587. package/src/schemas/schema.js +70 -0
  588. package/src/schemas/schema.js.map +1 -0
  589. package/src/schemas/used-direct-login-token.d.ts +35 -12
  590. package/src/schemas/used-direct-login-token.d.ts.map +1 -0
  591. package/src/schemas/used-direct-login-token.js +24 -0
  592. package/src/schemas/used-direct-login-token.js.map +1 -0
  593. package/src/schemas/user-role.d.ts +37 -12
  594. package/src/schemas/user-role.d.ts.map +1 -0
  595. package/src/schemas/user-role.js +55 -0
  596. package/src/schemas/user-role.js.map +1 -0
  597. package/src/schemas/user.d.ts +23 -18
  598. package/src/schemas/user.d.ts.map +1 -0
  599. package/src/schemas/user.js +194 -0
  600. package/src/schemas/user.js.map +1 -0
  601. package/src/services/backup-code.d.ts +76 -0
  602. package/src/services/backup-code.d.ts.map +1 -0
  603. package/src/services/backup-code.js +185 -0
  604. package/src/services/backup-code.js.map +1 -0
  605. package/src/services/base.d.ts +10 -0
  606. package/src/services/base.d.ts.map +1 -0
  607. package/src/services/base.js +15 -0
  608. package/src/services/base.js.map +1 -0
  609. package/src/services/checksum.d.ts +69 -0
  610. package/src/services/checksum.d.ts.map +1 -0
  611. package/src/services/checksum.js +145 -0
  612. package/src/services/checksum.js.map +1 -0
  613. package/src/services/crc.d.ts +87 -0
  614. package/src/services/crc.d.ts.map +1 -0
  615. package/src/services/crc.js +198 -0
  616. package/src/services/crc.js.map +1 -0
  617. package/src/services/database-initialization.d.ts +103 -0
  618. package/src/services/database-initialization.d.ts.map +1 -0
  619. package/src/services/database-initialization.js +817 -0
  620. package/src/services/database-initialization.js.map +1 -0
  621. package/src/services/{db-init-cache.ts → db-init-cache.d.ts} +5 -11
  622. package/src/services/db-init-cache.d.ts.map +1 -0
  623. package/src/services/db-init-cache.js +3 -0
  624. package/src/services/db-init-cache.js.map +1 -0
  625. package/src/services/direct-login-token.d.ts +6 -0
  626. package/src/services/direct-login-token.d.ts.map +1 -0
  627. package/src/services/direct-login-token.js +41 -0
  628. package/src/services/direct-login-token.js.map +1 -0
  629. package/src/services/dummy-email-service.d.ts +10 -0
  630. package/src/services/dummy-email-service.d.ts.map +1 -0
  631. package/src/services/dummy-email-service.js +16 -0
  632. package/src/services/dummy-email-service.js.map +1 -0
  633. package/src/services/fec-usage-example.d.ts +38 -0
  634. package/src/services/fec-usage-example.d.ts.map +1 -0
  635. package/src/services/fec-usage-example.js +75 -0
  636. package/src/services/fec-usage-example.js.map +1 -0
  637. package/src/services/fec.d.ts +46 -0
  638. package/src/services/fec.d.ts.map +1 -0
  639. package/src/services/fec.js +214 -0
  640. package/src/services/fec.js.map +1 -0
  641. package/src/services/{index.ts → index.d.ts} +1 -0
  642. package/src/services/index.d.ts.map +1 -0
  643. package/src/services/index.js +23 -0
  644. package/src/services/index.js.map +1 -0
  645. package/src/services/jwt.d.ts +30 -0
  646. package/src/services/jwt.d.ts.map +1 -0
  647. package/src/services/jwt.js +90 -0
  648. package/src/services/jwt.js.map +1 -0
  649. package/src/services/key-wrapping.d.ts +61 -0
  650. package/src/services/key-wrapping.d.ts.map +1 -0
  651. package/src/services/key-wrapping.js +310 -0
  652. package/src/services/key-wrapping.js.map +1 -0
  653. package/src/services/mnemonic.d.ts +61 -0
  654. package/src/services/mnemonic.d.ts.map +1 -0
  655. package/src/services/mnemonic.js +114 -0
  656. package/src/services/mnemonic.js.map +1 -0
  657. package/src/services/request-user.d.ts +23 -0
  658. package/src/services/request-user.d.ts.map +1 -0
  659. package/src/services/request-user.js +66 -0
  660. package/src/services/request-user.js.map +1 -0
  661. package/src/services/role.d.ts +86 -0
  662. package/src/services/role.d.ts.map +1 -0
  663. package/src/services/role.js +285 -0
  664. package/src/services/role.js.map +1 -0
  665. package/src/services/symmetric.d.ts +42 -0
  666. package/src/services/symmetric.d.ts.map +1 -0
  667. package/src/services/symmetric.js +101 -0
  668. package/src/services/symmetric.js.map +1 -0
  669. package/src/services/system-user.d.ts +17 -0
  670. package/src/services/system-user.d.ts.map +1 -0
  671. package/src/services/system-user.js +46 -0
  672. package/src/services/system-user.js.map +1 -0
  673. package/src/services/user.d.ts +349 -0
  674. package/src/services/user.d.ts.map +1 -0
  675. package/src/services/user.js +1452 -0
  676. package/src/services/user.js.map +1 -0
  677. package/src/services/xor.d.ts +24 -0
  678. package/src/services/xor.d.ts.map +1 -0
  679. package/src/services/xor.js +37 -0
  680. package/src/services/xor.js.map +1 -0
  681. package/src/testing.d.ts +3 -0
  682. package/src/testing.d.ts.map +1 -0
  683. package/src/testing.js +7 -0
  684. package/src/testing.js.map +1 -0
  685. package/src/transactions/{index.ts → index.d.ts} +1 -0
  686. package/src/transactions/index.d.ts.map +1 -0
  687. package/src/transactions/index.js +5 -0
  688. package/src/transactions/index.js.map +1 -0
  689. package/src/transactions/transaction-manager.d.ts +12 -0
  690. package/src/transactions/transaction-manager.d.ts.map +1 -0
  691. package/src/transactions/transaction-manager.js +30 -0
  692. package/src/transactions/transaction-manager.js.map +1 -0
  693. package/src/types/{app-config.ts → app-config.d.ts} +9 -10
  694. package/src/types/app-config.d.ts.map +1 -0
  695. package/src/types/app-config.js +3 -0
  696. package/src/types/app-config.js.map +1 -0
  697. package/src/types/{controller-config.ts → controller-config.d.ts} +7 -8
  698. package/src/types/controller-config.d.ts.map +1 -0
  699. package/src/types/controller-config.js +3 -0
  700. package/src/types/controller-config.js.map +1 -0
  701. package/src/types/{environment-variables.ts → environment-variables.d.ts} +5 -26
  702. package/src/types/environment-variables.d.ts.map +1 -0
  703. package/src/types/environment-variables.js +39 -0
  704. package/src/types/environment-variables.js.map +1 -0
  705. package/src/types/id-converters.d.ts +28 -0
  706. package/src/types/id-converters.d.ts.map +1 -0
  707. package/src/types/id-converters.js +45 -0
  708. package/src/types/id-converters.js.map +1 -0
  709. package/src/types/{index.ts → index.d.ts} +1 -0
  710. package/src/types/index.d.ts.map +1 -0
  711. package/src/types/index.js +6 -0
  712. package/src/types/index.js.map +1 -0
  713. package/src/types/{mongoose-helpers.ts → mongoose-helpers.d.ts} +2 -2
  714. package/src/types/mongoose-helpers.d.ts.map +1 -0
  715. package/src/types/mongoose-helpers.js +6 -0
  716. package/src/types/mongoose-helpers.js.map +1 -0
  717. package/src/types.d.ts +68 -40
  718. package/src/types.d.ts.map +1 -0
  719. package/src/types.js +14 -0
  720. package/src/types.js.map +1 -0
  721. package/src/utils.d.ts +210 -0
  722. package/src/utils.d.ts.map +1 -0
  723. package/src/utils.js +819 -0
  724. package/src/utils.js.map +1 -0
  725. package/src/validation/{index.ts → index.d.ts} +1 -0
  726. package/src/validation/index.d.ts.map +1 -0
  727. package/src/validation/index.js +5 -0
  728. package/src/validation/index.js.map +1 -0
  729. package/src/validation/validation-builder.d.ts +32 -0
  730. package/src/validation/validation-builder.d.ts.map +1 -0
  731. package/src/validation/validation-builder.js +81 -0
  732. package/src/validation/validation-builder.js.map +1 -0
  733. package/LICENSE +0 -21
  734. package/src/__tests__/fixtures/index.ts +0 -1
  735. package/src/__tests__/fixtures/model-mocks.mock.ts +0 -122
  736. package/src/__tests__/helpers/application.mock.ts +0 -90
  737. package/src/__tests__/helpers/setup-test-env.ts +0 -163
  738. package/src/__tests__/index.ts +0 -2
  739. package/src/application-base.ts +0 -520
  740. package/src/application-concrete.ts +0 -32
  741. package/src/application.ts +0 -321
  742. package/src/backup-code.ts +0 -348
  743. package/src/builders/application-builder.ts +0 -94
  744. package/src/constants.ts +0 -83
  745. package/src/container/service-container.ts +0 -39
  746. package/src/container/service-definitions.ts +0 -11
  747. package/src/controllers/base.ts +0 -496
  748. package/src/controllers/user.ts +0 -1687
  749. package/src/decorators/base-controller.ts +0 -77
  750. package/src/decorators/controller.ts +0 -140
  751. package/src/decorators/zod-validation.ts +0 -57
  752. package/src/defaults.ts +0 -249
  753. package/src/documents/base.ts +0 -10
  754. package/src/enumerations/base-model-name.ts +0 -41
  755. package/src/enumerations/length-encoding-type.ts +0 -6
  756. package/src/enumerations/schema-collection.ts +0 -33
  757. package/src/enumerations/symmetric-error-type.ts +0 -4
  758. package/src/environment.ts +0 -836
  759. package/src/errors/express-validation.ts +0 -21
  760. package/src/errors/invalid-backup-code-version.ts +0 -15
  761. package/src/errors/invalid-jwt-token.ts +0 -11
  762. package/src/errors/invalid-model.ts +0 -11
  763. package/src/errors/invalid-new-password.ts +0 -18
  764. package/src/errors/invalid-password.ts +0 -13
  765. package/src/errors/missing-validated-data.ts +0 -36
  766. package/src/errors/mnemonic-or-password-required.ts +0 -13
  767. package/src/errors/model-not-registered.ts +0 -11
  768. package/src/errors/mongoose-validation.ts +0 -36
  769. package/src/errors/symmetric.ts +0 -38
  770. package/src/errors/token-expired.ts +0 -11
  771. package/src/get-language.ts +0 -53
  772. package/src/get-timezone.ts +0 -61
  773. package/src/interfaces/api-express-validation-error-response.ts +0 -8
  774. package/src/interfaces/api-message-response.ts +0 -3
  775. package/src/interfaces/api-responses/user-settings-response.ts +0 -12
  776. package/src/interfaces/application.ts +0 -16
  777. package/src/interfaces/backend-objects/email-token.ts +0 -11
  778. package/src/interfaces/backend-objects/request-user.ts +0 -8
  779. package/src/interfaces/backend-objects/user.ts +0 -7
  780. package/src/interfaces/checksum-config.ts +0 -4
  781. package/src/interfaces/checksum-consts.ts +0 -13
  782. package/src/interfaces/constants.ts +0 -103
  783. package/src/interfaces/controller-config.ts +0 -27
  784. package/src/interfaces/create-user-basics.ts +0 -17
  785. package/src/interfaces/csp-config.ts +0 -16
  786. package/src/interfaces/csp-definition.ts +0 -53
  787. package/src/interfaces/deep-partial.ts +0 -3
  788. package/src/interfaces/email-service.ts +0 -8
  789. package/src/interfaces/environment-mongo.ts +0 -76
  790. package/src/interfaces/environment.ts +0 -185
  791. package/src/interfaces/failable-result.ts +0 -6
  792. package/src/interfaces/fec-consts.ts +0 -4
  793. package/src/interfaces/flexible-csp.ts +0 -18
  794. package/src/interfaces/handleable-error-options.ts +0 -6
  795. package/src/interfaces/jwt-consts.ts +0 -23
  796. package/src/interfaces/jwt-sign-response.ts +0 -19
  797. package/src/interfaces/mongo-errors.ts +0 -5
  798. package/src/interfaces/request-user.ts +0 -66
  799. package/src/interfaces/required-string-keys.ts +0 -26
  800. package/src/interfaces/schema.ts +0 -31
  801. package/src/interfaces/server-init-result.ts +0 -38
  802. package/src/interfaces/status-code-response.ts +0 -7
  803. package/src/interfaces/symmetric-encryption-results.ts +0 -4
  804. package/src/middlewares/authenticate-crypto.ts +0 -216
  805. package/src/middlewares/authenticate-token.ts +0 -150
  806. package/src/middlewares/cleanup-crypto.ts +0 -37
  807. package/src/middlewares/set-global-context-language.ts +0 -24
  808. package/src/middlewares.ts +0 -105
  809. package/src/model-registry.ts +0 -75
  810. package/src/models/email-token.ts +0 -16
  811. package/src/models/mnemonic.ts +0 -16
  812. package/src/models/role.ts +0 -16
  813. package/src/models/used-direct-login-token.ts +0 -16
  814. package/src/models/user-role.ts +0 -14
  815. package/src/models/user.ts +0 -16
  816. package/src/pipeline/pipeline-builder.ts +0 -18
  817. package/src/plugins/plugin-interface.ts +0 -8
  818. package/src/plugins/plugin-manager.ts +0 -40
  819. package/src/registry/email-service-registry.ts +0 -53
  820. package/src/responses/response-builder.ts +0 -86
  821. package/src/routers/api.ts +0 -168
  822. package/src/routers/app.ts +0 -340
  823. package/src/routers/base.ts +0 -17
  824. package/src/routers/router-config.ts +0 -16
  825. package/src/routing/index.ts +0 -1
  826. package/src/routing/route-builder.ts +0 -126
  827. package/src/schemas/email-token.ts +0 -97
  828. package/src/schemas/mnemonic.ts +0 -39
  829. package/src/schemas/role.ts +0 -132
  830. package/src/schemas/schema.ts +0 -150
  831. package/src/schemas/used-direct-login-token.ts +0 -44
  832. package/src/schemas/user-role.ts +0 -81
  833. package/src/schemas/user.ts +0 -224
  834. package/src/services/backup-code.ts +0 -321
  835. package/src/services/base.ts +0 -35
  836. package/src/services/checksum.ts +0 -167
  837. package/src/services/crc.ts +0 -213
  838. package/src/services/database-initialization.ts +0 -1564
  839. package/src/services/direct-login-token.ts +0 -62
  840. package/src/services/dummy-email-service.ts +0 -20
  841. package/src/services/fec-usage-example.ts +0 -102
  842. package/src/services/fec.ts +0 -355
  843. package/src/services/jwt.ts +0 -133
  844. package/src/services/key-wrapping.ts +0 -449
  845. package/src/services/mnemonic.ts +0 -166
  846. package/src/services/request-user.ts +0 -99
  847. package/src/services/role.ts +0 -410
  848. package/src/services/symmetric.ts +0 -139
  849. package/src/services/system-user.ts +0 -79
  850. package/src/services/user.ts +0 -2279
  851. package/src/services/xor.ts +0 -34
  852. package/src/testing.ts +0 -3
  853. package/src/transactions/transaction-manager.ts +0 -37
  854. package/src/types/id-converters.ts +0 -53
  855. package/src/types/mongoose-override.d.ts +0 -1
  856. package/src/types/mongoose.d.ts +0 -1
  857. package/src/types.ts +0 -130
  858. package/src/utils.ts +0 -1081
  859. package/src/validation/validation-builder.ts +0 -94
@@ -1,1687 +0,0 @@
1
- /// <reference path="../types.d.ts" />
2
-
3
- import { ECIES, SecureString, UINT64_SIZE } from '@digitaldefiance/ecies-lib';
4
- import {
5
- CoreLanguageCode,
6
- HandleableError,
7
- isValidTimezone,
8
- LanguageCodes,
9
- } from '@digitaldefiance/i18n-lib';
10
- import {
11
- Member as BackendMember,
12
- ECIESService,
13
- } from '@digitaldefiance/node-ecies-lib';
14
- import {
15
- AccountStatus,
16
- EmailTokenType,
17
- GenericValidationError,
18
- getSuiteCoreTranslation,
19
- ITokenRole,
20
- ITokenUser,
21
- IUserBase,
22
- SuiteCoreStringKey,
23
- UsernameOrEmailRequiredError,
24
- } from '@digitaldefiance/suite-core-lib';
25
- import type { NextFunction, Request, Response } from 'express';
26
- import { body } from 'express-validator';
27
- import { Types } from '@digitaldefiance/mongoose-types';
28
- import { z } from 'zod';
29
- import { BackupCode } from '../backup-code';
30
- import { DecoratorBaseController } from '../decorators/base-controller';
31
- import { Controller, Get, Post } from '../decorators/controller';
32
- import { IUserDocument } from '../documents/user';
33
- import { BaseModelName } from '../enumerations/base-model-name';
34
- import { MnemonicOrPasswordRequiredError } from '../errors/mnemonic-or-password-required';
35
- import {
36
- IApiChallengeResponse,
37
- IApiCodeCountResponse,
38
- IApiLoginResponse,
39
- IApiMessageResponse,
40
- IApiMnemonicResponse,
41
- IApiRegistrationResponse,
42
- IApiRequestUserResponse,
43
- IApiUserSettingsResponse,
44
- } from '../interfaces';
45
- import { IApiBackupCodesResponse } from '../interfaces/api-responses/backup-codes-response';
46
- import type { IApplication } from '../interfaces/application';
47
- import { IStatusCodeResponse } from '../interfaces/status-code-response';
48
- import { findAuthToken } from '../middlewares/authenticate-token';
49
- import { BackupCodeService } from '../services/backup-code';
50
- import { JwtService } from '../services/jwt';
51
- import { RequestUserService } from '../services/request-user';
52
- import { RoleService } from '../services/role';
53
- import { SystemUserService } from '../services/system-user';
54
- import { UserService } from '../services/user';
55
- import { ApiErrorResponse } from '../types';
56
- import { requireValidatedFieldsAsync, withTransaction } from '../utils';
57
-
58
- const isString = (v: unknown): v is string => typeof v === 'string';
59
-
60
- const RegisterSchema = z.object({
61
- username: z.string(),
62
- email: z.string(),
63
- timezone: z.string(),
64
- password: z.string().min(8).optional(),
65
- });
66
-
67
- const EmailLoginChallengeSchema = z.object({
68
- token: z.string(),
69
- signature: z.string(),
70
- email: z.string().optional(),
71
- username: z.string().optional(),
72
- });
73
-
74
- const DirectLoginChallengeSchema = z.object({
75
- challenge: z.string(),
76
- signature: z.string(),
77
- email: z.string().optional(),
78
- username: z.string().optional(),
79
- });
80
-
81
- @Controller()
82
- export class UserController<
83
- I extends Types.ObjectId | string = Types.ObjectId,
84
- D extends Date = Date,
85
- S extends string = string,
86
- A extends string = string,
87
- TUser extends IUserBase<I, D, S, A> = IUserBase<I, D, S, A>,
88
- TTokenRole extends ITokenRole<I, D> = ITokenRole<I, D>,
89
- TTokenUser extends ITokenUser = ITokenUser,
90
- TApplication extends IApplication = IApplication,
91
- TLanguage extends CoreLanguageCode = CoreLanguageCode,
92
- > extends DecoratorBaseController<TLanguage> {
93
- protected readonly userService: UserService<
94
- any,
95
- I,
96
- D,
97
- S,
98
- A,
99
- any,
100
- any,
101
- any,
102
- TUser,
103
- TTokenRole,
104
- TApplication
105
- >;
106
- protected readonly jwtService: JwtService<
107
- I,
108
- D,
109
- TTokenRole,
110
- TTokenUser,
111
- TApplication
112
- >;
113
- protected readonly backupCodeService: BackupCodeService<
114
- I,
115
- D,
116
- TTokenRole,
117
- TApplication
118
- >;
119
- protected readonly roleService: RoleService<I, D, TTokenRole>;
120
- protected readonly eciesService: ECIESService;
121
- protected readonly systemUser: BackendMember;
122
-
123
- constructor(
124
- application: IApplication,
125
- jwtService: JwtService<I, D, TTokenRole, TTokenUser, TApplication>,
126
- userService: UserService<
127
- any,
128
- I,
129
- D,
130
- S,
131
- A,
132
- any,
133
- any,
134
- any,
135
- TUser,
136
- TTokenRole,
137
- TApplication
138
- >,
139
- backupCodeService: BackupCodeService<I, D, TTokenRole, TApplication>,
140
- roleService: RoleService<I, D, TTokenRole>,
141
- eciesService: ECIESService,
142
- ) {
143
- super(application);
144
- this.jwtService = jwtService;
145
- this.userService = userService;
146
- this.backupCodeService = backupCodeService;
147
- this.roleService = roleService;
148
- this.eciesService = eciesService;
149
- this.systemUser = SystemUserService.getSystemUser(
150
- application.environment,
151
- application.constants,
152
- );
153
- }
154
-
155
- @Get('/verify', { auth: true })
156
- async tokenVerifiedResponse(
157
- req: Request,
158
- res: Response,
159
- next: NextFunction,
160
- ): Promise<IStatusCodeResponse<IApiRequestUserResponse | ApiErrorResponse>> {
161
- if (!req.user) {
162
- throw new HandleableError(
163
- new Error(
164
- getSuiteCoreTranslation(SuiteCoreStringKey.Common_NoUserOnRequest),
165
- ),
166
- {
167
- statusCode: 401,
168
- },
169
- );
170
- }
171
- const user = {
172
- id: req.user.id,
173
- email: req.user.email,
174
- username: req.user.username,
175
- roles: req.user.roles || [],
176
- rolePrivileges: req.user.rolePrivileges,
177
- timezone: req.user.timezone,
178
- currency: req.user.currency,
179
- emailVerified: req.user.emailVerified,
180
- darkMode: req.user.darkMode,
181
- siteLanguage: req.user.siteLanguage,
182
- directChallenge: req.user.directChallenge,
183
- ...(req.user.lastLogin && { lastLogin: req.user.lastLogin }),
184
- };
185
- return {
186
- statusCode: 200,
187
- response: {
188
- message: getSuiteCoreTranslation(
189
- SuiteCoreStringKey.Validation_TokenValid,
190
- ),
191
- user,
192
- },
193
- };
194
- }
195
-
196
- @Get('/refresh-token', { auth: true })
197
- async refreshToken(
198
- req: Request,
199
- res: Response,
200
- next: NextFunction,
201
- ): Promise<IStatusCodeResponse<IApiLoginResponse | ApiErrorResponse>> {
202
- const token = findAuthToken(req.headers);
203
- if (!token) {
204
- throw new GenericValidationError(
205
- getSuiteCoreTranslation(SuiteCoreStringKey.Validation_TokenMissing),
206
- );
207
- }
208
-
209
- const tokenUser = await this.jwtService.verifyToken(token);
210
- if (!tokenUser) {
211
- throw new GenericValidationError(
212
- getSuiteCoreTranslation(SuiteCoreStringKey.Validation_TokenInvalid),
213
- );
214
- }
215
-
216
- const UserModel = this.application.getModel<IUserDocument<string, I>>(
217
- BaseModelName.User,
218
- );
219
- const userDoc = await UserModel.findById(tokenUser.userId).select(
220
- '-password',
221
- );
222
- if (!userDoc || userDoc.accountStatus !== AccountStatus.Active) {
223
- throw new GenericValidationError(
224
- getSuiteCoreTranslation(SuiteCoreStringKey.Validation_UserNotFound),
225
- );
226
- }
227
- const { token: newToken, roles } = await this.jwtService.signToken(
228
- userDoc,
229
- this.application.environment.jwtSecret,
230
- (req.user?.siteLanguage as string) ?? LanguageCodes.EN_US,
231
- );
232
-
233
- return {
234
- statusCode: 200,
235
- response: {
236
- message: getSuiteCoreTranslation(SuiteCoreStringKey.TokenRefreshed),
237
- user: RequestUserService.makeRequestUserDTO(userDoc, roles),
238
- token: newToken,
239
- serverPublicKey: this.application.environment.systemPublicKeyHex ?? '',
240
- },
241
- headers: {
242
- Authorization: `Bearer ${newToken}`,
243
- },
244
- };
245
- }
246
-
247
- @Post('/register', {
248
- schema: RegisterSchema,
249
- validation: function (validationLanguage: TLanguage) {
250
- const constants = this.constants;
251
- return [
252
- body('username')
253
- .matches(constants.UsernameRegex)
254
- .withMessage(
255
- getSuiteCoreTranslation(
256
- SuiteCoreStringKey.Validation_UsernameRegexErrorTemplate,
257
- undefined,
258
- validationLanguage,
259
- ),
260
- ),
261
- body('email')
262
- .isEmail()
263
- .withMessage(
264
- getSuiteCoreTranslation(
265
- SuiteCoreStringKey.Validation_InvalidEmail,
266
- undefined,
267
- validationLanguage,
268
- ),
269
- ),
270
- body('timezone')
271
- .isString()
272
- .custom((value) => isValidTimezone(value))
273
- .withMessage(
274
- getSuiteCoreTranslation(
275
- SuiteCoreStringKey.Validation_TimezoneInvalid,
276
- undefined,
277
- validationLanguage,
278
- ),
279
- ),
280
- body('password')
281
- .optional()
282
- .matches(constants.PasswordRegex)
283
- .withMessage(
284
- getSuiteCoreTranslation(
285
- SuiteCoreStringKey.Validation_PasswordRegexErrorTemplate,
286
- ),
287
- ),
288
- ];
289
- },
290
- })
291
- async register(
292
- req: Request,
293
- res: Response,
294
- next: NextFunction,
295
- ): Promise<IStatusCodeResponse<IApiRegistrationResponse | ApiErrorResponse>> {
296
- return await withTransaction(
297
- this.application.db.connection,
298
- this.application.environment.mongo.useTransactions,
299
- undefined,
300
- async (sess) => {
301
- return await requireValidatedFieldsAsync(
302
- req,
303
- RegisterSchema,
304
- async ({ username, email, timezone, password }) => {
305
- if (
306
- !isString(username) ||
307
- !isString(email) ||
308
- !isString(timezone)
309
- ) {
310
- throw new GenericValidationError(
311
- getSuiteCoreTranslation(
312
- SuiteCoreStringKey.Validation_MissingValidatedData,
313
- ),
314
- );
315
- }
316
-
317
- const { user, mnemonic, backupCodes } =
318
- await this.userService.newUser(
319
- this.systemUser,
320
- {
321
- username: username.trim(),
322
- email: email.trim(),
323
- timezone: timezone,
324
- },
325
- undefined,
326
- undefined,
327
- sess,
328
- this.application.environment.debug,
329
- password as string | undefined,
330
- );
331
-
332
- await this.userService.createAndSendEmailToken(
333
- user,
334
- EmailTokenType.AccountVerification,
335
- sess,
336
- this.application.environment.debug,
337
- );
338
-
339
- return {
340
- statusCode: 201,
341
- response: {
342
- message: getSuiteCoreTranslation(
343
- SuiteCoreStringKey.Registration_Success,
344
- { MNEMONIC: mnemonic },
345
- ),
346
- mnemonic,
347
- backupCodes,
348
- },
349
- };
350
- },
351
- );
352
- },
353
- {
354
- timeoutMs: this.application.environment.mongo.transactionTimeout * 30,
355
- },
356
- );
357
- }
358
-
359
- @Post('/account-verification', {
360
- validation: function (validationLanguage: TLanguage) {
361
- const constants = this.constants;
362
- return [
363
- body('token')
364
- .not()
365
- .isEmpty()
366
- .withMessage(
367
- getSuiteCoreTranslation(
368
- SuiteCoreStringKey.Validation_TokenRequired,
369
- undefined,
370
- validationLanguage,
371
- ),
372
- )
373
- .matches(new RegExp(`^[a-f0-9]{${constants.EmailTokenLength * 2}}$`))
374
- .withMessage(
375
- getSuiteCoreTranslation(
376
- SuiteCoreStringKey.Validation_InvalidToken,
377
- undefined,
378
- validationLanguage,
379
- ),
380
- ),
381
- ];
382
- },
383
- })
384
- async completeAccountVerification(
385
- req: Request,
386
- res: Response,
387
- next: NextFunction,
388
- ): Promise<IStatusCodeResponse<IApiMessageResponse | ApiErrorResponse>> {
389
- const { token } = this.validatedBody;
390
-
391
- return await withTransaction(
392
- this.application.db.connection,
393
- this.application.environment.mongo.useTransactions,
394
- undefined,
395
- async (sess) => {
396
- await this.userService.verifyAccountTokenAndComplete(
397
- token as string,
398
- sess,
399
- );
400
- return {
401
- statusCode: 200,
402
- response: {
403
- message: getSuiteCoreTranslation(
404
- SuiteCoreStringKey.EmailVerification_Success,
405
- ),
406
- },
407
- };
408
- },
409
- );
410
- }
411
-
412
- @Post('/language', {
413
- auth: true,
414
- validation: function (validationLanguage: TLanguage) {
415
- return [
416
- body('language')
417
- .isString()
418
- .withMessage(
419
- getSuiteCoreTranslation(
420
- SuiteCoreStringKey.Validation_InvalidLanguage,
421
- undefined,
422
- validationLanguage,
423
- ),
424
- )
425
- .isIn(Object.values(LanguageCodes))
426
- .withMessage(
427
- getSuiteCoreTranslation(
428
- SuiteCoreStringKey.Validation_InvalidLanguage,
429
- undefined,
430
- validationLanguage,
431
- ),
432
- ),
433
- ];
434
- },
435
- })
436
- async setLanguage(
437
- req: Request,
438
- res: Response,
439
- next: NextFunction,
440
- ): Promise<IStatusCodeResponse<IApiRequestUserResponse | ApiErrorResponse>> {
441
- return await withTransaction(
442
- this.application.db.connection,
443
- this.application.environment.mongo.useTransactions,
444
- undefined,
445
- async (sess) => {
446
- const { language } = this.validatedBody;
447
- if (!req.user) {
448
- throw new HandleableError(
449
- new Error(
450
- getSuiteCoreTranslation(
451
- SuiteCoreStringKey.Common_NoUserOnRequest,
452
- ),
453
- ),
454
- { statusCode: 401 },
455
- );
456
- }
457
-
458
- const user = await this.userService.updateSiteLanguage(
459
- req.user.id,
460
- language as string,
461
- sess,
462
- );
463
-
464
- return {
465
- statusCode: 200,
466
- response: {
467
- message: getSuiteCoreTranslation(
468
- SuiteCoreStringKey.LanguageUpdate_Success,
469
- ),
470
- user,
471
- },
472
- };
473
- },
474
- );
475
- }
476
-
477
- @Post('/dark-mode', {
478
- auth: true,
479
- validation: function (validationLanguage: TLanguage) {
480
- return [
481
- body('darkMode')
482
- .isBoolean()
483
- .withMessage(
484
- getSuiteCoreTranslation(
485
- SuiteCoreStringKey.Validation_Required,
486
- undefined,
487
- validationLanguage,
488
- ),
489
- ),
490
- ];
491
- },
492
- })
493
- async setDarkMode(
494
- req: Request,
495
- res: Response,
496
- next: NextFunction,
497
- ): Promise<IStatusCodeResponse<IApiRequestUserResponse | ApiErrorResponse>> {
498
- return await withTransaction(
499
- this.application.db.connection,
500
- this.application.environment.mongo.useTransactions,
501
- undefined,
502
- async (sess) => {
503
- const { darkMode } = this.validatedBody;
504
- if (!req.user) {
505
- throw new HandleableError(
506
- new Error(
507
- getSuiteCoreTranslation(
508
- SuiteCoreStringKey.Common_NoUserOnRequest,
509
- ),
510
- ),
511
- { statusCode: 401 },
512
- );
513
- }
514
-
515
- const user = await this.userService.updateDarkMode(
516
- req.user.id,
517
- darkMode as boolean,
518
- sess,
519
- );
520
-
521
- return {
522
- statusCode: 200,
523
- response: {
524
- message: getSuiteCoreTranslation(
525
- SuiteCoreStringKey.Settings_DarkModeSuccess,
526
- ),
527
- user,
528
- },
529
- };
530
- },
531
- );
532
- }
533
-
534
- @Get('/settings', { auth: true })
535
- async getSettings(
536
- req: Request,
537
- res: Response,
538
- next: NextFunction,
539
- ): Promise<IStatusCodeResponse<IApiUserSettingsResponse | ApiErrorResponse>> {
540
- if (!req.user) {
541
- throw new HandleableError(
542
- new Error(
543
- getSuiteCoreTranslation(SuiteCoreStringKey.Common_NoUserOnRequest),
544
- ),
545
- { statusCode: 401 },
546
- );
547
- }
548
-
549
- const UserModel = this.application.getModel<IUserDocument<string, I>>(
550
- BaseModelName.User,
551
- );
552
- const userDoc = await UserModel.findById(req.user.id);
553
-
554
- return {
555
- statusCode: 200,
556
- response: {
557
- message: getSuiteCoreTranslation(
558
- SuiteCoreStringKey.Settings_RetrievedSuccess,
559
- ),
560
- settings: {
561
- email: userDoc?.email || '',
562
- timezone: userDoc?.timezone || '',
563
- currency: userDoc?.currency || '',
564
- siteLanguage: userDoc?.siteLanguage || '',
565
- darkMode: userDoc?.darkMode || false,
566
- directChallenge: userDoc?.directChallenge || false,
567
- },
568
- },
569
- };
570
- }
571
-
572
- @Post('/settings', {
573
- auth: true,
574
- validation: function (validationLanguage: TLanguage) {
575
- return [
576
- body('email')
577
- .optional()
578
- .isEmail()
579
- .withMessage(
580
- getSuiteCoreTranslation(
581
- SuiteCoreStringKey.Validation_InvalidEmail,
582
- undefined,
583
- validationLanguage,
584
- ),
585
- ),
586
- body('timezone')
587
- .optional()
588
- .isString()
589
- .custom((value) => isValidTimezone(value))
590
- .withMessage(
591
- getSuiteCoreTranslation(
592
- SuiteCoreStringKey.Validation_TimezoneInvalid,
593
- undefined,
594
- validationLanguage,
595
- ),
596
- ),
597
- body('siteLanguage')
598
- .optional()
599
- .isString()
600
- .isIn(Object.values(LanguageCodes))
601
- .withMessage(
602
- getSuiteCoreTranslation(
603
- SuiteCoreStringKey.Validation_InvalidLanguage,
604
- undefined,
605
- validationLanguage,
606
- ),
607
- ),
608
- body('currency')
609
- .optional()
610
- .isString()
611
- .withMessage(
612
- getSuiteCoreTranslation(
613
- SuiteCoreStringKey.Validation_CurrencyCodeRequired,
614
- undefined,
615
- validationLanguage,
616
- ),
617
- ),
618
- body('darkMode')
619
- .optional()
620
- .isBoolean()
621
- .withMessage(
622
- getSuiteCoreTranslation(
623
- SuiteCoreStringKey.Validation_Required,
624
- undefined,
625
- validationLanguage,
626
- ),
627
- ),
628
- body('directChallenge')
629
- .optional()
630
- .isBoolean()
631
- .withMessage(
632
- getSuiteCoreTranslation(
633
- SuiteCoreStringKey.Validation_Required,
634
- undefined,
635
- validationLanguage,
636
- ),
637
- ),
638
- ];
639
- },
640
- })
641
- async updateSettings(
642
- req: Request,
643
- res: Response,
644
- next: NextFunction,
645
- ): Promise<IStatusCodeResponse<IApiRequestUserResponse | ApiErrorResponse>> {
646
- return await withTransaction(
647
- this.application.db.connection,
648
- this.application.environment.mongo.useTransactions,
649
- undefined,
650
- async (sess) => {
651
- const {
652
- email,
653
- timezone,
654
- siteLanguage,
655
- currency,
656
- darkMode,
657
- directChallenge,
658
- } = this.validatedBody;
659
- if (!req.user) {
660
- throw new HandleableError(
661
- new Error(
662
- getSuiteCoreTranslation(
663
- SuiteCoreStringKey.Common_NoUserOnRequest,
664
- ),
665
- ),
666
- { statusCode: 401 },
667
- );
668
- }
669
-
670
- const user = await this.userService.updateUserSettings(
671
- req.user.id,
672
- {
673
- ...(email !== undefined && { email: email as string }),
674
- ...(timezone !== undefined && { timezone: timezone as string }),
675
- ...(siteLanguage !== undefined && {
676
- siteLanguage: siteLanguage as S,
677
- }),
678
- ...(currency !== undefined && { currency: currency as string }),
679
- ...(darkMode !== undefined && { darkMode: darkMode as boolean }),
680
- ...(directChallenge !== undefined && {
681
- directChallenge: directChallenge as boolean,
682
- }),
683
- },
684
- sess,
685
- );
686
-
687
- return {
688
- statusCode: 200,
689
- response: {
690
- message: getSuiteCoreTranslation(
691
- SuiteCoreStringKey.Settings_SaveSuccess,
692
- ),
693
- user,
694
- },
695
- };
696
- },
697
- );
698
- }
699
-
700
- @Get('/backup-codes', { auth: true })
701
- async getBackupCodeCount(
702
- req: Request,
703
- res: Response,
704
- next: NextFunction,
705
- ): Promise<IStatusCodeResponse<IApiCodeCountResponse | ApiErrorResponse>> {
706
- if (!req.user) {
707
- throw new HandleableError(
708
- new Error(
709
- getSuiteCoreTranslation(SuiteCoreStringKey.Common_NoUserOnRequest),
710
- ),
711
- { statusCode: 401 },
712
- );
713
- }
714
-
715
- const UserModel = this.application.getModel<IUserDocument<string, I>>(
716
- BaseModelName.User,
717
- );
718
- const user = await UserModel.findById(req.user.id);
719
-
720
- return {
721
- statusCode: 200,
722
- response: {
723
- message: 'Backup codes retrieved',
724
- codeCount: user?.backupCodes?.length || 0,
725
- } as IApiCodeCountResponse,
726
- };
727
- }
728
-
729
- @Post('/backup-codes', {
730
- auth: true,
731
- cryptoAuth: true,
732
- validation: function (validationLanguage: TLanguage) {
733
- const constants = this.constants;
734
- return [
735
- body().custom((value, { req }) => {
736
- if (!req.body?.password && !req.body?.mnemonic) {
737
- throw new MnemonicOrPasswordRequiredError();
738
- }
739
- return true;
740
- }),
741
- body('password')
742
- .optional()
743
- .notEmpty()
744
- .withMessage(
745
- getSuiteCoreTranslation(
746
- SuiteCoreStringKey.Validation_CurrentPasswordRequired,
747
- undefined,
748
- validationLanguage,
749
- ),
750
- ),
751
- body('mnemonic')
752
- .optional()
753
- .notEmpty()
754
- .withMessage(
755
- getSuiteCoreTranslation(
756
- SuiteCoreStringKey.Validation_MnemonicRequired,
757
- undefined,
758
- validationLanguage,
759
- ),
760
- )
761
- .matches(constants.MnemonicRegex)
762
- .withMessage(
763
- getSuiteCoreTranslation(
764
- SuiteCoreStringKey.Validation_MnemonicRegex,
765
- undefined,
766
- validationLanguage,
767
- ),
768
- ),
769
- ];
770
- },
771
- })
772
- async resetBackupCodes(
773
- req: Request,
774
- res: Response,
775
- next: NextFunction,
776
- ): Promise<IStatusCodeResponse<IApiBackupCodesResponse | ApiErrorResponse>> {
777
- if (!req.user || !req.eciesUser || !req.eciesUser.hasPrivateKey) {
778
- throw new HandleableError(
779
- new Error(
780
- getSuiteCoreTranslation(SuiteCoreStringKey.Common_NoUserOnRequest),
781
- ),
782
- { statusCode: 401 },
783
- );
784
- }
785
-
786
- const newBackupCodes = await this.userService.resetUserBackupCodes(
787
- req.eciesUser,
788
- this.systemUser,
789
- );
790
- const codes = newBackupCodes.map((c) => c.notNullValue);
791
- newBackupCodes.forEach((c) => c.dispose());
792
-
793
- return {
794
- statusCode: 200,
795
- response: {
796
- message: getSuiteCoreTranslation(
797
- SuiteCoreStringKey.BackupCodeRecovery_YourNewCodes,
798
- ),
799
- backupCodes: codes,
800
- },
801
- };
802
- }
803
-
804
- @Post('/recover-mnemonic', {
805
- auth: true,
806
- cryptoAuth: true,
807
- validation: function (validationLanguage: TLanguage) {
808
- return [
809
- body('password')
810
- .isString()
811
- .withMessage(
812
- getSuiteCoreTranslation(
813
- SuiteCoreStringKey.Validation_CurrentPasswordRequired,
814
- undefined,
815
- validationLanguage,
816
- ),
817
- ),
818
- ];
819
- },
820
- })
821
- async recoverMnemonic(
822
- req: Request,
823
- res: Response,
824
- next: NextFunction,
825
- ): Promise<IStatusCodeResponse<IApiMnemonicResponse | ApiErrorResponse>> {
826
- return await withTransaction(
827
- this.application.db.connection,
828
- this.application.environment.mongo.useTransactions,
829
- undefined,
830
- async (sess) => {
831
- if (!req.user) {
832
- throw new HandleableError(
833
- new Error(
834
- getSuiteCoreTranslation(
835
- SuiteCoreStringKey.Validation_InvalidCredentials,
836
- ),
837
- ),
838
- { statusCode: 401 },
839
- );
840
- } else if (!req.eciesUser) {
841
- throw new HandleableError(
842
- new Error(
843
- getSuiteCoreTranslation(
844
- SuiteCoreStringKey.Validation_MnemonicOrPasswordRequired,
845
- ),
846
- ),
847
- { statusCode: 401 },
848
- );
849
- }
850
-
851
- const { password } = this.validatedBody;
852
- if (!isString(password)) {
853
- throw new GenericValidationError(
854
- getSuiteCoreTranslation(
855
- SuiteCoreStringKey.Validation_MissingValidatedData,
856
- ),
857
- );
858
- }
859
-
860
- const userDoc = await this.userService.findUserById(
861
- this.userService.toId(req.user.id),
862
- true,
863
- sess,
864
- );
865
-
866
- const mnemonic = await this.userService.recoverMnemonic(
867
- req.eciesUser,
868
- userDoc.mnemonicRecovery,
869
- );
870
-
871
- return {
872
- statusCode: 200,
873
- response: {
874
- message: getSuiteCoreTranslation(
875
- SuiteCoreStringKey.MnemonicRecovery_Success,
876
- ),
877
- mnemonic: mnemonic.notNullValue,
878
- },
879
- };
880
- },
881
- );
882
- }
883
-
884
- @Post('/change-password', {
885
- auth: true,
886
- validation: function (validationLanguage: TLanguage) {
887
- const constants = this.constants;
888
- return [
889
- body('currentPassword')
890
- .notEmpty()
891
- .withMessage(
892
- getSuiteCoreTranslation(
893
- SuiteCoreStringKey.Validation_Required,
894
- undefined,
895
- validationLanguage,
896
- ),
897
- ),
898
- body('newPassword')
899
- .matches(constants.PasswordRegex)
900
- .withMessage(
901
- getSuiteCoreTranslation(
902
- SuiteCoreStringKey.Validation_PasswordRegexErrorTemplate,
903
- ),
904
- )
905
- .notEmpty()
906
- .withMessage(
907
- getSuiteCoreTranslation(
908
- SuiteCoreStringKey.Validation_Required,
909
- undefined,
910
- validationLanguage,
911
- ),
912
- ),
913
- ];
914
- },
915
- })
916
- async changePassword(
917
- req: Request,
918
- res: Response,
919
- next: NextFunction,
920
- ): Promise<IStatusCodeResponse<IApiMessageResponse | ApiErrorResponse>> {
921
- return await withTransaction(
922
- this.application.db.connection,
923
- this.application.environment.mongo.useTransactions,
924
- undefined,
925
- async (sess) => {
926
- const { currentPassword, newPassword } = this.validatedBody;
927
- if (!req.user) {
928
- throw new HandleableError(
929
- new Error(
930
- getSuiteCoreTranslation(
931
- SuiteCoreStringKey.Common_NoUserOnRequest,
932
- ),
933
- ),
934
- { statusCode: 401 },
935
- );
936
- }
937
-
938
- if (!isString(currentPassword) || !isString(newPassword)) {
939
- throw new GenericValidationError(
940
- getSuiteCoreTranslation(
941
- SuiteCoreStringKey.Validation_MissingValidatedData,
942
- ),
943
- );
944
- }
945
-
946
- await this.userService.changePassword(
947
- req.user.id,
948
- currentPassword,
949
- newPassword,
950
- sess,
951
- );
952
-
953
- return {
954
- statusCode: 200,
955
- response: {
956
- message: getSuiteCoreTranslation(
957
- SuiteCoreStringKey.PasswordChange_Success,
958
- ),
959
- },
960
- };
961
- },
962
- );
963
- }
964
-
965
- @Post('/request-direct-login')
966
- async requestDirectLogin(
967
- req: Request,
968
- res: Response,
969
- next: NextFunction,
970
- ): Promise<IStatusCodeResponse<IApiChallengeResponse | ApiErrorResponse>> {
971
- const challenge = this.userService.generateDirectLoginChallenge();
972
- return {
973
- statusCode: 200,
974
- response: {
975
- challenge: challenge,
976
- message: getSuiteCoreTranslation(
977
- SuiteCoreStringKey.Login_ChallengeGenerated,
978
- ),
979
- serverPublicKey: this.application.environment.systemPublicKeyHex ?? '',
980
- },
981
- };
982
- }
983
-
984
- @Post('/direct-challenge', {
985
- schema: DirectLoginChallengeSchema,
986
- validation: function (validationLanguage: TLanguage) {
987
- const constants = this.constants;
988
- return [
989
- body('challenge')
990
- .not()
991
- .isEmpty()
992
- .withMessage(
993
- getSuiteCoreTranslation(
994
- SuiteCoreStringKey.Validation_InvalidChallenge,
995
- undefined,
996
- validationLanguage,
997
- ),
998
- )
999
- .matches(
1000
- new RegExp(
1001
- `^[a-f0-9]{${(UINT64_SIZE + 32 + ECIES.SIGNATURE_SIZE) * 2}}$`,
1002
- ),
1003
- )
1004
- .withMessage(
1005
- getSuiteCoreTranslation(
1006
- SuiteCoreStringKey.Validation_InvalidChallenge,
1007
- undefined,
1008
- validationLanguage,
1009
- ),
1010
- ),
1011
- body('signature')
1012
- .not()
1013
- .isEmpty()
1014
- .withMessage(
1015
- getSuiteCoreTranslation(
1016
- SuiteCoreStringKey.Validation_InvalidSignature,
1017
- ),
1018
- )
1019
- .matches(new RegExp(`^[a-f0-9]{${ECIES.SIGNATURE_SIZE * 2}}$`))
1020
- .withMessage(SuiteCoreStringKey.Validation_InvalidSignature),
1021
- body().custom((value, { req }) => {
1022
- if (!req.body.username && !req.body.email) {
1023
- throw new UsernameOrEmailRequiredError();
1024
- }
1025
- return true;
1026
- }),
1027
- body('username')
1028
- .optional()
1029
- .matches(constants.UsernameRegex)
1030
- .withMessage(
1031
- getSuiteCoreTranslation(
1032
- SuiteCoreStringKey.Validation_UsernameRegexErrorTemplate,
1033
- undefined,
1034
- validationLanguage,
1035
- ),
1036
- ),
1037
- body('email')
1038
- .optional()
1039
- .isEmail()
1040
- .withMessage(
1041
- getSuiteCoreTranslation(
1042
- SuiteCoreStringKey.Validation_InvalidEmail,
1043
- undefined,
1044
- validationLanguage,
1045
- ),
1046
- ),
1047
- ];
1048
- },
1049
- })
1050
- async directLoginChallenge(
1051
- req: Request,
1052
- res: Response,
1053
- next: NextFunction,
1054
- ): Promise<IStatusCodeResponse<IApiLoginResponse | ApiErrorResponse>> {
1055
- return await withTransaction(
1056
- this.application.db.connection,
1057
- this.application.environment.mongo.useTransactions,
1058
- undefined,
1059
- async (sess) => {
1060
- const { username, email, challenge, signature } = this.validatedBody;
1061
-
1062
- const { userDoc } = await this.userService.verifyDirectLoginChallenge(
1063
- String(challenge),
1064
- String(signature),
1065
- username ? String(username) : undefined,
1066
- email ? String(email) : undefined,
1067
- sess,
1068
- );
1069
-
1070
- const { token: jwtToken, roles } = await this.jwtService.signToken(
1071
- userDoc,
1072
- this.application.environment.jwtSecret,
1073
- (req.user?.siteLanguage as string) ?? LanguageCodes.EN_US,
1074
- );
1075
-
1076
- return {
1077
- statusCode: 200,
1078
- response: {
1079
- user: RequestUserService.makeRequestUserDTO(userDoc, roles),
1080
- token: jwtToken,
1081
- serverPublicKey:
1082
- this.application.environment.systemPublicKeyHex ?? '',
1083
- message: getSuiteCoreTranslation(
1084
- SuiteCoreStringKey.LoggedIn_Success,
1085
- ),
1086
- },
1087
- };
1088
- },
1089
- );
1090
- }
1091
-
1092
- @Post('/request-email-login', {
1093
- validation: function (validationLanguage: TLanguage) {
1094
- const constants = this.constants;
1095
- return [
1096
- body().custom((value, { req }) => {
1097
- if (!req.body.username && !req.body.email) {
1098
- throw new UsernameOrEmailRequiredError();
1099
- }
1100
- return true;
1101
- }),
1102
- body('username')
1103
- .optional()
1104
- .matches(constants.UsernameRegex)
1105
- .withMessage(
1106
- getSuiteCoreTranslation(
1107
- SuiteCoreStringKey.Validation_UsernameRegexErrorTemplate,
1108
- undefined,
1109
- validationLanguage,
1110
- ),
1111
- ),
1112
- body('email')
1113
- .optional()
1114
- .isEmail()
1115
- .withMessage(
1116
- getSuiteCoreTranslation(
1117
- SuiteCoreStringKey.Validation_InvalidEmail,
1118
- undefined,
1119
- validationLanguage,
1120
- ),
1121
- ),
1122
- ];
1123
- },
1124
- })
1125
- async requestEmailLogin(
1126
- req: Request,
1127
- res: Response,
1128
- next: NextFunction,
1129
- ): Promise<IStatusCodeResponse<IApiMessageResponse | ApiErrorResponse>> {
1130
- const { username, email } = this.validatedBody;
1131
-
1132
- try {
1133
- await withTransaction(
1134
- this.application.db.connection,
1135
- this.application.environment.mongo.useTransactions,
1136
- undefined,
1137
- async (sess) => {
1138
- const userDoc = await this.userService.findUser(
1139
- email as string,
1140
- username as string,
1141
- sess,
1142
- );
1143
- await this.userService.createAndSendEmailToken(
1144
- userDoc,
1145
- EmailTokenType.LoginRequest,
1146
- sess,
1147
- this.application.environment.debug,
1148
- );
1149
- },
1150
- );
1151
- } catch (error) {
1152
- // Suppress user-related errors for security
1153
- }
1154
-
1155
- return {
1156
- statusCode: 200,
1157
- response: {
1158
- message: getSuiteCoreTranslation(SuiteCoreStringKey.Email_TokenSent),
1159
- },
1160
- };
1161
- }
1162
-
1163
- @Post('/email-challenge', {
1164
- schema: EmailLoginChallengeSchema,
1165
- validation: function (validationLanguage: TLanguage) {
1166
- const constants = this.constants;
1167
- return [
1168
- body('token')
1169
- .not()
1170
- .isEmpty()
1171
- .withMessage(
1172
- getSuiteCoreTranslation(
1173
- SuiteCoreStringKey.Validation_TokenRequired,
1174
- undefined,
1175
- validationLanguage,
1176
- ),
1177
- )
1178
- .matches(new RegExp(`^[a-f0-9]{${constants.EmailTokenLength * 2}}$`))
1179
- .withMessage(
1180
- getSuiteCoreTranslation(
1181
- SuiteCoreStringKey.Validation_InvalidToken,
1182
- undefined,
1183
- validationLanguage,
1184
- ),
1185
- ),
1186
- body('signature')
1187
- .not()
1188
- .isEmpty()
1189
- .withMessage(
1190
- getSuiteCoreTranslation(
1191
- SuiteCoreStringKey.Validation_InvalidSignature,
1192
- ),
1193
- )
1194
- .matches(new RegExp(`^[a-f0-9]{${ECIES.SIGNATURE_SIZE * 2}}$`))
1195
- .withMessage(SuiteCoreStringKey.Validation_InvalidSignature),
1196
- body().custom((value, { req }) => {
1197
- if (!req.body.username && !req.body.email) {
1198
- throw new UsernameOrEmailRequiredError();
1199
- }
1200
- return true;
1201
- }),
1202
- body('username')
1203
- .optional()
1204
- .matches(constants.UsernameRegex)
1205
- .withMessage(
1206
- getSuiteCoreTranslation(
1207
- SuiteCoreStringKey.Validation_UsernameRegexErrorTemplate,
1208
- undefined,
1209
- validationLanguage,
1210
- ),
1211
- ),
1212
- body('email')
1213
- .optional()
1214
- .isEmail()
1215
- .withMessage(
1216
- getSuiteCoreTranslation(
1217
- SuiteCoreStringKey.Validation_InvalidEmail,
1218
- undefined,
1219
- validationLanguage,
1220
- ),
1221
- ),
1222
- ];
1223
- },
1224
- })
1225
- async emailLoginChallenge(
1226
- req: Request,
1227
- res: Response,
1228
- next: NextFunction,
1229
- ): Promise<IStatusCodeResponse<IApiLoginResponse | ApiErrorResponse>> {
1230
- return await withTransaction(
1231
- this.application.db.connection,
1232
- this.application.environment.mongo.useTransactions,
1233
- undefined,
1234
- async (sess) => {
1235
- const { token, signature } = this.validatedBody;
1236
-
1237
- const userDoc = await this.userService.validateEmailLoginTokenChallenge(
1238
- String(token),
1239
- String(signature),
1240
- sess,
1241
- );
1242
-
1243
- const { token: jwtToken, roles } = await this.jwtService.signToken(
1244
- userDoc,
1245
- this.application.environment.jwtSecret,
1246
- (req.user?.siteLanguage as string) ?? LanguageCodes.EN_US,
1247
- );
1248
-
1249
- return {
1250
- statusCode: 200,
1251
- response: {
1252
- user: RequestUserService.makeRequestUserDTO(userDoc, roles),
1253
- token: jwtToken,
1254
- serverPublicKey:
1255
- this.application.environment.systemPublicKeyHex ?? '',
1256
- message: getSuiteCoreTranslation(
1257
- SuiteCoreStringKey.LoggedIn_Success,
1258
- ),
1259
- },
1260
- };
1261
- },
1262
- );
1263
- }
1264
-
1265
- @Post('/resend-verification', {
1266
- validation: function (validationLanguage: TLanguage) {
1267
- const constants = this.constants;
1268
- return [
1269
- body().custom((value, { req }) => {
1270
- if (!req.body.username && !req.body.email) {
1271
- throw new UsernameOrEmailRequiredError();
1272
- }
1273
- return true;
1274
- }),
1275
- body('username')
1276
- .optional()
1277
- .isString()
1278
- .matches(constants.UsernameRegex)
1279
- .withMessage(
1280
- getSuiteCoreTranslation(
1281
- SuiteCoreStringKey.Validation_UsernameRegexErrorTemplate,
1282
- undefined,
1283
- validationLanguage,
1284
- ),
1285
- ),
1286
- body('email').optional().isEmail(),
1287
- ];
1288
- },
1289
- })
1290
- async resendVerification(
1291
- req: Request,
1292
- res: Response,
1293
- next: NextFunction,
1294
- ): Promise<IStatusCodeResponse<IApiMessageResponse | ApiErrorResponse>> {
1295
- return await withTransaction(
1296
- this.application.db.connection,
1297
- this.application.environment.mongo.useTransactions,
1298
- undefined,
1299
- async (sess) => {
1300
- const { username, email } = this.validatedBody;
1301
-
1302
- const UserModel = this.application.getModel<IUserDocument<string, I>>(
1303
- BaseModelName.User,
1304
- );
1305
- let query: { username?: string; email?: string } = {};
1306
- if (isString(username)) query.username = username;
1307
- else if (isString(email)) query.email = email;
1308
- else {
1309
- throw new GenericValidationError(
1310
- getSuiteCoreTranslation(
1311
- SuiteCoreStringKey.Validation_MissingValidatedData,
1312
- ),
1313
- );
1314
- }
1315
-
1316
- const user = await UserModel.findOne(query).session(sess ?? null);
1317
- if (!user) {
1318
- throw new GenericValidationError(
1319
- getSuiteCoreTranslation(SuiteCoreStringKey.Validation_UserNotFound),
1320
- { statusCode: 404 },
1321
- );
1322
- }
1323
-
1324
- await this.userService.resendEmailToken(
1325
- user._id.toString(),
1326
- EmailTokenType.AccountVerification,
1327
- sess,
1328
- this.application.environment.debug,
1329
- );
1330
-
1331
- return {
1332
- statusCode: 200,
1333
- response: {
1334
- message: getSuiteCoreTranslation(
1335
- SuiteCoreStringKey.EmailVerification_Resent,
1336
- ),
1337
- },
1338
- };
1339
- },
1340
- );
1341
- }
1342
-
1343
- @Post('/backup-code', {
1344
- validation: function (validationLanguage: TLanguage) {
1345
- const constants = this.constants;
1346
- return [
1347
- body('email').optional().isEmail(),
1348
- body('username')
1349
- .optional()
1350
- .matches(constants.UsernameRegex)
1351
- .withMessage(
1352
- getSuiteCoreTranslation(
1353
- SuiteCoreStringKey.Validation_UsernameRegexErrorTemplate,
1354
- undefined,
1355
- validationLanguage,
1356
- ),
1357
- ),
1358
- body('code')
1359
- .custom((value) => {
1360
- const normalized = BackupCode.normalizeCode(value);
1361
- return (
1362
- constants.BACKUP_CODES.DisplayRegex.test(value) ||
1363
- constants.BACKUP_CODES.NormalizedHexRegex.test(normalized)
1364
- );
1365
- })
1366
- .withMessage(
1367
- getSuiteCoreTranslation(
1368
- SuiteCoreStringKey.Validation_InvalidBackupCode,
1369
- undefined,
1370
- validationLanguage,
1371
- ),
1372
- ),
1373
- body('recoverMnemonic').isBoolean().optional(),
1374
- body('newPassword')
1375
- .optional()
1376
- .matches(constants.PasswordRegex)
1377
- .withMessage(
1378
- getSuiteCoreTranslation(
1379
- SuiteCoreStringKey.Validation_PasswordRegexErrorTemplate,
1380
- undefined,
1381
- validationLanguage,
1382
- ),
1383
- ),
1384
- ];
1385
- },
1386
- })
1387
- async useBackupCodeLogin(
1388
- req: Request,
1389
- res: Response,
1390
- next: NextFunction,
1391
- ): Promise<IStatusCodeResponse<IApiLoginResponse | ApiErrorResponse>> {
1392
- return await withTransaction(
1393
- this.application.db.connection,
1394
- this.application.environment.mongo.useTransactions,
1395
- undefined,
1396
- async (sess) => {
1397
- const { code, newPassword, email, username } = this.validatedBody;
1398
-
1399
- if (!code) {
1400
- throw new GenericValidationError(
1401
- getSuiteCoreTranslation(
1402
- SuiteCoreStringKey.Validation_MissingValidatedData,
1403
- ),
1404
- );
1405
- }
1406
-
1407
- const recoverMnemonic =
1408
- this.validatedBody?.['recoverMnemonic'] === 'true' ||
1409
- this.validatedBody?.['recoverMnemonic'] === true;
1410
-
1411
- const userDoc = await this.userService.findUser(
1412
- email as string,
1413
- username as string,
1414
- sess,
1415
- );
1416
-
1417
- const {
1418
- user,
1419
- userDoc: updatedUserDoc,
1420
- codeCount,
1421
- } = await this.backupCodeService.recoverKeyWithBackupCode(
1422
- userDoc,
1423
- code as string,
1424
- newPassword ? new SecureString(newPassword as string) : undefined,
1425
- sess,
1426
- );
1427
-
1428
- let mnemonic: SecureString | undefined;
1429
- if (recoverMnemonic) {
1430
- mnemonic = await this.userService.recoverMnemonic(
1431
- user,
1432
- updatedUserDoc.mnemonicRecovery,
1433
- );
1434
- }
1435
-
1436
- const { token, roles } = await this.jwtService.signToken(
1437
- userDoc,
1438
- this.application.environment.jwtSecret,
1439
- LanguageCodes.EN_US,
1440
- );
1441
-
1442
- this.userService.updateLastLogin(updatedUserDoc._id).catch(() => {});
1443
-
1444
- return {
1445
- statusCode: 200,
1446
- response: {
1447
- user: RequestUserService.makeRequestUserDTO(userDoc, roles),
1448
- token: token,
1449
- message: getSuiteCoreTranslation(
1450
- SuiteCoreStringKey.BackupCodeRecovery_Success,
1451
- ),
1452
- codeCount,
1453
- ...(recoverMnemonic && mnemonic
1454
- ? { mnemonic: mnemonic.value }
1455
- : {}),
1456
- serverPublicKey:
1457
- this.application.environment.systemPublicKeyHex ?? '',
1458
- },
1459
- };
1460
- },
1461
- );
1462
- }
1463
-
1464
- @Post('/forgot-password', {
1465
- validation: function (validationLanguage: TLanguage) {
1466
- return [
1467
- body('email')
1468
- .isEmail()
1469
- .withMessage(
1470
- getSuiteCoreTranslation(
1471
- SuiteCoreStringKey.Validation_InvalidEmail,
1472
- undefined,
1473
- validationLanguage,
1474
- ),
1475
- ),
1476
- ];
1477
- },
1478
- })
1479
- async forgotPassword(
1480
- req: Request,
1481
- res: Response,
1482
- next: NextFunction,
1483
- ): Promise<IStatusCodeResponse<IApiMessageResponse | ApiErrorResponse>> {
1484
- return await withTransaction(
1485
- this.application.db.connection,
1486
- this.application.environment.mongo.useTransactions,
1487
- undefined,
1488
- async (sess) => {
1489
- const { email } = this.validatedBody;
1490
-
1491
- const UserModel = this.application.getModel<IUserDocument<string, I>>(
1492
- BaseModelName.User,
1493
- );
1494
- if (!isString(email)) {
1495
- throw new GenericValidationError(
1496
- getSuiteCoreTranslation(
1497
- SuiteCoreStringKey.Validation_MissingValidatedData,
1498
- ),
1499
- );
1500
- }
1501
-
1502
- const user = await UserModel.findOne({
1503
- email: email.toLowerCase(),
1504
- }).session(sess ?? null);
1505
-
1506
- if (!user || !user.passwordWrappedPrivateKey) {
1507
- return {
1508
- statusCode: 200,
1509
- response: {
1510
- message: getSuiteCoreTranslation(
1511
- SuiteCoreStringKey.PasswordReset_Success,
1512
- ),
1513
- },
1514
- };
1515
- }
1516
-
1517
- // Mongoose document type doesn't exactly match IUserDocument generic signature
1518
- // but the document has all required properties
1519
- await this.userService.createAndSendEmailToken(
1520
- user as unknown as IUserDocument<S, I>,
1521
- EmailTokenType.PasswordReset,
1522
- sess,
1523
- this.application.environment.debug,
1524
- );
1525
-
1526
- return {
1527
- statusCode: 200,
1528
- response: {
1529
- message: getSuiteCoreTranslation(
1530
- SuiteCoreStringKey.PasswordReset_Success,
1531
- ),
1532
- },
1533
- };
1534
- },
1535
- );
1536
- }
1537
-
1538
- @Get('/verify-reset-token')
1539
- async verifyResetToken(
1540
- req: Request,
1541
- res: Response,
1542
- next: NextFunction,
1543
- ): Promise<IStatusCodeResponse<IApiMessageResponse | ApiErrorResponse>> {
1544
- const token = req.query['token'] as string;
1545
- if (!token) {
1546
- throw new GenericValidationError(
1547
- getSuiteCoreTranslation(SuiteCoreStringKey.Validation_TokenMissing),
1548
- );
1549
- }
1550
-
1551
- return await withTransaction(
1552
- this.application.db.connection,
1553
- this.application.environment.mongo.useTransactions,
1554
- undefined,
1555
- async (sess) => {
1556
- await this.userService.verifyEmailToken(
1557
- token,
1558
- EmailTokenType.PasswordReset,
1559
- sess,
1560
- );
1561
- return {
1562
- statusCode: 200,
1563
- response: {
1564
- message: 'Token is valid',
1565
- },
1566
- };
1567
- },
1568
- );
1569
- }
1570
-
1571
- @Post('/reset-password', {
1572
- validation: function (validationLanguage: TLanguage) {
1573
- const constants = this.constants;
1574
- return [
1575
- body('token')
1576
- .not()
1577
- .isEmpty()
1578
- .withMessage(
1579
- getSuiteCoreTranslation(
1580
- SuiteCoreStringKey.Validation_TokenRequired,
1581
- undefined,
1582
- validationLanguage,
1583
- ),
1584
- )
1585
- .matches(new RegExp(`^[a-f0-9]{${constants.EmailTokenLength * 2}}$`))
1586
- .withMessage(
1587
- getSuiteCoreTranslation(
1588
- SuiteCoreStringKey.Validation_InvalidToken,
1589
- undefined,
1590
- validationLanguage,
1591
- ),
1592
- ),
1593
- body('newPassword')
1594
- .optional()
1595
- .isLength({ min: 8 })
1596
- .withMessage(
1597
- getSuiteCoreTranslation(
1598
- SuiteCoreStringKey.Validation_PasswordMinLengthTemplate,
1599
- undefined,
1600
- validationLanguage,
1601
- ),
1602
- )
1603
- .matches(constants.PasswordRegex)
1604
- .withMessage(
1605
- getSuiteCoreTranslation(
1606
- SuiteCoreStringKey.Validation_PasswordRegexErrorTemplate,
1607
- undefined,
1608
- validationLanguage,
1609
- ),
1610
- ),
1611
- body('password')
1612
- .optional()
1613
- .isLength({ min: 8 })
1614
- .withMessage(
1615
- getSuiteCoreTranslation(
1616
- SuiteCoreStringKey.Validation_PasswordMinLengthTemplate,
1617
- undefined,
1618
- validationLanguage,
1619
- ),
1620
- )
1621
- .matches(constants.PasswordRegex)
1622
- .withMessage(
1623
- getSuiteCoreTranslation(
1624
- SuiteCoreStringKey.Validation_PasswordRegexErrorTemplate,
1625
- undefined,
1626
- validationLanguage,
1627
- ),
1628
- ),
1629
- body('currentPassword').optional().isString(),
1630
- body('mnemonic').optional().isString(),
1631
- ];
1632
- },
1633
- })
1634
- async resetPassword(
1635
- req: Request,
1636
- res: Response,
1637
- next: NextFunction,
1638
- ): Promise<IStatusCodeResponse<IApiMessageResponse | ApiErrorResponse>> {
1639
- return await withTransaction(
1640
- this.application.db.connection,
1641
- this.application.environment.mongo.useTransactions,
1642
- undefined,
1643
- async (sess) => {
1644
- const { token, newPassword, password, currentPassword, mnemonic } =
1645
- this.validatedBody;
1646
- const selectedNewPassword = (newPassword ?? password) as
1647
- | string
1648
- | undefined;
1649
-
1650
- if (!isString(token) || !isString(selectedNewPassword)) {
1651
- throw new GenericValidationError(
1652
- getSuiteCoreTranslation(
1653
- SuiteCoreStringKey.Validation_MissingValidatedData,
1654
- ),
1655
- );
1656
- }
1657
-
1658
- const credential =
1659
- (mnemonic as string | undefined) ??
1660
- (currentPassword as string | undefined);
1661
- if (!isString(credential)) {
1662
- throw new GenericValidationError(
1663
- getSuiteCoreTranslation(
1664
- SuiteCoreStringKey.Validation_MissingValidatedData,
1665
- ),
1666
- );
1667
- }
1668
-
1669
- await this.userService.resetPasswordWithToken(
1670
- token as string,
1671
- selectedNewPassword,
1672
- credential,
1673
- sess,
1674
- );
1675
-
1676
- return {
1677
- statusCode: 200,
1678
- response: {
1679
- message: getSuiteCoreTranslation(
1680
- SuiteCoreStringKey.PasswordChange_Success,
1681
- ),
1682
- },
1683
- };
1684
- },
1685
- );
1686
- }
1687
- }