@getjones/test-infra 2.8.4 → 2.8.5
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/package.json +29 -29
- package/src/common/commonFlows/auth/auth.js +40 -40
- package/src/common/commonFlows/index.js +4 -4
- package/src/common/commonFlows/records/records.js +72 -72
- package/src/common/consts/dashboardCharts.js +17 -17
- package/src/common/consts/recordTypes.js +5 -5
- package/src/common/consts/userTypes.js +5 -5
- package/src/common/httpResponseStatusCodes.json +11 -11
- package/src/common/requests/apiKeyAuth/requests.js +44 -44
- package/src/common/requests/cookieAuth/requests.js +40 -40
- package/src/common/requests/requestHandlers.js +78 -78
- package/src/common/utils/complianceUtil.js +56 -56
- package/src/common/utils/dataTypeUtils.js +41 -41
- package/src/common/utils/numberUtils.js +22 -22
- package/src/common/utils/objectUtils.js +7 -7
- package/src/common/utils/timeUtils.js +175 -175
- package/src/common/validations/errorValidation.js +16 -16
- package/src/common/validations/typeValidations.js +36 -36
- package/src/defaults/configs/auditConfigs.js +91 -91
- package/src/defaults/configs/coverage.js +227 -227
- package/src/defaults/configs/polices.js +49 -49
- package/src/defaults/configs/requirement.js +32 -32
- package/src/defaults/index.js +6 -6
- package/src/env.js +57 -57
- package/src/factory/index.js +7 -7
- package/src/factory/records/records.js +141 -142
- package/src/factory/users/users.js +79 -79
- package/src/index.js +81 -81
- package/src/saas/internal-api/accounts/api/core/accounts.core.api.js +28 -28
- package/src/saas/internal-api/accounts/api/core/accounts.core.service.js +77 -77
- package/src/saas/internal-api/accounts/api/openapi/accounts.openapi.api.js +48 -48
- package/src/saas/internal-api/accounts/api/openapi/accounts.openapi.service.js +74 -74
- package/src/saas/internal-api/accounts/api/settings/settings.api.js +21 -21
- package/src/saas/internal-api/accounts/api/settings/settings.service.js +41 -41
- package/src/saas/internal-api/accounts/consts/consts.js +6 -6
- package/src/saas/internal-api/accounts/index.js +21 -21
- 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 +38 -38
- package/src/saas/internal-api/accounts/utils/utils.js +66 -66
- package/src/saas/internal-api/auditNotes/api/audit.notes.api.js +40 -40
- package/src/saas/internal-api/auditNotes/api/audit.notes.service.js +115 -115
- package/src/saas/internal-api/auditNotes/index.js +4 -4
- package/src/saas/internal-api/auditNotes/models/audit.note.model.js +30 -30
- package/src/saas/internal-api/auth/api/auth.api.js +27 -27
- package/src/saas/internal-api/auth/api/auth.service.js +90 -90
- package/src/saas/internal-api/auth/index.js +3 -3
- package/src/saas/internal-api/coi/api/coi.api.js +34 -34
- package/src/saas/internal-api/coi/api/coi.service.js +22 -22
- package/src/saas/internal-api/coi/consts/uploaderTypes.js +5 -5
- package/src/saas/internal-api/coi/index.js +13 -13
- package/src/saas/internal-api/coi/models/submit.coi.model.js +9 -9
- package/src/saas/internal-api/coi/utils/utils.js +48 -48
- package/src/saas/internal-api/compliance/api/audit/audit.api.js +46 -46
- package/src/saas/internal-api/compliance/api/audit/audit.service.js +143 -143
- package/src/saas/internal-api/compliance/api/convert/convert.api.js +17 -17
- package/src/saas/internal-api/compliance/api/convert/convert.service.js +11 -11
- package/src/saas/internal-api/compliance/api/coverage/coverage.api.js +33 -33
- package/src/saas/internal-api/compliance/api/coverage/coverage.service.js +48 -48
- package/src/saas/internal-api/compliance/api/overrideGap/override.gap.api.js +33 -33
- package/src/saas/internal-api/compliance/api/overrideGap/override.gap.service.js +127 -127
- package/src/saas/internal-api/compliance/consts/audit.js +71 -71
- package/src/saas/internal-api/compliance/index.js +33 -33
- package/src/saas/internal-api/compliance/models/audit/audit.model.js +84 -84
- package/src/saas/internal-api/compliance/models/waive/waive.model.js +49 -49
- package/src/saas/internal-api/compliance/utils/auditUtil.js +222 -222
- package/src/saas/internal-api/compliance/utils/coverageUtil.js +40 -40
- package/src/saas/internal-api/contractors/api/contractors.api.js +153 -153
- package/src/saas/internal-api/contractors/api/contractors.service.js +181 -169
- package/src/saas/internal-api/contractors/consts/consts.js +6 -6
- package/src/saas/internal-api/contractors/index.js +9 -9
- package/src/saas/internal-api/contractors/models/assign.requirement.model.js +10 -10
- package/src/saas/internal-api/contractors/models/create.contractor.model.js +22 -22
- package/src/saas/internal-api/contractors/models/edit.contractor.model.js +60 -60
- package/src/saas/internal-api/contractors/models/verification.contractor.model.js +27 -27
- 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 +127 -127
- package/src/saas/internal-api/dbEmails/consts/consts.js +37 -37
- package/src/saas/internal-api/dbEmails/index.js +5 -5
- package/src/saas/internal-api/dbEmails/models/db.emails.model.js +21 -21
- package/src/saas/internal-api/dbEmails/utils/util.js +68 -68
- package/src/saas/internal-api/globalRecord/api/global.record.api.js +82 -82
- package/src/saas/internal-api/globalRecord/api/global.record.service.js +95 -95
- 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 +43 -43
- package/src/saas/internal-api/globalRecord/utils/util.js +148 -148
- 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/projects/api/core/projects.api.js +39 -39
- package/src/saas/internal-api/projects/api/core/projects.service.js +65 -65
- 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 +41 -41
- package/src/saas/internal-api/projects/utils/utils.js +156 -156
- package/src/saas/internal-api/recordNotes/api/record.notes.api.js +38 -38
- package/src/saas/internal-api/recordNotes/api/record.notes.service.js +29 -29
- package/src/saas/internal-api/recordNotes/index.js +3 -3
- package/src/saas/internal-api/reports/api/reports.api.js +39 -39
- package/src/saas/internal-api/reports/api/reports.service.js +34 -34
- package/src/saas/internal-api/reports/consts/consts.js +63 -63
- 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 +72 -72
- package/src/saas/internal-api/requests/api/requests.service.js +114 -122
- package/src/saas/internal-api/requests/index.js +14 -14
- package/src/saas/internal-api/requests/models/create.request.model.js +33 -33
- package/src/saas/internal-api/requests/models/edit.request.model.js +31 -31
- package/src/saas/internal-api/requests/models/tenant.request.model.js +9 -9
- package/src/saas/internal-api/requests/utils.js +8 -8
- 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/requirements.api.js +45 -45
- package/src/saas/internal-api/requirements/api/requirements.service.js +134 -134
- package/src/saas/internal-api/requirements/consts/attributeTypes.json +5 -5
- package/src/saas/internal-api/requirements/consts/consts.js +6 -6
- package/src/saas/internal-api/requirements/index.js +9 -9
- package/src/saas/internal-api/requirements/models/create.requirement.model.js +17 -17
- package/src/saas/internal-api/requirements/models/policy.model.js +32 -32
- package/src/saas/internal-api/requirements/models/update.requirement.model.js +19 -19
- package/src/saas/internal-api/requirements/utils/utils.js +102 -102
- 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/tabs/api/tabs.api.js +32 -32
- package/src/saas/internal-api/tabs/api/tabs.service.js +54 -54
- package/src/saas/internal-api/tabs/index.js +3 -3
- package/src/saas/internal-api/tabs/models/tabs.model.js +18 -18
- package/src/saas/internal-api/thread-scheduler/runner.js +39 -39
- package/src/saas/internal-api/users/api/tenantApp/tenant.app.api.js +32 -32
- package/src/saas/internal-api/users/api/tenantApp/tenant.app.service.js +78 -78
- package/src/saas/internal-api/users/api/users.api.js +77 -77
- package/src/saas/internal-api/users/api/users.service.js +101 -101
- package/src/saas/internal-api/users/index.js +11 -11
- package/src/saas/internal-api/users/models/tenent.user.model.js +11 -11
- package/src/saas/internal-api/users/models/users.model.js +31 -31
- package/src/saas/internal-api/users/utils/util.js +20 -20
- package/src/saas/internal-api/vendorProfile/api/vendor.profile.api.js +20 -20
- package/src/saas/internal-api/vendorProfile/api/vendor.profile.service.js +14 -14
- 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 +20 -20
- package/src/saas/openapi/coi/coi.service.js +13 -13
- package/src/saas/openapi/projects/projects.api.js +59 -59
- package/src/saas/openapi/projects/projects.service.js +44 -44
- package/src/saas/openapi/requests/index.js +7 -7
- package/src/saas/openapi/requests/models/invite.request.model.js +37 -37
- package/src/saas/openapi/requests/models/update.request.model.js +35 -35
- package/src/saas/openapi/requests/requests.api.js +76 -76
- package/src/saas/openapi/requests/requests.service.js +65 -65
- 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 +26 -26
- package/src/saas/openapi/requirements/requirements.service.js +32 -32
- 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 +18 -18
- package/src/saas/openapi/tabs/tabs.service.js +11 -11
- package/tests/env.test.js +40 -40
- package/tests/validation.test.js +83 -83
|
@@ -1,127 +1,127 @@
|
|
|
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 { EmailModel } = require('../models/db.emails.model');
|
|
6
|
-
|
|
7
|
-
const strict = 'strict';
|
|
8
|
-
|
|
9
|
-
const getAllMessages = emailModel => {
|
|
10
|
-
return dbEmailsApi.getAllMessages(emailModel);
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
const deleteMultipleMessages = emailIds => {
|
|
14
|
-
return dbEmailsApi.deleteMultipleMessages(emailIds);
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
const deleteAllMessages = () => {
|
|
18
|
-
return dbEmailsApi.deleteAllMessages();
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const getLastMessage = async (
|
|
22
|
-
{
|
|
23
|
-
recipients,
|
|
24
|
-
recipientsVerification = strict,
|
|
25
|
-
textInSubject,
|
|
26
|
-
textInBody,
|
|
27
|
-
excludingPhrasesInBody,
|
|
28
|
-
regex,
|
|
29
|
-
returnType
|
|
30
|
-
} = {}
|
|
31
|
-
) => {
|
|
32
|
-
async function getLatestMessage(messages) {
|
|
33
|
-
for (const message of messages) {
|
|
34
|
-
/* The query we use to search for messages guarantees the recipients are included,
|
|
35
|
-
but it doesn't guarantee other emails aren't in to, cc or bcc */
|
|
36
|
-
let emailsMatch = true;
|
|
37
|
-
|
|
38
|
-
if (recipientsVerification === strict) {
|
|
39
|
-
const emptyArray = [''];
|
|
40
|
-
|
|
41
|
-
const expectedRecipients = {
|
|
42
|
-
from: util.extractEmailFromNameAndEmailFormat(recipients.from),
|
|
43
|
-
to: recipients.to || emptyArray,
|
|
44
|
-
cc: recipients.cc || emptyArray
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
const actualRecipients = {
|
|
48
|
-
from: util.extractEmailFromNameAndEmailFormat(message.from),
|
|
49
|
-
to: message.recipientsTo || emptyArray,
|
|
50
|
-
cc: message.recipientsCc || emptyArray
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
emailsMatch = util.recipientsMatchVerification(expectedRecipients, actualRecipients);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (!emailsMatch) {
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const result = regex ? util.regexVerification(message.body, regex, { returnType }) : message.body;
|
|
61
|
-
|
|
62
|
-
const isMessageNewest = timeUtils.isDateAfterOther(message.insertedTime, newestDateTime);
|
|
63
|
-
|
|
64
|
-
if (result && (!newestResult || !newestId || isMessageNewest)) {
|
|
65
|
-
newestResult = result;
|
|
66
|
-
newestId = message.id;
|
|
67
|
-
newestDateTime = message.insertedTime;
|
|
68
|
-
|
|
69
|
-
// Used for logging purposes only
|
|
70
|
-
newestTo = message.recipientsTo;
|
|
71
|
-
newestCc = message.recipientsCc;
|
|
72
|
-
newestSubject = message.subject;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
let newestDateTime = '2020-01-01T01:01:01.000+0000';
|
|
78
|
-
let newestId, newestResult, newestTo, newestCc, newestSubject;
|
|
79
|
-
|
|
80
|
-
let recipientsTo = recipients.to;
|
|
81
|
-
let includesOneOfRecipientsTo;
|
|
82
|
-
|
|
83
|
-
if (recipientsVerification !== strict) {
|
|
84
|
-
recipientsTo = null;
|
|
85
|
-
includesOneOfRecipientsTo = recipients.to;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// In case the format is 'First Last <username@domain.com>' we need the email part only
|
|
89
|
-
const emailModel = new EmailModel(
|
|
90
|
-
util.extractEmailFromNameAndEmailFormat(recipients.from),
|
|
91
|
-
recipientsTo,
|
|
92
|
-
includesOneOfRecipientsTo,
|
|
93
|
-
recipients.cc,
|
|
94
|
-
textInSubject,
|
|
95
|
-
textInBody,
|
|
96
|
-
excludingPhrasesInBody
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
const response = await getAllMessages(emailModel);
|
|
100
|
-
|
|
101
|
-
if (response.status !== httpResponseStatusCodes.OK) {
|
|
102
|
-
throw new Error(`Inbox messages could not be retrieved\n${response}`);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
await getLatestMessage(response.data);
|
|
106
|
-
|
|
107
|
-
if (newestId) {
|
|
108
|
-
util.logRetrievedEmailInfo(newestTo, newestSubject, { cc: newestCc });
|
|
109
|
-
|
|
110
|
-
const response = await deleteMultipleMessages([newestId]);
|
|
111
|
-
|
|
112
|
-
if (response.status !== httpResponseStatusCodes.NO_CONTENT) {
|
|
113
|
-
throw new Error(`Failed to delete email with ID : ${newestId}\n${response}`);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return newestResult;
|
|
118
|
-
};
|
|
119
|
-
|
|
120
|
-
module.exports = {
|
|
121
|
-
util,
|
|
122
|
-
|
|
123
|
-
getAllMessages,
|
|
124
|
-
getLastMessage,
|
|
125
|
-
deleteMultipleMessages,
|
|
126
|
-
deleteAllMessages
|
|
127
|
-
};
|
|
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 { EmailModel } = require('../models/db.emails.model');
|
|
6
|
+
|
|
7
|
+
const strict = 'strict';
|
|
8
|
+
|
|
9
|
+
const getAllMessages = emailModel => {
|
|
10
|
+
return dbEmailsApi.getAllMessages(emailModel);
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const deleteMultipleMessages = emailIds => {
|
|
14
|
+
return dbEmailsApi.deleteMultipleMessages(emailIds);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const deleteAllMessages = () => {
|
|
18
|
+
return dbEmailsApi.deleteAllMessages();
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const getLastMessage = async (
|
|
22
|
+
{
|
|
23
|
+
recipients,
|
|
24
|
+
recipientsVerification = strict,
|
|
25
|
+
textInSubject,
|
|
26
|
+
textInBody,
|
|
27
|
+
excludingPhrasesInBody,
|
|
28
|
+
regex,
|
|
29
|
+
returnType
|
|
30
|
+
} = {}
|
|
31
|
+
) => {
|
|
32
|
+
async function getLatestMessage(messages) {
|
|
33
|
+
for (const message of messages) {
|
|
34
|
+
/* The query we use to search for messages guarantees the recipients are included,
|
|
35
|
+
but it doesn't guarantee other emails aren't in to, cc or bcc */
|
|
36
|
+
let emailsMatch = true;
|
|
37
|
+
|
|
38
|
+
if (recipientsVerification === strict) {
|
|
39
|
+
const emptyArray = [''];
|
|
40
|
+
|
|
41
|
+
const expectedRecipients = {
|
|
42
|
+
from: util.extractEmailFromNameAndEmailFormat(recipients.from),
|
|
43
|
+
to: recipients.to || emptyArray,
|
|
44
|
+
cc: recipients.cc || emptyArray
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const actualRecipients = {
|
|
48
|
+
from: util.extractEmailFromNameAndEmailFormat(message.from),
|
|
49
|
+
to: message.recipientsTo || emptyArray,
|
|
50
|
+
cc: message.recipientsCc || emptyArray
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
emailsMatch = util.recipientsMatchVerification(expectedRecipients, actualRecipients);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (!emailsMatch) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const result = regex ? util.regexVerification(message.body, regex, { returnType }) : message.body;
|
|
61
|
+
|
|
62
|
+
const isMessageNewest = timeUtils.isDateAfterOther(message.insertedTime, newestDateTime);
|
|
63
|
+
|
|
64
|
+
if (result && (!newestResult || !newestId || isMessageNewest)) {
|
|
65
|
+
newestResult = result;
|
|
66
|
+
newestId = message.id;
|
|
67
|
+
newestDateTime = message.insertedTime;
|
|
68
|
+
|
|
69
|
+
// Used for logging purposes only
|
|
70
|
+
newestTo = message.recipientsTo;
|
|
71
|
+
newestCc = message.recipientsCc;
|
|
72
|
+
newestSubject = message.subject;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
let newestDateTime = '2020-01-01T01:01:01.000+0000';
|
|
78
|
+
let newestId, newestResult, newestTo, newestCc, newestSubject;
|
|
79
|
+
|
|
80
|
+
let recipientsTo = recipients.to;
|
|
81
|
+
let includesOneOfRecipientsTo;
|
|
82
|
+
|
|
83
|
+
if (recipientsVerification !== strict) {
|
|
84
|
+
recipientsTo = null;
|
|
85
|
+
includesOneOfRecipientsTo = recipients.to;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// In case the format is 'First Last <username@domain.com>' we need the email part only
|
|
89
|
+
const emailModel = new EmailModel(
|
|
90
|
+
util.extractEmailFromNameAndEmailFormat(recipients.from),
|
|
91
|
+
recipientsTo,
|
|
92
|
+
includesOneOfRecipientsTo,
|
|
93
|
+
recipients.cc,
|
|
94
|
+
textInSubject,
|
|
95
|
+
textInBody,
|
|
96
|
+
excludingPhrasesInBody
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
const response = await getAllMessages(emailModel);
|
|
100
|
+
|
|
101
|
+
if (response.status !== httpResponseStatusCodes.OK) {
|
|
102
|
+
throw new Error(`Inbox messages could not be retrieved\n${response}`);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
await getLatestMessage(response.data);
|
|
106
|
+
|
|
107
|
+
if (newestId) {
|
|
108
|
+
util.logRetrievedEmailInfo(newestTo, newestSubject, { cc: newestCc });
|
|
109
|
+
|
|
110
|
+
const response = await deleteMultipleMessages([newestId]);
|
|
111
|
+
|
|
112
|
+
if (response.status !== httpResponseStatusCodes.NO_CONTENT) {
|
|
113
|
+
throw new Error(`Failed to delete email with ID : ${newestId}\n${response}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return newestResult;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
module.exports = {
|
|
121
|
+
util,
|
|
122
|
+
|
|
123
|
+
getAllMessages,
|
|
124
|
+
getLastMessage,
|
|
125
|
+
deleteMultipleMessages,
|
|
126
|
+
deleteAllMessages
|
|
127
|
+
};
|
|
@@ -1,37 +1,37 @@
|
|
|
1
|
-
const DEFAULT_EMAIL_SENDER = 'hellogetjonestest@gmail.com';
|
|
2
|
-
|
|
3
|
-
const EMAIL_TYPES = {
|
|
4
|
-
COMPLIANT: 'compliant',
|
|
5
|
-
SEND_GAPS: 'sendGaps',
|
|
6
|
-
REQUEST_NEW_COI_EXPIRED: 'requestNewCoiExpired',
|
|
7
|
-
FIRST_REMINDER: 'firstReminder',
|
|
8
|
-
SECOND_REMINDER: 'secondReminder',
|
|
9
|
-
FINAL_REMINDER: 'finalReminder',
|
|
10
|
-
ABOUT_TO_EXPIRE_PM: 'aboutToExpirePM',
|
|
11
|
-
ABOUT_TO_EXPIRE_MONTH_AUTO_RENEWAL: 'aboutToExpireMonthAutoRenewal',
|
|
12
|
-
ABOUT_TO_EXPIRE_TWO_WEEKS_AUTO_RENEWAL: 'aboutToExpireTwoWeeksAutoRenewal',
|
|
13
|
-
ABOUT_TO_EXPIRE_WEEK_AUTO_RENEWAL: 'aboutToExpireWeekAutoRenewal',
|
|
14
|
-
SAME_DAY_EXPIRATION_RECORD_AUTO_RENEWAL: 'sameDayExpirationRecordAutoRenewal',
|
|
15
|
-
SAME_DAY_EXPIRATION_PM_AUTO_RENEWAL: 'sameDayExpirationPMAutoRenewal',
|
|
16
|
-
REQUIREMENTS_UPDATED_NOTIFICATION: 'requirementsUpdatedNotification',
|
|
17
|
-
UPDATE_REQUIREMENTS_PREFIX: 'updatedRequirementsSubjectPrefix'
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
const EMAIL_SUBJECT = {
|
|
21
|
-
compliant: ({ recordCompanyName }) => `Compliant COI - ${recordCompanyName}`,
|
|
22
|
-
sendGaps: ({ requesterName }) => `New Insurance Docs Required for ${requesterName}`, //doesn't includes text for guest or tenant
|
|
23
|
-
requestNewCoiExpired: ({ recordCompanyName }) => `${recordCompanyName}'s COI is`,
|
|
24
|
-
firstReminder: ({ requesterName }) => `We are still awaiting the Insurance Docs for ${requesterName}`,
|
|
25
|
-
secondReminder: ({ requesterName }) => `We are still awaiting the Insurance Docs for ${requesterName}`,
|
|
26
|
-
finalReminder: ({ recordCompanyName, requesterName }) => `Missing ${recordCompanyName}'s Insurance Docs for ${requesterName}`,
|
|
27
|
-
aboutToExpirePM: ({ recordCompanyName }) => `Insurance Policy of ${recordCompanyName} expires Soon`,
|
|
28
|
-
aboutToExpireMonthAutoRenewal: ({ requesterName }) => `Your COI for ${requesterName} expires in 30 days`,
|
|
29
|
-
aboutToExpireTwoWeeksAutoRenewal: ({ requesterName }) => `Your COI for ${requesterName} expires in 14 days`,
|
|
30
|
-
aboutToExpireWeekAutoRenewal: ({ requesterName }) => `Only 7 days! Your COI for ${requesterName} expires`,
|
|
31
|
-
sameDayExpirationRecordAutoRenewal: ({ requesterName }) => `Your COI for ${requesterName} expires TODAY`,
|
|
32
|
-
sameDayExpirationPMAutoRenewal: ({ recordCompanyName }) => `COI expired for ${recordCompanyName} at`,
|
|
33
|
-
requirementsUpdatedNotification: ({ requesterName }) => `Updated Requirements - Your Insurance Docs are needed for ${requesterName}`,
|
|
34
|
-
updatedRequirementsSubjectPrefix: () => 'Updated Requirements - '
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
module.exports = { DEFAULT_EMAIL_SENDER, EMAIL_TYPES, EMAIL_SUBJECT };
|
|
1
|
+
const DEFAULT_EMAIL_SENDER = 'hellogetjonestest@gmail.com';
|
|
2
|
+
|
|
3
|
+
const EMAIL_TYPES = {
|
|
4
|
+
COMPLIANT: 'compliant',
|
|
5
|
+
SEND_GAPS: 'sendGaps',
|
|
6
|
+
REQUEST_NEW_COI_EXPIRED: 'requestNewCoiExpired',
|
|
7
|
+
FIRST_REMINDER: 'firstReminder',
|
|
8
|
+
SECOND_REMINDER: 'secondReminder',
|
|
9
|
+
FINAL_REMINDER: 'finalReminder',
|
|
10
|
+
ABOUT_TO_EXPIRE_PM: 'aboutToExpirePM',
|
|
11
|
+
ABOUT_TO_EXPIRE_MONTH_AUTO_RENEWAL: 'aboutToExpireMonthAutoRenewal',
|
|
12
|
+
ABOUT_TO_EXPIRE_TWO_WEEKS_AUTO_RENEWAL: 'aboutToExpireTwoWeeksAutoRenewal',
|
|
13
|
+
ABOUT_TO_EXPIRE_WEEK_AUTO_RENEWAL: 'aboutToExpireWeekAutoRenewal',
|
|
14
|
+
SAME_DAY_EXPIRATION_RECORD_AUTO_RENEWAL: 'sameDayExpirationRecordAutoRenewal',
|
|
15
|
+
SAME_DAY_EXPIRATION_PM_AUTO_RENEWAL: 'sameDayExpirationPMAutoRenewal',
|
|
16
|
+
REQUIREMENTS_UPDATED_NOTIFICATION: 'requirementsUpdatedNotification',
|
|
17
|
+
UPDATE_REQUIREMENTS_PREFIX: 'updatedRequirementsSubjectPrefix'
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const EMAIL_SUBJECT = {
|
|
21
|
+
compliant: ({ recordCompanyName }) => `Compliant COI - ${recordCompanyName}`,
|
|
22
|
+
sendGaps: ({ requesterName }) => `New Insurance Docs Required for ${requesterName}`, //doesn't includes text for guest or tenant
|
|
23
|
+
requestNewCoiExpired: ({ recordCompanyName }) => `${recordCompanyName}'s COI is`,
|
|
24
|
+
firstReminder: ({ requesterName }) => `We are still awaiting the Insurance Docs for ${requesterName}`,
|
|
25
|
+
secondReminder: ({ requesterName }) => `We are still awaiting the Insurance Docs for ${requesterName}`,
|
|
26
|
+
finalReminder: ({ recordCompanyName, requesterName }) => `Missing ${recordCompanyName}'s Insurance Docs for ${requesterName}`,
|
|
27
|
+
aboutToExpirePM: ({ recordCompanyName }) => `Insurance Policy of ${recordCompanyName} expires Soon`,
|
|
28
|
+
aboutToExpireMonthAutoRenewal: ({ requesterName }) => `Your COI for ${requesterName} expires in 30 days`,
|
|
29
|
+
aboutToExpireTwoWeeksAutoRenewal: ({ requesterName }) => `Your COI for ${requesterName} expires in 14 days`,
|
|
30
|
+
aboutToExpireWeekAutoRenewal: ({ requesterName }) => `Only 7 days! Your COI for ${requesterName} expires`,
|
|
31
|
+
sameDayExpirationRecordAutoRenewal: ({ requesterName }) => `Your COI for ${requesterName} expires TODAY`,
|
|
32
|
+
sameDayExpirationPMAutoRenewal: ({ recordCompanyName }) => `COI expired for ${recordCompanyName} at`,
|
|
33
|
+
requirementsUpdatedNotification: ({ requesterName }) => `Updated Requirements - Your Insurance Docs are needed for ${requesterName}`,
|
|
34
|
+
updatedRequirementsSubjectPrefix: () => 'Updated Requirements - '
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
module.exports = { DEFAULT_EMAIL_SENDER, EMAIL_TYPES, EMAIL_SUBJECT };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const services = require('./api/db.emails.service');
|
|
2
|
-
const consts = require('./consts/consts');
|
|
3
|
-
const utils = require('./utils/util');
|
|
4
|
-
|
|
5
|
-
module.exports = { services, consts, utils };
|
|
1
|
+
const services = require('./api/db.emails.service');
|
|
2
|
+
const consts = require('./consts/consts');
|
|
3
|
+
const utils = require('./utils/util');
|
|
4
|
+
|
|
5
|
+
module.exports = { services, consts, utils };
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
class EmailModel {
|
|
2
|
-
constructor(
|
|
3
|
-
from,
|
|
4
|
-
recipientsTo,
|
|
5
|
-
includesOneOfRecipientsTo,
|
|
6
|
-
recipientsCc,
|
|
7
|
-
textInSubject,
|
|
8
|
-
textInBody,
|
|
9
|
-
excludingPhrasesInBody
|
|
10
|
-
) {
|
|
11
|
-
this.from = from;
|
|
12
|
-
this.recipientsTo = recipientsTo;
|
|
13
|
-
this.includesOneOfRecipientsTo = includesOneOfRecipientsTo;
|
|
14
|
-
this.recipientsCc = recipientsCc;
|
|
15
|
-
this.textInSubject = textInSubject;
|
|
16
|
-
this.textInBody = textInBody;
|
|
17
|
-
this.excludingPhrasesInBody = excludingPhrasesInBody;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
module.exports = { EmailModel };
|
|
1
|
+
class EmailModel {
|
|
2
|
+
constructor(
|
|
3
|
+
from,
|
|
4
|
+
recipientsTo,
|
|
5
|
+
includesOneOfRecipientsTo,
|
|
6
|
+
recipientsCc,
|
|
7
|
+
textInSubject,
|
|
8
|
+
textInBody,
|
|
9
|
+
excludingPhrasesInBody
|
|
10
|
+
) {
|
|
11
|
+
this.from = from;
|
|
12
|
+
this.recipientsTo = recipientsTo;
|
|
13
|
+
this.includesOneOfRecipientsTo = includesOneOfRecipientsTo;
|
|
14
|
+
this.recipientsCc = recipientsCc;
|
|
15
|
+
this.textInSubject = textInSubject;
|
|
16
|
+
this.textInBody = textInBody;
|
|
17
|
+
this.excludingPhrasesInBody = excludingPhrasesInBody;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
module.exports = { EmailModel };
|
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
const { EMAIL_SUBJECT } = require('../consts/consts');
|
|
2
|
-
|
|
3
|
-
const compareUnorderedArrays = (arr, other, { caseSensitive = true } = {}) => {
|
|
4
|
-
const isEachElementEqual = arr.sort().every((mail, i) => {
|
|
5
|
-
if (caseSensitive) {
|
|
6
|
-
return mail === other.sort()[i];
|
|
7
|
-
} else {
|
|
8
|
-
return mail.toLowerCase() === other.sort()[i].toLowerCase();
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
return arr.length === other.length && isEachElementEqual;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
const recipientsMatchVerification = (expectedRecipients, actualRecipients) => {
|
|
15
|
-
const caseSensitive = false;
|
|
16
|
-
|
|
17
|
-
return expectedRecipients.from.includes(actualRecipients.from) && // For some emails can be few sendor options (ex: branded emails)
|
|
18
|
-
compareUnorderedArrays(actualRecipients.to, expectedRecipients.to, { caseSensitive }) &&
|
|
19
|
-
compareUnorderedArrays(actualRecipients.cc, expectedRecipients.cc, { caseSensitive });
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
const regexVerification = (message, regex, { returnType } = {}) => {
|
|
23
|
-
const capturingGroupsArr = message.match(regex);
|
|
24
|
-
|
|
25
|
-
if (!capturingGroupsArr || capturingGroupsArr.length < 1) {
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const capturingGroups = capturingGroupsArr[capturingGroupsArr.length - 1];
|
|
30
|
-
|
|
31
|
-
if (!capturingGroups || capturingGroups.length < 2) {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
switch (returnType) {
|
|
36
|
-
case 'url':
|
|
37
|
-
return typeof capturingGroups === 'string' ? capturingGroups : capturingGroups[capturingGroups.length - 1];
|
|
38
|
-
case 'body':
|
|
39
|
-
return message;
|
|
40
|
-
default:
|
|
41
|
-
return 'Bad "returnType" argument';
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
const extractEmailFromNameAndEmailFormat = str => {
|
|
46
|
-
// In case the format is 'First Last <username@domain.com>' we will return username@domain.com only
|
|
47
|
-
return str.split('<').pop().split('>')[0];
|
|
48
|
-
};
|
|
49
|
-
const logRetrievedEmailInfo = (to, subject, { cc } = {}) => {
|
|
50
|
-
let log = 'The following email retrieved and will be sent to trash:';
|
|
51
|
-
log += `\n| To: ${to}`;
|
|
52
|
-
cc ? log += `\n| Cc: ${cc}` : '';
|
|
53
|
-
log += `\n| Subject: ${subject}`;
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
const getEmailTextInSubject = (recordCompanyName, emailType, isAfterUpdateRequirements = false, { requesterName = 'Default' } = {}) => {
|
|
57
|
-
const subject = EMAIL_SUBJECT[emailType]({ recordCompanyName, requesterName });
|
|
58
|
-
|
|
59
|
-
return isAfterUpdateRequirements ? `Updated Requirements - ${subject}` : subject;
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
module.exports = {
|
|
63
|
-
recipientsMatchVerification,
|
|
64
|
-
regexVerification,
|
|
65
|
-
extractEmailFromNameAndEmailFormat,
|
|
66
|
-
logRetrievedEmailInfo,
|
|
67
|
-
getEmailTextInSubject
|
|
68
|
-
};
|
|
1
|
+
const { EMAIL_SUBJECT } = require('../consts/consts');
|
|
2
|
+
|
|
3
|
+
const compareUnorderedArrays = (arr, other, { caseSensitive = true } = {}) => {
|
|
4
|
+
const isEachElementEqual = arr.sort().every((mail, i) => {
|
|
5
|
+
if (caseSensitive) {
|
|
6
|
+
return mail === other.sort()[i];
|
|
7
|
+
} else {
|
|
8
|
+
return mail.toLowerCase() === other.sort()[i].toLowerCase();
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
return arr.length === other.length && isEachElementEqual;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const recipientsMatchVerification = (expectedRecipients, actualRecipients) => {
|
|
15
|
+
const caseSensitive = false;
|
|
16
|
+
|
|
17
|
+
return expectedRecipients.from.includes(actualRecipients.from) && // For some emails can be few sendor options (ex: branded emails)
|
|
18
|
+
compareUnorderedArrays(actualRecipients.to, expectedRecipients.to, { caseSensitive }) &&
|
|
19
|
+
compareUnorderedArrays(actualRecipients.cc, expectedRecipients.cc, { caseSensitive });
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const regexVerification = (message, regex, { returnType } = {}) => {
|
|
23
|
+
const capturingGroupsArr = message.match(regex);
|
|
24
|
+
|
|
25
|
+
if (!capturingGroupsArr || capturingGroupsArr.length < 1) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const capturingGroups = capturingGroupsArr[capturingGroupsArr.length - 1];
|
|
30
|
+
|
|
31
|
+
if (!capturingGroups || capturingGroups.length < 2) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
switch (returnType) {
|
|
36
|
+
case 'url':
|
|
37
|
+
return typeof capturingGroups === 'string' ? capturingGroups : capturingGroups[capturingGroups.length - 1];
|
|
38
|
+
case 'body':
|
|
39
|
+
return message;
|
|
40
|
+
default:
|
|
41
|
+
return 'Bad "returnType" argument';
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const extractEmailFromNameAndEmailFormat = str => {
|
|
46
|
+
// In case the format is 'First Last <username@domain.com>' we will return username@domain.com only
|
|
47
|
+
return str.split('<').pop().split('>')[0];
|
|
48
|
+
};
|
|
49
|
+
const logRetrievedEmailInfo = (to, subject, { cc } = {}) => {
|
|
50
|
+
let log = 'The following email retrieved and will be sent to trash:';
|
|
51
|
+
log += `\n| To: ${to}`;
|
|
52
|
+
cc ? log += `\n| Cc: ${cc}` : '';
|
|
53
|
+
log += `\n| Subject: ${subject}`;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const getEmailTextInSubject = (recordCompanyName, emailType, isAfterUpdateRequirements = false, { requesterName = 'Default' } = {}) => {
|
|
57
|
+
const subject = EMAIL_SUBJECT[emailType]({ recordCompanyName, requesterName });
|
|
58
|
+
|
|
59
|
+
return isAfterUpdateRequirements ? `Updated Requirements - ${subject}` : subject;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
module.exports = {
|
|
63
|
+
recipientsMatchVerification,
|
|
64
|
+
regexVerification,
|
|
65
|
+
extractEmailFromNameAndEmailFormat,
|
|
66
|
+
logRetrievedEmailInfo,
|
|
67
|
+
getEmailTextInSubject
|
|
68
|
+
};
|