@digitaldefiance/node-express-suite 3.6.21 → 3.6.22

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