@getjones/test-infra 4.4.13 → 4.4.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/package.json +30 -30
  2. package/src/common/commonFlows/auth/auth.js +40 -40
  3. package/src/common/commonFlows/index.js +4 -4
  4. package/src/common/commonFlows/records/records.js +243 -243
  5. package/src/common/consts/accountSettings.js +14 -14
  6. package/src/common/consts/activationStatuses.js +6 -6
  7. package/src/common/consts/autocomplete.js +10 -10
  8. package/src/common/consts/constantsForRecordsSortingAndFilters.js +40 -40
  9. package/src/common/consts/dashboardCharts.js +18 -18
  10. package/src/common/consts/ocrStatuses.js +6 -6
  11. package/src/common/consts/projectSettings.js +21 -21
  12. package/src/common/consts/recordTypes.js +5 -5
  13. package/src/common/consts/s3FileTypes.js +13 -13
  14. package/src/common/consts/userRoles.js +6 -6
  15. package/src/common/consts/userTypes.js +8 -8
  16. package/src/common/errorCodes.js +3 -3
  17. package/src/common/httpResponseStatusCodes.json +11 -11
  18. package/src/common/httpResponseTypes.json +2 -2
  19. package/src/common/requests/apiKeyAuth/requests.js +44 -44
  20. package/src/common/requests/cookieAuth/requests.js +40 -40
  21. package/src/common/requests/internalAuth/requests.js +48 -48
  22. package/src/common/requests/requestHandlers.js +80 -80
  23. package/src/common/utils/complianceUtil.js +114 -114
  24. package/src/common/utils/configsUtil.js +22 -22
  25. package/src/common/utils/dataTypeUtils.js +41 -41
  26. package/src/common/utils/numberUtils.js +22 -22
  27. package/src/common/utils/objectUtils.js +7 -7
  28. package/src/common/utils/timeUtils.js +177 -177
  29. package/src/common/validations/errorValidation.js +16 -16
  30. package/src/common/validations/typeValidations.js +36 -36
  31. package/src/defaults/configs/auditConfigs.js +125 -125
  32. package/src/defaults/configs/coverage.js +227 -227
  33. package/src/defaults/configs/polices.js +75 -75
  34. package/src/defaults/configs/requirement.js +32 -32
  35. package/src/defaults/index.js +6 -6
  36. package/src/env.js +57 -57
  37. package/src/factory/globalRecord/globalRecord.js +43 -43
  38. package/src/factory/index.js +8 -8
  39. package/src/factory/records/records.js +229 -229
  40. package/src/factory/users/users.js +86 -86
  41. package/src/index.js +97 -97
  42. package/src/saas/internal-api/accountDirectory/api/accountDirectory.api.js +50 -50
  43. package/src/saas/internal-api/accountDirectory/api/accountDirectory.service.js +182 -182
  44. package/src/saas/internal-api/accountDirectory/index.js +4 -4
  45. package/src/saas/internal-api/accountDirectory/models/accountDirectory.model.js +40 -40
  46. package/src/saas/internal-api/accounts/api/core/accounts.core.api.js +35 -35
  47. package/src/saas/internal-api/accounts/api/core/accounts.core.service.js +93 -93
  48. package/src/saas/internal-api/accounts/api/emailCustomization/accounts.email.customizations.api.js +29 -29
  49. package/src/saas/internal-api/accounts/api/emailCustomization/accounts.email.customizations.service.js +61 -61
  50. package/src/saas/internal-api/accounts/api/openapi/accounts.openapi.api.js +48 -48
  51. package/src/saas/internal-api/accounts/api/openapi/accounts.openapi.service.js +74 -74
  52. package/src/saas/internal-api/accounts/api/settings/settings.api.js +21 -21
  53. package/src/saas/internal-api/accounts/api/settings/settings.service.js +41 -41
  54. package/src/saas/internal-api/accounts/consts/consts.js +8 -8
  55. package/src/saas/internal-api/accounts/index.js +22 -22
  56. package/src/saas/internal-api/accounts/models/core/create.account.model.js +16 -16
  57. package/src/saas/internal-api/accounts/models/settings/update.settings.model.js +42 -42
  58. package/src/saas/internal-api/accounts/utils/utils.js +60 -60
  59. package/src/saas/internal-api/agreement/api/agreement.api.js +39 -39
  60. package/src/saas/internal-api/agreement/api/agreement.service.js +121 -121
  61. package/src/saas/internal-api/agreement/consts/consts.js +10 -10
  62. package/src/saas/internal-api/agreement/index.js +12 -12
  63. package/src/saas/internal-api/agreement/models/create.agreement.model.js +12 -12
  64. package/src/saas/internal-api/agreement/models/createAgreementByAuditorModel.js +11 -11
  65. package/src/saas/internal-api/agreement/models/createAgreementByPMModel.js +13 -13
  66. package/src/saas/internal-api/auditCustomerRules/api/customer.rules.api.js +43 -43
  67. package/src/saas/internal-api/auditCustomerRules/api/customer.rules.service.js +105 -105
  68. package/src/saas/internal-api/auditCustomerRules/consts/customer.rule.js +11 -11
  69. package/src/saas/internal-api/auditCustomerRules/index.js +6 -6
  70. package/src/saas/internal-api/auditCustomerRules/models/customer.rule.model.js +46 -46
  71. package/src/saas/internal-api/auditCustomerRules/utils/customer.rule.util.js +19 -19
  72. package/src/saas/internal-api/auditNotes/api/audit.notes.api.js +40 -40
  73. package/src/saas/internal-api/auditNotes/api/audit.notes.service.js +115 -115
  74. package/src/saas/internal-api/auditNotes/index.js +4 -4
  75. package/src/saas/internal-api/auditNotes/models/audit.note.model.js +30 -30
  76. package/src/saas/internal-api/auth/api/auth.api.js +27 -27
  77. package/src/saas/internal-api/auth/api/auth.service.js +90 -90
  78. package/src/saas/internal-api/auth/index.js +3 -3
  79. package/src/saas/internal-api/coi/api/coi.api.js +45 -45
  80. package/src/saas/internal-api/coi/api/coi.service.js +39 -39
  81. package/src/saas/internal-api/coi/consts/hashes.js +4 -4
  82. package/src/saas/internal-api/coi/consts/uploaderTypes.js +5 -5
  83. package/src/saas/internal-api/coi/index.js +14 -14
  84. package/src/saas/internal-api/coi/models/Combine.last.two.cois.model.js +25 -25
  85. package/src/saas/internal-api/coi/models/submit.coi.model.js +19 -19
  86. package/src/saas/internal-api/coi/utils/utils.js +117 -117
  87. package/src/saas/internal-api/compliance/api/audit/audit.api.js +115 -115
  88. package/src/saas/internal-api/compliance/api/audit/audit.service.js +300 -300
  89. package/src/saas/internal-api/compliance/api/convert/convert.api.js +17 -17
  90. package/src/saas/internal-api/compliance/api/convert/convert.service.js +11 -11
  91. package/src/saas/internal-api/compliance/api/coverage/coverage.api.js +33 -33
  92. package/src/saas/internal-api/compliance/api/coverage/coverage.service.js +48 -48
  93. package/src/saas/internal-api/compliance/api/overrideGap/override.gap.api.js +38 -38
  94. package/src/saas/internal-api/compliance/api/overrideGap/override.gap.service.js +182 -182
  95. package/src/saas/internal-api/compliance/consts/audit.js +111 -111
  96. package/src/saas/internal-api/compliance/index.js +33 -33
  97. package/src/saas/internal-api/compliance/models/audit/audit.model.js +96 -96
  98. package/src/saas/internal-api/compliance/models/waive/waive.model.js +49 -49
  99. package/src/saas/internal-api/compliance/utils/auditUtil.js +254 -254
  100. package/src/saas/internal-api/compliance/utils/coverageUtil.js +40 -40
  101. package/src/saas/internal-api/contractors/api/contractors.api.js +209 -209
  102. package/src/saas/internal-api/contractors/api/contractors.service.js +361 -361
  103. package/src/saas/internal-api/contractors/consts/consts.js +6 -6
  104. package/src/saas/internal-api/contractors/index.js +8 -8
  105. package/src/saas/internal-api/contractors/models/assign.requirement.model.js +10 -10
  106. package/src/saas/internal-api/contractors/models/edit.contractor.model.js +62 -62
  107. package/src/saas/internal-api/contractors/models/link.request.model.js +10 -10
  108. package/src/saas/internal-api/contractors/models/subscription.contractor.model.js +13 -13
  109. package/src/saas/internal-api/contractors/models/verification.contractor.model.js +27 -27
  110. package/src/saas/internal-api/contractors/utils.js +25 -25
  111. package/src/saas/internal-api/dashboard/api/recordList.api.js +38 -38
  112. package/src/saas/internal-api/dashboard/api/recordList.service.js +60 -60
  113. package/src/saas/internal-api/dashboard/index.js +5 -5
  114. package/src/saas/internal-api/dashboard/models/dashboard.filter.criteria.model.js +38 -38
  115. package/src/saas/internal-api/dbEmails/api/db.emails.api.js +25 -25
  116. package/src/saas/internal-api/dbEmails/api/db.emails.service.js +156 -156
  117. package/src/saas/internal-api/dbEmails/consts/consts.js +55 -55
  118. package/src/saas/internal-api/dbEmails/index.js +6 -6
  119. package/src/saas/internal-api/dbEmails/models/db.emails.model.js +22 -22
  120. package/src/saas/internal-api/dbEmails/utils/util.js +87 -87
  121. package/src/saas/internal-api/emailCustomization/api/email.customization.api.js +26 -26
  122. package/src/saas/internal-api/emailCustomization/api/email.customization.service.js +50 -50
  123. package/src/saas/internal-api/emailCustomization/index.js +3 -3
  124. package/src/saas/internal-api/globalRecord/api/global.record.api.js +95 -101
  125. package/src/saas/internal-api/globalRecord/api/global.record.service.js +112 -117
  126. package/src/saas/internal-api/globalRecord/consts.js +20 -20
  127. package/src/saas/internal-api/globalRecord/index.js +6 -6
  128. package/src/saas/internal-api/globalRecord/models/global.record.model.js +60 -60
  129. package/src/saas/internal-api/globalRecord/utils/util.js +161 -161
  130. package/src/saas/internal-api/homepageCharts/api/charts.api.js +12 -12
  131. package/src/saas/internal-api/homepageCharts/api/charts.service.js +7 -7
  132. package/src/saas/internal-api/homepageCharts/index.js +3 -3
  133. package/src/saas/internal-api/policyFile/api/policy.file.api.js +31 -25
  134. package/src/saas/internal-api/policyFile/api/policy.file.service.js +73 -39
  135. package/src/saas/internal-api/policyFile/consts.js +21 -21
  136. package/src/saas/internal-api/policyFile/index.js +11 -11
  137. package/src/saas/internal-api/policyFile/models/create.policy.file.model.js +11 -11
  138. package/src/saas/internal-api/projects/api/core/projects.api.js +39 -39
  139. package/src/saas/internal-api/projects/api/core/projects.service.js +77 -77
  140. package/src/saas/internal-api/projects/api/settings/project.settings.api.js +18 -18
  141. package/src/saas/internal-api/projects/api/settings/project.settings.service.js +35 -35
  142. package/src/saas/internal-api/projects/consts/defaultProject.js +3 -3
  143. package/src/saas/internal-api/projects/index.js +24 -24
  144. package/src/saas/internal-api/projects/models/core/create.project.model.js +41 -41
  145. package/src/saas/internal-api/projects/models/core/update.project.model.js +47 -47
  146. package/src/saas/internal-api/projects/models/settings/update.project.settings.model.js +40 -40
  147. package/src/saas/internal-api/projects/utils/utils.js +155 -155
  148. package/src/saas/internal-api/recordHub/api/record.hub.api.js +14 -14
  149. package/src/saas/internal-api/recordHub/api/record.hub.service.js +21 -21
  150. package/src/saas/internal-api/recordHub/index.js +3 -3
  151. package/src/saas/internal-api/recordNotes/api/record.notes.api.js +38 -38
  152. package/src/saas/internal-api/recordNotes/api/record.notes.service.js +47 -47
  153. package/src/saas/internal-api/recordNotes/api/record.notes.utils.js +12 -12
  154. package/src/saas/internal-api/recordNotes/index.js +3 -3
  155. package/src/saas/internal-api/reports/api/reports.api.js +62 -62
  156. package/src/saas/internal-api/reports/api/reports.service.js +79 -79
  157. package/src/saas/internal-api/reports/consts/consts.js +74 -74
  158. package/src/saas/internal-api/reports/index.js +15 -15
  159. package/src/saas/internal-api/reports/models/report.model.js +27 -27
  160. package/src/saas/internal-api/requests/api/requests.api.js +120 -120
  161. package/src/saas/internal-api/requests/api/requests.service.js +274 -274
  162. package/src/saas/internal-api/requests/index.js +21 -20
  163. package/src/saas/internal-api/requests/models/create.request.model.js +36 -35
  164. package/src/saas/internal-api/requests/models/draft.request.criteria.model.js +18 -18
  165. package/src/saas/internal-api/requests/models/draft.request.report.model.js +14 -14
  166. package/src/saas/internal-api/requests/models/edit.request.model.js +31 -31
  167. package/src/saas/internal-api/requests/models/requestListCriteriaModel.js +17 -17
  168. package/src/saas/internal-api/requests/models/tenant.request.model.js +9 -9
  169. package/src/saas/internal-api/requests/utils.js +16 -8
  170. package/src/saas/internal-api/requestsTable/api/requests.table.api.js +20 -20
  171. package/src/saas/internal-api/requestsTable/api/requests.table.service.js +14 -14
  172. package/src/saas/internal-api/requestsTable/index.js +3 -3
  173. package/src/saas/internal-api/requirements/api/requirements.api.js +57 -57
  174. package/src/saas/internal-api/requirements/api/requirements.service.js +177 -177
  175. package/src/saas/internal-api/requirements/consts/attributeTypes.json +8 -8
  176. package/src/saas/internal-api/requirements/consts/consts.js +6 -6
  177. package/src/saas/internal-api/requirements/index.js +10 -10
  178. package/src/saas/internal-api/requirements/models/create.requirement.model.js +17 -17
  179. package/src/saas/internal-api/requirements/models/policy.model.js +35 -35
  180. package/src/saas/internal-api/requirements/models/update.requirement.model.js +19 -19
  181. package/src/saas/internal-api/requirements/utils/utils.js +129 -129
  182. package/src/saas/internal-api/serviceArea/api/coordinates.api.js +12 -12
  183. package/src/saas/internal-api/serviceArea/api/coordinates.service.js +7 -7
  184. package/src/saas/internal-api/serviceArea/index.js +4 -4
  185. package/src/saas/internal-api/serviceArea/utils/utils.js +8 -8
  186. package/src/saas/internal-api/tabs/api/tabs.api.js +32 -32
  187. package/src/saas/internal-api/tabs/api/tabs.service.js +54 -54
  188. package/src/saas/internal-api/tabs/index.js +3 -3
  189. package/src/saas/internal-api/tabs/models/tabs.model.js +19 -19
  190. package/src/saas/internal-api/thread-scheduler/runner.js +55 -55
  191. package/src/saas/internal-api/uploadFiles/api/upload.file.api.js +43 -43
  192. package/src/saas/internal-api/uploadFiles/api/upload.file.service.js +106 -106
  193. package/src/saas/internal-api/uploadFiles/consts.js +12 -12
  194. package/src/saas/internal-api/uploadFiles/index.js +5 -5
  195. package/src/saas/internal-api/users/api/tenantApp/tenant.app.api.js +38 -38
  196. package/src/saas/internal-api/users/api/tenantApp/tenant.app.service.js +108 -108
  197. package/src/saas/internal-api/users/api/users.api.js +127 -127
  198. package/src/saas/internal-api/users/api/users.service.js +258 -243
  199. package/src/saas/internal-api/users/index.js +16 -16
  200. package/src/saas/internal-api/users/models/create.inner.system.user.model.js +18 -18
  201. package/src/saas/internal-api/users/models/notification.settings.model.js +12 -12
  202. package/src/saas/internal-api/users/models/tenent.user.model.js +11 -11
  203. package/src/saas/internal-api/users/models/users.model.js +43 -42
  204. package/src/saas/internal-api/users/utils/util.js +39 -39
  205. package/src/saas/internal-api/vendorProfile/api/vendor.profile.api.js +26 -20
  206. package/src/saas/internal-api/vendorProfile/api/vendor.profile.service.js +19 -14
  207. package/src/saas/internal-api/vendorProfile/index.js +3 -3
  208. package/src/saas/openapi/accounts/accounts.api.js +17 -17
  209. package/src/saas/openapi/accounts/accounts.service.js +11 -11
  210. package/src/saas/openapi/coi/coi.api.js +30 -30
  211. package/src/saas/openapi/coi/coi.service.js +43 -43
  212. package/src/saas/openapi/projects/projects.api.js +83 -83
  213. package/src/saas/openapi/projects/projects.service.js +64 -64
  214. package/src/saas/openapi/requests/index.js +7 -7
  215. package/src/saas/openapi/requests/models/invite.request.model.js +40 -40
  216. package/src/saas/openapi/requests/models/update.request.model.js +35 -35
  217. package/src/saas/openapi/requests/requests.api.js +87 -87
  218. package/src/saas/openapi/requests/requests.service.js +81 -81
  219. package/src/saas/openapi/requirements/index.js +6 -6
  220. package/src/saas/openapi/requirements/models/copy.requirement.model.js +10 -10
  221. package/src/saas/openapi/requirements/requirements.api.js +41 -41
  222. package/src/saas/openapi/requirements/requirements.service.js +49 -49
  223. package/src/saas/openapi/tabs/index.js +6 -6
  224. package/src/saas/openapi/tabs/models/create.tab.model.js +6 -6
  225. package/src/saas/openapi/tabs/tabs.api.js +27 -27
  226. package/src/saas/openapi/tabs/tabs.service.js +19 -19
  227. package/src/saas/openapi/users/user.model.js +10 -10
  228. package/src/saas/openapi/users/users.api.js +33 -33
  229. package/src/saas/openapi/users/users.service.js +41 -41
  230. package/tests/env.test.js +40 -40
  231. package/tests/validation.test.js +83 -83
@@ -1,25 +1,25 @@
1
- const requests = require('../../../../common/requests/requestHandlers');
2
- const { backendUrl, dbEmailsSecrets } = require('../../../../env').getEnv();
3
-
4
- const Endpoints = {
5
- dbEmails: `${backendUrl}/_saas/automation/emails/${dbEmailsSecrets}`,
6
- deleteAllDbEmails: `${backendUrl}/_saas/automation/emails/all/${dbEmailsSecrets}`
7
- };
8
-
9
- const getAllMessages = emailModel => {
10
- return requests.postRequestHandler(Endpoints.dbEmails, emailModel);
11
- };
12
-
13
- const deleteMultipleMessages = emailIds => {
14
- return requests.deleteRequestHandler(Endpoints.dbEmails, {}, {}, emailIds);
15
- };
16
-
17
- const deleteAllMessages = () => {
18
- return requests.deleteRequestHandler(Endpoints.deleteAllDbEmails);
19
- };
20
-
21
- module.exports = {
22
- getAllMessages,
23
- deleteMultipleMessages,
24
- deleteAllMessages
25
- };
1
+ const requests = require('../../../../common/requests/requestHandlers');
2
+ const { backendUrl, dbEmailsSecrets } = require('../../../../env').getEnv();
3
+
4
+ const Endpoints = {
5
+ dbEmails: `${backendUrl}/_saas/automation/emails/${dbEmailsSecrets}`,
6
+ deleteAllDbEmails: `${backendUrl}/_saas/automation/emails/all/${dbEmailsSecrets}`
7
+ };
8
+
9
+ const getAllMessages = emailModel => {
10
+ return requests.postRequestHandler(Endpoints.dbEmails, emailModel);
11
+ };
12
+
13
+ const deleteMultipleMessages = emailIds => {
14
+ return requests.deleteRequestHandler(Endpoints.dbEmails, {}, {}, emailIds);
15
+ };
16
+
17
+ const deleteAllMessages = () => {
18
+ return requests.deleteRequestHandler(Endpoints.deleteAllDbEmails);
19
+ };
20
+
21
+ module.exports = {
22
+ getAllMessages,
23
+ deleteMultipleMessages,
24
+ deleteAllMessages
25
+ };
@@ -1,156 +1,156 @@
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
- {
91
- from: util.extractEmailFromNameAndEmailFormat(recipients.from),
92
- recipientsTo,
93
- includesOneOfRecipientsTo,
94
- recipientsCc: recipients.cc,
95
- textInSubject,
96
- textInBody,
97
- excludingPhrasesInBody
98
- }
99
- );
100
-
101
- const response = await getAllMessages(emailModel);
102
-
103
- if (response.status !== httpResponseStatusCodes.OK) {
104
- throw new Error(`Inbox messages could not be retrieved\n${response}`);
105
- }
106
-
107
- await getLatestMessage(response.data);
108
-
109
- if (newestId) {
110
- util.logRetrievedEmailInfo(newestTo, newestSubject, { cc: newestCc });
111
-
112
- const response = await deleteMultipleMessages([newestId]);
113
-
114
- if (response.status !== httpResponseStatusCodes.NO_CONTENT) {
115
- throw new Error(`Failed to delete email with ID : ${newestId}\n${response}`);
116
- }
117
- }
118
-
119
- return newestResult;
120
- };
121
-
122
- const waitForMail = async (emailModel, { maxSecondToWait = 30 } = {}) => {
123
- let isFound = false;
124
- const oneSecondInMilliseconds = 1000;
125
- let timeFromTheStart = 0;
126
- const started = new Date();
127
- let foundMails;
128
-
129
- while (!isFound && timeFromTheStart < maxSecondToWait) {
130
- ({ data: foundMails } = await getAllMessages(emailModel));
131
- isFound = foundMails.length > 0;
132
- const now = new Date();
133
- timeFromTheStart = (now - started) / oneSecondInMilliseconds;
134
- await timeUtils.waitFor(3).seconds;
135
- }
136
-
137
- return foundMails;
138
- };
139
-
140
- const getSubscriptionData = async function(recipients) {
141
- const regex = util.getUnsubscribeButtonUrlRegex();
142
- const unsubscribeButtonUrl = await getLastMessage({ recipients, regex, returnType: 'url' });
143
-
144
- const data = util.getEncryptedDataFromLink(unsubscribeButtonUrl);
145
- return decodeURIComponent(data);
146
- };
147
-
148
- module.exports = {
149
- util,
150
- waitForMail,
151
- getAllMessages,
152
- getLastMessage,
153
- getSubscriptionData,
154
- deleteMultipleMessages,
155
- deleteAllMessages
156
- };
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
+ {
91
+ from: util.extractEmailFromNameAndEmailFormat(recipients.from),
92
+ recipientsTo,
93
+ includesOneOfRecipientsTo,
94
+ recipientsCc: recipients.cc,
95
+ textInSubject,
96
+ textInBody,
97
+ excludingPhrasesInBody
98
+ }
99
+ );
100
+
101
+ const response = await getAllMessages(emailModel);
102
+
103
+ if (response.status !== httpResponseStatusCodes.OK) {
104
+ throw new Error(`Inbox messages could not be retrieved\n${response}`);
105
+ }
106
+
107
+ await getLatestMessage(response.data);
108
+
109
+ if (newestId) {
110
+ util.logRetrievedEmailInfo(newestTo, newestSubject, { cc: newestCc });
111
+
112
+ const response = await deleteMultipleMessages([newestId]);
113
+
114
+ if (response.status !== httpResponseStatusCodes.NO_CONTENT) {
115
+ throw new Error(`Failed to delete email with ID : ${newestId}\n${response}`);
116
+ }
117
+ }
118
+
119
+ return newestResult;
120
+ };
121
+
122
+ const waitForMail = async (emailModel, { maxSecondToWait = 30 } = {}) => {
123
+ let isFound = false;
124
+ const oneSecondInMilliseconds = 1000;
125
+ let timeFromTheStart = 0;
126
+ const started = new Date();
127
+ let foundMails;
128
+
129
+ while (!isFound && timeFromTheStart < maxSecondToWait) {
130
+ ({ data: foundMails } = await getAllMessages(emailModel));
131
+ isFound = foundMails.length > 0;
132
+ const now = new Date();
133
+ timeFromTheStart = (now - started) / oneSecondInMilliseconds;
134
+ await timeUtils.waitFor(3).seconds;
135
+ }
136
+
137
+ return foundMails;
138
+ };
139
+
140
+ const getSubscriptionData = async function(recipients) {
141
+ const regex = util.getUnsubscribeButtonUrlRegex();
142
+ const unsubscribeButtonUrl = await getLastMessage({ recipients, regex, returnType: 'url' });
143
+
144
+ const data = util.getEncryptedDataFromLink(unsubscribeButtonUrl);
145
+ return decodeURIComponent(data);
146
+ };
147
+
148
+ module.exports = {
149
+ util,
150
+ waitForMail,
151
+ getAllMessages,
152
+ getLastMessage,
153
+ getSubscriptionData,
154
+ deleteMultipleMessages,
155
+ deleteAllMessages
156
+ };
@@ -1,55 +1,55 @@
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 Docs are needed for',
27
- compliant: ({ recordCompanyName }) => `Compliant COI - ${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 COI 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 }) => `Your COI for ${requesterName} expires in 30 days`,
40
- aboutToExpireTwoWeeksAutoRenewal: ({ requesterName }) => `Your COI for ${requesterName} expires in 14 days`,
41
- aboutToExpireWeekAutoRenewal: ({ requesterName }) => `Only 7 days! Your COI for ${requesterName} expires`,
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 COI',
51
- teamNoteMention: ({ taggingUserFullName, recordCompanyName }) => `${taggingUserFullName} mentioned you in a team note for ${recordCompanyName}`,
52
- reportSentSingleProject: ({ accountName, projectName }) => `Jones - Report for ${accountName}: ${projectName}`
53
- };
54
-
55
- module.exports = { DEFAULT_EMAIL_SENDER, EMAIL_TYPES, EMAIL_SUBJECT, 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 Docs are needed for',
27
+ compliant: ({ recordCompanyName }) => `Compliant COI - ${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 COI 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 }) => `Your COI for ${requesterName} expires in 30 days`,
40
+ aboutToExpireTwoWeeksAutoRenewal: ({ requesterName }) => `Your COI for ${requesterName} expires in 14 days`,
41
+ aboutToExpireWeekAutoRenewal: ({ requesterName }) => `Only 7 days! Your COI for ${requesterName} expires`,
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 COI',
51
+ teamNoteMention: ({ taggingUserFullName, recordCompanyName }) => `${taggingUserFullName} mentioned you in a team note for ${recordCompanyName}`,
52
+ reportSentSingleProject: ({ accountName, projectName }) => `Jones - Report for ${accountName}: ${projectName}`
53
+ };
54
+
55
+ module.exports = { DEFAULT_EMAIL_SENDER, EMAIL_TYPES, EMAIL_SUBJECT, 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.includesOneOfRecipientsTo = 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.includesOneOfRecipientsTo = includesOneOfRecipientsTo;
15
+ this.recipientsCc = recipientsCc;
16
+ this.textInSubject = textInSubject;
17
+ this.textInBody = textInBody;
18
+ this.excludingPhrasesInBody = excludingPhrasesInBody;
19
+ }
20
+ }
21
+
22
+ module.exports = { EmailModel };