@getjones/test-infra 1.11.0 → 2.0.0
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 +1 -1
- package/src/common/factory/records/records.js +26 -0
- package/src/common/utils/timeUtils.js +16 -1
- package/src/index.js +5 -3
- package/src/saas/internal-api/contractors/api/contractors.api.js +2 -14
- package/src/saas/internal-api/contractors/api/contractors.service.js +0 -7
- package/src/saas/internal-api/contractors/models/create.contractor.model.js +2 -2
- package/src/saas/internal-api/contractors/models/edit.contractor.model.js +1 -10
- package/src/saas/internal-api/dbEmails/api/db.emails.api.js +1 -1
- package/src/saas/internal-api/dbEmails/api/db.emails.service.js +111 -3
- package/src/saas/internal-api/dbEmails/consts/consts.js +3 -0
- package/src/saas/internal-api/dbEmails/index.js +2 -1
- package/src/saas/internal-api/dbEmails/models/db.emails.model.js +1 -1
- package/src/saas/internal-api/dbEmails/utils/util.js +59 -0
- package/src/saas/internal-api/requests/models/edit.request.model.js +1 -1
- package/src/saas/internal-api/requests/utils.js +8 -0
- package/src/saas/internal-api/users/api/users.api.js +2 -3
- package/src/saas/internal-api/users/api/users.service.js +2 -2
- package/src/saas/openapi/requests/index.js +6 -0
- package/src/saas/openapi/{contractors/models/invite.contractor.model.js → requests/models/invite.request.model.js} +2 -2
- package/src/saas/openapi/requests/requests.api.js +20 -0
- package/src/saas/openapi/requests/requests.service.js +18 -0
- package/src/saas/internal-api/requests/models/validation.models.js +0 -8
- package/src/saas/openapi/contractors/contractors.api.js +0 -20
- package/src/saas/openapi/contractors/contractors.service.js +0 -18
- package/src/saas/openapi/contractors/index.js +0 -6
package/package.json
CHANGED
|
@@ -31,6 +31,30 @@ const updateInviteDate = async function(recordId, inviteDate, context) {
|
|
|
31
31
|
await timeUtils.waitFor(2.5).seconds; // calls for the same records can override each other
|
|
32
32
|
};
|
|
33
33
|
|
|
34
|
+
const runOverAllRenewalDatesForRecord = async function(recordId, policyName) {
|
|
35
|
+
const dates = timeUtils.getAutomaticRenewalsExpirationDates();
|
|
36
|
+
|
|
37
|
+
for (const date of dates) {
|
|
38
|
+
await updatePolicyExpiryDateForRecord(recordId, date, policyName);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const updatePolicyExpiryDateForRecord = async function(recordId, expiryDate, policyName) {
|
|
43
|
+
const updateResponse = await contractors.services.updateExpiryDate(recordId, expiryDate, policyName);
|
|
44
|
+
|
|
45
|
+
if (updateResponse.status !== httpResponseStatusCodes.NO_CONTENT) {
|
|
46
|
+
throw new Error('Record expiry date could not be updated', updateResponse);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const threadSchedulerResponse = await threadScheduler.runThreadScheduler({ contractorIds: [recordId] });
|
|
50
|
+
|
|
51
|
+
if (threadSchedulerResponse.status !== httpResponseStatusCodes.OK) {
|
|
52
|
+
throw new Error('Thread scheduler has failed to run', threadSchedulerResponse);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
await timeUtils.waitFor(2.5).seconds; // calls for the same records can override each other
|
|
56
|
+
};
|
|
57
|
+
|
|
34
58
|
const getHistoryEvents = async function(recordId, context) {
|
|
35
59
|
const recordHistory = await contractors.services.getRecordHistory(recordId, context);
|
|
36
60
|
expect(recordHistory.status, 'Expected record history response status to equal 200.').to.equal(httpResponseStatusCodes.OK);
|
|
@@ -40,6 +64,8 @@ const getHistoryEvents = async function(recordId, context) {
|
|
|
40
64
|
|
|
41
65
|
module.exports = {
|
|
42
66
|
makeRecordNotResponsive,
|
|
67
|
+
runOverAllRenewalDatesForRecord,
|
|
43
68
|
updateInviteDate,
|
|
69
|
+
updatePolicyExpiryDateForRecord,
|
|
44
70
|
getHistoryEvents
|
|
45
71
|
};
|
|
@@ -115,6 +115,19 @@ const getInvitationDatesForNotResponsiveTenant = function() {
|
|
|
115
115
|
return [fiveDaysAgoUtc, tenDaysAgoUtc, fifteenDaysAgoUtc];
|
|
116
116
|
};
|
|
117
117
|
|
|
118
|
+
const isDateAfterOther = (date, other) => {
|
|
119
|
+
return moment(date).isAfter(other);
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
const getAutomaticRenewalsExpirationDates = function() {
|
|
123
|
+
const inTwentyNineDaysUtc = getDateinTwentyNineDays();
|
|
124
|
+
const inThirteenDaysUtc = getDateinThirteenDays();
|
|
125
|
+
const inSixDaysUtc = getDateinSixDays();
|
|
126
|
+
const todayUtc = getCurrentDate();
|
|
127
|
+
|
|
128
|
+
return [inTwentyNineDaysUtc, inThirteenDaysUtc, inSixDaysUtc, todayUtc];
|
|
129
|
+
};
|
|
130
|
+
|
|
118
131
|
module.exports = {
|
|
119
132
|
formats,
|
|
120
133
|
getOneYearAgoDate,
|
|
@@ -134,6 +147,7 @@ module.exports = {
|
|
|
134
147
|
getDateinTwentyNineDays,
|
|
135
148
|
getInvitationDatesForNotResponsiveVendor,
|
|
136
149
|
getInvitationDatesForNotResponsiveTenant,
|
|
150
|
+
getAutomaticRenewalsExpirationDates,
|
|
137
151
|
getLogTimestamp,
|
|
138
152
|
getCurrentFormattedDate,
|
|
139
153
|
getAuditDateFormat,
|
|
@@ -143,5 +157,6 @@ module.exports = {
|
|
|
143
157
|
getDayInMilliseconds,
|
|
144
158
|
extractDateFromDateTime,
|
|
145
159
|
getPreviousDateByDays,
|
|
146
|
-
waitFor
|
|
160
|
+
waitFor,
|
|
161
|
+
isDateAfterOther
|
|
147
162
|
};
|
package/src/index.js
CHANGED
|
@@ -31,6 +31,7 @@ const getInternalAPI = () => {
|
|
|
31
31
|
const serviceArea = require('./saas/internal-api/serviceArea');
|
|
32
32
|
|
|
33
33
|
const threadScheduler = require('./saas/internal-api/thread-scheduler/runner');
|
|
34
|
+
const dbEmails = require('./saas/internal-api/dbEmails/index');
|
|
34
35
|
|
|
35
36
|
const internalAPI = {
|
|
36
37
|
auth,
|
|
@@ -48,7 +49,8 @@ const getInternalAPI = () => {
|
|
|
48
49
|
globalRecord,
|
|
49
50
|
vendorProfile,
|
|
50
51
|
serviceArea,
|
|
51
|
-
threadScheduler
|
|
52
|
+
threadScheduler,
|
|
53
|
+
dbEmails
|
|
52
54
|
};
|
|
53
55
|
|
|
54
56
|
return internalAPI;
|
|
@@ -57,10 +59,10 @@ const getInternalAPI = () => {
|
|
|
57
59
|
const getOpenAPI = () => {
|
|
58
60
|
const accounts = require('./saas/openapi/accounts/accounts.service');
|
|
59
61
|
const tabs = require('./saas/openapi/tabs/tabs.service');
|
|
60
|
-
const
|
|
62
|
+
const requests = require('./saas/openapi/requests');
|
|
61
63
|
const projects = require('./saas/openapi/projects/projects.service');
|
|
62
64
|
const requirements = require('./saas/openapi/requirements');
|
|
63
|
-
const openAPI = { accounts, tabs,
|
|
65
|
+
const openAPI = { accounts, tabs, requests, projects, requirements };
|
|
64
66
|
return openAPI;
|
|
65
67
|
};
|
|
66
68
|
|
|
@@ -19,7 +19,6 @@ const Endpoints = {
|
|
|
19
19
|
changeRequirement: `${backendUrl}/saas/contractor/requirement`,
|
|
20
20
|
updateVendorExpiryDate: contractorId => `${backendUrl}/_saas/automation/contractor/${contractorId}/expiry-date`,
|
|
21
21
|
updateContractorInviteDate: contractorId => `${backendUrl}/_saas/automation/contractor/${contractorId}/invite-date`,
|
|
22
|
-
assignMptToProperties: (accountId, tenantId) => `${backendUrl}/saas/account/${accountId}/multi-properties/${tenantId}`,
|
|
23
22
|
searchInAutocomplete: ({ tabId, searchWord }) =>
|
|
24
23
|
`${backendUrl}/saas/contractors/search/audited?&tabId=${tabId}&searchWord=${searchWord}`,
|
|
25
24
|
automationUpdateContractorUploadDate: contractorId => `${backendUrl}/saas/automation/contractor/${contractorId}/upload-date`,
|
|
@@ -85,7 +84,8 @@ const requestNewCoiExpired = (recordModifyDateVerificationModel, context) => {
|
|
|
85
84
|
};
|
|
86
85
|
|
|
87
86
|
const resendInvitation = (recordModifyDateVerificationModel, context) => {
|
|
88
|
-
|
|
87
|
+
const recordId = recordModifyDateVerificationModel.contractorId;
|
|
88
|
+
return requests.postRequestHandler(Endpoints.resendInvitation(recordId), recordModifyDateVerificationModel, context);
|
|
89
89
|
};
|
|
90
90
|
|
|
91
91
|
const updateExpiryDate = (contractorId, expiryDate, policyName) => {
|
|
@@ -98,17 +98,6 @@ const updateInviteDate = (contractorId, inviteDate, context) => {
|
|
|
98
98
|
return requests.postRequestHandler(Endpoints.updateContractorInviteDate(contractorId), data, context);
|
|
99
99
|
};
|
|
100
100
|
|
|
101
|
-
const assignMptToProperties = (assignToMptModel, context) => {
|
|
102
|
-
const params = { updateInfoUser: 'EditVendor' };
|
|
103
|
-
return requests.postRequestHandler(
|
|
104
|
-
Endpoints.assignMptToProperties(assignToMptModel.accountId, assignToMptModel.tenantId),
|
|
105
|
-
assignToMptModel.properties,
|
|
106
|
-
context,
|
|
107
|
-
{},
|
|
108
|
-
params
|
|
109
|
-
);
|
|
110
|
-
};
|
|
111
|
-
|
|
112
101
|
const getContractorsByTabId = async (tabId, context, activityStatus) => {
|
|
113
102
|
const body = { tabId, activityStatus };
|
|
114
103
|
const response = await requests.postRequestHandler(Endpoints.get, body, context);
|
|
@@ -145,7 +134,6 @@ module.exports = {
|
|
|
145
134
|
editContractor,
|
|
146
135
|
updateInviteDate,
|
|
147
136
|
updateExpiryDate,
|
|
148
|
-
assignMptToProperties,
|
|
149
137
|
getContractorsByTabId,
|
|
150
138
|
searchInAutocomplete,
|
|
151
139
|
updateContractorUploadDate,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
const contractorsAPI = require('./contractors.api');
|
|
2
2
|
const { CreateContractorModel } = require('../models/create.contractor.model');
|
|
3
|
-
const { MptModel } = require('../models/edit.contractor.model');
|
|
4
3
|
const { RequestModel } = require('../../requests/models/edit.request.model');
|
|
5
4
|
const { validateType } = require('../../../../common/validations/typeValidations');
|
|
6
5
|
const { RecordModifyDateVerificationModel } = require('../models/verification.contractor.model');
|
|
@@ -56,11 +55,6 @@ const getContractorsByTabId = (tabId, context, activityStatus = 'ACTIVE') => {
|
|
|
56
55
|
return contractorsAPI.getContractorsByTabId(tabId, context, activityStatus);
|
|
57
56
|
};
|
|
58
57
|
|
|
59
|
-
const assignMptToProperties = (assignToMptModel, context) => {
|
|
60
|
-
validateType(assignToMptModel, MptModel);
|
|
61
|
-
return contractorsAPI.assignMptToProperties(assignToMptModel, context);
|
|
62
|
-
};
|
|
63
|
-
|
|
64
58
|
const searchInAutoComplete = ({ tabId, searchWord }, context) => {
|
|
65
59
|
return contractorsAPI.searchInAutocomplete({ tabId, searchWord }, context);
|
|
66
60
|
};
|
|
@@ -123,7 +117,6 @@ module.exports = {
|
|
|
123
117
|
updateInviteDate,
|
|
124
118
|
updateExpiryDate,
|
|
125
119
|
getContractorsByTabId,
|
|
126
|
-
assignMptToProperties,
|
|
127
120
|
searchInAutoComplete,
|
|
128
121
|
updateContractorUploadDate,
|
|
129
122
|
inviteContractorViaPublicLink,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const { validateType } = require('../../../../common/validations/typeValidations');
|
|
2
2
|
|
|
3
|
-
function CreateContractorModel(requirementId, inviterEmail, vendorInfo, { tabId = null,
|
|
3
|
+
function CreateContractorModel(requirementId, inviterEmail, vendorInfo, { tabId = null, sendMail = false, publicLink } = {}) {
|
|
4
4
|
this.reqId = requirementId;
|
|
5
5
|
this.inviterEmail = inviterEmail;
|
|
6
6
|
this.vendorInfo = vendorInfo;
|
|
7
|
-
this.disableMail =
|
|
7
|
+
this.disableMail = !sendMail;
|
|
8
8
|
this.tabId = tabId;
|
|
9
9
|
this.publicLink = publicLink;
|
|
10
10
|
|
|
@@ -54,16 +54,7 @@ class ContractorDetailsModel {
|
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
class MptModel {
|
|
58
|
-
constructor(accountId, tenantId, properties) {
|
|
59
|
-
this.accountId = accountId;
|
|
60
|
-
this.tenantId = tenantId;
|
|
61
|
-
this.properties = properties;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
57
|
module.exports = {
|
|
66
58
|
ContractorModel,
|
|
67
|
-
ContractorDetailsModel
|
|
68
|
-
MptModel
|
|
59
|
+
ContractorDetailsModel
|
|
69
60
|
};
|
|
@@ -11,7 +11,7 @@ const getAllMessages = emailModel => {
|
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
const deleteMultipleMessages = emailIds => {
|
|
14
|
-
return requests.deleteRequestHandler(Endpoints.dbEmails, {
|
|
14
|
+
return requests.deleteRequestHandler(Endpoints.dbEmails, {}, {}, emailIds);
|
|
15
15
|
};
|
|
16
16
|
|
|
17
17
|
const deleteAllMessages = () => {
|
|
@@ -1,19 +1,127 @@
|
|
|
1
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';
|
|
2
8
|
|
|
3
9
|
const getAllMessages = emailModel => {
|
|
4
|
-
return dbEmailsApi.
|
|
10
|
+
return dbEmailsApi.getAllMessages(emailModel);
|
|
5
11
|
};
|
|
6
12
|
|
|
7
13
|
const deleteMultipleMessages = emailIds => {
|
|
8
|
-
return dbEmailsApi.
|
|
14
|
+
return dbEmailsApi.deleteMultipleMessages(emailIds);
|
|
9
15
|
};
|
|
10
16
|
|
|
11
17
|
const deleteAllMessages = () => {
|
|
12
|
-
return dbEmailsApi.
|
|
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', 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}`, response);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return newestResult;
|
|
13
118
|
};
|
|
14
119
|
|
|
15
120
|
module.exports = {
|
|
121
|
+
util,
|
|
122
|
+
|
|
16
123
|
getAllMessages,
|
|
124
|
+
getLastMessage,
|
|
17
125
|
deleteMultipleMessages,
|
|
18
126
|
deleteAllMessages
|
|
19
127
|
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const compareUnorderedArrays = (arr, other, { caseSensitive = true } = {}) => {
|
|
2
|
+
const isEachElementEqual = arr.sort().every((mail, i) => {
|
|
3
|
+
if (caseSensitive) {
|
|
4
|
+
return mail === other.sort()[i];
|
|
5
|
+
} else {
|
|
6
|
+
return mail.toLowerCase() === other.sort()[i].toLowerCase();
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
return arr.length === other.length && isEachElementEqual;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const recipientsMatchVerification = (expectedRecipients, actualRecipients) => {
|
|
13
|
+
const caseSensitive = false;
|
|
14
|
+
|
|
15
|
+
return expectedRecipients.from.includes(actualRecipients.from) && // For some emails can be few sendor options (ex: branded emails)
|
|
16
|
+
compareUnorderedArrays(actualRecipients.to, expectedRecipients.to, { caseSensitive }) &&
|
|
17
|
+
compareUnorderedArrays(actualRecipients.cc, expectedRecipients.cc, { caseSensitive });
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const regexVerification = (message, regex, { returnType } = {}) => {
|
|
21
|
+
const capturingGroupsArr = message.match(regex);
|
|
22
|
+
|
|
23
|
+
if (!capturingGroupsArr || capturingGroupsArr.length < 1) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const capturingGroups = capturingGroupsArr[capturingGroupsArr.length - 1];
|
|
28
|
+
|
|
29
|
+
if (!capturingGroups || capturingGroups.length < 2) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
switch (returnType) {
|
|
34
|
+
case 'url':
|
|
35
|
+
return typeof capturingGroups === 'string' ? capturingGroups : capturingGroups[capturingGroups.length - 1];
|
|
36
|
+
case 'body':
|
|
37
|
+
return message;
|
|
38
|
+
default:
|
|
39
|
+
return 'Bad "returnType" argument';
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const extractEmailFromNameAndEmailFormat = str => {
|
|
44
|
+
// In case the format is 'First Last <username@domain.com>' we will return username@domain.com only
|
|
45
|
+
return str.split('<').pop().split('>')[0];
|
|
46
|
+
};
|
|
47
|
+
const logRetrievedEmailInfo = (to, subject, { cc } = {}) => {
|
|
48
|
+
let log = 'The following email retrieved and will be sent to trash:';
|
|
49
|
+
log += `\n| To: ${to}`;
|
|
50
|
+
cc ? log += `\n| Cc: ${cc}` : '';
|
|
51
|
+
log += `\n| Subject: ${subject}`;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
module.exports = {
|
|
55
|
+
recipientsMatchVerification,
|
|
56
|
+
regexVerification,
|
|
57
|
+
extractEmailFromNameAndEmailFormat,
|
|
58
|
+
logRetrievedEmailInfo
|
|
59
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const { validateType } = require('../../../../common/validations/typeValidations');
|
|
2
|
-
const { validateContractorModel } = require('../
|
|
2
|
+
const { validateContractorModel } = require('../utils');
|
|
3
3
|
|
|
4
4
|
class RequestModel {
|
|
5
5
|
constructor(id, record, tabModel, tenantRequest) {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const { validateType } = require('../../../common/validations/typeValidations');
|
|
2
|
+
const { ContractorModel } = require('../contractors/models/edit.contractor.model');
|
|
3
|
+
|
|
4
|
+
function validateContractorModel(record) {
|
|
5
|
+
validateType(record, ContractorModel);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
module.exports = { validateContractorModel };
|
|
@@ -16,9 +16,8 @@ const Endpoints = {
|
|
|
16
16
|
removeAllUserTraceFromDb: userId => `${backendUrl}/saas/user/automation/${userId}`
|
|
17
17
|
};
|
|
18
18
|
|
|
19
|
-
const invite = (invitedUser, context) => {
|
|
20
|
-
|
|
21
|
-
return requests.putRequestHandler(Endpoints.invite, invitedUser, context, {}, params);
|
|
19
|
+
const invite = (invitedUser, context, { disableSendMail = true } = {}) => {
|
|
20
|
+
return requests.putRequestHandler(Endpoints.invite, invitedUser, context, {}, { disableSendMail });
|
|
22
21
|
};
|
|
23
22
|
|
|
24
23
|
const signupUser = (signupUserModel, context) => {
|
|
@@ -6,8 +6,8 @@ const userAPI = require('./users.api');
|
|
|
6
6
|
const util = require('../utils/util');
|
|
7
7
|
const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
|
|
8
8
|
|
|
9
|
-
const inviteUser = async (invitedUser, context) => {
|
|
10
|
-
return userAPI.invite(invitedUser, context);
|
|
9
|
+
const inviteUser = async (invitedUser, context, { disableSendMail } = {}) => {
|
|
10
|
+
return userAPI.invite(invitedUser, context, { disableSendMail });
|
|
11
11
|
};
|
|
12
12
|
|
|
13
13
|
const signupUser = (signupUserModel, context) => {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const requests = require('../../../common/requests/apiKeyAuth/requests');
|
|
2
|
+
const { openapiUrl } = require('../../../env').getEnv();
|
|
3
|
+
const { isLocalhost } = require('../../../env');
|
|
4
|
+
|
|
5
|
+
const contractorUrl = isLocalhost() ? 'contractors' : 'records';
|
|
6
|
+
|
|
7
|
+
const Endpoints = {
|
|
8
|
+
getAllRequests: `${openapiUrl}/${contractorUrl}/all`,
|
|
9
|
+
inviteRequest: tabId => `${openapiUrl}/tabs/${tabId}/${contractorUrl}`
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const getAllRequests = async (apiKey, params) => {
|
|
13
|
+
return requests.getRequestHandler(Endpoints.getAllRequests, apiKey, params).then(res => res.data);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const inviteRequest = async (apiKey, tabId, params) => {
|
|
17
|
+
return requests.postRequestHandler(Endpoints.inviteRequest(tabId), apiKey, params).then(res => res.data);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
module.exports = { getAllRequests, inviteRequest };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const requestsApi = require('./requests.api');
|
|
2
|
+
const { InviteRequestModel } = require('./models/invite.request.model');
|
|
3
|
+
const { validateType } = require('../../../common/validations/typeValidations');
|
|
4
|
+
|
|
5
|
+
const getAllAccountRequests = async (apiKey, { projectId, type, activationStatuses } = {}) => {
|
|
6
|
+
if (activationStatuses) {
|
|
7
|
+
activationStatuses = activationStatuses.reduce((f, s) => `${f},${s}`);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return requestsApi.getAllRequests(apiKey, { propertyId: projectId, type, activationStatuses });
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const inviteRequest = async (apiKey, tabId, inviteRequestModel = {}) => {
|
|
14
|
+
validateType(inviteRequestModel, InviteRequestModel);
|
|
15
|
+
return requestsApi.inviteRequest(apiKey, tabId, inviteRequestModel);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
module.exports = { getAllAccountRequests, inviteRequest };
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
const { validateType } = require('../../../../common/validations/typeValidations');
|
|
2
|
-
const { ContractorModel } = require('../../contractors/models/edit.contractor.model');
|
|
3
|
-
|
|
4
|
-
function validateContractorModel(record) {
|
|
5
|
-
validateType(record, ContractorModel);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
module.exports = { validateContractorModel };
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
const requests = require('../../../common/requests/apiKeyAuth/requests');
|
|
2
|
-
const { openapiUrl } = require('../../../env').getEnv();
|
|
3
|
-
const { isLocalhost } = require('../../../env');
|
|
4
|
-
|
|
5
|
-
const contractorUrl = isLocalhost() ? 'contractors' : 'records';
|
|
6
|
-
|
|
7
|
-
const Endpoints = {
|
|
8
|
-
getAllContractors: `${openapiUrl}/${contractorUrl}/all`,
|
|
9
|
-
inviteContractor: tabId => `${openapiUrl}/tabs/${tabId}/${contractorUrl}`
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
const getAllContractors = async (apiKey, params) => {
|
|
13
|
-
return requests.getRequestHandler(Endpoints.getAllContractors, apiKey, params).then(res => res.data);
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const inviteContractor = async (apiKey, tabId, params) => {
|
|
17
|
-
return requests.postRequestHandler(Endpoints.inviteContractor(tabId), apiKey, params).then(res => res.data);
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
module.exports = { getAllContractors, inviteContractor };
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
const contractorsApi = require('./contractors.api');
|
|
2
|
-
const { InviteContractorModel } = require('./models/invite.contractor.model');
|
|
3
|
-
const { validateType } = require('../../../common/validations/typeValidations');
|
|
4
|
-
|
|
5
|
-
const getContractors = async (apiKey, { projectId, type, activationStatuses } = {}) => {
|
|
6
|
-
if (activationStatuses) {
|
|
7
|
-
activationStatuses = activationStatuses.reduce((f, s) => `${f},${s}`);
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
return contractorsApi.getAllContractors(apiKey, { propertyId: projectId, type, activationStatuses });
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
const inviteContractor = async (apiKey, tabId, inviteContractorModel = {}) => {
|
|
14
|
-
validateType(inviteContractorModel, InviteContractorModel);
|
|
15
|
-
return contractorsApi.inviteContractor(apiKey, tabId, inviteContractorModel);
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
module.exports = { getContractors, inviteContractor };
|