@digitaldefiance/node-express-suite 1.0.22 → 1.0.23

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 (633) hide show
  1. package/README.md +4 -0
  2. package/package.json +27 -32
  3. package/src/application-base.ts +492 -0
  4. package/src/application.ts +254 -0
  5. package/src/backup-code.ts +336 -0
  6. package/src/constants.ts +69 -0
  7. package/src/controllers/base.ts +440 -0
  8. package/{dist/controllers/index.d.ts → src/controllers/index.ts} +0 -1
  9. package/src/controllers/user.ts +1451 -0
  10. package/src/decorators/base-controller.ts +61 -0
  11. package/src/decorators/controller.ts +109 -0
  12. package/{dist/decorators/index.d.ts → src/decorators/index.ts} +0 -1
  13. package/src/decorators/zod-validation.ts +57 -0
  14. package/src/defaults.ts +94 -0
  15. package/src/documents/base.ts +7 -0
  16. package/src/documents/email-token.ts +14 -0
  17. package/{dist/documents/index.d.ts → src/documents/index.ts} +0 -1
  18. package/{dist/documents/mnemonic.d.ts → src/documents/mnemonic.ts} +5 -2
  19. package/{dist/documents/role.d.ts → src/documents/role.ts} +5 -2
  20. package/src/documents/used-direct-login-token.ts +7 -0
  21. package/{dist/documents/user-role.d.ts → src/documents/user-role.ts} +5 -2
  22. package/{dist/documents/user.d.ts → src/documents/user.ts} +4 -2
  23. package/src/enumerations/base-model-name.ts +41 -0
  24. package/{dist/enumerations/index.d.ts → src/enumerations/index.ts} +0 -1
  25. package/src/enumerations/length-encoding-type.ts +6 -0
  26. package/src/enumerations/schema-collection.ts +33 -0
  27. package/src/enumerations/symmetric-error-type.ts +4 -0
  28. package/src/environment.ts +770 -0
  29. package/src/errors/express-validation.ts +21 -0
  30. package/{dist/errors/index.d.ts → src/errors/index.ts} +0 -1
  31. package/src/errors/invalid-backup-code-version.ts +14 -0
  32. package/src/errors/invalid-jwt-token.ts +10 -0
  33. package/src/errors/invalid-model.ts +11 -0
  34. package/src/errors/invalid-new-password.ts +18 -0
  35. package/src/errors/invalid-password.ts +13 -0
  36. package/src/errors/missing-validated-data.ts +36 -0
  37. package/src/errors/mnemonic-or-password-required.ts +12 -0
  38. package/src/errors/model-not-registered.ts +11 -0
  39. package/src/errors/mongoose-validation.ts +34 -0
  40. package/src/errors/symmetric.ts +41 -0
  41. package/src/errors/token-expired.ts +10 -0
  42. package/src/get-language.ts +53 -0
  43. package/src/get-timezone.ts +45 -0
  44. package/{dist/index.d.ts → src/index.ts} +3 -2
  45. package/{dist/interfaces/api-error-response.d.ts → src/interfaces/api-error-response.ts} +2 -2
  46. package/src/interfaces/api-express-validation-error-response.ts +8 -0
  47. package/src/interfaces/api-message-response.ts +3 -0
  48. package/{dist/interfaces/api-mongo-validation-error-response.d.ts → src/interfaces/api-mongo-validation-error-response.ts} +2 -2
  49. package/{dist/interfaces/api-responses/backup-codes-response.d.ts → src/interfaces/api-responses/backup-codes-response.ts} +2 -2
  50. package/{dist/interfaces/api-responses/challenge-response.d.ts → src/interfaces/api-responses/challenge-response.ts} +3 -3
  51. package/{dist/interfaces/api-responses/code-count-response.d.ts → src/interfaces/api-responses/code-count-response.ts} +2 -2
  52. package/{dist/interfaces/api-responses/index.d.ts → src/interfaces/api-responses/index.ts} +0 -1
  53. package/{dist/interfaces/api-responses/login-response.d.ts → src/interfaces/api-responses/login-response.ts} +4 -4
  54. package/{dist/interfaces/api-responses/mnemonic-response.d.ts → src/interfaces/api-responses/mnemonic-response.ts} +2 -2
  55. package/{dist/interfaces/api-responses/registration-response.d.ts → src/interfaces/api-responses/registration-response.ts} +3 -3
  56. package/{dist/interfaces/api-responses/request-user-response.d.ts → src/interfaces/api-responses/request-user-response.ts} +2 -2
  57. package/{dist/interfaces/application.d.ts → src/interfaces/application.ts} +7 -7
  58. package/src/interfaces/backend-objects/email-token.ts +11 -0
  59. package/{dist/interfaces/backend-objects/index.d.ts → src/interfaces/backend-objects/index.ts} +0 -1
  60. package/{dist/interfaces/backend-objects/request-user.d.ts → src/interfaces/backend-objects/request-user.ts} +7 -2
  61. package/{dist/interfaces/backend-objects/role.d.ts → src/interfaces/backend-objects/role.ts} +1 -1
  62. package/src/interfaces/backend-objects/user.ts +9 -0
  63. package/src/interfaces/checksum-config.ts +4 -0
  64. package/src/interfaces/checksum-consts.ts +13 -0
  65. package/{dist/interfaces/constants.d.ts → src/interfaces/constants.ts} +5 -5
  66. package/src/interfaces/create-user-basics.ts +17 -0
  67. package/src/interfaces/csp-config.ts +35 -0
  68. package/src/interfaces/deep-partial.ts +3 -0
  69. package/{dist/interfaces/discriminator-collections.d.ts → src/interfaces/discriminator-collections.ts} +3 -3
  70. package/src/interfaces/email-service.ts +8 -0
  71. package/src/interfaces/environment-mongo.ts +76 -0
  72. package/src/interfaces/environment.ts +181 -0
  73. package/src/interfaces/failable-result.ts +6 -0
  74. package/src/interfaces/fec-consts.ts +4 -0
  75. package/src/interfaces/handleable-error-options.ts +6 -0
  76. package/{dist/interfaces/index.d.ts → src/interfaces/index.ts} +0 -1
  77. package/src/interfaces/jwt-consts.ts +23 -0
  78. package/src/interfaces/jwt-sign-response.ts +19 -0
  79. package/src/interfaces/mongo-errors.ts +5 -0
  80. package/src/interfaces/request-user.ts +50 -0
  81. package/src/interfaces/required-string-keys.ts +26 -0
  82. package/src/interfaces/schema.ts +31 -0
  83. package/src/interfaces/server-init-result.ts +37 -0
  84. package/src/interfaces/status-code-response.ts +7 -0
  85. package/src/interfaces/symmetric-encryption-results.d.ts +5 -0
  86. package/src/interfaces/symmetric-encryption-results.d.ts.map +1 -0
  87. package/src/interfaces/symmetric-encryption-results.js.map +1 -0
  88. package/src/interfaces/symmetric-encryption-results.ts +4 -0
  89. package/{dist/interfaces/token-response.d.ts → src/interfaces/token-response.ts} +2 -2
  90. package/src/middlewares/authenticate-crypto.ts +243 -0
  91. package/src/middlewares/authenticate-token.ts +152 -0
  92. package/src/middlewares/cleanup-crypto.ts +40 -0
  93. package/{dist/middlewares/index.d.ts → src/middlewares/index.ts} +0 -1
  94. package/src/middlewares/set-global-context-language.ts +24 -0
  95. package/src/middlewares.ts +120 -0
  96. package/src/model-registry.ts +75 -0
  97. package/src/models/email-token.ts +19 -0
  98. package/{dist/models/index.d.ts → src/models/index.ts} +0 -1
  99. package/src/models/mnemonic.ts +19 -0
  100. package/src/models/role.ts +19 -0
  101. package/src/models/used-direct-login-token.ts +23 -0
  102. package/src/models/user-role.ts +17 -0
  103. package/src/models/user.ts +19 -0
  104. package/src/registry/email-service-registry.ts +24 -0
  105. package/{dist/registry/index.d.ts → src/registry/index.ts} +0 -1
  106. package/src/routers/api.ts +151 -0
  107. package/src/routers/app.ts +258 -0
  108. package/src/routers/base.ts +17 -0
  109. package/{dist/routers/index.d.ts → src/routers/index.ts} +0 -1
  110. package/src/schemas/email-token.ts +91 -0
  111. package/{dist/schemas/index.d.ts → src/schemas/index.ts} +1 -2
  112. package/src/schemas/mnemonic.ts +37 -0
  113. package/src/schemas/role.ts +127 -0
  114. package/src/schemas/schema.ts +140 -0
  115. package/src/schemas/used-direct-login-token.ts +38 -0
  116. package/src/schemas/user-role.ts +75 -0
  117. package/src/schemas/user.ts +202 -0
  118. package/src/services/backup-code.ts +316 -0
  119. package/src/services/base.ts +33 -0
  120. package/src/services/checksum.ts +161 -0
  121. package/src/services/crc.ts +213 -0
  122. package/src/services/database-initialization.ts +1479 -0
  123. package/src/services/db-init-cache.d.ts +16 -0
  124. package/src/services/direct-login-token.ts +62 -0
  125. package/src/services/fec-usage-example.ts +102 -0
  126. package/src/services/fec.ts +296 -0
  127. package/{dist/services/index.d.ts → src/services/index.ts} +0 -1
  128. package/src/services/jwt.ts +134 -0
  129. package/src/services/key-wrapping.ts +434 -0
  130. package/src/services/mnemonic.ts +167 -0
  131. package/src/services/request-user.ts +62 -0
  132. package/src/services/role.ts +396 -0
  133. package/src/services/symmetric.ts +139 -0
  134. package/src/services/system-user.ts +82 -0
  135. package/src/services/user.ts +2137 -0
  136. package/src/services/xor.ts +34 -0
  137. package/src/types.d.ts +44 -0
  138. package/src/types.ts +128 -0
  139. package/src/utils.ts +1022 -0
  140. package/dist/application-base.d.ts +0 -112
  141. package/dist/application-base.d.ts.map +0 -1
  142. package/dist/application-base.js +0 -301
  143. package/dist/application-base.js.map +0 -1
  144. package/dist/application.d.ts +0 -23
  145. package/dist/application.d.ts.map +0 -1
  146. package/dist/application.js +0 -126
  147. package/dist/application.js.map +0 -1
  148. package/dist/backup-code.d.ts +0 -67
  149. package/dist/backup-code.d.ts.map +0 -1
  150. package/dist/backup-code.js +0 -270
  151. package/dist/backup-code.js.map +0 -1
  152. package/dist/constants.d.ts +0 -16
  153. package/dist/constants.d.ts.map +0 -1
  154. package/dist/constants.js +0 -54
  155. package/dist/constants.js.map +0 -1
  156. package/dist/controllers/base.d.ts +0 -63
  157. package/dist/controllers/base.d.ts.map +0 -1
  158. package/dist/controllers/base.js +0 -269
  159. package/dist/controllers/base.js.map +0 -1
  160. package/dist/controllers/index.d.ts.map +0 -1
  161. package/dist/controllers/index.js +0 -19
  162. package/dist/controllers/index.js.map +0 -1
  163. package/dist/controllers/user.d.ts +0 -45
  164. package/dist/controllers/user.d.ts.map +0 -1
  165. package/dist/controllers/user.js +0 -750
  166. package/dist/controllers/user.js.map +0 -1
  167. package/dist/decorators/base-controller.d.ts +0 -14
  168. package/dist/decorators/base-controller.d.ts.map +0 -1
  169. package/dist/decorators/base-controller.js +0 -49
  170. package/dist/decorators/base-controller.js.map +0 -1
  171. package/dist/decorators/controller.d.ts +0 -32
  172. package/dist/decorators/controller.d.ts.map +0 -1
  173. package/dist/decorators/controller.js +0 -67
  174. package/dist/decorators/controller.js.map +0 -1
  175. package/dist/decorators/index.d.ts.map +0 -1
  176. package/dist/decorators/index.js +0 -20
  177. package/dist/decorators/index.js.map +0 -1
  178. package/dist/decorators/zod-validation.d.ts +0 -5
  179. package/dist/decorators/zod-validation.d.ts.map +0 -1
  180. package/dist/decorators/zod-validation.js +0 -47
  181. package/dist/decorators/zod-validation.js.map +0 -1
  182. package/dist/defaults.d.ts +0 -7
  183. package/dist/defaults.d.ts.map +0 -1
  184. package/dist/defaults.js +0 -83
  185. package/dist/defaults.js.map +0 -1
  186. package/dist/documents/base.d.ts +0 -3
  187. package/dist/documents/base.d.ts.map +0 -1
  188. package/dist/documents/base.js +0 -3
  189. package/dist/documents/base.js.map +0 -1
  190. package/dist/documents/email-token.d.ts +0 -8
  191. package/dist/documents/email-token.d.ts.map +0 -1
  192. package/dist/documents/email-token.js +0 -3
  193. package/dist/documents/email-token.js.map +0 -1
  194. package/dist/documents/index.d.ts.map +0 -1
  195. package/dist/documents/index.js +0 -3
  196. package/dist/documents/index.js.map +0 -1
  197. package/dist/documents/mnemonic.d.ts.map +0 -1
  198. package/dist/documents/mnemonic.js +0 -3
  199. package/dist/documents/mnemonic.js.map +0 -1
  200. package/dist/documents/role.d.ts.map +0 -1
  201. package/dist/documents/role.js +0 -3
  202. package/dist/documents/role.js.map +0 -1
  203. package/dist/documents/used-direct-login-token.d.ts +0 -5
  204. package/dist/documents/used-direct-login-token.d.ts.map +0 -1
  205. package/dist/documents/used-direct-login-token.js +0 -3
  206. package/dist/documents/used-direct-login-token.js.map +0 -1
  207. package/dist/documents/user-role.d.ts.map +0 -1
  208. package/dist/documents/user-role.js +0 -3
  209. package/dist/documents/user-role.js.map +0 -1
  210. package/dist/documents/user.d.ts.map +0 -1
  211. package/dist/documents/user.js +0 -3
  212. package/dist/documents/user.js.map +0 -1
  213. package/dist/enumerations/base-model-name.d.ts +0 -38
  214. package/dist/enumerations/base-model-name.d.ts.map +0 -1
  215. package/dist/enumerations/base-model-name.js +0 -34
  216. package/dist/enumerations/base-model-name.js.map +0 -1
  217. package/dist/enumerations/index.d.ts.map +0 -1
  218. package/dist/enumerations/index.js +0 -21
  219. package/dist/enumerations/index.js.map +0 -1
  220. package/dist/enumerations/length-encoding-type.d.ts +0 -7
  221. package/dist/enumerations/length-encoding-type.d.ts.map +0 -1
  222. package/dist/enumerations/length-encoding-type.js +0 -11
  223. package/dist/enumerations/length-encoding-type.js.map +0 -1
  224. package/dist/enumerations/schema-collection.d.ts +0 -34
  225. package/dist/enumerations/schema-collection.d.ts.map +0 -1
  226. package/dist/enumerations/schema-collection.js +0 -38
  227. package/dist/enumerations/schema-collection.js.map +0 -1
  228. package/dist/enumerations/symmetric-error-type.d.ts +0 -5
  229. package/dist/enumerations/symmetric-error-type.d.ts.map +0 -1
  230. package/dist/enumerations/symmetric-error-type.js +0 -9
  231. package/dist/enumerations/symmetric-error-type.js.map +0 -1
  232. package/dist/environment.d.ts +0 -189
  233. package/dist/environment.d.ts.map +0 -1
  234. package/dist/environment.js +0 -618
  235. package/dist/environment.js.map +0 -1
  236. package/dist/errors/express-validation.d.ts +0 -9
  237. package/dist/errors/express-validation.d.ts.map +0 -1
  238. package/dist/errors/express-validation.js +0 -17
  239. package/dist/errors/express-validation.js.map +0 -1
  240. package/dist/errors/index.d.ts.map +0 -1
  241. package/dist/errors/index.js +0 -29
  242. package/dist/errors/index.js.map +0 -1
  243. package/dist/errors/invalid-backup-code-version.d.ts +0 -6
  244. package/dist/errors/invalid-backup-code-version.d.ts.map +0 -1
  245. package/dist/errors/invalid-backup-code-version.js +0 -14
  246. package/dist/errors/invalid-backup-code-version.js.map +0 -1
  247. package/dist/errors/invalid-jwt-token.d.ts +0 -5
  248. package/dist/errors/invalid-jwt-token.d.ts.map +0 -1
  249. package/dist/errors/invalid-jwt-token.js +0 -11
  250. package/dist/errors/invalid-jwt-token.js.map +0 -1
  251. package/dist/errors/invalid-model.d.ts +0 -6
  252. package/dist/errors/invalid-model.d.ts.map +0 -1
  253. package/dist/errors/invalid-model.js +0 -13
  254. package/dist/errors/invalid-model.js.map +0 -1
  255. package/dist/errors/invalid-new-password.d.ts +0 -5
  256. package/dist/errors/invalid-new-password.d.ts.map +0 -1
  257. package/dist/errors/invalid-new-password.js +0 -14
  258. package/dist/errors/invalid-new-password.js.map +0 -1
  259. package/dist/errors/invalid-password.d.ts +0 -5
  260. package/dist/errors/invalid-password.d.ts.map +0 -1
  261. package/dist/errors/invalid-password.js +0 -14
  262. package/dist/errors/invalid-password.js.map +0 -1
  263. package/dist/errors/missing-validated-data.d.ts +0 -7
  264. package/dist/errors/missing-validated-data.d.ts.map +0 -1
  265. package/dist/errors/missing-validated-data.js +0 -34
  266. package/dist/errors/missing-validated-data.js.map +0 -1
  267. package/dist/errors/mnemonic-or-password-required.d.ts +0 -5
  268. package/dist/errors/mnemonic-or-password-required.d.ts.map +0 -1
  269. package/dist/errors/mnemonic-or-password-required.js +0 -13
  270. package/dist/errors/mnemonic-or-password-required.js.map +0 -1
  271. package/dist/errors/model-not-registered.d.ts +0 -5
  272. package/dist/errors/model-not-registered.d.ts.map +0 -1
  273. package/dist/errors/model-not-registered.js +0 -12
  274. package/dist/errors/model-not-registered.js.map +0 -1
  275. package/dist/errors/mongoose-validation.d.ts +0 -11
  276. package/dist/errors/mongoose-validation.d.ts.map +0 -1
  277. package/dist/errors/mongoose-validation.js +0 -16
  278. package/dist/errors/mongoose-validation.js.map +0 -1
  279. package/dist/errors/symmetric.d.ts +0 -8
  280. package/dist/errors/symmetric.d.ts.map +0 -1
  281. package/dist/errors/symmetric.js +0 -23
  282. package/dist/errors/symmetric.js.map +0 -1
  283. package/dist/errors/token-expired.d.ts +0 -5
  284. package/dist/errors/token-expired.d.ts.map +0 -1
  285. package/dist/errors/token-expired.js +0 -11
  286. package/dist/errors/token-expired.js.map +0 -1
  287. package/dist/get-language.d.ts +0 -2
  288. package/dist/get-language.d.ts.map +0 -1
  289. package/dist/get-language.js +0 -30
  290. package/dist/get-language.js.map +0 -1
  291. package/dist/get-timezone.d.ts +0 -3
  292. package/dist/get-timezone.d.ts.map +0 -1
  293. package/dist/get-timezone.js +0 -31
  294. package/dist/get-timezone.js.map +0 -1
  295. package/dist/index.d.ts.map +0 -1
  296. package/dist/index.js +0 -40
  297. package/dist/index.js.map +0 -1
  298. package/dist/interfaces/api-error-response.d.ts.map +0 -1
  299. package/dist/interfaces/api-error-response.js +0 -3
  300. package/dist/interfaces/api-error-response.js.map +0 -1
  301. package/dist/interfaces/api-express-validation-error-response.d.ts +0 -7
  302. package/dist/interfaces/api-express-validation-error-response.d.ts.map +0 -1
  303. package/dist/interfaces/api-express-validation-error-response.js +0 -3
  304. package/dist/interfaces/api-express-validation-error-response.js.map +0 -1
  305. package/dist/interfaces/api-message-response.d.ts +0 -4
  306. package/dist/interfaces/api-message-response.d.ts.map +0 -1
  307. package/dist/interfaces/api-message-response.js +0 -3
  308. package/dist/interfaces/api-message-response.js.map +0 -1
  309. package/dist/interfaces/api-mongo-validation-error-response.d.ts.map +0 -1
  310. package/dist/interfaces/api-mongo-validation-error-response.js +0 -3
  311. package/dist/interfaces/api-mongo-validation-error-response.js.map +0 -1
  312. package/dist/interfaces/api-responses/backup-codes-response.d.ts.map +0 -1
  313. package/dist/interfaces/api-responses/backup-codes-response.js +0 -3
  314. package/dist/interfaces/api-responses/backup-codes-response.js.map +0 -1
  315. package/dist/interfaces/api-responses/challenge-response.d.ts.map +0 -1
  316. package/dist/interfaces/api-responses/challenge-response.js +0 -3
  317. package/dist/interfaces/api-responses/challenge-response.js.map +0 -1
  318. package/dist/interfaces/api-responses/code-count-response.d.ts.map +0 -1
  319. package/dist/interfaces/api-responses/code-count-response.js +0 -3
  320. package/dist/interfaces/api-responses/code-count-response.js.map +0 -1
  321. package/dist/interfaces/api-responses/index.d.ts.map +0 -1
  322. package/dist/interfaces/api-responses/index.js +0 -24
  323. package/dist/interfaces/api-responses/index.js.map +0 -1
  324. package/dist/interfaces/api-responses/login-response.d.ts.map +0 -1
  325. package/dist/interfaces/api-responses/login-response.js +0 -3
  326. package/dist/interfaces/api-responses/login-response.js.map +0 -1
  327. package/dist/interfaces/api-responses/mnemonic-response.d.ts.map +0 -1
  328. package/dist/interfaces/api-responses/mnemonic-response.js +0 -3
  329. package/dist/interfaces/api-responses/mnemonic-response.js.map +0 -1
  330. package/dist/interfaces/api-responses/registration-response.d.ts.map +0 -1
  331. package/dist/interfaces/api-responses/registration-response.js +0 -3
  332. package/dist/interfaces/api-responses/registration-response.js.map +0 -1
  333. package/dist/interfaces/api-responses/request-user-response.d.ts.map +0 -1
  334. package/dist/interfaces/api-responses/request-user-response.js +0 -3
  335. package/dist/interfaces/api-responses/request-user-response.js.map +0 -1
  336. package/dist/interfaces/application.d.ts.map +0 -1
  337. package/dist/interfaces/application.js +0 -3
  338. package/dist/interfaces/application.js.map +0 -1
  339. package/dist/interfaces/backend-objects/email-token.d.ts +0 -4
  340. package/dist/interfaces/backend-objects/email-token.d.ts.map +0 -1
  341. package/dist/interfaces/backend-objects/email-token.js +0 -3
  342. package/dist/interfaces/backend-objects/email-token.js.map +0 -1
  343. package/dist/interfaces/backend-objects/index.d.ts.map +0 -1
  344. package/dist/interfaces/backend-objects/index.js +0 -21
  345. package/dist/interfaces/backend-objects/index.js.map +0 -1
  346. package/dist/interfaces/backend-objects/request-user.d.ts.map +0 -1
  347. package/dist/interfaces/backend-objects/request-user.js +0 -3
  348. package/dist/interfaces/backend-objects/request-user.js.map +0 -1
  349. package/dist/interfaces/backend-objects/role.d.ts.map +0 -1
  350. package/dist/interfaces/backend-objects/role.js +0 -3
  351. package/dist/interfaces/backend-objects/role.js.map +0 -1
  352. package/dist/interfaces/backend-objects/user.d.ts +0 -4
  353. package/dist/interfaces/backend-objects/user.d.ts.map +0 -1
  354. package/dist/interfaces/backend-objects/user.js +0 -3
  355. package/dist/interfaces/backend-objects/user.js.map +0 -1
  356. package/dist/interfaces/checksum-config.d.ts +0 -5
  357. package/dist/interfaces/checksum-config.d.ts.map +0 -1
  358. package/dist/interfaces/checksum-config.js +0 -3
  359. package/dist/interfaces/checksum-config.js.map +0 -1
  360. package/dist/interfaces/checksum-consts.d.ts +0 -11
  361. package/dist/interfaces/checksum-consts.d.ts.map +0 -1
  362. package/dist/interfaces/checksum-consts.js +0 -3
  363. package/dist/interfaces/checksum-consts.js.map +0 -1
  364. package/dist/interfaces/constants.d.ts.map +0 -1
  365. package/dist/interfaces/constants.js +0 -3
  366. package/dist/interfaces/constants.js.map +0 -1
  367. package/dist/interfaces/create-user-basics.d.ts +0 -18
  368. package/dist/interfaces/create-user-basics.d.ts.map +0 -1
  369. package/dist/interfaces/create-user-basics.js +0 -3
  370. package/dist/interfaces/create-user-basics.js.map +0 -1
  371. package/dist/interfaces/csp-config.d.ts +0 -14
  372. package/dist/interfaces/csp-config.d.ts.map +0 -1
  373. package/dist/interfaces/csp-config.js +0 -3
  374. package/dist/interfaces/csp-config.js.map +0 -1
  375. package/dist/interfaces/deep-partial.d.ts +0 -4
  376. package/dist/interfaces/deep-partial.d.ts.map +0 -1
  377. package/dist/interfaces/deep-partial.js +0 -3
  378. package/dist/interfaces/deep-partial.js.map +0 -1
  379. package/dist/interfaces/discriminator-collections.d.ts.map +0 -1
  380. package/dist/interfaces/discriminator-collections.js +0 -3
  381. package/dist/interfaces/discriminator-collections.js.map +0 -1
  382. package/dist/interfaces/email-service.d.ts +0 -4
  383. package/dist/interfaces/email-service.d.ts.map +0 -1
  384. package/dist/interfaces/email-service.js +0 -3
  385. package/dist/interfaces/email-service.js.map +0 -1
  386. package/dist/interfaces/environment-mongo.d.ts +0 -76
  387. package/dist/interfaces/environment-mongo.d.ts.map +0 -1
  388. package/dist/interfaces/environment-mongo.js +0 -3
  389. package/dist/interfaces/environment-mongo.js.map +0 -1
  390. package/dist/interfaces/environment.d.ts +0 -181
  391. package/dist/interfaces/environment.d.ts.map +0 -1
  392. package/dist/interfaces/environment.js +0 -3
  393. package/dist/interfaces/environment.js.map +0 -1
  394. package/dist/interfaces/failable-result.d.ts +0 -7
  395. package/dist/interfaces/failable-result.d.ts.map +0 -1
  396. package/dist/interfaces/failable-result.js +0 -3
  397. package/dist/interfaces/failable-result.js.map +0 -1
  398. package/dist/interfaces/fec-consts.d.ts +0 -5
  399. package/dist/interfaces/fec-consts.d.ts.map +0 -1
  400. package/dist/interfaces/fec-consts.js +0 -3
  401. package/dist/interfaces/fec-consts.js.map +0 -1
  402. package/dist/interfaces/handleable-error-options.d.ts +0 -7
  403. package/dist/interfaces/handleable-error-options.d.ts.map +0 -1
  404. package/dist/interfaces/handleable-error-options.js +0 -3
  405. package/dist/interfaces/handleable-error-options.js.map +0 -1
  406. package/dist/interfaces/index.d.ts.map +0 -1
  407. package/dist/interfaces/index.js +0 -46
  408. package/dist/interfaces/index.js.map +0 -1
  409. package/dist/interfaces/jwt-consts.d.ts +0 -11
  410. package/dist/interfaces/jwt-consts.d.ts.map +0 -1
  411. package/dist/interfaces/jwt-consts.js +0 -3
  412. package/dist/interfaces/jwt-consts.js.map +0 -1
  413. package/dist/interfaces/jwt-sign-response.d.ts +0 -11
  414. package/dist/interfaces/jwt-sign-response.d.ts.map +0 -1
  415. package/dist/interfaces/jwt-sign-response.js +0 -3
  416. package/dist/interfaces/jwt-sign-response.js.map +0 -1
  417. package/dist/interfaces/mongo-errors.d.ts +0 -5
  418. package/dist/interfaces/mongo-errors.d.ts.map +0 -1
  419. package/dist/interfaces/mongo-errors.js +0 -3
  420. package/dist/interfaces/mongo-errors.js.map +0 -1
  421. package/dist/interfaces/request-user.d.ts +0 -42
  422. package/dist/interfaces/request-user.d.ts.map +0 -1
  423. package/dist/interfaces/request-user.js +0 -3
  424. package/dist/interfaces/request-user.js.map +0 -1
  425. package/dist/interfaces/required-string-keys.d.ts +0 -22
  426. package/dist/interfaces/required-string-keys.d.ts.map +0 -1
  427. package/dist/interfaces/required-string-keys.js +0 -3
  428. package/dist/interfaces/required-string-keys.js.map +0 -1
  429. package/dist/interfaces/schema.d.ts +0 -29
  430. package/dist/interfaces/schema.d.ts.map +0 -1
  431. package/dist/interfaces/schema.js +0 -3
  432. package/dist/interfaces/schema.js.map +0 -1
  433. package/dist/interfaces/server-init-result.d.ts +0 -35
  434. package/dist/interfaces/server-init-result.d.ts.map +0 -1
  435. package/dist/interfaces/server-init-result.js +0 -3
  436. package/dist/interfaces/server-init-result.js.map +0 -1
  437. package/dist/interfaces/status-code-response.d.ts +0 -7
  438. package/dist/interfaces/status-code-response.d.ts.map +0 -1
  439. package/dist/interfaces/status-code-response.js +0 -3
  440. package/dist/interfaces/status-code-response.js.map +0 -1
  441. package/dist/interfaces/symmetric-encryption-results.d.ts +0 -5
  442. package/dist/interfaces/symmetric-encryption-results.d.ts.map +0 -1
  443. package/dist/interfaces/symmetric-encryption-results.js.map +0 -1
  444. package/dist/interfaces/token-response.d.ts.map +0 -1
  445. package/dist/interfaces/token-response.js +0 -3
  446. package/dist/interfaces/token-response.js.map +0 -1
  447. package/dist/middlewares/authenticate-crypto.d.ts +0 -13
  448. package/dist/middlewares/authenticate-crypto.d.ts.map +0 -1
  449. package/dist/middlewares/authenticate-crypto.js +0 -146
  450. package/dist/middlewares/authenticate-crypto.js.map +0 -1
  451. package/dist/middlewares/authenticate-token.d.ts +0 -24
  452. package/dist/middlewares/authenticate-token.d.ts.map +0 -1
  453. package/dist/middlewares/authenticate-token.js +0 -102
  454. package/dist/middlewares/authenticate-token.js.map +0 -1
  455. package/dist/middlewares/cleanup-crypto.d.ts +0 -7
  456. package/dist/middlewares/cleanup-crypto.d.ts.map +0 -1
  457. package/dist/middlewares/cleanup-crypto.js +0 -32
  458. package/dist/middlewares/cleanup-crypto.js.map +0 -1
  459. package/dist/middlewares/index.d.ts.map +0 -1
  460. package/dist/middlewares/index.js +0 -21
  461. package/dist/middlewares/index.js.map +0 -1
  462. package/dist/middlewares/set-global-context-language.d.ts +0 -3
  463. package/dist/middlewares/set-global-context-language.d.ts.map +0 -1
  464. package/dist/middlewares/set-global-context-language.js +0 -14
  465. package/dist/middlewares/set-global-context-language.js.map +0 -1
  466. package/dist/middlewares.d.ts +0 -18
  467. package/dist/middlewares.d.ts.map +0 -1
  468. package/dist/middlewares.js +0 -76
  469. package/dist/middlewares.js.map +0 -1
  470. package/dist/model-registry.d.ts +0 -23
  471. package/dist/model-registry.d.ts.map +0 -1
  472. package/dist/model-registry.js +0 -47
  473. package/dist/model-registry.js.map +0 -1
  474. package/dist/models/email-token.d.ts +0 -11
  475. package/dist/models/email-token.d.ts.map +0 -1
  476. package/dist/models/email-token.js +0 -11
  477. package/dist/models/email-token.js.map +0 -1
  478. package/dist/models/index.d.ts.map +0 -1
  479. package/dist/models/index.js +0 -23
  480. package/dist/models/index.js.map +0 -1
  481. package/dist/models/mnemonic.d.ts +0 -11
  482. package/dist/models/mnemonic.d.ts.map +0 -1
  483. package/dist/models/mnemonic.js +0 -11
  484. package/dist/models/mnemonic.js.map +0 -1
  485. package/dist/models/role.d.ts +0 -11
  486. package/dist/models/role.d.ts.map +0 -1
  487. package/dist/models/role.js +0 -11
  488. package/dist/models/role.js.map +0 -1
  489. package/dist/models/used-direct-login-token.d.ts +0 -11
  490. package/dist/models/used-direct-login-token.d.ts.map +0 -1
  491. package/dist/models/used-direct-login-token.js +0 -11
  492. package/dist/models/used-direct-login-token.js.map +0 -1
  493. package/dist/models/user-role.d.ts +0 -6
  494. package/dist/models/user-role.d.ts.map +0 -1
  495. package/dist/models/user-role.js +0 -10
  496. package/dist/models/user-role.js.map +0 -1
  497. package/dist/models/user.d.ts +0 -7
  498. package/dist/models/user.d.ts.map +0 -1
  499. package/dist/models/user.js +0 -11
  500. package/dist/models/user.js.map +0 -1
  501. package/dist/registry/email-service-registry.d.ts +0 -9
  502. package/dist/registry/email-service-registry.d.ts.map +0 -1
  503. package/dist/registry/email-service-registry.js +0 -17
  504. package/dist/registry/email-service-registry.js.map +0 -1
  505. package/dist/registry/index.d.ts.map +0 -1
  506. package/dist/registry/index.js +0 -6
  507. package/dist/registry/index.js.map +0 -1
  508. package/dist/routers/api.d.ts +0 -27
  509. package/dist/routers/api.d.ts.map +0 -1
  510. package/dist/routers/api.js +0 -44
  511. package/dist/routers/api.js.map +0 -1
  512. package/dist/routers/app.d.ts +0 -28
  513. package/dist/routers/app.d.ts.map +0 -1
  514. package/dist/routers/app.js +0 -182
  515. package/dist/routers/app.js.map +0 -1
  516. package/dist/routers/base.d.ts +0 -12
  517. package/dist/routers/base.d.ts.map +0 -1
  518. package/dist/routers/base.js +0 -12
  519. package/dist/routers/base.js.map +0 -1
  520. package/dist/routers/index.d.ts.map +0 -1
  521. package/dist/routers/index.js +0 -20
  522. package/dist/routers/index.js.map +0 -1
  523. package/dist/schemas/email-token.d.ts +0 -38
  524. package/dist/schemas/email-token.d.ts.map +0 -1
  525. package/dist/schemas/email-token.js +0 -56
  526. package/dist/schemas/email-token.js.map +0 -1
  527. package/dist/schemas/index.d.ts.map +0 -1
  528. package/dist/schemas/index.js +0 -24
  529. package/dist/schemas/index.js.map +0 -1
  530. package/dist/schemas/mnemonic.d.ts +0 -20
  531. package/dist/schemas/mnemonic.d.ts.map +0 -1
  532. package/dist/schemas/mnemonic.js +0 -30
  533. package/dist/schemas/mnemonic.js.map +0 -1
  534. package/dist/schemas/role.d.ts +0 -32
  535. package/dist/schemas/role.d.ts.map +0 -1
  536. package/dist/schemas/role.js +0 -86
  537. package/dist/schemas/role.js.map +0 -1
  538. package/dist/schemas/schema.d.ts +0 -40
  539. package/dist/schemas/schema.d.ts.map +0 -1
  540. package/dist/schemas/schema.js +0 -64
  541. package/dist/schemas/schema.js.map +0 -1
  542. package/dist/schemas/used-direct-login-token.d.ts +0 -27
  543. package/dist/schemas/used-direct-login-token.d.ts.map +0 -1
  544. package/dist/schemas/used-direct-login-token.js +0 -23
  545. package/dist/schemas/used-direct-login-token.js.map +0 -1
  546. package/dist/schemas/user-role.d.ts +0 -29
  547. package/dist/schemas/user-role.d.ts.map +0 -1
  548. package/dist/schemas/user-role.js +0 -54
  549. package/dist/schemas/user-role.js.map +0 -1
  550. package/dist/schemas/user.d.ts +0 -21
  551. package/dist/schemas/user.d.ts.map +0 -1
  552. package/dist/schemas/user.js +0 -178
  553. package/dist/schemas/user.js.map +0 -1
  554. package/dist/services/backup-code.d.ts +0 -78
  555. package/dist/services/backup-code.d.ts.map +0 -1
  556. package/dist/services/backup-code.js +0 -180
  557. package/dist/services/backup-code.js.map +0 -1
  558. package/dist/services/base.d.ts +0 -13
  559. package/dist/services/base.d.ts.map +0 -1
  560. package/dist/services/base.js +0 -14
  561. package/dist/services/base.js.map +0 -1
  562. package/dist/services/checksum.d.ts +0 -67
  563. package/dist/services/checksum.d.ts.map +0 -1
  564. package/dist/services/checksum.js +0 -175
  565. package/dist/services/checksum.js.map +0 -1
  566. package/dist/services/crc.d.ts +0 -87
  567. package/dist/services/crc.d.ts.map +0 -1
  568. package/dist/services/crc.js +0 -198
  569. package/dist/services/crc.js.map +0 -1
  570. package/dist/services/database-initialization.d.ts +0 -105
  571. package/dist/services/database-initialization.d.ts.map +0 -1
  572. package/dist/services/database-initialization.js +0 -779
  573. package/dist/services/database-initialization.js.map +0 -1
  574. package/dist/services/direct-login-token.d.ts +0 -9
  575. package/dist/services/direct-login-token.d.ts.map +0 -1
  576. package/dist/services/direct-login-token.js +0 -41
  577. package/dist/services/direct-login-token.js.map +0 -1
  578. package/dist/services/fec-usage-example.d.ts +0 -38
  579. package/dist/services/fec-usage-example.d.ts.map +0 -1
  580. package/dist/services/fec-usage-example.js +0 -77
  581. package/dist/services/fec-usage-example.js.map +0 -1
  582. package/dist/services/fec.d.ts +0 -46
  583. package/dist/services/fec.d.ts.map +0 -1
  584. package/dist/services/fec.js +0 -192
  585. package/dist/services/fec.js.map +0 -1
  586. package/dist/services/index.d.ts.map +0 -1
  587. package/dist/services/index.js +0 -35
  588. package/dist/services/index.js.map +0 -1
  589. package/dist/services/jwt.d.ts +0 -33
  590. package/dist/services/jwt.d.ts.map +0 -1
  591. package/dist/services/jwt.js +0 -90
  592. package/dist/services/jwt.js.map +0 -1
  593. package/dist/services/key-wrapping.d.ts +0 -60
  594. package/dist/services/key-wrapping.d.ts.map +0 -1
  595. package/dist/services/key-wrapping.js +0 -311
  596. package/dist/services/key-wrapping.js.map +0 -1
  597. package/dist/services/mnemonic.d.ts +0 -61
  598. package/dist/services/mnemonic.d.ts.map +0 -1
  599. package/dist/services/mnemonic.js +0 -112
  600. package/dist/services/mnemonic.js.map +0 -1
  601. package/dist/services/request-user.d.ts +0 -20
  602. package/dist/services/request-user.d.ts.map +0 -1
  603. package/dist/services/request-user.js +0 -50
  604. package/dist/services/request-user.js.map +0 -1
  605. package/dist/services/role.d.ts +0 -88
  606. package/dist/services/role.d.ts.map +0 -1
  607. package/dist/services/role.js +0 -263
  608. package/dist/services/role.js.map +0 -1
  609. package/dist/services/symmetric.d.ts +0 -42
  610. package/dist/services/symmetric.d.ts.map +0 -1
  611. package/dist/services/symmetric.js +0 -101
  612. package/dist/services/symmetric.js.map +0 -1
  613. package/dist/services/system-user.d.ts +0 -17
  614. package/dist/services/system-user.d.ts.map +0 -1
  615. package/dist/services/system-user.js +0 -46
  616. package/dist/services/system-user.js.map +0 -1
  617. package/dist/services/user.d.ts +0 -320
  618. package/dist/services/user.d.ts.map +0 -1
  619. package/dist/services/user.js +0 -1373
  620. package/dist/services/user.js.map +0 -1
  621. package/dist/services/xor.d.ts +0 -24
  622. package/dist/services/xor.d.ts.map +0 -1
  623. package/dist/services/xor.js +0 -37
  624. package/dist/services/xor.js.map +0 -1
  625. package/dist/types.d.ts +0 -70
  626. package/dist/types.d.ts.map +0 -1
  627. package/dist/types.js +0 -14
  628. package/dist/types.js.map +0 -1
  629. package/dist/utils.d.ts +0 -202
  630. package/dist/utils.d.ts.map +0 -1
  631. package/dist/utils.js +0 -786
  632. package/dist/utils.js.map +0 -1
  633. /package/{dist → src}/interfaces/symmetric-encryption-results.js +0 -0
@@ -0,0 +1,396 @@
1
+ import { MemberType } from '@digitaldefiance/ecies-lib';
2
+ import {
3
+ GlobalActiveContext,
4
+ IActiveContext,
5
+ PluginI18nEngine,
6
+ } from '@digitaldefiance/i18n-lib';
7
+ import {
8
+ IRoleBase,
9
+ IRoleDTO,
10
+ ITokenRole,
11
+ ITokenRoleDTO,
12
+ IUserRoleBase,
13
+ LastAdminError,
14
+ Role,
15
+ } from '@digitaldefiance/suite-core-lib';
16
+ import { ClientSession, Document, Types } from 'mongoose';
17
+ import { IBaseDocument, IUserDocument } from '../documents';
18
+ import { IRoleDocument } from '../documents/role';
19
+ import { IUserRoleDocument } from '../documents/user-role';
20
+ import { BaseModelName } from '../enumerations/base-model-name';
21
+ import { IApplication } from '../interfaces/application';
22
+ import { IRoleBackendObject } from '../interfaces/backend-objects/role';
23
+ import { ModelRegistry } from '../model-registry';
24
+ import { omit } from '../utils';
25
+ import { BaseService } from './base';
26
+ import { Environment } from '../environment';
27
+ import { IConstants } from '../interfaces';
28
+
29
+ /**
30
+ * Service for managing roles
31
+ */
32
+ export class RoleService<
33
+ I = Types.ObjectId,
34
+ D extends Date = Date,
35
+ TTokenRole extends ITokenRole<I, D> = ITokenRole<I, D>,
36
+ > extends BaseService {
37
+ /**
38
+ * Constructor for the role service
39
+ * @param application The application object
40
+ */
41
+ constructor(application: IApplication<any, Types.ObjectId, IBaseDocument<any, Types.ObjectId>, Environment, IConstants>,) {
42
+ super(application);
43
+ }
44
+
45
+ public static roleToRoleDTO<I = Types.ObjectId, D extends Date = Date>(
46
+ role: ITokenRole<I, D> | IRoleDocument | Partial<IRoleBase<I>>,
47
+ ): ITokenRoleDTO {
48
+ return {
49
+ ...(role instanceof Document ? role.toObject() : role),
50
+ _id: (role._id instanceof Types.ObjectId
51
+ ? role._id.toString()
52
+ : role._id) as string,
53
+ translatedName:
54
+ 'translatedName' in role ? role.translatedName : role.name,
55
+ createdBy: (role.createdBy instanceof Date
56
+ ? role.createdBy.toString()
57
+ : role.createdBy) as string,
58
+ updatedBy: (role.updatedBy instanceof Date
59
+ ? role.updatedBy.toString()
60
+ : role.updatedBy) as string,
61
+ ...(role.deletedBy
62
+ ? {
63
+ deletedBy: (role.deletedBy instanceof Date
64
+ ? role.deletedBy.toString()
65
+ : role.deletedBy) as string,
66
+ }
67
+ : {}),
68
+ } as ITokenRoleDTO;
69
+ }
70
+
71
+ /**
72
+ * Given a Role DTO, reconstitute ids and dates
73
+ * @param role The Role DTO
74
+ * @returns An IRoleBackendObject
75
+ */
76
+ public static hydrateRoleDTOToBackend(
77
+ role: ITokenRoleDTO,
78
+ ): IRoleBackendObject {
79
+ return {
80
+ ...(omit<ITokenRoleDTO, 'translatedName'>(role, [
81
+ 'translatedName',
82
+ ]) as IRoleDTO),
83
+ _id: new Types.ObjectId(role._id),
84
+ name: role.name as Role,
85
+ createdAt: new Date(role.createdAt),
86
+ createdBy: new Types.ObjectId(role.createdBy),
87
+ updatedAt: new Date(role.updatedAt),
88
+ updatedBy: new Types.ObjectId(role.updatedBy),
89
+ ...(role.deletedAt ? { deletedAt: new Date(role.deletedAt) } : {}),
90
+ ...(role.deletedBy
91
+ ? {
92
+ deletedBy: new Types.ObjectId(role.deletedBy),
93
+ }
94
+ : {}),
95
+ } as IRoleBackendObject;
96
+ }
97
+
98
+ /**
99
+ * Gets the role ID by name
100
+ * @param roleName The name of the role
101
+ * @returns The role ID or null if not found
102
+ */
103
+ public async getRoleIdByName(
104
+ roleName: Role,
105
+ session?: ClientSession,
106
+ ): Promise<Types.ObjectId | null> {
107
+ const RoleModel = ModelRegistry.instance.get<
108
+ IRoleBase<Types.ObjectId, Date, Role>,
109
+ IBaseDocument<IRoleBase<Types.ObjectId, Date, Role>>
110
+ >(BaseModelName.Role).model;
111
+ const role = await RoleModel.findOne({ name: roleName }, undefined, {
112
+ session,
113
+ }).select('_id');
114
+ if (!role) {
115
+ return null;
116
+ }
117
+ return role._id;
118
+ }
119
+
120
+ /**
121
+ * Creates a new role
122
+ * @param roleData The role data
123
+ * @param session Optional mongoose session
124
+ * @returns The created role document
125
+ */
126
+ public async createRole(
127
+ roleData: IRoleBase<Types.ObjectId, Date, Role>,
128
+ session?: ClientSession | null,
129
+ ): Promise<IRoleDocument> {
130
+ const RoleModel = ModelRegistry.instance.get<
131
+ IRoleBase<Types.ObjectId, Date, Role>,
132
+ IBaseDocument<IRoleBase<Types.ObjectId, Date, Role>>
133
+ >(BaseModelName.Role).model;
134
+ const role = new RoleModel(roleData);
135
+ const savedRole = await role.save(session ? { session } : {});
136
+ return savedRole;
137
+ }
138
+
139
+ /**
140
+ * Adds a user to a role
141
+ * @param roleId - The role id
142
+ * @param userId - The user id
143
+ * @param createdBy - The user creating the relationship
144
+ * @param session Optional mongoose session
145
+ */
146
+ public async addUserToRole(
147
+ roleId: Types.ObjectId,
148
+ userId: Types.ObjectId,
149
+ createdBy: Types.ObjectId,
150
+ session?: ClientSession,
151
+ overrideId?: Types.ObjectId,
152
+ ): Promise<IUserRoleDocument> {
153
+ const UserRoleModel = ModelRegistry.instance.get<
154
+ IUserRoleBase<Types.ObjectId, Date>,
155
+ IUserRoleDocument
156
+ >(BaseModelName.UserRole).model;
157
+
158
+ // Check if the user-role relationship already exists (and is not deleted)
159
+ const existingUserRole = await UserRoleModel.findOne({
160
+ userId,
161
+ roleId,
162
+ deletedAt: { $exists: false },
163
+ }).session(session ?? null);
164
+
165
+ if (existingUserRole) {
166
+ // Relationship already exists, no need to create it again
167
+ return existingUserRole;
168
+ }
169
+
170
+ const userRole = new UserRoleModel({
171
+ ...(overrideId ? { _id: overrideId } : {}),
172
+ userId,
173
+ roleId,
174
+ createdBy,
175
+ updatedBy: createdBy,
176
+ });
177
+ const result = await userRole.save({ session });
178
+ return result;
179
+ }
180
+
181
+ /**
182
+ * Removes a user from a role
183
+ * @param roleId - The role id
184
+ * @param userId - The user id
185
+ * @param deletedBy - The user removing the relationship
186
+ * @param session Optional mongoose session
187
+ * @throws LastAdminError if attempting to remove the last admin
188
+ */
189
+ public async removeUserFromRole(
190
+ roleId: Types.ObjectId,
191
+ userId: Types.ObjectId,
192
+ deletedBy: Types.ObjectId,
193
+ session?: ClientSession,
194
+ ): Promise<void> {
195
+ const RoleModel = ModelRegistry.instance.get<
196
+ IRoleBase<Types.ObjectId, Date, Role>,
197
+ IRoleDocument
198
+ >(BaseModelName.Role).model;
199
+ const UserRoleModel = ModelRegistry.instance.get<
200
+ IUserRoleBase<Types.ObjectId, Date>,
201
+ IUserRoleDocument
202
+ >(BaseModelName.UserRole).model;
203
+
204
+ const role = await RoleModel.findById(roleId).session(session ?? null);
205
+ if (role?.admin) {
206
+ const adminCount = await UserRoleModel.countDocuments({
207
+ roleId,
208
+ deletedAt: { $exists: false },
209
+ }).session(session ?? null);
210
+ if (adminCount <= 1) {
211
+ throw new LastAdminError();
212
+ }
213
+ }
214
+
215
+ await UserRoleModel.findOneAndUpdate(
216
+ { userId, roleId, deletedAt: { $exists: false } },
217
+ { deletedAt: new Date(), deletedBy },
218
+ { session },
219
+ );
220
+ }
221
+
222
+ /**
223
+ * Deletes a role by ID
224
+ * @param roleId The role ID
225
+ * @param deleter The ID of the user deleting the role
226
+ * @param hardDelete Whether to hard delete the role
227
+ * @param session Optional mongoose session
228
+ */
229
+ public async deleteRole(
230
+ roleId: Types.ObjectId,
231
+ deleter: Types.ObjectId,
232
+ hardDelete: boolean,
233
+ session?: ClientSession,
234
+ ): Promise<void> {
235
+ const RoleModel = ModelRegistry.instance.get<
236
+ IRoleBase<Types.ObjectId, Date, Role>,
237
+ IRoleDocument
238
+ >(BaseModelName.Role).model;
239
+ if (hardDelete) {
240
+ await RoleModel.findByIdAndDelete(roleId).session(session ?? null);
241
+ } else {
242
+ await RoleModel.findByIdAndUpdate(roleId, {
243
+ deletedAt: new Date(),
244
+ deletedBy: deleter,
245
+ }).session(session ?? null);
246
+ }
247
+ }
248
+
249
+ /**
250
+ * Gets all roles for a user
251
+ * @param userId The user ID
252
+ * @param session Optional mongoose session
253
+ * @returns The roles the user is a member of
254
+ */
255
+ public async getUserRoles(
256
+ userId: Types.ObjectId,
257
+ session?: ClientSession,
258
+ ): Promise<IRoleDocument[]> {
259
+ const UserRoleModel = ModelRegistry.instance.get<
260
+ IUserRoleBase<Types.ObjectId, Date>,
261
+ IUserRoleDocument
262
+ >(BaseModelName.UserRole).model;
263
+ const RoleModel = ModelRegistry.instance.get<
264
+ IRoleBase<Types.ObjectId, Date, Role>,
265
+ IBaseDocument<IRoleBase<Types.ObjectId, Date, Role>>
266
+ >(BaseModelName.Role).model;
267
+ if (!UserRoleModel || !RoleModel) throw new Error('Model not registered');
268
+
269
+ // Return full documents
270
+ const userRoles = await UserRoleModel.find({
271
+ userId,
272
+ deletedAt: { $exists: false },
273
+ })
274
+ .select('roleId')
275
+ .session(session ?? null);
276
+
277
+ const roleIds = userRoles.map((ur) => ur.roleId);
278
+ return await RoleModel.find({
279
+ _id: { $in: roleIds },
280
+ deletedAt: { $exists: false },
281
+ }).session(session ?? null);
282
+ }
283
+
284
+ /**
285
+ * Gets all users for a role
286
+ * @param roleId The role ID
287
+ * @param session Optional mongoose session
288
+ * @returns The user IDs that are members of the role
289
+ */
290
+ public async getRoleUsers(
291
+ roleId: Types.ObjectId,
292
+ session?: ClientSession,
293
+ ): Promise<Types.ObjectId[]> {
294
+ const UserRoleModel = ModelRegistry.instance.get<
295
+ IUserRoleBase<Types.ObjectId, Date>,
296
+ IUserRoleDocument
297
+ >(BaseModelName.UserRole).model;
298
+
299
+ // Return full documents
300
+ const userRoles = await UserRoleModel.find({
301
+ roleId,
302
+ deletedAt: { $exists: false },
303
+ })
304
+ .select('userId')
305
+ .session(session ?? null);
306
+
307
+ return userRoles.map((ur) => ur.userId);
308
+ }
309
+
310
+ /** Convert roles to translated TokenRoles */
311
+ public rolesToTokenRoles(
312
+ roles: Array<IRoleBackendObject>,
313
+ overrideLanguage?: string,
314
+ ): Array<TTokenRole> {
315
+ return roles.map((role) => {
316
+ const engine = PluginI18nEngine.getInstance<string>();
317
+ const userLang = GlobalActiveContext.getInstance<
318
+ string,
319
+ IActiveContext<string>
320
+ >().userLanguage;
321
+ const lang = (overrideLanguage || userLang || 'en-US') as string;
322
+ const roleTranslation = engine.translateEnum(Role, role.name, lang);
323
+ return {
324
+ ...role,
325
+ translatedName: roleTranslation,
326
+ } as TTokenRole;
327
+ });
328
+ }
329
+
330
+ public async isUserAdmin(
331
+ userDoc: IUserDocument,
332
+ session?: ClientSession,
333
+ providedRoles?: Array<IRoleDocument>,
334
+ ): Promise<boolean> {
335
+ const roles =
336
+ providedRoles ?? (await this.getUserRoles(userDoc._id, session));
337
+ if (roles.filter((r) => r.admin).length > 0) {
338
+ return true;
339
+ }
340
+ return false;
341
+ }
342
+
343
+ public async isUserMember(
344
+ userDoc: IUserDocument,
345
+ session?: ClientSession,
346
+ providedRoles?: Array<IRoleDocument>,
347
+ ): Promise<boolean> {
348
+ const roles =
349
+ providedRoles ?? (await this.getUserRoles(userDoc._id, session));
350
+ if (roles.filter((r) => r.member).length > 0) {
351
+ return true;
352
+ }
353
+ return false;
354
+ }
355
+
356
+ public async isUserChild(
357
+ userDoc: IUserDocument,
358
+ session?: ClientSession,
359
+ providedRoles?: Array<IRoleDocument>,
360
+ ): Promise<boolean> {
361
+ const roles =
362
+ providedRoles ?? (await this.getUserRoles(userDoc._id, session));
363
+ if (roles.filter((r) => r.child).length > 0) {
364
+ return true;
365
+ }
366
+ return false;
367
+ }
368
+
369
+ public async isSystemUser(
370
+ userDoc: IUserDocument,
371
+ session?: ClientSession,
372
+ providedRoles?: Array<IRoleDocument>,
373
+ ): Promise<boolean> {
374
+ const roles =
375
+ providedRoles ?? (await this.getUserRoles(userDoc._id, session));
376
+ return roles.some((r) => r.system);
377
+ }
378
+
379
+ public async getMemberType(
380
+ userDoc: IUserDocument,
381
+ session?: ClientSession,
382
+ providedRoles?: Array<IRoleDocument>,
383
+ ): Promise<MemberType> {
384
+ const roles =
385
+ providedRoles ?? (await this.getUserRoles(userDoc._id, session));
386
+ if (await this.isSystemUser(userDoc, session, roles)) {
387
+ return MemberType.System;
388
+ } else if (await this.isUserAdmin(userDoc, session, roles)) {
389
+ return MemberType.Admin;
390
+ } else if (await this.isUserMember(userDoc, session, roles)) {
391
+ return MemberType.User;
392
+ } else {
393
+ return MemberType.Anonymous;
394
+ }
395
+ }
396
+ }
@@ -0,0 +1,139 @@
1
+ import { ECIES, IECIESConstants } from '@digitaldefiance/ecies-lib';
2
+ import { createCipheriv, createDecipheriv, randomBytes } from 'crypto';
3
+ import { SymmetricErrorType } from '../enumerations/symmetric-error-type';
4
+ import { SymmetricError } from '../errors/symmetric';
5
+ import { ISymmetricEncryptionResults } from '../interfaces/symmetric-encryption-results';
6
+
7
+ function hasToJsonMethod<T>(obj: T): obj is T & { toJson: () => string } {
8
+ return typeof obj === 'object' && obj !== null && 'toJson' in obj;
9
+ }
10
+
11
+ /**
12
+ * Service for handling symmetric encryption operations.
13
+ * This service provides functionality for:
14
+ * - AES encryption/decryption of buffers and JSON data
15
+ * - Key and IV generation
16
+ * - Secure cryptographic operations
17
+ */
18
+ export class SymmetricService {
19
+ public static symmetricKeyBits(
20
+ eciesConstants: IECIESConstants = ECIES,
21
+ ): number {
22
+ return eciesConstants.SYMMETRIC.KEY_BITS;
23
+ }
24
+
25
+ public static symmetricKeyBytes(
26
+ eciesConstants: IECIESConstants = ECIES,
27
+ ): number {
28
+ return eciesConstants.SYMMETRIC.KEY_SIZE;
29
+ }
30
+
31
+ /**
32
+ * Encrypt data with AES
33
+ * @param data The data to encrypt
34
+ * @param encryptionKey Optional encryption key (will be randomly generated if not provided)
35
+ * @returns Object containing encrypted data and key
36
+ */
37
+ public static encryptBuffer(
38
+ data: Buffer,
39
+ encryptionKey?: Buffer,
40
+ eciesConstants: IECIESConstants = ECIES,
41
+ ): ISymmetricEncryptionResults {
42
+ if (
43
+ encryptionKey &&
44
+ encryptionKey.length != eciesConstants.SYMMETRIC.KEY_SIZE
45
+ ) {
46
+ throw new SymmetricError(SymmetricErrorType.InvalidKeyLength);
47
+ }
48
+
49
+ // encrypt the document using AES-256 and the key
50
+ // Initialization Vector
51
+ const ivBuffer = randomBytes(eciesConstants.IV_SIZE);
52
+ const key: Buffer =
53
+ encryptionKey ?? randomBytes(eciesConstants.SYMMETRIC.KEY_SIZE);
54
+ const cipher = createCipheriv(
55
+ eciesConstants.SYMMETRIC_ALGORITHM_CONFIGURATION,
56
+ key,
57
+ ivBuffer,
58
+ );
59
+
60
+ const ciphertextBuffer = cipher.update(data);
61
+ const finalBuffer = cipher.final();
62
+ const authTag = cipher.getAuthTag();
63
+
64
+ const encryptionIvPlusData: Buffer = Buffer.concat([
65
+ ivBuffer,
66
+ ciphertextBuffer,
67
+ finalBuffer,
68
+ authTag,
69
+ ]);
70
+ return {
71
+ encryptedData: encryptionIvPlusData,
72
+ key: key,
73
+ };
74
+ }
75
+
76
+ /**
77
+ * Decrypt the given buffer with AES
78
+ * @param encryptedData The encrypted data to decrypt
79
+ * @param key The key to use for decryption
80
+ * @returns Decrypted data as a Buffer
81
+ */
82
+ public static decryptBuffer(
83
+ encryptedData: Buffer,
84
+ key: Buffer,
85
+ eciesConstants: IECIESConstants = ECIES,
86
+ ): Buffer {
87
+ const ivBuffer = encryptedData.subarray(0, eciesConstants.IV_SIZE);
88
+ const authTagStart = encryptedData.length - eciesConstants.AUTH_TAG_SIZE;
89
+ const ciphertextBuffer = encryptedData.subarray(
90
+ eciesConstants.IV_SIZE,
91
+ authTagStart,
92
+ );
93
+ const authTag = encryptedData.subarray(authTagStart);
94
+
95
+ const decipher = createDecipheriv(
96
+ eciesConstants.SYMMETRIC_ALGORITHM_CONFIGURATION,
97
+ key,
98
+ ivBuffer,
99
+ );
100
+ decipher.setAuthTag(authTag);
101
+
102
+ return Buffer.concat([decipher.update(ciphertextBuffer), decipher.final()]);
103
+ }
104
+
105
+ /**
106
+ * Encrypt JSON data with AES
107
+ * @param data The data to encrypt
108
+ * @param encryptionKey Optional encryption key (will be randomly generated if not provided)
109
+ * @returns Object containing encrypted data and key
110
+ */
111
+ public static encryptJson<T>(
112
+ data: T,
113
+ encryptionKey?: Buffer,
114
+ ): ISymmetricEncryptionResults {
115
+ if (data === null || data === undefined) {
116
+ throw new SymmetricError(SymmetricErrorType.DataNullOrUndefined);
117
+ }
118
+ let dataBuffer: Buffer;
119
+ if (hasToJsonMethod<T>(data)) {
120
+ // amazonq-ignore-next-line false positive
121
+ dataBuffer = Buffer.from(data.toJson(), 'utf8');
122
+ } else {
123
+ dataBuffer = Buffer.from(JSON.stringify(data), 'utf8');
124
+ }
125
+ return SymmetricService.encryptBuffer(dataBuffer, encryptionKey);
126
+ }
127
+
128
+ /**
129
+ * Decrypt the given buffer with AES and parse as JSON
130
+ * @param encryptedData The encrypted data to decrypt
131
+ * @param key The key to use for decryption
132
+ * @returns Decrypted data parsed as type T
133
+ */
134
+ public static decryptJson<T>(encryptedData: Buffer, key: Buffer): T {
135
+ return JSON.parse(
136
+ SymmetricService.decryptBuffer(encryptedData, key).toString('utf8'),
137
+ ) as T;
138
+ }
139
+ }
@@ -0,0 +1,82 @@
1
+ import {
2
+ EmailString,
3
+ MemberType,
4
+ SecureBuffer,
5
+ SecureString,
6
+ } from '@digitaldefiance/ecies-lib';
7
+ import {
8
+ Member as BackendMember,
9
+ ECIESService,
10
+ } from '@digitaldefiance/node-ecies-lib';
11
+ import {
12
+ Constants,
13
+ IConstants,
14
+ SuiteCoreStringKey,
15
+ TranslatableSuiteError,
16
+ } from '@digitaldefiance/suite-core-lib';
17
+ import { Environment } from '../environment';
18
+
19
+ /**
20
+ * Service to manage the system member's wallet.
21
+ */
22
+ export class SystemUserService {
23
+ private static systemUser: BackendMember | null = null;
24
+ private static eciesService: ECIESService = new ECIESService();
25
+
26
+ /**
27
+ * Initializes and returns the system member's Member instance.
28
+ * The mnemonic should be stored securely in environment variables.
29
+ */
30
+ public static getSystemUser(
31
+ environment: Environment,
32
+ constants: IConstants = Constants,
33
+ ): BackendMember {
34
+ if (!SystemUserService.systemUser) {
35
+ if (!environment.systemMnemonic) {
36
+ throw new TranslatableSuiteError(
37
+ SuiteCoreStringKey.Admin_EnvNotSetTemplate,
38
+ {
39
+ NAME: 'SYSTEM_MNEMONIC',
40
+ },
41
+ );
42
+ }
43
+ const mnemonic: SecureString = environment.systemMnemonic;
44
+ const { wallet } =
45
+ SystemUserService.eciesService.walletAndSeedFromMnemonic(mnemonic);
46
+ const keyPair =
47
+ SystemUserService.eciesService.walletToSimpleKeyPairBuffer(wallet);
48
+
49
+ SystemUserService.systemUser = new BackendMember(
50
+ SystemUserService.eciesService,
51
+ MemberType.System,
52
+ constants.SystemUser,
53
+ new EmailString(constants.SystemEmail),
54
+ keyPair.publicKey,
55
+ new SecureBuffer(keyPair.privateKey),
56
+ wallet,
57
+ );
58
+ if (
59
+ SystemUserService.systemUser.publicKey.toString('hex') !==
60
+ environment.systemPublicKeyHex
61
+ ) {
62
+ console.warn('System public key does not match environment variable', {
63
+ derived: SystemUserService.systemUser.publicKey.toString('hex'),
64
+ expected: environment.systemPublicKeyHex,
65
+ });
66
+ }
67
+ }
68
+ return SystemUserService.systemUser;
69
+ }
70
+
71
+ public static setSystemUser(
72
+ user: BackendMember,
73
+ constants: IConstants = Constants,
74
+ ): void {
75
+ if (user.type !== MemberType.System || user.name !== constants.SystemUser) {
76
+ throw new Error(
77
+ 'setSystemUser can only be called with a MemberType.System user',
78
+ );
79
+ }
80
+ SystemUserService.systemUser = user;
81
+ }
82
+ }