@getjones/test-infra 5.2.10 → 5.2.12
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 -42
- package/src/common/commonFlows/auth/auth.js +95 -95
- package/src/common/commonFlows/index.js +5 -5
- package/src/common/commonFlows/records/records.js +457 -423
- 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 +12 -11
- 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 +195 -195
- 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 +114 -114
- package/src/reporters/mochaReporter.js +273 -273
- package/src/resources/agreements/agreement.pdf +0 -0
- 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 +48 -48
- package/src/saas/internal-api/accounts/api/core/accounts.core.service.js +104 -104
- 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 +206 -172
- package/src/saas/internal-api/auth/index.js +3 -3
- 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/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 +16 -16
- 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 +185 -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.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 +178 -178
- 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 +48 -48
- 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 -56
- package/src/saas/internal-api/requirements/api/lease/lease.service.js +167 -123
- 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 -15
- package/src/saas/internal-api/requirements/index.js +22 -21
- 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 -0
- 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/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 +69 -69
- package/src/saas/internal-api/thread-scheduler/schedulerJobs.js +8 -8
- package/src/saas/internal-api/uploadFiles/api/upload.file.api.js +49 -49
- package/src/saas/internal-api/uploadFiles/api/upload.file.service.js +162 -162
- 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 -14
- 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 -49
- 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 +71 -71
- package/src/saas/openapi/relatedDocs/related.docs.api.js +30 -30
- package/src/saas/openapi/relatedDocs/related.docs.service.js +55 -55
- 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 +94 -94
- 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 +55 -55
- 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 +19 -19
- 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,178 +1,178 @@
|
|
|
1
|
-
const dbEmailsApi = require('./db.emails.api');
|
|
2
|
-
const util = require('../utils/util');
|
|
3
|
-
const timeUtils = require('../../../../common/utils/timeUtils');
|
|
4
|
-
const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
|
|
5
|
-
const { EMAIL_POLLING } = require('../consts/consts');
|
|
6
|
-
const { EmailModel } = require('../models/db.emails.model');
|
|
7
|
-
|
|
8
|
-
const strict = 'strict';
|
|
9
|
-
|
|
10
|
-
const getAllMessages = emailModel => {
|
|
11
|
-
return dbEmailsApi.getAllMessages(emailModel);
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
const deleteMultipleMessages = emailIds => {
|
|
15
|
-
return dbEmailsApi.deleteMultipleMessages(emailIds);
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
const deleteAllMessages = () => {
|
|
19
|
-
return dbEmailsApi.deleteAllMessages();
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
const deleteAllMessagesByRecipient = async recipients => {
|
|
23
|
-
const recipientsTo = recipients.recipientsTo || recipients.to;
|
|
24
|
-
|
|
25
|
-
if (!recipientsTo?.length) {
|
|
26
|
-
throw new Error('deleteAllMessagesByRecipient requires recipients ({ to: [...] })');
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const emailModel = new EmailModel({ from: recipients.from, includesOneOfRecipientsTo: recipientsTo });
|
|
30
|
-
const { data: emailMessages } = await getAllMessages(emailModel);
|
|
31
|
-
|
|
32
|
-
const lowerCasedRecipients = recipientsTo.map(recipient => recipient.toLowerCase());
|
|
33
|
-
const messagesToRecipients = (emailMessages || []).filter(message =>
|
|
34
|
-
(message.recipientsTo || []).some(recipient => lowerCasedRecipients.includes(recipient.toLowerCase())));
|
|
35
|
-
|
|
36
|
-
messagesToRecipients.length && await deleteMultipleMessages(messagesToRecipients.map(({ id }) => id));
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const getLastMessage = async (
|
|
40
|
-
{
|
|
41
|
-
recipients,
|
|
42
|
-
recipientsVerification = strict,
|
|
43
|
-
textInSubject,
|
|
44
|
-
textInBody,
|
|
45
|
-
excludingPhrasesInBody,
|
|
46
|
-
regex,
|
|
47
|
-
returnType,
|
|
48
|
-
expectNoMail = false,
|
|
49
|
-
maxRetries,
|
|
50
|
-
pollIntervalSeconds
|
|
51
|
-
} = {}
|
|
52
|
-
) => {
|
|
53
|
-
const polling = expectNoMail ? EMAIL_POLLING.expectNoMail : EMAIL_POLLING.default;
|
|
54
|
-
maxRetries = maxRetries ?? polling.maxRetries;
|
|
55
|
-
pollIntervalSeconds = pollIntervalSeconds ?? polling.pollIntervalSeconds;
|
|
56
|
-
|
|
57
|
-
async function getLatestMessage(messages) {
|
|
58
|
-
for (const message of messages) {
|
|
59
|
-
/* The query we use to search for messages guarantees the recipients are included,
|
|
60
|
-
but it doesn't guarantee other emails aren't in to, cc or bcc */
|
|
61
|
-
let emailsMatch = true;
|
|
62
|
-
|
|
63
|
-
if (recipientsVerification === strict) {
|
|
64
|
-
const emptyArray = [''];
|
|
65
|
-
|
|
66
|
-
const expectedRecipients = {
|
|
67
|
-
from: util.extractEmailFromNameAndEmailFormat(recipients.from),
|
|
68
|
-
to: recipients.to || emptyArray,
|
|
69
|
-
cc: recipients.cc || emptyArray
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
const actualRecipients = {
|
|
73
|
-
from: util.extractEmailFromNameAndEmailFormat(message.from),
|
|
74
|
-
to: message.recipientsTo || emptyArray,
|
|
75
|
-
cc: message.recipientsCc || emptyArray
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
emailsMatch = util.recipientsMatchVerification(expectedRecipients, actualRecipients);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (!emailsMatch) {
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const result = regex ? util.regexVerification(message.body, regex, { returnType }) : message.body;
|
|
86
|
-
|
|
87
|
-
const isMessageNewest = timeUtils.isDateAfterOther(message.insertedTime, newestDateTime);
|
|
88
|
-
|
|
89
|
-
if (result && (!newestResult || !newestId || isMessageNewest)) {
|
|
90
|
-
newestResult = result;
|
|
91
|
-
newestId = message.id;
|
|
92
|
-
newestDateTime = message.insertedTime;
|
|
93
|
-
|
|
94
|
-
// Used for logging purposes only
|
|
95
|
-
newestTo = message.recipientsTo;
|
|
96
|
-
newestCc = message.recipientsCc;
|
|
97
|
-
newestSubject = message.subject;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
let newestDateTime = '2020-01-01T01:01:01.000+0000';
|
|
103
|
-
let newestId, newestResult, newestTo, newestCc, newestSubject;
|
|
104
|
-
|
|
105
|
-
let recipientsTo = recipients.to;
|
|
106
|
-
let includesOneOfRecipientsTo;
|
|
107
|
-
|
|
108
|
-
if (recipientsVerification !== strict) {
|
|
109
|
-
recipientsTo = null;
|
|
110
|
-
includesOneOfRecipientsTo = recipients.to;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// In case the format is 'First Last <username@domain.com>' we need the email part only
|
|
114
|
-
const emailModel = new EmailModel(
|
|
115
|
-
{
|
|
116
|
-
from: util.extractEmailFromNameAndEmailFormat(recipients.from),
|
|
117
|
-
recipientsTo,
|
|
118
|
-
includesOneOfRecipientsTo,
|
|
119
|
-
recipientsCc: recipients.cc,
|
|
120
|
-
textInSubject,
|
|
121
|
-
textInBody,
|
|
122
|
-
excludingPhrasesInBody
|
|
123
|
-
}
|
|
124
|
-
);
|
|
125
|
-
|
|
126
|
-
let retries = maxRetries;
|
|
127
|
-
|
|
128
|
-
while (!newestResult && retries--) {
|
|
129
|
-
await timeUtils.waitFor(pollIntervalSeconds).seconds;
|
|
130
|
-
const response = await getAllMessages(emailModel);
|
|
131
|
-
|
|
132
|
-
if (response.status !== httpResponseStatusCodes.OK) {
|
|
133
|
-
throw new Error(`Inbox messages could not be retrieved\n${response}`);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
await getLatestMessage(response.data);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (newestId) {
|
|
140
|
-
util.logRetrievedEmailInfo(newestTo, newestSubject, { cc: newestCc });
|
|
141
|
-
|
|
142
|
-
const response = await deleteMultipleMessages([newestId]);
|
|
143
|
-
|
|
144
|
-
if (response.status !== httpResponseStatusCodes.NO_CONTENT) {
|
|
145
|
-
throw new Error(`Failed to delete email with ID : ${newestId}\n${response}`);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
return newestResult;
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
const waitForMail = async (emailModel, { maxSecondToWait = 30 } = {}) => {
|
|
153
|
-
let isFound = false;
|
|
154
|
-
const oneSecondInMilliseconds = 1000;
|
|
155
|
-
let timeFromTheStart = 0;
|
|
156
|
-
const started = new Date();
|
|
157
|
-
let foundMails;
|
|
158
|
-
|
|
159
|
-
while (!isFound && timeFromTheStart < maxSecondToWait) {
|
|
160
|
-
({ data: foundMails } = await getAllMessages(emailModel));
|
|
161
|
-
isFound = foundMails.length > 0;
|
|
162
|
-
const now = new Date();
|
|
163
|
-
timeFromTheStart = (now - started) / oneSecondInMilliseconds;
|
|
164
|
-
await timeUtils.waitFor(3).seconds;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return foundMails;
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
module.exports = {
|
|
171
|
-
util,
|
|
172
|
-
waitForMail,
|
|
173
|
-
getAllMessages,
|
|
174
|
-
getLastMessage,
|
|
175
|
-
deleteMultipleMessages,
|
|
176
|
-
deleteAllMessages,
|
|
177
|
-
deleteAllMessagesByRecipient
|
|
178
|
-
};
|
|
1
|
+
const dbEmailsApi = require('./db.emails.api');
|
|
2
|
+
const util = require('../utils/util');
|
|
3
|
+
const timeUtils = require('../../../../common/utils/timeUtils');
|
|
4
|
+
const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
|
|
5
|
+
const { EMAIL_POLLING } = require('../consts/consts');
|
|
6
|
+
const { EmailModel } = require('../models/db.emails.model');
|
|
7
|
+
|
|
8
|
+
const strict = 'strict';
|
|
9
|
+
|
|
10
|
+
const getAllMessages = emailModel => {
|
|
11
|
+
return dbEmailsApi.getAllMessages(emailModel);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const deleteMultipleMessages = emailIds => {
|
|
15
|
+
return dbEmailsApi.deleteMultipleMessages(emailIds);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const deleteAllMessages = () => {
|
|
19
|
+
return dbEmailsApi.deleteAllMessages();
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const deleteAllMessagesByRecipient = async recipients => {
|
|
23
|
+
const recipientsTo = recipients.recipientsTo || recipients.to;
|
|
24
|
+
|
|
25
|
+
if (!recipientsTo?.length) {
|
|
26
|
+
throw new Error('deleteAllMessagesByRecipient requires recipients ({ to: [...] })');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const emailModel = new EmailModel({ from: recipients.from, includesOneOfRecipientsTo: recipientsTo });
|
|
30
|
+
const { data: emailMessages } = await getAllMessages(emailModel);
|
|
31
|
+
|
|
32
|
+
const lowerCasedRecipients = recipientsTo.map(recipient => recipient.toLowerCase());
|
|
33
|
+
const messagesToRecipients = (emailMessages || []).filter(message =>
|
|
34
|
+
(message.recipientsTo || []).some(recipient => lowerCasedRecipients.includes(recipient.toLowerCase())));
|
|
35
|
+
|
|
36
|
+
messagesToRecipients.length && await deleteMultipleMessages(messagesToRecipients.map(({ id }) => id));
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const getLastMessage = async (
|
|
40
|
+
{
|
|
41
|
+
recipients,
|
|
42
|
+
recipientsVerification = strict,
|
|
43
|
+
textInSubject,
|
|
44
|
+
textInBody,
|
|
45
|
+
excludingPhrasesInBody,
|
|
46
|
+
regex,
|
|
47
|
+
returnType,
|
|
48
|
+
expectNoMail = false,
|
|
49
|
+
maxRetries,
|
|
50
|
+
pollIntervalSeconds
|
|
51
|
+
} = {}
|
|
52
|
+
) => {
|
|
53
|
+
const polling = expectNoMail ? EMAIL_POLLING.expectNoMail : EMAIL_POLLING.default;
|
|
54
|
+
maxRetries = maxRetries ?? polling.maxRetries;
|
|
55
|
+
pollIntervalSeconds = pollIntervalSeconds ?? polling.pollIntervalSeconds;
|
|
56
|
+
|
|
57
|
+
async function getLatestMessage(messages) {
|
|
58
|
+
for (const message of messages) {
|
|
59
|
+
/* The query we use to search for messages guarantees the recipients are included,
|
|
60
|
+
but it doesn't guarantee other emails aren't in to, cc or bcc */
|
|
61
|
+
let emailsMatch = true;
|
|
62
|
+
|
|
63
|
+
if (recipientsVerification === strict) {
|
|
64
|
+
const emptyArray = [''];
|
|
65
|
+
|
|
66
|
+
const expectedRecipients = {
|
|
67
|
+
from: util.extractEmailFromNameAndEmailFormat(recipients.from),
|
|
68
|
+
to: recipients.to || emptyArray,
|
|
69
|
+
cc: recipients.cc || emptyArray
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const actualRecipients = {
|
|
73
|
+
from: util.extractEmailFromNameAndEmailFormat(message.from),
|
|
74
|
+
to: message.recipientsTo || emptyArray,
|
|
75
|
+
cc: message.recipientsCc || emptyArray
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
emailsMatch = util.recipientsMatchVerification(expectedRecipients, actualRecipients);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!emailsMatch) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const result = regex ? util.regexVerification(message.body, regex, { returnType }) : message.body;
|
|
86
|
+
|
|
87
|
+
const isMessageNewest = timeUtils.isDateAfterOther(message.insertedTime, newestDateTime);
|
|
88
|
+
|
|
89
|
+
if (result && (!newestResult || !newestId || isMessageNewest)) {
|
|
90
|
+
newestResult = result;
|
|
91
|
+
newestId = message.id;
|
|
92
|
+
newestDateTime = message.insertedTime;
|
|
93
|
+
|
|
94
|
+
// Used for logging purposes only
|
|
95
|
+
newestTo = message.recipientsTo;
|
|
96
|
+
newestCc = message.recipientsCc;
|
|
97
|
+
newestSubject = message.subject;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
let newestDateTime = '2020-01-01T01:01:01.000+0000';
|
|
103
|
+
let newestId, newestResult, newestTo, newestCc, newestSubject;
|
|
104
|
+
|
|
105
|
+
let recipientsTo = recipients.to;
|
|
106
|
+
let includesOneOfRecipientsTo;
|
|
107
|
+
|
|
108
|
+
if (recipientsVerification !== strict) {
|
|
109
|
+
recipientsTo = null;
|
|
110
|
+
includesOneOfRecipientsTo = recipients.to;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// In case the format is 'First Last <username@domain.com>' we need the email part only
|
|
114
|
+
const emailModel = new EmailModel(
|
|
115
|
+
{
|
|
116
|
+
from: util.extractEmailFromNameAndEmailFormat(recipients.from),
|
|
117
|
+
recipientsTo,
|
|
118
|
+
includesOneOfRecipientsTo,
|
|
119
|
+
recipientsCc: recipients.cc,
|
|
120
|
+
textInSubject,
|
|
121
|
+
textInBody,
|
|
122
|
+
excludingPhrasesInBody
|
|
123
|
+
}
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
let retries = maxRetries;
|
|
127
|
+
|
|
128
|
+
while (!newestResult && retries--) {
|
|
129
|
+
await timeUtils.waitFor(pollIntervalSeconds).seconds;
|
|
130
|
+
const response = await getAllMessages(emailModel);
|
|
131
|
+
|
|
132
|
+
if (response.status !== httpResponseStatusCodes.OK) {
|
|
133
|
+
throw new Error(`Inbox messages could not be retrieved\n${response}`);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
await getLatestMessage(response.data);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (newestId) {
|
|
140
|
+
util.logRetrievedEmailInfo(newestTo, newestSubject, { cc: newestCc });
|
|
141
|
+
|
|
142
|
+
const response = await deleteMultipleMessages([newestId]);
|
|
143
|
+
|
|
144
|
+
if (response.status !== httpResponseStatusCodes.NO_CONTENT) {
|
|
145
|
+
throw new Error(`Failed to delete email with ID : ${newestId}\n${response}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return newestResult;
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const waitForMail = async (emailModel, { maxSecondToWait = 30 } = {}) => {
|
|
153
|
+
let isFound = false;
|
|
154
|
+
const oneSecondInMilliseconds = 1000;
|
|
155
|
+
let timeFromTheStart = 0;
|
|
156
|
+
const started = new Date();
|
|
157
|
+
let foundMails;
|
|
158
|
+
|
|
159
|
+
while (!isFound && timeFromTheStart < maxSecondToWait) {
|
|
160
|
+
({ data: foundMails } = await getAllMessages(emailModel));
|
|
161
|
+
isFound = foundMails.length > 0;
|
|
162
|
+
const now = new Date();
|
|
163
|
+
timeFromTheStart = (now - started) / oneSecondInMilliseconds;
|
|
164
|
+
await timeUtils.waitFor(3).seconds;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return foundMails;
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
module.exports = {
|
|
171
|
+
util,
|
|
172
|
+
waitForMail,
|
|
173
|
+
getAllMessages,
|
|
174
|
+
getLastMessage,
|
|
175
|
+
deleteMultipleMessages,
|
|
176
|
+
deleteAllMessages,
|
|
177
|
+
deleteAllMessagesByRecipient
|
|
178
|
+
};
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
const DEFAULT_EMAIL_SENDER = 'hellogetjonestest@gmail.com';
|
|
2
|
-
|
|
3
|
-
const tenantUserExtension = externalCompanyName => ` and ${externalCompanyName}`;
|
|
4
|
-
|
|
5
|
-
const EMAIL_TYPES = {
|
|
6
|
-
INVITE: 'invite',
|
|
7
|
-
COMPLIANT: 'compliant',
|
|
8
|
-
NOT_COMPLIANT: 'notCompliant',
|
|
9
|
-
SEND_GAPS: 'sendGaps',
|
|
10
|
-
SEND_GAPS_TENANT: 'sendGapsForTenant',
|
|
11
|
-
REQUEST_NEW_COI_EXPIRED: 'requestNewCoiExpired',
|
|
12
|
-
FIRST_REMINDER: 'firstReminder',
|
|
13
|
-
SECOND_REMINDER: 'secondReminder',
|
|
14
|
-
FINAL_REMINDER: 'finalReminder',
|
|
15
|
-
ABOUT_TO_EXPIRE_PM: 'aboutToExpirePM',
|
|
16
|
-
ABOUT_TO_EXPIRE_MONTH_AUTO_RENEWAL: 'aboutToExpireMonthAutoRenewal',
|
|
17
|
-
ABOUT_TO_EXPIRE_TWO_WEEKS_AUTO_RENEWAL: 'aboutToExpireTwoWeeksAutoRenewal',
|
|
18
|
-
ABOUT_TO_EXPIRE_WEEK_AUTO_RENEWAL: 'aboutToExpireWeekAutoRenewal',
|
|
19
|
-
SAME_DAY_EXPIRATION_RECORD_AUTO_RENEWAL: 'sameDayExpirationRecordAutoRenewal',
|
|
20
|
-
SAME_DAY_EXPIRATION_PM_AUTO_RENEWAL: 'sameDayExpirationPMAutoRenewal',
|
|
21
|
-
REQUIREMENTS_UPDATED_NOTIFICATION: 'requirementsUpdatedNotification',
|
|
22
|
-
UPDATE_REQUIREMENTS_PREFIX: 'updatedRequirementsSubjectPrefix'
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const EMAIL_SUBJECT = {
|
|
26
|
-
invite: 'Your Insurance Documents are needed for',
|
|
27
|
-
compliant: ({ requesterName, recordCompanyName }) => `Accepted Insurance for ${requesterName} - ${recordCompanyName}`,
|
|
28
|
-
sendGaps: ({ requesterName }) => `Corrected Insurance Docs Required for ${requesterName} - `, //For this email type, guest is the same as vendor
|
|
29
|
-
sendGapsForTenant: ({ requesterName }) => `Corrected Insurance Docs Required for leased space at ${requesterName} - `,
|
|
30
|
-
notCompliant: ({ recordCompanyName, requesterName }) => `Please Review Compliance Gaps - ${recordCompanyName} (${requesterName})`,
|
|
31
|
-
wrongCoi: ({ recordCompanyName, requesterName }) => `Incorrect File Submission - COI Still Required for ${recordCompanyName} - ${requesterName}`,
|
|
32
|
-
sendGapsVendorFullName: ({ requesterName, recordFirstName, recordLastName }) => `Corrected Insurance Docs Required for ${requesterName} - ${recordFirstName} ${recordLastName}`,
|
|
33
|
-
sendGapsTenantFullName: ({ requesterName, recordFirstName, recordLastName }) => `Corrected Insurance Docs Required for leased space at ${requesterName} - ${recordFirstName} ${recordLastName}`,
|
|
34
|
-
requestNewCoiExpired: ({ recordCompanyName }) => `${recordCompanyName}'s COI is`,
|
|
35
|
-
firstReminder: ({ requesterName }) => `We are still awaiting the Insurance Docs for ${requesterName}`,
|
|
36
|
-
secondReminder: ({ requesterName }) => `${requesterName} still needs`,
|
|
37
|
-
finalReminder: ({ recordCompanyName, requesterName }) => `Missing ${recordCompanyName}'s Insurance Docs for ${requesterName}`,
|
|
38
|
-
aboutToExpirePM: ({ recordCompanyName }) => `Insurance Policy of ${recordCompanyName} expires Soon`,
|
|
39
|
-
aboutToExpireMonthAutoRenewal: ({ requesterName, expiryDate }) => `Your COI for ${requesterName} expires on ${expiryDate}`,
|
|
40
|
-
aboutToExpireTwoWeeksAutoRenewal: ({ requesterName, expiryDate }) => `Your COI for ${requesterName} expires on ${expiryDate}`,
|
|
41
|
-
aboutToExpireWeekAutoRenewal: ({ requesterName, expiryDate }) => `Your COI for ${requesterName} expires ${expiryDate}`,
|
|
42
|
-
sameDayExpirationRecordAutoRenewal: ({ requesterName }) => `Your COI for ${requesterName} expires TODAY`,
|
|
43
|
-
sameDayExpirationPMAutoRenewal: ({ recordCompanyName }) => `COI expired for ${recordCompanyName} at`,
|
|
44
|
-
requirementsUpdatedNotification: ({ requesterName }) => `Updated Requirements - Your Insurance Docs are needed for ${requesterName}`,
|
|
45
|
-
updatedRequirementsSubjectPrefix: () => 'Updated Requirements - ',
|
|
46
|
-
malwareFileFound: ({ recordCompanyName }) => `File upload failed to pass security scan for ${recordCompanyName}`,
|
|
47
|
-
fraudAuditorReview: ({ recordCompanyName, requesterName }) => `Authentication check for ${recordCompanyName} at ${requesterName}`,
|
|
48
|
-
requestNewCoi: ({ recordCompanyName, requesterName, isExpired }) => `${recordCompanyName}'s COI is ${isExpired ? 'expired' : 'about to expire'} - ${requesterName}`,
|
|
49
|
-
malwareCoiFound: 'COI upload failed to pass security scan',
|
|
50
|
-
thankYou: 'Thank you for submitting your documents',
|
|
51
|
-
teamNoteMention: ({ taggingUserFullName, recordCompanyName }) => `${taggingUserFullName} mentioned you in a team note for ${recordCompanyName}`,
|
|
52
|
-
reportSentSingleProject: ({ accountName, projectName }) => `Jones - Report for ${accountName}: ${projectName}`,
|
|
53
|
-
inviteUserToProject: ({ accountName }) => `${accountName} invited you to join their project`,
|
|
54
|
-
overrideGapRequestPending: ({ vendorCompanyName }) => `${vendorCompanyName} asked for an exception`,
|
|
55
|
-
overrideGapRequestRejected: ({ accountName }) => `${accountName} denied your exception request`,
|
|
56
|
-
overrideGapRequestApproved: ({ accountName }) => `${accountName} approved your exception request`,
|
|
57
|
-
timedOverrideExpired: ({ recordCompanyName, requesterName }) => `Override ended - ${recordCompanyName} in ${requesterName}`,
|
|
58
|
-
allRecordsExport: 'Jones - All Records Export'
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
const EMAIL_POLLING = {
|
|
62
|
-
default: { maxRetries: 10, pollIntervalSeconds: 2 },
|
|
63
|
-
expectNoMail: { maxRetries: 3, pollIntervalSeconds: 1 }
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
module.exports = { DEFAULT_EMAIL_SENDER, EMAIL_TYPES, EMAIL_SUBJECT, EMAIL_POLLING, tenantUserExtension };
|
|
1
|
+
const DEFAULT_EMAIL_SENDER = 'hellogetjonestest@gmail.com';
|
|
2
|
+
|
|
3
|
+
const tenantUserExtension = externalCompanyName => ` and ${externalCompanyName}`;
|
|
4
|
+
|
|
5
|
+
const EMAIL_TYPES = {
|
|
6
|
+
INVITE: 'invite',
|
|
7
|
+
COMPLIANT: 'compliant',
|
|
8
|
+
NOT_COMPLIANT: 'notCompliant',
|
|
9
|
+
SEND_GAPS: 'sendGaps',
|
|
10
|
+
SEND_GAPS_TENANT: 'sendGapsForTenant',
|
|
11
|
+
REQUEST_NEW_COI_EXPIRED: 'requestNewCoiExpired',
|
|
12
|
+
FIRST_REMINDER: 'firstReminder',
|
|
13
|
+
SECOND_REMINDER: 'secondReminder',
|
|
14
|
+
FINAL_REMINDER: 'finalReminder',
|
|
15
|
+
ABOUT_TO_EXPIRE_PM: 'aboutToExpirePM',
|
|
16
|
+
ABOUT_TO_EXPIRE_MONTH_AUTO_RENEWAL: 'aboutToExpireMonthAutoRenewal',
|
|
17
|
+
ABOUT_TO_EXPIRE_TWO_WEEKS_AUTO_RENEWAL: 'aboutToExpireTwoWeeksAutoRenewal',
|
|
18
|
+
ABOUT_TO_EXPIRE_WEEK_AUTO_RENEWAL: 'aboutToExpireWeekAutoRenewal',
|
|
19
|
+
SAME_DAY_EXPIRATION_RECORD_AUTO_RENEWAL: 'sameDayExpirationRecordAutoRenewal',
|
|
20
|
+
SAME_DAY_EXPIRATION_PM_AUTO_RENEWAL: 'sameDayExpirationPMAutoRenewal',
|
|
21
|
+
REQUIREMENTS_UPDATED_NOTIFICATION: 'requirementsUpdatedNotification',
|
|
22
|
+
UPDATE_REQUIREMENTS_PREFIX: 'updatedRequirementsSubjectPrefix'
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const EMAIL_SUBJECT = {
|
|
26
|
+
invite: 'Your Insurance Documents are needed for',
|
|
27
|
+
compliant: ({ requesterName, recordCompanyName }) => `Accepted Insurance for ${requesterName} - ${recordCompanyName}`,
|
|
28
|
+
sendGaps: ({ requesterName }) => `Corrected Insurance Docs Required for ${requesterName} - `, //For this email type, guest is the same as vendor
|
|
29
|
+
sendGapsForTenant: ({ requesterName }) => `Corrected Insurance Docs Required for leased space at ${requesterName} - `,
|
|
30
|
+
notCompliant: ({ recordCompanyName, requesterName }) => `Please Review Compliance Gaps - ${recordCompanyName} (${requesterName})`,
|
|
31
|
+
wrongCoi: ({ recordCompanyName, requesterName }) => `Incorrect File Submission - COI Still Required for ${recordCompanyName} - ${requesterName}`,
|
|
32
|
+
sendGapsVendorFullName: ({ requesterName, recordFirstName, recordLastName }) => `Corrected Insurance Docs Required for ${requesterName} - ${recordFirstName} ${recordLastName}`,
|
|
33
|
+
sendGapsTenantFullName: ({ requesterName, recordFirstName, recordLastName }) => `Corrected Insurance Docs Required for leased space at ${requesterName} - ${recordFirstName} ${recordLastName}`,
|
|
34
|
+
requestNewCoiExpired: ({ recordCompanyName }) => `${recordCompanyName}'s COI is`,
|
|
35
|
+
firstReminder: ({ requesterName }) => `We are still awaiting the Insurance Docs for ${requesterName}`,
|
|
36
|
+
secondReminder: ({ requesterName }) => `${requesterName} still needs`,
|
|
37
|
+
finalReminder: ({ recordCompanyName, requesterName }) => `Missing ${recordCompanyName}'s Insurance Docs for ${requesterName}`,
|
|
38
|
+
aboutToExpirePM: ({ recordCompanyName }) => `Insurance Policy of ${recordCompanyName} expires Soon`,
|
|
39
|
+
aboutToExpireMonthAutoRenewal: ({ requesterName, expiryDate }) => `Your COI for ${requesterName} expires on ${expiryDate}`,
|
|
40
|
+
aboutToExpireTwoWeeksAutoRenewal: ({ requesterName, expiryDate }) => `Your COI for ${requesterName} expires on ${expiryDate}`,
|
|
41
|
+
aboutToExpireWeekAutoRenewal: ({ requesterName, expiryDate }) => `Your COI for ${requesterName} expires ${expiryDate}`,
|
|
42
|
+
sameDayExpirationRecordAutoRenewal: ({ requesterName }) => `Your COI for ${requesterName} expires TODAY`,
|
|
43
|
+
sameDayExpirationPMAutoRenewal: ({ recordCompanyName }) => `COI expired for ${recordCompanyName} at`,
|
|
44
|
+
requirementsUpdatedNotification: ({ requesterName }) => `Updated Requirements - Your Insurance Docs are needed for ${requesterName}`,
|
|
45
|
+
updatedRequirementsSubjectPrefix: () => 'Updated Requirements - ',
|
|
46
|
+
malwareFileFound: ({ recordCompanyName }) => `File upload failed to pass security scan for ${recordCompanyName}`,
|
|
47
|
+
fraudAuditorReview: ({ recordCompanyName, requesterName }) => `Authentication check for ${recordCompanyName} at ${requesterName}`,
|
|
48
|
+
requestNewCoi: ({ recordCompanyName, requesterName, isExpired }) => `${recordCompanyName}'s COI is ${isExpired ? 'expired' : 'about to expire'} - ${requesterName}`,
|
|
49
|
+
malwareCoiFound: 'COI upload failed to pass security scan',
|
|
50
|
+
thankYou: 'Thank you for submitting your documents',
|
|
51
|
+
teamNoteMention: ({ taggingUserFullName, recordCompanyName }) => `${taggingUserFullName} mentioned you in a team note for ${recordCompanyName}`,
|
|
52
|
+
reportSentSingleProject: ({ accountName, projectName }) => `Jones - Report for ${accountName}: ${projectName}`,
|
|
53
|
+
inviteUserToProject: ({ accountName }) => `${accountName} invited you to join their project`,
|
|
54
|
+
overrideGapRequestPending: ({ vendorCompanyName }) => `${vendorCompanyName} asked for an exception`,
|
|
55
|
+
overrideGapRequestRejected: ({ accountName }) => `${accountName} denied your exception request`,
|
|
56
|
+
overrideGapRequestApproved: ({ accountName }) => `${accountName} approved your exception request`,
|
|
57
|
+
timedOverrideExpired: ({ recordCompanyName, requesterName }) => `Override ended - ${recordCompanyName} in ${requesterName}`,
|
|
58
|
+
allRecordsExport: 'Jones - All Records Export'
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const EMAIL_POLLING = {
|
|
62
|
+
default: { maxRetries: 10, pollIntervalSeconds: 2 },
|
|
63
|
+
expectNoMail: { maxRetries: 3, pollIntervalSeconds: 1 }
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
module.exports = { DEFAULT_EMAIL_SENDER, EMAIL_TYPES, EMAIL_SUBJECT, EMAIL_POLLING, tenantUserExtension };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
const services = require('./api/db.emails.service');
|
|
2
|
-
const consts = require('./consts/consts');
|
|
3
|
-
const utils = require('./utils/util');
|
|
4
|
-
const { EmailModel } = require('./models/db.emails.model');
|
|
5
|
-
|
|
6
|
-
module.exports = { services, consts, utils, models: { EmailModel } };
|
|
1
|
+
const services = require('./api/db.emails.service');
|
|
2
|
+
const consts = require('./consts/consts');
|
|
3
|
+
const utils = require('./utils/util');
|
|
4
|
+
const { EmailModel } = require('./models/db.emails.model');
|
|
5
|
+
|
|
6
|
+
module.exports = { services, consts, utils, models: { EmailModel } };
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
class EmailModel {
|
|
2
|
-
constructor({
|
|
3
|
-
from,
|
|
4
|
-
recipientsTo,
|
|
5
|
-
includesOneOfRecipientsTo,
|
|
6
|
-
recipientsCc,
|
|
7
|
-
textInSubject,
|
|
8
|
-
textInBody,
|
|
9
|
-
excludingPhrasesInBody
|
|
10
|
-
} = {}
|
|
11
|
-
) {
|
|
12
|
-
this.from = from;
|
|
13
|
-
this.recipientsTo = recipientsTo;
|
|
14
|
-
this.includeOneOfRecipientsTo = includesOneOfRecipientsTo;
|
|
15
|
-
this.recipientsCc = recipientsCc;
|
|
16
|
-
this.textInSubject = textInSubject;
|
|
17
|
-
this.textInBody = textInBody;
|
|
18
|
-
this.excludingPhrasesInBody = excludingPhrasesInBody;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
module.exports = { EmailModel };
|
|
1
|
+
class EmailModel {
|
|
2
|
+
constructor({
|
|
3
|
+
from,
|
|
4
|
+
recipientsTo,
|
|
5
|
+
includesOneOfRecipientsTo,
|
|
6
|
+
recipientsCc,
|
|
7
|
+
textInSubject,
|
|
8
|
+
textInBody,
|
|
9
|
+
excludingPhrasesInBody
|
|
10
|
+
} = {}
|
|
11
|
+
) {
|
|
12
|
+
this.from = from;
|
|
13
|
+
this.recipientsTo = recipientsTo;
|
|
14
|
+
this.includeOneOfRecipientsTo = includesOneOfRecipientsTo;
|
|
15
|
+
this.recipientsCc = recipientsCc;
|
|
16
|
+
this.textInSubject = textInSubject;
|
|
17
|
+
this.textInBody = textInBody;
|
|
18
|
+
this.excludingPhrasesInBody = excludingPhrasesInBody;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = { EmailModel };
|