@getjones/test-infra 5.2.14 → 5.2.16

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 (296) hide show
  1. package/eslint.config.mjs +156 -156
  2. package/package.json +43 -43
  3. package/src/common/commonFlows/auth/auth.js +95 -95
  4. package/src/common/commonFlows/index.js +5 -5
  5. package/src/common/commonFlows/records/records.js +452 -452
  6. package/src/common/commonFlows/users/users.js +15 -15
  7. package/src/common/consts/accountSettings.js +112 -112
  8. package/src/common/consts/activationStatuses.js +6 -6
  9. package/src/common/consts/analysisStatuses.js +7 -7
  10. package/src/common/consts/autocomplete.js +10 -10
  11. package/src/common/consts/constantsForRecordsSortingAndFilters.js +49 -49
  12. package/src/common/consts/dashboardCharts.js +18 -18
  13. package/src/common/consts/homepage/AttentionTab.js +6 -6
  14. package/src/common/consts/homepage/sortOptions.js +19 -19
  15. package/src/common/consts/projectSettings.js +28 -28
  16. package/src/common/consts/recordTypes.js +5 -5
  17. package/src/common/consts/requirementActions.js +10 -10
  18. package/src/common/consts/s3FileTypes.js +12 -12
  19. package/src/common/consts/userRoles.js +21 -21
  20. package/src/common/consts/userTypes.js +16 -16
  21. package/src/common/errorCodes.js +13 -13
  22. package/src/common/httpResponseStatusCodes.json +19 -19
  23. package/src/common/httpResponseTypes.json +2 -2
  24. package/src/common/requests/apiKeyAuth/requests.js +45 -45
  25. package/src/common/requests/cookieAuth/requests.js +40 -40
  26. package/src/common/requests/internalAuth/requests.js +48 -48
  27. package/src/common/requests/requestHandlers.js +112 -112
  28. package/src/common/utils/arrayUtils.js +19 -19
  29. package/src/common/utils/complianceUtil.js +114 -114
  30. package/src/common/utils/configsUtil.js +22 -22
  31. package/src/common/utils/dataTypeUtils.js +41 -41
  32. package/src/common/utils/numberUtils.js +22 -22
  33. package/src/common/utils/objectUtils.js +102 -102
  34. package/src/common/utils/timeUtils.js +202 -202
  35. package/src/common/validations/typeValidations.js +36 -36
  36. package/src/defaults/configs/attributes.js +170 -170
  37. package/src/defaults/configs/auditConfigs.js +129 -129
  38. package/src/defaults/configs/coverage.js +144 -144
  39. package/src/defaults/configs/polices.js +28 -28
  40. package/src/defaults/configs/requirement.js +218 -218
  41. package/src/defaults/index.js +7 -7
  42. package/src/env.js +58 -58
  43. package/src/factory/globalRecord/globalRecord.js +43 -43
  44. package/src/factory/index.js +8 -8
  45. package/src/factory/records/records.js +295 -295
  46. package/src/factory/users/users.js +70 -70
  47. package/src/index.js +118 -118
  48. package/src/reporters/mochaReporter.js +273 -273
  49. package/src/saas/internal-api/accountDirectory/api/accountDirectory.api.js +152 -152
  50. package/src/saas/internal-api/accountDirectory/api/accountDirectory.service.js +576 -576
  51. package/src/saas/internal-api/accountDirectory/consts/accountDirectory.consts.js +75 -75
  52. package/src/saas/internal-api/accountDirectory/index.js +5 -5
  53. package/src/saas/internal-api/accountDirectory/models/accountDirectory.models.js +172 -172
  54. package/src/saas/internal-api/accounts/api/core/accounts.core.api.js +54 -54
  55. package/src/saas/internal-api/accounts/api/core/accounts.core.service.js +114 -114
  56. package/src/saas/internal-api/accounts/api/emailCustomization/accounts.email.customizations.api.js +29 -29
  57. package/src/saas/internal-api/accounts/api/emailCustomization/accounts.email.customizations.service.js +60 -60
  58. package/src/saas/internal-api/accounts/api/emailCustomization/consts.js +8 -8
  59. package/src/saas/internal-api/accounts/api/openapi/accounts.openapi.api.js +54 -54
  60. package/src/saas/internal-api/accounts/api/openapi/accounts.openapi.service.js +67 -67
  61. package/src/saas/internal-api/accounts/api/settings/settings.api.js +21 -21
  62. package/src/saas/internal-api/accounts/api/settings/settings.service.js +58 -58
  63. package/src/saas/internal-api/accounts/consts/consts.js +8 -8
  64. package/src/saas/internal-api/accounts/index.js +22 -22
  65. package/src/saas/internal-api/accounts/models/core/create.account.model.js +16 -16
  66. package/src/saas/internal-api/accounts/models/settings/update.settings.model.js +110 -110
  67. package/src/saas/internal-api/accounts/utils/utils.js +60 -60
  68. package/src/saas/internal-api/agreement/api/agreement.api.js +39 -39
  69. package/src/saas/internal-api/agreement/api/agreement.service.js +121 -121
  70. package/src/saas/internal-api/agreement/consts/consts.js +11 -11
  71. package/src/saas/internal-api/agreement/index.js +12 -12
  72. package/src/saas/internal-api/agreement/models/create.agreement.model.js +12 -12
  73. package/src/saas/internal-api/agreement/models/createAgreementByAuditorModel.js +11 -11
  74. package/src/saas/internal-api/agreement/models/createAgreementByPMModel.js +13 -13
  75. package/src/saas/internal-api/auditCustomerRules/api/customer.rules.api.js +49 -49
  76. package/src/saas/internal-api/auditCustomerRules/api/customer.rules.service.js +121 -121
  77. package/src/saas/internal-api/auditCustomerRules/consts/customer.rule.js +40 -40
  78. package/src/saas/internal-api/auditCustomerRules/index.js +7 -7
  79. package/src/saas/internal-api/auditCustomerRules/models/customer.rule.model.js +55 -55
  80. package/src/saas/internal-api/auditCustomerRules/utils/customer.rule.util.js +70 -70
  81. package/src/saas/internal-api/auditNotes/api/audit.notes.api.js +40 -40
  82. package/src/saas/internal-api/auditNotes/api/audit.notes.service.js +116 -116
  83. package/src/saas/internal-api/auditNotes/index.js +4 -4
  84. package/src/saas/internal-api/auditNotes/models/audit.note.model.js +32 -32
  85. package/src/saas/internal-api/auditorComments/api/auditor.comments.api.js +20 -20
  86. package/src/saas/internal-api/auditorComments/api/auditor.comments.service.js +27 -27
  87. package/src/saas/internal-api/auditorComments/consts/auditor.comment.js +16 -16
  88. package/src/saas/internal-api/auditorComments/index.js +5 -5
  89. package/src/saas/internal-api/auditorComments/models/auditor.comment.model.js +40 -40
  90. package/src/saas/internal-api/auth/api/auth.api.js +78 -78
  91. package/src/saas/internal-api/auth/api/auth.service.js +217 -217
  92. package/src/saas/internal-api/auth/index.js +3 -3
  93. package/src/saas/internal-api/certificial/api/certificial.api.js +15 -15
  94. package/src/saas/internal-api/certificial/api/certificial.service.js +24 -24
  95. package/src/saas/internal-api/certificial/consts.js +8 -8
  96. package/src/saas/internal-api/certificial/index.js +4 -4
  97. package/src/saas/internal-api/coi/api/coi.api.js +76 -76
  98. package/src/saas/internal-api/coi/api/coi.service.js +104 -104
  99. package/src/saas/internal-api/coi/consts/{uploaderStatuses.js → coiUploaderTypes.js} +9 -9
  100. package/src/saas/internal-api/coi/consts/duplicateHandling.js +7 -7
  101. package/src/saas/internal-api/coi/consts/hashes.js +5 -5
  102. package/src/saas/internal-api/coi/consts/uploaderTypes.js +3 -3
  103. package/src/saas/internal-api/coi/index.js +17 -17
  104. package/src/saas/internal-api/coi/models/Combine.last.two.cois.model.js +25 -25
  105. package/src/saas/internal-api/coi/models/submit.coi.batch.model.js +23 -23
  106. package/src/saas/internal-api/coi/models/submit.coi.model.js +23 -23
  107. package/src/saas/internal-api/coi/utils/utils.js +186 -185
  108. package/src/saas/internal-api/compliance/api/amBestRating/am.best.rating.api.js +12 -12
  109. package/src/saas/internal-api/compliance/api/amBestRating/am.best.rating.service.js +14 -14
  110. package/src/saas/internal-api/compliance/api/audit/aiAudit/aiAudit.api.js +63 -63
  111. package/src/saas/internal-api/compliance/api/audit/aiAudit/aiAudit.service.js +99 -99
  112. package/src/saas/internal-api/compliance/api/audit/audit.api.js +124 -124
  113. package/src/saas/internal-api/compliance/api/audit/audit.service.js +390 -390
  114. package/src/saas/internal-api/compliance/api/complianceSnapshot/compliance.snapshot.api.js +32 -32
  115. package/src/saas/internal-api/compliance/api/complianceSnapshot/compliance.snapshot.service.js +73 -73
  116. package/src/saas/internal-api/compliance/api/convert/convert.api.js +12 -12
  117. package/src/saas/internal-api/compliance/api/convert/convert.service.js +7 -7
  118. package/src/saas/internal-api/compliance/api/coverage/coverage.api.js +33 -33
  119. package/src/saas/internal-api/compliance/api/coverage/coverage.service.js +46 -46
  120. package/src/saas/internal-api/compliance/api/overrideGap/override.gap.api.js +86 -86
  121. package/src/saas/internal-api/compliance/api/overrideGap/override.gap.service.js +300 -300
  122. package/src/saas/internal-api/compliance/consts/audit.js +130 -130
  123. package/src/saas/internal-api/compliance/consts/overrideGapRequest/override.gap.request.js +7 -7
  124. package/src/saas/internal-api/compliance/index.js +41 -41
  125. package/src/saas/internal-api/compliance/models/audit/audit.model.js +109 -109
  126. package/src/saas/internal-api/compliance/models/overrideGapRequest/override.gap.request.model.js +16 -16
  127. package/src/saas/internal-api/compliance/models/waive/waive.model.js +112 -112
  128. package/src/saas/internal-api/compliance/utils/auditUtil.js +308 -308
  129. package/src/saas/internal-api/compliance/utils/coverageUtil.js +45 -45
  130. package/src/saas/internal-api/contractors/api/contractors.api.js +251 -251
  131. package/src/saas/internal-api/contractors/api/contractors.service.js +482 -482
  132. package/src/saas/internal-api/contractors/consts/consts.js +6 -6
  133. package/src/saas/internal-api/contractors/index.js +8 -8
  134. package/src/saas/internal-api/contractors/models/assign.requirement.model.js +11 -11
  135. package/src/saas/internal-api/contractors/models/edit.contractor.model.js +73 -73
  136. package/src/saas/internal-api/contractors/models/link.request.model.js +10 -10
  137. package/src/saas/internal-api/contractors/models/verification.contractor.model.js +29 -29
  138. package/src/saas/internal-api/contractors/utils.js +25 -25
  139. package/src/saas/internal-api/customTags/api/customTags.api.js +47 -47
  140. package/src/saas/internal-api/customTags/api/customTags.service.js +96 -96
  141. package/src/saas/internal-api/customTags/index.js +4 -4
  142. package/src/saas/internal-api/customTags/models/customTagsModels.js +17 -17
  143. package/src/saas/internal-api/dashboard/api/recordList.api.js +38 -38
  144. package/src/saas/internal-api/dashboard/api/recordList.service.js +60 -60
  145. package/src/saas/internal-api/dashboard/index.js +5 -5
  146. package/src/saas/internal-api/dashboard/models/dashboard.filter.criteria.model.js +38 -38
  147. package/src/saas/internal-api/dbEmails/api/db.emails.api.js +25 -25
  148. package/src/saas/internal-api/dbEmails/api/db.emails.service.js +209 -209
  149. package/src/saas/internal-api/dbEmails/consts/consts.js +66 -66
  150. package/src/saas/internal-api/dbEmails/index.js +6 -6
  151. package/src/saas/internal-api/dbEmails/models/db.emails.model.js +22 -22
  152. package/src/saas/internal-api/dbEmails/utils/util.js +82 -82
  153. package/src/saas/internal-api/emailCustomization/api/email.customization.api.js +26 -26
  154. package/src/saas/internal-api/emailCustomization/api/email.customization.service.js +50 -50
  155. package/src/saas/internal-api/emailCustomization/index.js +3 -3
  156. package/src/saas/internal-api/fileScan/api/file.scan.api.js +14 -14
  157. package/src/saas/internal-api/fileScan/api/file.scan.service.js +35 -35
  158. package/src/saas/internal-api/fileScan/index.js +3 -3
  159. package/src/saas/internal-api/fileScan/models/update.scan.status.model.js +13 -13
  160. package/src/saas/internal-api/globalRecord/api/global.record.api.js +95 -95
  161. package/src/saas/internal-api/globalRecord/api/global.record.service.js +112 -112
  162. package/src/saas/internal-api/globalRecord/consts.js +20 -20
  163. package/src/saas/internal-api/globalRecord/index.js +6 -6
  164. package/src/saas/internal-api/globalRecord/models/global.record.model.js +60 -60
  165. package/src/saas/internal-api/globalRecord/utils/util.js +161 -161
  166. package/src/saas/internal-api/homepageCharts/api/charts.api.js +12 -12
  167. package/src/saas/internal-api/homepageCharts/api/charts.service.js +7 -7
  168. package/src/saas/internal-api/homepageCharts/index.js +3 -3
  169. package/src/saas/internal-api/notificationCenter/api/notification.center.api.js +32 -32
  170. package/src/saas/internal-api/notificationCenter/api/notification.center.service.js +49 -49
  171. package/src/saas/internal-api/notificationCenter/consts.js +9 -9
  172. package/src/saas/internal-api/notificationCenter/index.js +4 -4
  173. package/src/saas/internal-api/outlook/api/outlook.api.js +14 -14
  174. package/src/saas/internal-api/outlook/api/outlook.service.js +14 -14
  175. package/src/saas/internal-api/outlook/index.js +3 -3
  176. package/src/saas/internal-api/policyFile/api/policy.file.api.js +43 -43
  177. package/src/saas/internal-api/policyFile/api/policy.file.service.js +117 -117
  178. package/src/saas/internal-api/policyFile/consts.js +21 -21
  179. package/src/saas/internal-api/policyFile/index.js +11 -11
  180. package/src/saas/internal-api/policyFile/models/create.policy.file.model.js +11 -11
  181. package/src/saas/internal-api/policyFile/models/set.publish.flag.to.policy.model.js +13 -13
  182. package/src/saas/internal-api/projects/api/core/projects.api.js +39 -39
  183. package/src/saas/internal-api/projects/api/core/projects.service.js +77 -77
  184. package/src/saas/internal-api/projects/api/settings/project.settings.api.js +18 -18
  185. package/src/saas/internal-api/projects/api/settings/project.settings.service.js +35 -35
  186. package/src/saas/internal-api/projects/consts/defaultProject.js +3 -3
  187. package/src/saas/internal-api/projects/index.js +24 -24
  188. package/src/saas/internal-api/projects/models/core/create.project.model.js +41 -41
  189. package/src/saas/internal-api/projects/models/core/update.project.model.js +47 -47
  190. package/src/saas/internal-api/projects/models/settings/update.project.settings.model.js +56 -56
  191. package/src/saas/internal-api/projects/utils/utils.js +159 -159
  192. package/src/saas/internal-api/recordHub/api/record.hub.api.js +20 -20
  193. package/src/saas/internal-api/recordHub/api/record.hub.service.js +86 -86
  194. package/src/saas/internal-api/recordHub/index.js +3 -3
  195. package/src/saas/internal-api/recordNotes/api/record.notes.api.js +38 -38
  196. package/src/saas/internal-api/recordNotes/api/record.notes.service.js +56 -56
  197. package/src/saas/internal-api/recordNotes/api/record.notes.utils.js +12 -12
  198. package/src/saas/internal-api/recordNotes/index.js +3 -3
  199. package/src/saas/internal-api/relatedDocs/api/related.docs.api.js +98 -98
  200. package/src/saas/internal-api/relatedDocs/api/related.docs.service.js +180 -180
  201. package/src/saas/internal-api/relatedDocs/index.js +4 -4
  202. package/src/saas/internal-api/relatedDocs/models/related.doc.model.js +36 -36
  203. package/src/saas/internal-api/reports/api/reports.api.js +56 -56
  204. package/src/saas/internal-api/reports/api/reports.service.js +68 -68
  205. package/src/saas/internal-api/reports/consts/consts.js +71 -71
  206. package/src/saas/internal-api/reports/index.js +15 -15
  207. package/src/saas/internal-api/reports/models/report.model.js +27 -27
  208. package/src/saas/internal-api/requests/api/requests.api.js +132 -132
  209. package/src/saas/internal-api/requests/api/requests.service.js +315 -315
  210. package/src/saas/internal-api/requests/index.js +21 -21
  211. package/src/saas/internal-api/requests/models/create.request.model.js +39 -39
  212. package/src/saas/internal-api/requests/models/draft.request.criteria.model.js +18 -18
  213. package/src/saas/internal-api/requests/models/draft.request.report.model.js +14 -14
  214. package/src/saas/internal-api/requests/models/edit.request.model.js +31 -31
  215. package/src/saas/internal-api/requests/models/homepageRequestCriteriaModel.js +19 -19
  216. package/src/saas/internal-api/requests/models/requestListCriteriaModel.js +17 -17
  217. package/src/saas/internal-api/requests/models/tenant.request.model.js +9 -9
  218. package/src/saas/internal-api/requests/utils.js +16 -16
  219. package/src/saas/internal-api/requestsTable/api/requests.table.api.js +20 -20
  220. package/src/saas/internal-api/requestsTable/api/requests.table.service.js +14 -14
  221. package/src/saas/internal-api/requestsTable/index.js +3 -3
  222. package/src/saas/internal-api/requirements/api/lease/lease.api.js +74 -74
  223. package/src/saas/internal-api/requirements/api/lease/lease.service.js +167 -167
  224. package/src/saas/internal-api/requirements/api/requirements.api.js +65 -65
  225. package/src/saas/internal-api/requirements/api/requirements.service.js +198 -198
  226. package/src/saas/internal-api/requirements/consts/attributeTypes.json +8 -8
  227. package/src/saas/internal-api/requirements/consts/consts.js +22 -22
  228. package/src/saas/internal-api/requirements/index.js +22 -22
  229. package/src/saas/internal-api/requirements/models/create.requirement.model.js +17 -17
  230. package/src/saas/internal-api/requirements/models/extraction.request.model.js +16 -16
  231. package/src/saas/internal-api/requirements/models/policy.model.js +35 -35
  232. package/src/saas/internal-api/requirements/models/tab.extraction.request.model.js +14 -14
  233. package/src/saas/internal-api/requirements/models/update.requirement.model.js +19 -19
  234. package/src/saas/internal-api/requirements/utils/utils.js +129 -129
  235. package/src/saas/internal-api/sampleCoi/api/sample.coi.api.js +15 -15
  236. package/src/saas/internal-api/sampleCoi/api/sample.coi.service.js +48 -48
  237. package/src/saas/internal-api/sampleCoi/consts/consts.js +22 -22
  238. package/src/saas/internal-api/sampleCoi/index.js +4 -4
  239. package/src/saas/internal-api/schedulerJobRun/api/scheduler.job.run.api.js +31 -31
  240. package/src/saas/internal-api/schedulerJobRun/api/scheduler.job.run.service.js +56 -56
  241. package/src/saas/internal-api/schedulerJobRun/index.js +3 -3
  242. package/src/saas/internal-api/serviceArea/api/coordinates.api.js +12 -12
  243. package/src/saas/internal-api/serviceArea/api/coordinates.service.js +7 -7
  244. package/src/saas/internal-api/serviceArea/index.js +4 -4
  245. package/src/saas/internal-api/serviceArea/utils/utils.js +8 -8
  246. package/src/saas/internal-api/tableOfContents/api/table.of.contents.api.js +37 -37
  247. package/src/saas/internal-api/tableOfContents/api/table.of.contents.service.js +19 -19
  248. package/src/saas/internal-api/tableOfContents/index.js +3 -3
  249. package/src/saas/internal-api/tabs/api/tabs.api.js +32 -32
  250. package/src/saas/internal-api/tabs/api/tabs.service.js +60 -60
  251. package/src/saas/internal-api/tabs/index.js +3 -3
  252. package/src/saas/internal-api/tabs/models/tabs.model.js +19 -19
  253. package/src/saas/internal-api/thread-scheduler/runner.js +86 -86
  254. package/src/saas/internal-api/thread-scheduler/schedulerJobs.js +10 -10
  255. package/src/saas/internal-api/uploadFiles/api/upload.file.api.js +49 -49
  256. package/src/saas/internal-api/uploadFiles/api/upload.file.service.js +176 -176
  257. package/src/saas/internal-api/uploadFiles/consts.js +36 -36
  258. package/src/saas/internal-api/uploadFiles/index.js +5 -5
  259. package/src/saas/internal-api/uploadFiles/utils.js +34 -34
  260. package/src/saas/internal-api/users/api/tenantApp/tenant.app.api.js +38 -38
  261. package/src/saas/internal-api/users/api/tenantApp/tenant.app.service.js +109 -109
  262. package/src/saas/internal-api/users/api/users.api.js +158 -158
  263. package/src/saas/internal-api/users/api/users.service.js +363 -363
  264. package/src/saas/internal-api/users/index.js +17 -17
  265. package/src/saas/internal-api/users/models/create.inner.system.user.model.js +18 -18
  266. package/src/saas/internal-api/users/models/notification.settings.model.js +15 -15
  267. package/src/saas/internal-api/users/models/tenant.user.model.js +11 -11
  268. package/src/saas/internal-api/users/models/users.model.js +43 -43
  269. package/src/saas/internal-api/users/utils/util.js +50 -50
  270. package/src/saas/internal-api/vendorProfile/api/vendor.profile.api.js +26 -26
  271. package/src/saas/internal-api/vendorProfile/api/vendor.profile.service.js +19 -19
  272. package/src/saas/internal-api/vendorProfile/index.js +3 -3
  273. package/src/saas/openapi/accounts/accounts.api.js +17 -17
  274. package/src/saas/openapi/accounts/accounts.service.js +11 -11
  275. package/src/saas/openapi/coi/coi.api.js +35 -35
  276. package/src/saas/openapi/coi/coi.service.js +53 -53
  277. package/src/saas/openapi/projects/projects.api.js +83 -83
  278. package/src/saas/openapi/projects/projects.service.js +89 -89
  279. package/src/saas/openapi/relatedDocs/related.docs.api.js +30 -30
  280. package/src/saas/openapi/relatedDocs/related.docs.service.js +56 -56
  281. package/src/saas/openapi/requests/index.js +7 -7
  282. package/src/saas/openapi/requests/models/invite.request.model.js +42 -42
  283. package/src/saas/openapi/requests/models/update.request.model.js +37 -37
  284. package/src/saas/openapi/requests/requests.api.js +93 -93
  285. package/src/saas/openapi/requests/requests.service.js +100 -100
  286. package/src/saas/openapi/requirements/index.js +6 -6
  287. package/src/saas/openapi/requirements/models/copy.requirement.model.js +10 -10
  288. package/src/saas/openapi/requirements/requirements.api.js +41 -41
  289. package/src/saas/openapi/requirements/requirements.service.js +61 -61
  290. package/src/saas/openapi/tabs/index.js +6 -6
  291. package/src/saas/openapi/tabs/models/create.tab.model.js +6 -6
  292. package/src/saas/openapi/tabs/tabs.api.js +27 -27
  293. package/src/saas/openapi/tabs/tabs.service.js +26 -26
  294. package/src/saas/openapi/users/user.model.js +10 -10
  295. package/src/saas/openapi/users/users.api.js +33 -33
  296. package/src/saas/openapi/users/users.service.js +51 -51
@@ -1,363 +1,363 @@
1
- const { InviteUserModel, SignupUserModel, EditUserInvitationModel, EditUserProfileModel } = require('../models/users.model');
2
- const { validateType } = require('../../../../common/validations/typeValidations');
3
- const { getEnv, getSystemUserIdentity } = require('../../../../env');
4
- const { credentials } = getEnv();
5
- const userAPI = require('./users.api');
6
- const dbEmailsService = require('../../dbEmails/api/db.emails.service');
7
- const util = require('../utils/util');
8
- const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
9
- const { NotificationSettingsModel } = require('../models/notification.settings.model');
10
- const CreateInnerSystemAccountModel = require('../models/create.inner.system.user.model');
11
- const CreateInnerSystemUserModel = require('../models/create.inner.system.user.model');
12
-
13
- const { internalApiUserRoles: userRoles } = require('../../../../common/consts/userRoles');
14
-
15
- const inviteUser = async (invitedUserModels, context, { disableSendMail } = {}) => {
16
- return userAPI.invite(invitedUserModels, context, { disableSendMail });
17
- };
18
-
19
- const signupUser = (signupUserModel, context) => {
20
- validateType(signupUserModel, SignupUserModel);
21
- return userAPI.signupUser(signupUserModel, context);
22
- };
23
-
24
- const editUserRole = async (userId, data, context) => {
25
- return userAPI.editUserRole(userId, data, context);
26
- };
27
-
28
- const editUserInvitationByModel = async (editUserInvitationModel, context) => {
29
- validateType(editUserInvitationModel, EditUserInvitationModel);
30
- return userAPI.invite([editUserInvitationModel], context);
31
- };
32
-
33
- const editUserInvitation = async (userId, userEmail, role, projectsIds, context, { hasCompleteAccessPermission } = {}) => {
34
- const editUserInvitationModel = new EditUserInvitationModel(userId, userEmail, role, projectsIds, hasCompleteAccessPermission);
35
-
36
- const response = await editUserInvitationByModel(editUserInvitationModel, context);
37
-
38
- if (response.status !== httpResponseStatusCodes.NO_CONTENT) {
39
- throw new Error('Failed to edit user invitation');
40
- }
41
-
42
- return response;
43
- };
44
-
45
- const getUsersByProjectId = async (projectId, context) => {
46
- return userAPI.getUsersByProjectId(projectId, context);
47
- };
48
-
49
- const getUserByEmail = async (email, context) => {
50
- return userAPI.getUserByEmail(email, context);
51
- };
52
-
53
- const getUserByEmailForAutoReplyEmails = async (email, { expectError } = {}) => {
54
- const response = await userAPI.getUserByEmailForAutoReplyEmails(email);
55
-
56
- if (response.status !== httpResponseStatusCodes.OK && !expectError) {
57
- throw new Error(`Failed to get user by email ${email}. Status: ${response.status}`);
58
- }
59
-
60
- return response;
61
- };
62
-
63
- const getTeamMemberByEmail = async (email, accountId, context) => {
64
- const response = await userAPI.getTeamMemberByEmail(email, accountId, context);
65
-
66
- if (response.status !== httpResponseStatusCodes.OK) {
67
- throw new Error(`Failed to get user by email ${email}`);
68
- }
69
-
70
- return response.data;
71
- };
72
-
73
- const getEnabledAndDisabledByEmail = async (email, context) => {
74
- const response = await userAPI.getEnabledAndDisabledByEmail(email, context);
75
-
76
- if (response.status !== httpResponseStatusCodes.OK) {
77
- throw new Error(`Failed to get user by email ${email}`);
78
- }
79
-
80
- return response.data;
81
- };
82
-
83
- const getOrCreateUser = async (email, role, projectsIds, context, { fullName = role, password = credentials.strongPassword, expectError, hasCompleteAccessPermission } = {}) => {
84
- let userResponse = await getUserByEmail(email, context);
85
-
86
- if (userResponse.data !== '' && userResponse.status === httpResponseStatusCodes.OK) {
87
- const { projectPermissions } = userResponse.data;
88
- const projectPermissionsIds = projectPermissions.map(projectPermission => projectPermission.projectId);
89
-
90
- projectsIds = projectsIds.filter(projectId => !projectPermissionsIds.includes(projectId));
91
-
92
- if (userResponse.data && userResponse.data.id && userResponse.data.isVerified && !projectsIds.length) {
93
- return userResponse.data;
94
- }
95
- }
96
-
97
- const inviteUserModel = new InviteUserModel(email, role, projectsIds, hasCompleteAccessPermission);
98
- const inviteResponse = await inviteUser([inviteUserModel], context);
99
-
100
- if (inviteResponse.status !== httpResponseStatusCodes.NO_CONTENT && !expectError) {
101
- throw new Error(`Failed to invite user with email: ${email}\n${inviteResponse}`);
102
- } else if (expectError) {
103
- return inviteResponse;
104
- }
105
-
106
- userResponse = await getUserByEmail(email, context);
107
-
108
- //Already signup user
109
- if (userResponse.data.isVerified) {
110
- return userResponse.data;
111
- }
112
-
113
- const signupUserModel = await util.getSignupUserModel(email, role, fullName, password, context);
114
- const signupResponse = await signupUser(signupUserModel, context);
115
-
116
- if (signupResponse.status !== httpResponseStatusCodes.OK) {
117
- throw new Error(`Failed to signup user with email: ${email}\n${signupResponse}`);
118
- }
119
-
120
- userResponse = await getUserByEmail(email, context);
121
- return userResponse.data;
122
- };
123
-
124
- const deleteUser = (userId, context) => {
125
- return userAPI.deleteUser(userId, context);
126
- };
127
-
128
- const editUserProjects = async (accountId, userId, addedProjectIds, removedProjectIds, context, { hasCompleteAccessPermission } = {}) => {
129
- return userAPI.editUserProjects(accountId, userId, addedProjectIds, removedProjectIds, context, { hasCompleteAccessPermission });
130
- };
131
-
132
- const deleteAllTeamMembersFromProjects = async (projectsIds, context) => {
133
- for (const projectId of projectsIds) {
134
- await deleteAllTeamMembersFromProject(projectId, context);
135
- }
136
- };
137
-
138
- const deleteAllTeamMembersFromProject = async (projectId, context) => {
139
- let { data: users } = await getUsersByProjectId(projectId, context);
140
- users = users.filter(user => user.role !== userRoles.admin);
141
-
142
- for (const user of users) {
143
- await deleteUser(user.id, context);
144
- await removeAllUserTraceFromDb(user.id, context);
145
- }
146
- };
147
-
148
- const removeAllUserTraceFromDb = (userId, context) => {
149
- return userAPI.removeAllUserTraceFromDb(userId, context);
150
- };
151
-
152
- const deleteUserByEmail = async (userEmail, context) => {
153
- const { data: user } = await getUserByEmail(userEmail, context);
154
- return user ? deleteUser(user.id, context) : null;
155
- };
156
-
157
- const reinviteUser = (userId, context) => {
158
- return userAPI.reinviteUser(userId, context);
159
- };
160
-
161
- const editUserEmailNotificationsSettings = (notificationSettingsModel, context) => {
162
- validateType(notificationSettingsModel, NotificationSettingsModel);
163
- return userAPI.editUserEmailNotificationsSettings(notificationSettingsModel, context);
164
- };
165
-
166
- const createInnerSystemUser = async (createInnerSystemUserModel, icsContext) => {
167
- validateType(createInnerSystemUserModel, CreateInnerSystemAccountModel);
168
- const response = await userAPI.createInnerSystemUser(createInnerSystemUserModel, icsContext);
169
-
170
- if (response.status !== httpResponseStatusCodes.OK) {
171
- throw Error(`Create inner system account failed\n${response}`);
172
- }
173
-
174
- return response.data;
175
- };
176
-
177
- const getInnerSystemUsersPerRole = async icsContext => {
178
- const roles = `${userRoles.ics},${userRoles.auditor},${userRoles.operator}`;
179
- const response = await userAPI.getInnerSystemUsersPerRole(roles, icsContext);
180
-
181
- if (response.status !== httpResponseStatusCodes.OK) {
182
- throw Error(`Get inner system accounts failed\n${response}`);
183
- }
184
-
185
- return response.data;
186
- };
187
-
188
- const deactivateInnerSystemUser = async (userId, icsContext, { expectError } = {}) => {
189
- const response = await userAPI.deactivateInnerSystemUser(userId, icsContext);
190
-
191
- if (!expectError && response.status !== httpResponseStatusCodes.OK && response.status !== httpResponseStatusCodes.NO_CONTENT) {
192
- throw Error(`Failed to deactivate user ${userId}. Status code: ${response.status}`);
193
- }
194
-
195
- return response;
196
- };
197
-
198
- const activateInnerSystemUser = async (userId, icsContext, { expectError } = {}) => {
199
- const response = await userAPI.activateInnerSystemUser(userId, icsContext);
200
-
201
- if (!expectError && response.status !== httpResponseStatusCodes.OK && response.status !== httpResponseStatusCodes.NO_CONTENT) {
202
- throw Error(`Failed to activate user ${userId}. Status code: ${response.status}`);
203
- }
204
-
205
- return response;
206
- };
207
-
208
- const getOrCreateInnerSystemUser = async (innerSystemCreateAccountModel, role, icsContext) => {
209
- const accountEmail = innerSystemCreateAccountModel.email;
210
- const account = await getInnerSystemUserByEmail(accountEmail, role, icsContext);
211
-
212
- if (account) {
213
- return account;
214
- }
215
-
216
- await createInnerSystemUser(innerSystemCreateAccountModel, icsContext);
217
- return getInnerSystemUserByEmail(accountEmail, role, icsContext);
218
- };
219
-
220
- const getOrCreateInnerSystemUserByUser = async (user, role, icsContext) => {
221
- const createInnerSystemUserModel = new CreateInnerSystemUserModel(user);
222
- return getOrCreateInnerSystemUser(createInnerSystemUserModel, role, icsContext);
223
- };
224
-
225
- const getInnerSystemUserByEmail = async (accountEmail, role, icsContext) => {
226
- const accountsPerRole = await getInnerSystemUsersPerRole(icsContext);
227
- const accountsOfRole = accountsPerRole[role];
228
- const account = accountsOfRole.find(({ email }) => email === accountEmail);
229
-
230
- return account;
231
- };
232
-
233
- const requestPasswordReset = userEmail => {
234
- return userAPI.requestPasswordReset(userEmail);
235
- };
236
-
237
- const extractResetTokenFromEmail = async email => {
238
- // The reset link is https://<clientDomain>/app/#/resetPassword?data=<token>. The `?data=`
239
- // sits inside the URL *fragment* (after the `#`), so URL/searchParams parsing returns nothing —
240
- // a regex over the raw body is required. regexVerification returns the last capture group.
241
- const rawToken = await dbEmailsService.getLastMessage({
242
- recipients: { from: credentials.superUser, to: [email] },
243
- textInSubject: 'Reset Password',
244
- regex: /resetPassword\?data=([^"'&\s<]+)/,
245
- returnType: 'url'
246
- });
247
-
248
- if (!rawToken) {
249
- throw Error(`No reset link found in the reset-password mail for ${email}`);
250
- }
251
-
252
- return decodeURIComponent(rawToken);
253
- };
254
-
255
- // Clears the recipient's existing reset mails *before* requesting, so the extracted token is
256
- // guaranteed to come from this request's mail — not a stale leftover (whose token is already
257
- // invalidated server-side, which would flake verifyResetLink/resetPassword). Clearing after the
258
- // request is unsafe: the new mail may already have arrived and would be deleted too.
259
- const requestPasswordResetAndGetToken = async email => {
260
- await dbEmailsService.deleteAllMessagesByRecipient({ from: credentials.superUser, to: [email] });
261
- await requestPasswordReset(email);
262
-
263
- return extractResetTokenFromEmail(email);
264
- };
265
-
266
- const verifyResetLink = async (rawToken, { expectError = false } = {}) => {
267
- const response = await userAPI.verifyResetLink(rawToken);
268
-
269
- if (!expectError && response.status !== httpResponseStatusCodes.OK) {
270
- throw Error(`Failed to verify reset link. Status code: ${response.status}`);
271
- }
272
-
273
- return response;
274
- };
275
-
276
- const backdateResetTokens = async (email, offsetInMinutes, context) => {
277
- const response = await userAPI.backdateResetTokens(email, offsetInMinutes, context);
278
-
279
- if (response.status !== httpResponseStatusCodes.OK) {
280
- throw Error(`Failed to backdate reset tokens for ${email}. Status code: ${response.status}`);
281
- }
282
-
283
- return response;
284
- };
285
-
286
- const getResetTokens = async (email, context) => {
287
- const response = await userAPI.getResetTokens(email, context);
288
-
289
- if (response.status !== httpResponseStatusCodes.OK) {
290
- throw Error(`Failed to get reset tokens for ${email}. Status code: ${response.status}`);
291
- }
292
-
293
- return response.data;
294
- };
295
-
296
- const editUserProfile = async (email, fullName, userContext) => {
297
- const systemUserContext = await getSystemUserIdentity(credentials.superUser).cookie;
298
- const { data: user } = await getUserByEmail(email, systemUserContext);
299
-
300
- const editUserProfileModel = new EditUserProfileModel(user.id, email, user.role, fullName);
301
-
302
- const response = await userAPI.editUserProfile(editUserProfileModel, userContext);
303
-
304
- if (response.status !== httpResponseStatusCodes.OK) {
305
- throw Error(`Failed to edit user id: [${user.id}] profile\n${response}`);
306
- }
307
-
308
- return getUserByEmail(email, systemUserContext);
309
- };
310
-
311
- const editUserSettings = async (email, config, userContext) => {
312
- const systemUserContext = await getSystemUserIdentity(credentials.superUser).cookie;
313
- const { data: user } = await getUserByEmail(email, systemUserContext);
314
-
315
- const settingModel = util.getSettingsModel(config);
316
- const response = await userAPI.editUserEmailNotificationsSettings(settingModel, userContext);
317
-
318
- if (response.status !== httpResponseStatusCodes.OK) {
319
- throw Error(`Failed to edit user id: [${user.id}] settings\n${response}`);
320
- }
321
-
322
- return getUserByEmail(email, systemUserContext);
323
- };
324
-
325
- const getUserListByRecordId = async (recordId, context, { searchTerm } = {}) => {
326
- return userAPI.getUserListByRecordId(recordId, context, { searchTerm });
327
- };
328
-
329
- module.exports = {
330
- inviteUser,
331
- signupUser,
332
- getTeamMemberByEmail,
333
- getUsersByProjectId,
334
- getUserByEmail,
335
- getUserByEmailForAutoReplyEmails,
336
- getEnabledAndDisabledByEmail,
337
- getOrCreateUser,
338
- deleteUser,
339
- editUserProjects,
340
- deleteAllTeamMembersFromProjects,
341
- deleteUserByEmail,
342
- removeAllUserTraceFromDb,
343
- editUserRole,
344
- editUserInvitation,
345
- editUserInvitationByModel,
346
- reinviteUser,
347
- editUserEmailNotificationsSettings,
348
- requestPasswordReset,
349
- extractResetTokenFromEmail,
350
- requestPasswordResetAndGetToken,
351
- verifyResetLink,
352
- backdateResetTokens,
353
- getResetTokens,
354
- getOrCreateInnerSystemUser,
355
- getOrCreateInnerSystemUserByUser,
356
- getInnerSystemUsersPerRole,
357
- deactivateInnerSystemUser,
358
- activateInnerSystemUser,
359
- editUserProfile,
360
- editUserSettings,
361
- getInnerSystemUserByEmail,
362
- getUserListByRecordId
363
- };
1
+ const { InviteUserModel, SignupUserModel, EditUserInvitationModel, EditUserProfileModel } = require('../models/users.model');
2
+ const { validateType } = require('../../../../common/validations/typeValidations');
3
+ const { getEnv, getSystemUserIdentity } = require('../../../../env');
4
+ const { credentials } = getEnv();
5
+ const userAPI = require('./users.api');
6
+ const dbEmailsService = require('../../dbEmails/api/db.emails.service');
7
+ const util = require('../utils/util');
8
+ const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
9
+ const { NotificationSettingsModel } = require('../models/notification.settings.model');
10
+ const CreateInnerSystemAccountModel = require('../models/create.inner.system.user.model');
11
+ const CreateInnerSystemUserModel = require('../models/create.inner.system.user.model');
12
+
13
+ const { internalApiUserRoles: userRoles } = require('../../../../common/consts/userRoles');
14
+
15
+ const inviteUser = async (invitedUserModels, context, { disableSendMail } = {}) => {
16
+ return userAPI.invite(invitedUserModels, context, { disableSendMail });
17
+ };
18
+
19
+ const signupUser = (signupUserModel, context) => {
20
+ validateType(signupUserModel, SignupUserModel);
21
+ return userAPI.signupUser(signupUserModel, context);
22
+ };
23
+
24
+ const editUserRole = async (userId, data, context) => {
25
+ return userAPI.editUserRole(userId, data, context);
26
+ };
27
+
28
+ const editUserInvitationByModel = async (editUserInvitationModel, context) => {
29
+ validateType(editUserInvitationModel, EditUserInvitationModel);
30
+ return userAPI.invite([editUserInvitationModel], context);
31
+ };
32
+
33
+ const editUserInvitation = async (userId, userEmail, role, projectsIds, context, { hasCompleteAccessPermission } = {}) => {
34
+ const editUserInvitationModel = new EditUserInvitationModel(userId, userEmail, role, projectsIds, hasCompleteAccessPermission);
35
+
36
+ const response = await editUserInvitationByModel(editUserInvitationModel, context);
37
+
38
+ if (response.status !== httpResponseStatusCodes.NO_CONTENT) {
39
+ throw new Error('Failed to edit user invitation');
40
+ }
41
+
42
+ return response;
43
+ };
44
+
45
+ const getUsersByProjectId = async (projectId, context) => {
46
+ return userAPI.getUsersByProjectId(projectId, context);
47
+ };
48
+
49
+ const getUserByEmail = async (email, context) => {
50
+ return userAPI.getUserByEmail(email, context);
51
+ };
52
+
53
+ const getUserByEmailForAutoReplyEmails = async (email, { expectError } = {}) => {
54
+ const response = await userAPI.getUserByEmailForAutoReplyEmails(email);
55
+
56
+ if (response.status !== httpResponseStatusCodes.OK && !expectError) {
57
+ throw new Error(`Failed to get user by email ${email}. Status: ${response.status}`);
58
+ }
59
+
60
+ return response;
61
+ };
62
+
63
+ const getTeamMemberByEmail = async (email, accountId, context) => {
64
+ const response = await userAPI.getTeamMemberByEmail(email, accountId, context);
65
+
66
+ if (response.status !== httpResponseStatusCodes.OK) {
67
+ throw new Error(`Failed to get user by email ${email}`);
68
+ }
69
+
70
+ return response.data;
71
+ };
72
+
73
+ const getEnabledAndDisabledByEmail = async (email, context) => {
74
+ const response = await userAPI.getEnabledAndDisabledByEmail(email, context);
75
+
76
+ if (response.status !== httpResponseStatusCodes.OK) {
77
+ throw new Error(`Failed to get user by email ${email}`);
78
+ }
79
+
80
+ return response.data;
81
+ };
82
+
83
+ const getOrCreateUser = async (email, role, projectsIds, context, { fullName = role, password = credentials.strongPassword, expectError, hasCompleteAccessPermission } = {}) => {
84
+ let userResponse = await getUserByEmail(email, context);
85
+
86
+ if (userResponse.data !== '' && userResponse.status === httpResponseStatusCodes.OK) {
87
+ const { projectPermissions } = userResponse.data;
88
+ const projectPermissionsIds = projectPermissions.map(projectPermission => projectPermission.projectId);
89
+
90
+ projectsIds = projectsIds.filter(projectId => !projectPermissionsIds.includes(projectId));
91
+
92
+ if (userResponse.data && userResponse.data.id && userResponse.data.isVerified && !projectsIds.length) {
93
+ return userResponse.data;
94
+ }
95
+ }
96
+
97
+ const inviteUserModel = new InviteUserModel(email, role, projectsIds, hasCompleteAccessPermission);
98
+ const inviteResponse = await inviteUser([inviteUserModel], context);
99
+
100
+ if (inviteResponse.status !== httpResponseStatusCodes.NO_CONTENT && !expectError) {
101
+ throw new Error(`Failed to invite user with email: ${email}\n${inviteResponse}`);
102
+ } else if (expectError) {
103
+ return inviteResponse;
104
+ }
105
+
106
+ userResponse = await getUserByEmail(email, context);
107
+
108
+ //Already signup user
109
+ if (userResponse.data.isVerified) {
110
+ return userResponse.data;
111
+ }
112
+
113
+ const signupUserModel = await util.getSignupUserModel(email, role, fullName, password, context);
114
+ const signupResponse = await signupUser(signupUserModel, context);
115
+
116
+ if (signupResponse.status !== httpResponseStatusCodes.OK) {
117
+ throw new Error(`Failed to signup user with email: ${email}\n${signupResponse}`);
118
+ }
119
+
120
+ userResponse = await getUserByEmail(email, context);
121
+ return userResponse.data;
122
+ };
123
+
124
+ const deleteUser = (userId, context) => {
125
+ return userAPI.deleteUser(userId, context);
126
+ };
127
+
128
+ const editUserProjects = async (accountId, userId, addedProjectIds, removedProjectIds, context, { hasCompleteAccessPermission } = {}) => {
129
+ return userAPI.editUserProjects(accountId, userId, addedProjectIds, removedProjectIds, context, { hasCompleteAccessPermission });
130
+ };
131
+
132
+ const deleteAllTeamMembersFromProjects = async (projectsIds, context) => {
133
+ for (const projectId of projectsIds) {
134
+ await deleteAllTeamMembersFromProject(projectId, context);
135
+ }
136
+ };
137
+
138
+ const deleteAllTeamMembersFromProject = async (projectId, context) => {
139
+ let { data: users } = await getUsersByProjectId(projectId, context);
140
+ users = users.filter(user => user.role !== userRoles.admin);
141
+
142
+ for (const user of users) {
143
+ await deleteUser(user.id, context);
144
+ await removeAllUserTraceFromDb(user.id, context);
145
+ }
146
+ };
147
+
148
+ const removeAllUserTraceFromDb = (userId, context) => {
149
+ return userAPI.removeAllUserTraceFromDb(userId, context);
150
+ };
151
+
152
+ const deleteUserByEmail = async (userEmail, context) => {
153
+ const { data: user } = await getUserByEmail(userEmail, context);
154
+ return user ? deleteUser(user.id, context) : null;
155
+ };
156
+
157
+ const reinviteUser = (userId, context) => {
158
+ return userAPI.reinviteUser(userId, context);
159
+ };
160
+
161
+ const editUserEmailNotificationsSettings = (notificationSettingsModel, context) => {
162
+ validateType(notificationSettingsModel, NotificationSettingsModel);
163
+ return userAPI.editUserEmailNotificationsSettings(notificationSettingsModel, context);
164
+ };
165
+
166
+ const createInnerSystemUser = async (createInnerSystemUserModel, icsContext) => {
167
+ validateType(createInnerSystemUserModel, CreateInnerSystemAccountModel);
168
+ const response = await userAPI.createInnerSystemUser(createInnerSystemUserModel, icsContext);
169
+
170
+ if (response.status !== httpResponseStatusCodes.OK) {
171
+ throw Error(`Create inner system account failed\n${response}`);
172
+ }
173
+
174
+ return response.data;
175
+ };
176
+
177
+ const getInnerSystemUsersPerRole = async icsContext => {
178
+ const roles = `${userRoles.ics},${userRoles.auditor},${userRoles.operator}`;
179
+ const response = await userAPI.getInnerSystemUsersPerRole(roles, icsContext);
180
+
181
+ if (response.status !== httpResponseStatusCodes.OK) {
182
+ throw Error(`Get inner system accounts failed\n${response}`);
183
+ }
184
+
185
+ return response.data;
186
+ };
187
+
188
+ const deactivateInnerSystemUser = async (userId, icsContext, { expectError } = {}) => {
189
+ const response = await userAPI.deactivateInnerSystemUser(userId, icsContext);
190
+
191
+ if (!expectError && response.status !== httpResponseStatusCodes.OK && response.status !== httpResponseStatusCodes.NO_CONTENT) {
192
+ throw Error(`Failed to deactivate user ${userId}. Status code: ${response.status}`);
193
+ }
194
+
195
+ return response;
196
+ };
197
+
198
+ const activateInnerSystemUser = async (userId, icsContext, { expectError } = {}) => {
199
+ const response = await userAPI.activateInnerSystemUser(userId, icsContext);
200
+
201
+ if (!expectError && response.status !== httpResponseStatusCodes.OK && response.status !== httpResponseStatusCodes.NO_CONTENT) {
202
+ throw Error(`Failed to activate user ${userId}. Status code: ${response.status}`);
203
+ }
204
+
205
+ return response;
206
+ };
207
+
208
+ const getOrCreateInnerSystemUser = async (innerSystemCreateAccountModel, role, icsContext) => {
209
+ const accountEmail = innerSystemCreateAccountModel.email;
210
+ const account = await getInnerSystemUserByEmail(accountEmail, role, icsContext);
211
+
212
+ if (account) {
213
+ return account;
214
+ }
215
+
216
+ await createInnerSystemUser(innerSystemCreateAccountModel, icsContext);
217
+ return getInnerSystemUserByEmail(accountEmail, role, icsContext);
218
+ };
219
+
220
+ const getOrCreateInnerSystemUserByUser = async (user, role, icsContext) => {
221
+ const createInnerSystemUserModel = new CreateInnerSystemUserModel(user);
222
+ return getOrCreateInnerSystemUser(createInnerSystemUserModel, role, icsContext);
223
+ };
224
+
225
+ const getInnerSystemUserByEmail = async (accountEmail, role, icsContext) => {
226
+ const accountsPerRole = await getInnerSystemUsersPerRole(icsContext);
227
+ const accountsOfRole = accountsPerRole[role];
228
+ const account = accountsOfRole.find(({ email }) => email === accountEmail);
229
+
230
+ return account;
231
+ };
232
+
233
+ const requestPasswordReset = userEmail => {
234
+ return userAPI.requestPasswordReset(userEmail);
235
+ };
236
+
237
+ const extractResetTokenFromEmail = async email => {
238
+ // The reset link is https://<clientDomain>/app/#/resetPassword?data=<token>. The `?data=`
239
+ // sits inside the URL *fragment* (after the `#`), so URL/searchParams parsing returns nothing —
240
+ // a regex over the raw body is required. regexVerification returns the last capture group.
241
+ const rawToken = await dbEmailsService.getLastMessage({
242
+ recipients: { from: credentials.superUser, to: [email] },
243
+ textInSubject: 'Reset Password',
244
+ regex: /resetPassword\?data=([^"'&\s<]+)/,
245
+ returnType: 'url'
246
+ });
247
+
248
+ if (!rawToken) {
249
+ throw Error(`No reset link found in the reset-password mail for ${email}`);
250
+ }
251
+
252
+ return decodeURIComponent(rawToken);
253
+ };
254
+
255
+ // Clears the recipient's existing reset mails *before* requesting, so the extracted token is
256
+ // guaranteed to come from this request's mail — not a stale leftover (whose token is already
257
+ // invalidated server-side, which would flake verifyResetLink/resetPassword). Clearing after the
258
+ // request is unsafe: the new mail may already have arrived and would be deleted too.
259
+ const requestPasswordResetAndGetToken = async email => {
260
+ await dbEmailsService.deleteAllMessagesByRecipient({ from: credentials.superUser, to: [email] });
261
+ await requestPasswordReset(email);
262
+
263
+ return extractResetTokenFromEmail(email);
264
+ };
265
+
266
+ const verifyResetLink = async (rawToken, { expectError = false } = {}) => {
267
+ const response = await userAPI.verifyResetLink(rawToken);
268
+
269
+ if (!expectError && response.status !== httpResponseStatusCodes.OK) {
270
+ throw Error(`Failed to verify reset link. Status code: ${response.status}`);
271
+ }
272
+
273
+ return response;
274
+ };
275
+
276
+ const backdateResetTokens = async (email, offsetInMinutes, context) => {
277
+ const response = await userAPI.backdateResetTokens(email, offsetInMinutes, context);
278
+
279
+ if (response.status !== httpResponseStatusCodes.OK) {
280
+ throw Error(`Failed to backdate reset tokens for ${email}. Status code: ${response.status}`);
281
+ }
282
+
283
+ return response;
284
+ };
285
+
286
+ const getResetTokens = async (email, context) => {
287
+ const response = await userAPI.getResetTokens(email, context);
288
+
289
+ if (response.status !== httpResponseStatusCodes.OK) {
290
+ throw Error(`Failed to get reset tokens for ${email}. Status code: ${response.status}`);
291
+ }
292
+
293
+ return response.data;
294
+ };
295
+
296
+ const editUserProfile = async (email, fullName, userContext) => {
297
+ const systemUserContext = await getSystemUserIdentity(credentials.superUser).cookie;
298
+ const { data: user } = await getUserByEmail(email, systemUserContext);
299
+
300
+ const editUserProfileModel = new EditUserProfileModel(user.id, email, user.role, fullName);
301
+
302
+ const response = await userAPI.editUserProfile(editUserProfileModel, userContext);
303
+
304
+ if (response.status !== httpResponseStatusCodes.OK) {
305
+ throw Error(`Failed to edit user id: [${user.id}] profile\n${response}`);
306
+ }
307
+
308
+ return getUserByEmail(email, systemUserContext);
309
+ };
310
+
311
+ const editUserSettings = async (email, config, userContext) => {
312
+ const systemUserContext = await getSystemUserIdentity(credentials.superUser).cookie;
313
+ const { data: user } = await getUserByEmail(email, systemUserContext);
314
+
315
+ const settingModel = util.getSettingsModel(config);
316
+ const response = await userAPI.editUserEmailNotificationsSettings(settingModel, userContext);
317
+
318
+ if (response.status !== httpResponseStatusCodes.OK) {
319
+ throw Error(`Failed to edit user id: [${user.id}] settings\n${response}`);
320
+ }
321
+
322
+ return getUserByEmail(email, systemUserContext);
323
+ };
324
+
325
+ const getUserListByRecordId = async (recordId, context, { searchTerm } = {}) => {
326
+ return userAPI.getUserListByRecordId(recordId, context, { searchTerm });
327
+ };
328
+
329
+ module.exports = {
330
+ inviteUser,
331
+ signupUser,
332
+ getTeamMemberByEmail,
333
+ getUsersByProjectId,
334
+ getUserByEmail,
335
+ getUserByEmailForAutoReplyEmails,
336
+ getEnabledAndDisabledByEmail,
337
+ getOrCreateUser,
338
+ deleteUser,
339
+ editUserProjects,
340
+ deleteAllTeamMembersFromProjects,
341
+ deleteUserByEmail,
342
+ removeAllUserTraceFromDb,
343
+ editUserRole,
344
+ editUserInvitation,
345
+ editUserInvitationByModel,
346
+ reinviteUser,
347
+ editUserEmailNotificationsSettings,
348
+ requestPasswordReset,
349
+ extractResetTokenFromEmail,
350
+ requestPasswordResetAndGetToken,
351
+ verifyResetLink,
352
+ backdateResetTokens,
353
+ getResetTokens,
354
+ getOrCreateInnerSystemUser,
355
+ getOrCreateInnerSystemUserByUser,
356
+ getInnerSystemUsersPerRole,
357
+ deactivateInnerSystemUser,
358
+ activateInnerSystemUser,
359
+ editUserProfile,
360
+ editUserSettings,
361
+ getInnerSystemUserByEmail,
362
+ getUserListByRecordId
363
+ };