@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.
- package/eslint.config.mjs +156 -156
- package/package.json +43 -43
- package/src/common/commonFlows/auth/auth.js +95 -95
- package/src/common/commonFlows/index.js +5 -5
- package/src/common/commonFlows/records/records.js +452 -452
- package/src/common/commonFlows/users/users.js +15 -15
- package/src/common/consts/accountSettings.js +112 -112
- package/src/common/consts/activationStatuses.js +6 -6
- package/src/common/consts/analysisStatuses.js +7 -7
- package/src/common/consts/autocomplete.js +10 -10
- package/src/common/consts/constantsForRecordsSortingAndFilters.js +49 -49
- package/src/common/consts/dashboardCharts.js +18 -18
- package/src/common/consts/homepage/AttentionTab.js +6 -6
- package/src/common/consts/homepage/sortOptions.js +19 -19
- package/src/common/consts/projectSettings.js +28 -28
- package/src/common/consts/recordTypes.js +5 -5
- package/src/common/consts/requirementActions.js +10 -10
- package/src/common/consts/s3FileTypes.js +12 -12
- package/src/common/consts/userRoles.js +21 -21
- package/src/common/consts/userTypes.js +16 -16
- package/src/common/errorCodes.js +13 -13
- package/src/common/httpResponseStatusCodes.json +19 -19
- package/src/common/httpResponseTypes.json +2 -2
- package/src/common/requests/apiKeyAuth/requests.js +45 -45
- package/src/common/requests/cookieAuth/requests.js +40 -40
- package/src/common/requests/internalAuth/requests.js +48 -48
- package/src/common/requests/requestHandlers.js +112 -112
- package/src/common/utils/arrayUtils.js +19 -19
- package/src/common/utils/complianceUtil.js +114 -114
- package/src/common/utils/configsUtil.js +22 -22
- package/src/common/utils/dataTypeUtils.js +41 -41
- package/src/common/utils/numberUtils.js +22 -22
- package/src/common/utils/objectUtils.js +102 -102
- package/src/common/utils/timeUtils.js +202 -202
- package/src/common/validations/typeValidations.js +36 -36
- package/src/defaults/configs/attributes.js +170 -170
- package/src/defaults/configs/auditConfigs.js +129 -129
- package/src/defaults/configs/coverage.js +144 -144
- package/src/defaults/configs/polices.js +28 -28
- package/src/defaults/configs/requirement.js +218 -218
- package/src/defaults/index.js +7 -7
- package/src/env.js +58 -58
- package/src/factory/globalRecord/globalRecord.js +43 -43
- package/src/factory/index.js +8 -8
- package/src/factory/records/records.js +295 -295
- package/src/factory/users/users.js +70 -70
- package/src/index.js +118 -118
- package/src/reporters/mochaReporter.js +273 -273
- package/src/saas/internal-api/accountDirectory/api/accountDirectory.api.js +152 -152
- package/src/saas/internal-api/accountDirectory/api/accountDirectory.service.js +576 -576
- package/src/saas/internal-api/accountDirectory/consts/accountDirectory.consts.js +75 -75
- package/src/saas/internal-api/accountDirectory/index.js +5 -5
- package/src/saas/internal-api/accountDirectory/models/accountDirectory.models.js +172 -172
- package/src/saas/internal-api/accounts/api/core/accounts.core.api.js +54 -54
- package/src/saas/internal-api/accounts/api/core/accounts.core.service.js +114 -114
- package/src/saas/internal-api/accounts/api/emailCustomization/accounts.email.customizations.api.js +29 -29
- package/src/saas/internal-api/accounts/api/emailCustomization/accounts.email.customizations.service.js +60 -60
- package/src/saas/internal-api/accounts/api/emailCustomization/consts.js +8 -8
- package/src/saas/internal-api/accounts/api/openapi/accounts.openapi.api.js +54 -54
- package/src/saas/internal-api/accounts/api/openapi/accounts.openapi.service.js +67 -67
- package/src/saas/internal-api/accounts/api/settings/settings.api.js +21 -21
- package/src/saas/internal-api/accounts/api/settings/settings.service.js +58 -58
- package/src/saas/internal-api/accounts/consts/consts.js +8 -8
- package/src/saas/internal-api/accounts/index.js +22 -22
- package/src/saas/internal-api/accounts/models/core/create.account.model.js +16 -16
- package/src/saas/internal-api/accounts/models/settings/update.settings.model.js +110 -110
- package/src/saas/internal-api/accounts/utils/utils.js +60 -60
- package/src/saas/internal-api/agreement/api/agreement.api.js +39 -39
- package/src/saas/internal-api/agreement/api/agreement.service.js +121 -121
- package/src/saas/internal-api/agreement/consts/consts.js +11 -11
- package/src/saas/internal-api/agreement/index.js +12 -12
- package/src/saas/internal-api/agreement/models/create.agreement.model.js +12 -12
- package/src/saas/internal-api/agreement/models/createAgreementByAuditorModel.js +11 -11
- package/src/saas/internal-api/agreement/models/createAgreementByPMModel.js +13 -13
- package/src/saas/internal-api/auditCustomerRules/api/customer.rules.api.js +49 -49
- package/src/saas/internal-api/auditCustomerRules/api/customer.rules.service.js +121 -121
- package/src/saas/internal-api/auditCustomerRules/consts/customer.rule.js +40 -40
- package/src/saas/internal-api/auditCustomerRules/index.js +7 -7
- package/src/saas/internal-api/auditCustomerRules/models/customer.rule.model.js +55 -55
- package/src/saas/internal-api/auditCustomerRules/utils/customer.rule.util.js +70 -70
- package/src/saas/internal-api/auditNotes/api/audit.notes.api.js +40 -40
- package/src/saas/internal-api/auditNotes/api/audit.notes.service.js +116 -116
- package/src/saas/internal-api/auditNotes/index.js +4 -4
- package/src/saas/internal-api/auditNotes/models/audit.note.model.js +32 -32
- package/src/saas/internal-api/auditorComments/api/auditor.comments.api.js +20 -20
- package/src/saas/internal-api/auditorComments/api/auditor.comments.service.js +27 -27
- package/src/saas/internal-api/auditorComments/consts/auditor.comment.js +16 -16
- package/src/saas/internal-api/auditorComments/index.js +5 -5
- package/src/saas/internal-api/auditorComments/models/auditor.comment.model.js +40 -40
- package/src/saas/internal-api/auth/api/auth.api.js +78 -78
- package/src/saas/internal-api/auth/api/auth.service.js +217 -217
- package/src/saas/internal-api/auth/index.js +3 -3
- package/src/saas/internal-api/certificial/api/certificial.api.js +15 -15
- package/src/saas/internal-api/certificial/api/certificial.service.js +24 -24
- package/src/saas/internal-api/certificial/consts.js +8 -8
- package/src/saas/internal-api/certificial/index.js +4 -4
- package/src/saas/internal-api/coi/api/coi.api.js +76 -76
- package/src/saas/internal-api/coi/api/coi.service.js +104 -104
- package/src/saas/internal-api/coi/consts/{uploaderStatuses.js → coiUploaderTypes.js} +9 -9
- package/src/saas/internal-api/coi/consts/duplicateHandling.js +7 -7
- package/src/saas/internal-api/coi/consts/hashes.js +5 -5
- package/src/saas/internal-api/coi/consts/uploaderTypes.js +3 -3
- package/src/saas/internal-api/coi/index.js +17 -17
- package/src/saas/internal-api/coi/models/Combine.last.two.cois.model.js +25 -25
- package/src/saas/internal-api/coi/models/submit.coi.batch.model.js +23 -23
- package/src/saas/internal-api/coi/models/submit.coi.model.js +23 -23
- package/src/saas/internal-api/coi/utils/utils.js +186 -185
- package/src/saas/internal-api/compliance/api/amBestRating/am.best.rating.api.js +12 -12
- package/src/saas/internal-api/compliance/api/amBestRating/am.best.rating.service.js +14 -14
- package/src/saas/internal-api/compliance/api/audit/aiAudit/aiAudit.api.js +63 -63
- package/src/saas/internal-api/compliance/api/audit/aiAudit/aiAudit.service.js +99 -99
- package/src/saas/internal-api/compliance/api/audit/audit.api.js +124 -124
- package/src/saas/internal-api/compliance/api/audit/audit.service.js +390 -390
- package/src/saas/internal-api/compliance/api/complianceSnapshot/compliance.snapshot.api.js +32 -32
- package/src/saas/internal-api/compliance/api/complianceSnapshot/compliance.snapshot.service.js +73 -73
- package/src/saas/internal-api/compliance/api/convert/convert.api.js +12 -12
- package/src/saas/internal-api/compliance/api/convert/convert.service.js +7 -7
- package/src/saas/internal-api/compliance/api/coverage/coverage.api.js +33 -33
- package/src/saas/internal-api/compliance/api/coverage/coverage.service.js +46 -46
- package/src/saas/internal-api/compliance/api/overrideGap/override.gap.api.js +86 -86
- package/src/saas/internal-api/compliance/api/overrideGap/override.gap.service.js +300 -300
- package/src/saas/internal-api/compliance/consts/audit.js +130 -130
- package/src/saas/internal-api/compliance/consts/overrideGapRequest/override.gap.request.js +7 -7
- package/src/saas/internal-api/compliance/index.js +41 -41
- package/src/saas/internal-api/compliance/models/audit/audit.model.js +109 -109
- package/src/saas/internal-api/compliance/models/overrideGapRequest/override.gap.request.model.js +16 -16
- package/src/saas/internal-api/compliance/models/waive/waive.model.js +112 -112
- package/src/saas/internal-api/compliance/utils/auditUtil.js +308 -308
- package/src/saas/internal-api/compliance/utils/coverageUtil.js +45 -45
- package/src/saas/internal-api/contractors/api/contractors.api.js +251 -251
- package/src/saas/internal-api/contractors/api/contractors.service.js +482 -482
- package/src/saas/internal-api/contractors/consts/consts.js +6 -6
- package/src/saas/internal-api/contractors/index.js +8 -8
- package/src/saas/internal-api/contractors/models/assign.requirement.model.js +11 -11
- package/src/saas/internal-api/contractors/models/edit.contractor.model.js +73 -73
- package/src/saas/internal-api/contractors/models/link.request.model.js +10 -10
- package/src/saas/internal-api/contractors/models/verification.contractor.model.js +29 -29
- package/src/saas/internal-api/contractors/utils.js +25 -25
- package/src/saas/internal-api/customTags/api/customTags.api.js +47 -47
- package/src/saas/internal-api/customTags/api/customTags.service.js +96 -96
- package/src/saas/internal-api/customTags/index.js +4 -4
- package/src/saas/internal-api/customTags/models/customTagsModels.js +17 -17
- package/src/saas/internal-api/dashboard/api/recordList.api.js +38 -38
- package/src/saas/internal-api/dashboard/api/recordList.service.js +60 -60
- package/src/saas/internal-api/dashboard/index.js +5 -5
- package/src/saas/internal-api/dashboard/models/dashboard.filter.criteria.model.js +38 -38
- package/src/saas/internal-api/dbEmails/api/db.emails.api.js +25 -25
- package/src/saas/internal-api/dbEmails/api/db.emails.service.js +209 -209
- package/src/saas/internal-api/dbEmails/consts/consts.js +66 -66
- package/src/saas/internal-api/dbEmails/index.js +6 -6
- package/src/saas/internal-api/dbEmails/models/db.emails.model.js +22 -22
- package/src/saas/internal-api/dbEmails/utils/util.js +82 -82
- package/src/saas/internal-api/emailCustomization/api/email.customization.api.js +26 -26
- package/src/saas/internal-api/emailCustomization/api/email.customization.service.js +50 -50
- package/src/saas/internal-api/emailCustomization/index.js +3 -3
- package/src/saas/internal-api/fileScan/api/file.scan.api.js +14 -14
- package/src/saas/internal-api/fileScan/api/file.scan.service.js +35 -35
- package/src/saas/internal-api/fileScan/index.js +3 -3
- package/src/saas/internal-api/fileScan/models/update.scan.status.model.js +13 -13
- package/src/saas/internal-api/globalRecord/api/global.record.api.js +95 -95
- package/src/saas/internal-api/globalRecord/api/global.record.service.js +112 -112
- package/src/saas/internal-api/globalRecord/consts.js +20 -20
- package/src/saas/internal-api/globalRecord/index.js +6 -6
- package/src/saas/internal-api/globalRecord/models/global.record.model.js +60 -60
- package/src/saas/internal-api/globalRecord/utils/util.js +161 -161
- package/src/saas/internal-api/homepageCharts/api/charts.api.js +12 -12
- package/src/saas/internal-api/homepageCharts/api/charts.service.js +7 -7
- package/src/saas/internal-api/homepageCharts/index.js +3 -3
- package/src/saas/internal-api/notificationCenter/api/notification.center.api.js +32 -32
- package/src/saas/internal-api/notificationCenter/api/notification.center.service.js +49 -49
- package/src/saas/internal-api/notificationCenter/consts.js +9 -9
- package/src/saas/internal-api/notificationCenter/index.js +4 -4
- package/src/saas/internal-api/outlook/api/outlook.api.js +14 -14
- package/src/saas/internal-api/outlook/api/outlook.service.js +14 -14
- package/src/saas/internal-api/outlook/index.js +3 -3
- package/src/saas/internal-api/policyFile/api/policy.file.api.js +43 -43
- package/src/saas/internal-api/policyFile/api/policy.file.service.js +117 -117
- package/src/saas/internal-api/policyFile/consts.js +21 -21
- package/src/saas/internal-api/policyFile/index.js +11 -11
- package/src/saas/internal-api/policyFile/models/create.policy.file.model.js +11 -11
- package/src/saas/internal-api/policyFile/models/set.publish.flag.to.policy.model.js +13 -13
- package/src/saas/internal-api/projects/api/core/projects.api.js +39 -39
- package/src/saas/internal-api/projects/api/core/projects.service.js +77 -77
- package/src/saas/internal-api/projects/api/settings/project.settings.api.js +18 -18
- package/src/saas/internal-api/projects/api/settings/project.settings.service.js +35 -35
- package/src/saas/internal-api/projects/consts/defaultProject.js +3 -3
- package/src/saas/internal-api/projects/index.js +24 -24
- package/src/saas/internal-api/projects/models/core/create.project.model.js +41 -41
- package/src/saas/internal-api/projects/models/core/update.project.model.js +47 -47
- package/src/saas/internal-api/projects/models/settings/update.project.settings.model.js +56 -56
- package/src/saas/internal-api/projects/utils/utils.js +159 -159
- package/src/saas/internal-api/recordHub/api/record.hub.api.js +20 -20
- package/src/saas/internal-api/recordHub/api/record.hub.service.js +86 -86
- package/src/saas/internal-api/recordHub/index.js +3 -3
- package/src/saas/internal-api/recordNotes/api/record.notes.api.js +38 -38
- package/src/saas/internal-api/recordNotes/api/record.notes.service.js +56 -56
- package/src/saas/internal-api/recordNotes/api/record.notes.utils.js +12 -12
- package/src/saas/internal-api/recordNotes/index.js +3 -3
- package/src/saas/internal-api/relatedDocs/api/related.docs.api.js +98 -98
- package/src/saas/internal-api/relatedDocs/api/related.docs.service.js +180 -180
- package/src/saas/internal-api/relatedDocs/index.js +4 -4
- package/src/saas/internal-api/relatedDocs/models/related.doc.model.js +36 -36
- package/src/saas/internal-api/reports/api/reports.api.js +56 -56
- package/src/saas/internal-api/reports/api/reports.service.js +68 -68
- package/src/saas/internal-api/reports/consts/consts.js +71 -71
- package/src/saas/internal-api/reports/index.js +15 -15
- package/src/saas/internal-api/reports/models/report.model.js +27 -27
- package/src/saas/internal-api/requests/api/requests.api.js +132 -132
- package/src/saas/internal-api/requests/api/requests.service.js +315 -315
- package/src/saas/internal-api/requests/index.js +21 -21
- package/src/saas/internal-api/requests/models/create.request.model.js +39 -39
- package/src/saas/internal-api/requests/models/draft.request.criteria.model.js +18 -18
- package/src/saas/internal-api/requests/models/draft.request.report.model.js +14 -14
- package/src/saas/internal-api/requests/models/edit.request.model.js +31 -31
- package/src/saas/internal-api/requests/models/homepageRequestCriteriaModel.js +19 -19
- package/src/saas/internal-api/requests/models/requestListCriteriaModel.js +17 -17
- package/src/saas/internal-api/requests/models/tenant.request.model.js +9 -9
- package/src/saas/internal-api/requests/utils.js +16 -16
- package/src/saas/internal-api/requestsTable/api/requests.table.api.js +20 -20
- package/src/saas/internal-api/requestsTable/api/requests.table.service.js +14 -14
- package/src/saas/internal-api/requestsTable/index.js +3 -3
- package/src/saas/internal-api/requirements/api/lease/lease.api.js +74 -74
- package/src/saas/internal-api/requirements/api/lease/lease.service.js +167 -167
- package/src/saas/internal-api/requirements/api/requirements.api.js +65 -65
- package/src/saas/internal-api/requirements/api/requirements.service.js +198 -198
- package/src/saas/internal-api/requirements/consts/attributeTypes.json +8 -8
- package/src/saas/internal-api/requirements/consts/consts.js +22 -22
- package/src/saas/internal-api/requirements/index.js +22 -22
- package/src/saas/internal-api/requirements/models/create.requirement.model.js +17 -17
- package/src/saas/internal-api/requirements/models/extraction.request.model.js +16 -16
- package/src/saas/internal-api/requirements/models/policy.model.js +35 -35
- package/src/saas/internal-api/requirements/models/tab.extraction.request.model.js +14 -14
- package/src/saas/internal-api/requirements/models/update.requirement.model.js +19 -19
- package/src/saas/internal-api/requirements/utils/utils.js +129 -129
- package/src/saas/internal-api/sampleCoi/api/sample.coi.api.js +15 -15
- package/src/saas/internal-api/sampleCoi/api/sample.coi.service.js +48 -48
- package/src/saas/internal-api/sampleCoi/consts/consts.js +22 -22
- package/src/saas/internal-api/sampleCoi/index.js +4 -4
- package/src/saas/internal-api/schedulerJobRun/api/scheduler.job.run.api.js +31 -31
- package/src/saas/internal-api/schedulerJobRun/api/scheduler.job.run.service.js +56 -56
- package/src/saas/internal-api/schedulerJobRun/index.js +3 -3
- package/src/saas/internal-api/serviceArea/api/coordinates.api.js +12 -12
- package/src/saas/internal-api/serviceArea/api/coordinates.service.js +7 -7
- package/src/saas/internal-api/serviceArea/index.js +4 -4
- package/src/saas/internal-api/serviceArea/utils/utils.js +8 -8
- package/src/saas/internal-api/tableOfContents/api/table.of.contents.api.js +37 -37
- package/src/saas/internal-api/tableOfContents/api/table.of.contents.service.js +19 -19
- package/src/saas/internal-api/tableOfContents/index.js +3 -3
- package/src/saas/internal-api/tabs/api/tabs.api.js +32 -32
- package/src/saas/internal-api/tabs/api/tabs.service.js +60 -60
- package/src/saas/internal-api/tabs/index.js +3 -3
- package/src/saas/internal-api/tabs/models/tabs.model.js +19 -19
- package/src/saas/internal-api/thread-scheduler/runner.js +86 -86
- package/src/saas/internal-api/thread-scheduler/schedulerJobs.js +10 -10
- package/src/saas/internal-api/uploadFiles/api/upload.file.api.js +49 -49
- package/src/saas/internal-api/uploadFiles/api/upload.file.service.js +176 -176
- package/src/saas/internal-api/uploadFiles/consts.js +36 -36
- package/src/saas/internal-api/uploadFiles/index.js +5 -5
- package/src/saas/internal-api/uploadFiles/utils.js +34 -34
- package/src/saas/internal-api/users/api/tenantApp/tenant.app.api.js +38 -38
- package/src/saas/internal-api/users/api/tenantApp/tenant.app.service.js +109 -109
- package/src/saas/internal-api/users/api/users.api.js +158 -158
- package/src/saas/internal-api/users/api/users.service.js +363 -363
- package/src/saas/internal-api/users/index.js +17 -17
- package/src/saas/internal-api/users/models/create.inner.system.user.model.js +18 -18
- package/src/saas/internal-api/users/models/notification.settings.model.js +15 -15
- package/src/saas/internal-api/users/models/tenant.user.model.js +11 -11
- package/src/saas/internal-api/users/models/users.model.js +43 -43
- package/src/saas/internal-api/users/utils/util.js +50 -50
- package/src/saas/internal-api/vendorProfile/api/vendor.profile.api.js +26 -26
- package/src/saas/internal-api/vendorProfile/api/vendor.profile.service.js +19 -19
- package/src/saas/internal-api/vendorProfile/index.js +3 -3
- package/src/saas/openapi/accounts/accounts.api.js +17 -17
- package/src/saas/openapi/accounts/accounts.service.js +11 -11
- package/src/saas/openapi/coi/coi.api.js +35 -35
- package/src/saas/openapi/coi/coi.service.js +53 -53
- package/src/saas/openapi/projects/projects.api.js +83 -83
- package/src/saas/openapi/projects/projects.service.js +89 -89
- package/src/saas/openapi/relatedDocs/related.docs.api.js +30 -30
- package/src/saas/openapi/relatedDocs/related.docs.service.js +56 -56
- package/src/saas/openapi/requests/index.js +7 -7
- package/src/saas/openapi/requests/models/invite.request.model.js +42 -42
- package/src/saas/openapi/requests/models/update.request.model.js +37 -37
- package/src/saas/openapi/requests/requests.api.js +93 -93
- package/src/saas/openapi/requests/requests.service.js +100 -100
- package/src/saas/openapi/requirements/index.js +6 -6
- package/src/saas/openapi/requirements/models/copy.requirement.model.js +10 -10
- package/src/saas/openapi/requirements/requirements.api.js +41 -41
- package/src/saas/openapi/requirements/requirements.service.js +61 -61
- package/src/saas/openapi/tabs/index.js +6 -6
- package/src/saas/openapi/tabs/models/create.tab.model.js +6 -6
- package/src/saas/openapi/tabs/tabs.api.js +27 -27
- package/src/saas/openapi/tabs/tabs.service.js +26 -26
- package/src/saas/openapi/users/user.model.js +10 -10
- package/src/saas/openapi/users/users.api.js +33 -33
- 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
|
+
};
|