@getjones/test-infra 2.13.1 → 2.14.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/consts/activationStatuses.js +6 -0
- package/src/common/consts/projectSettings.js +6 -0
- package/src/common/errorCodes.js +3 -0
- package/src/defaults/configs/polices.js +4 -0
- package/src/factory/records/records.js +37 -1
- package/src/saas/internal-api/accounts/api/emailCustomization/accounts.email.customizations.api.js +29 -0
- package/src/saas/internal-api/accounts/api/emailCustomization/accounts.email.customizations.service.js +61 -0
- package/src/saas/internal-api/accounts/index.js +3 -1
- package/src/saas/internal-api/requests/api/requests.api.js +12 -0
- package/src/saas/internal-api/requests/api/requests.service.js +57 -2
- package/src/saas/internal-api/requests/models/draft.request.report.model.js +14 -0
- package/src/saas/internal-api/users/api/tenantApp/tenant.app.service.js +6 -2
package/package.json
CHANGED
|
@@ -41,6 +41,10 @@ const attributeNames = {
|
|
|
41
41
|
perLocation: 'Per Location',
|
|
42
42
|
eachOccurrence: 'Each Occurrence',
|
|
43
43
|
generalAggregate: 'General Aggregate',
|
|
44
|
+
noticeOfCancelation: 'Notice of Cancellation',
|
|
45
|
+
noticeOfCancelationEndorsement: 'Notice of Cancellation Endorsement',
|
|
46
|
+
occurrenceBasis: 'Occurrence Basis',
|
|
47
|
+
perProjectAggregate: 'Per Project Aggregate',
|
|
44
48
|
occur: 'Occur',
|
|
45
49
|
text: 'text',
|
|
46
50
|
limit: 'limit',
|
|
@@ -11,6 +11,7 @@ const requests = require('../../saas/internal-api/requests');
|
|
|
11
11
|
|
|
12
12
|
const { complianceStatuses, getAuditConfigByStatus } = require('../../common/utils/complianceUtil');
|
|
13
13
|
const httpResponseStatusCodes = require('../../common/httpResponseStatusCodes.json');
|
|
14
|
+
const activationStatuses = require('../../common/consts/activationStatuses');
|
|
14
15
|
const timeUtils = require('../../common/utils/timeUtils');
|
|
15
16
|
|
|
16
17
|
const filePath = path.join(__dirname, '../../resources/coi/coi.pdf');
|
|
@@ -135,6 +136,40 @@ const prepareAwaitingNewCoiRecord = async (recordCompany, recordEmail, tabId, re
|
|
|
135
136
|
const prepareUnderReviewRecord = (recordCompany, recordEmail, tabId, requirementId, context, { recordConfig } = {}) => {
|
|
136
137
|
return prepareRecord(recordCompany, recordEmail, complianceStatuses.underReview, tabId, requirementId, context, { recordConfig });
|
|
137
138
|
};
|
|
139
|
+
const prepareDraftRecord = async (recordCompany, tabId, context, { recordEmail, requirementId, uploadCoi } = {}) => {
|
|
140
|
+
const requestData = await requests.services.getOrCreateRequest(
|
|
141
|
+
context,
|
|
142
|
+
tabId,
|
|
143
|
+
requirementId,
|
|
144
|
+
{
|
|
145
|
+
inviterEmail: credentials.superUser,
|
|
146
|
+
email: recordEmail,
|
|
147
|
+
companyName: recordCompany
|
|
148
|
+
},
|
|
149
|
+
activationStatuses.DRAFT
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
if (!(requestData && requestData.id)) {
|
|
153
|
+
throw Error(`Failed to create record ${recordCompany}\n${requestData}`);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (uploadCoi) {
|
|
157
|
+
const recordId = requestData.record.contractorId;
|
|
158
|
+
|
|
159
|
+
const coiUpload = await coi.utils.uploadCoi(
|
|
160
|
+
recordId,
|
|
161
|
+
filePath,
|
|
162
|
+
uploaderType = coi.consts.UPLOADER_TYPES.ICS,
|
|
163
|
+
uploaderEmail = credentials.superUser
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
if (!(coiUpload && coiUpload.name)) {
|
|
167
|
+
throw Error(`Failed to upload COI for record ${recordCompany}\n${coiUpload}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return requestData;
|
|
172
|
+
};
|
|
138
173
|
|
|
139
174
|
module.exports = {
|
|
140
175
|
prepareCompliantRecord,
|
|
@@ -143,5 +178,6 @@ module.exports = {
|
|
|
143
178
|
prepareWaivedRecord,
|
|
144
179
|
prepareAboutToExpiredRecord,
|
|
145
180
|
prepareAwaitingNewCoiRecord,
|
|
146
|
-
prepareUnderReviewRecord
|
|
181
|
+
prepareUnderReviewRecord,
|
|
182
|
+
prepareDraftRecord
|
|
147
183
|
};
|
package/src/saas/internal-api/accounts/api/emailCustomization/accounts.email.customizations.api.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const requests = require('../../../../../common/requests/cookieAuth/requests');
|
|
2
|
+
const internalRequests = require('../../../../../common/requests/internalAuth/requests');
|
|
3
|
+
|
|
4
|
+
const { backendUrl } = require('../../../../../env').getEnv();
|
|
5
|
+
|
|
6
|
+
const Endpoints = {
|
|
7
|
+
getCobranding: accountId => `${backendUrl}/saas/cobranding/fetch?accountId=${accountId}`,
|
|
8
|
+
deleteCobranding: accountId => `${backendUrl}/saas/cobranding/archive?accountId=${accountId}`,
|
|
9
|
+
publishCobranding: `${backendUrl}/saas/cobranding/publish`,
|
|
10
|
+
getAccountsByCobrandingEmail: email => `${backendUrl}/jcsc/account/from-email/${email}`
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const getCobranding = (accountId, context) => {
|
|
14
|
+
return requests.getRequestHandler(Endpoints.getCobranding(accountId), {}, context);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const deleteCobranding = (accountId, context) => {
|
|
18
|
+
return requests.deleteRequestHandler(Endpoints.deleteCobranding(accountId), context);
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
const publishCobranding = (formData, context) => {
|
|
22
|
+
return requests.postRequestHandler(Endpoints.publishCobranding, formData, context, formData.getHeaders());
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const getAccountsByCobrandingEmail = email => {
|
|
26
|
+
return internalRequests.getRequestHandler(Endpoints.getAccountsByCobrandingEmail(email), {});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
module.exports = { getCobranding, deleteCobranding, publishCobranding, getAccountsByCobrandingEmail };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const FormData = require('form-data');
|
|
2
|
+
|
|
3
|
+
const emailCustomizationsAPI = require('./accounts.email.customizations.api');
|
|
4
|
+
const httpResponseStatusCodes = require('../../../../../common/httpResponseStatusCodes.json');
|
|
5
|
+
|
|
6
|
+
const getCobranding = async (accountId, context) => {
|
|
7
|
+
const response = await emailCustomizationsAPI.getCobranding(accountId, context);
|
|
8
|
+
|
|
9
|
+
if (response.status !== httpResponseStatusCodes.OK) {
|
|
10
|
+
throw Error(`Failed to get cobranding by account id: ${accountId} - Response: ${response.status}`);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return response.data;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const deleteCobranding = async (accountId, context) => {
|
|
17
|
+
const response = await emailCustomizationsAPI.deleteCobranding(accountId, context);
|
|
18
|
+
|
|
19
|
+
if (response.status !== httpResponseStatusCodes.OK) {
|
|
20
|
+
throw Error(`Failed to delete cobranding by account id: ${accountId} - Response: ${response.status}`);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return response.data;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const publishCobranding = async (publishCobrandingModel, context) => {
|
|
27
|
+
const publishCobrandingStr = JSON.stringify(publishCobrandingModel);
|
|
28
|
+
|
|
29
|
+
const formData = new FormData();
|
|
30
|
+
// File names are passed as empty so the integration tests won't need to start handle files
|
|
31
|
+
// In this case the backend just take the file name from the cobrandingData object
|
|
32
|
+
// and doesn't check against S3. This will work as long as we won't check the content of the cobranded
|
|
33
|
+
// emails themselves as there there won't be images.
|
|
34
|
+
formData.append('file', '');
|
|
35
|
+
formData.append('coBrandingData', publishCobrandingStr) ;
|
|
36
|
+
|
|
37
|
+
const response = await emailCustomizationsAPI.publishCobranding(formData, context);
|
|
38
|
+
|
|
39
|
+
if (response.status !== httpResponseStatusCodes.OK) {
|
|
40
|
+
throw Error(`Failed to publish cobranding with from email: ${publishCobrandingModel.fromEmailAddress} - Response: ${response.status}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return response.data;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const getAccountsByCobrandingEmail = async email => {
|
|
47
|
+
const response = await emailCustomizationsAPI.getAccountsByCobrandingEmail(email);
|
|
48
|
+
|
|
49
|
+
if (response.status !== httpResponseStatusCodes.OK) {
|
|
50
|
+
throw Error(`Failed to get account ids by email: ${email} - Response: ${response.status}`);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return response.data;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
module.exports = {
|
|
57
|
+
getCobranding,
|
|
58
|
+
deleteCobranding,
|
|
59
|
+
publishCobranding,
|
|
60
|
+
getAccountsByCobrandingEmail
|
|
61
|
+
};
|
|
@@ -10,11 +10,13 @@ const consts = require('./consts/consts');
|
|
|
10
10
|
const coreService = require('./api/core/accounts.core.service');
|
|
11
11
|
const openApiServices = require('./api/openapi/accounts.openapi.service');
|
|
12
12
|
const settingsServices = require('./api/settings/settings.service');
|
|
13
|
+
const emailCustomizationService = require('./api/emailCustomization/accounts.email.customizations.service');
|
|
13
14
|
|
|
14
15
|
const services = {
|
|
15
16
|
core: coreService,
|
|
16
17
|
openApi: openApiServices,
|
|
17
|
-
settings: settingsServices
|
|
18
|
+
settings: settingsServices,
|
|
19
|
+
emailCustomizations: emailCustomizationService
|
|
18
20
|
};
|
|
19
21
|
|
|
20
22
|
module.exports = { services, models, utils, consts };
|
|
@@ -6,6 +6,8 @@ const Endpoints = {
|
|
|
6
6
|
addRequestToRecord: (recordId, tabId) => `${backendUrl}/saas/${tabId}/request/${recordId}`,
|
|
7
7
|
publicLinkInvite: `${backendUrl}/_saas/requests/publicinvite`,
|
|
8
8
|
edit: contractorId => `${backendUrl}/saas/requests/${contractorId}/update`,
|
|
9
|
+
saveDraftRequest: `${backendUrl}/saas/requests/draft/save`,
|
|
10
|
+
activateDraftRequest: `${backendUrl}/saas/requests/draft/activate`,
|
|
9
11
|
getById: requestId => `${backendUrl}/saas/request/${requestId}`,
|
|
10
12
|
getAccountRequests: accountId => `${backendUrl}/saas/requests/${accountId}`,
|
|
11
13
|
getByTabId: `${backendUrl}/saas/requests`,
|
|
@@ -34,6 +36,14 @@ const editRequestAndRecordDetails = (editRequestModel, context) => {
|
|
|
34
36
|
return requests.postRequestHandler(Endpoints.edit(contractorId), editRequestModel, context, {}, params);
|
|
35
37
|
};
|
|
36
38
|
|
|
39
|
+
const saveDraftRequest = (draftRequestReportModel, context) => {
|
|
40
|
+
return requests.postRequestHandler(Endpoints.saveDraftRequest, draftRequestReportModel, context);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const activateDraftRequest = (draftRequestReportModel, context) => {
|
|
44
|
+
return requests.postRequestHandler(Endpoints.activateDraftRequest, draftRequestReportModel, context);
|
|
45
|
+
};
|
|
46
|
+
|
|
37
47
|
const getRequestById = (requestId, context) => {
|
|
38
48
|
return requests.getRequestHandler(Endpoints.getById(requestId), {}, context);
|
|
39
49
|
};
|
|
@@ -68,6 +78,8 @@ module.exports = {
|
|
|
68
78
|
addRequestToRecord,
|
|
69
79
|
inviteRequestViaPublicLink,
|
|
70
80
|
editRequestAndRecordDetails,
|
|
81
|
+
saveDraftRequest,
|
|
82
|
+
activateDraftRequest,
|
|
71
83
|
getRequestById,
|
|
72
84
|
getRequestsByAccountId,
|
|
73
85
|
getRequestsByTabId,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const requestsAPI = require('./requests.api');
|
|
2
2
|
const { CreateRequestModel, ContractorInfo } = require('../models/create.request.model');
|
|
3
|
+
const { DraftRequestReportModel } = require('../models/draft.request.report.model');
|
|
3
4
|
const { InnerPageRequestCriteriaModel } = require('../models/inner.page.request.criteria.model');
|
|
4
5
|
const { RequestModel } = require('../models/edit.request.model');
|
|
5
6
|
const { validateType } = require('../../../../common/validations/typeValidations');
|
|
@@ -24,6 +25,56 @@ const editRequestAndRecordDetails = (editRequestModel, context) => {
|
|
|
24
25
|
return requestsAPI.editRequestAndRecordDetails(editRequestModel, context);
|
|
25
26
|
};
|
|
26
27
|
|
|
28
|
+
const activateDraftRequest = (draftRequestReportModel, context) => {
|
|
29
|
+
validateType(draftRequestReportModel, DraftRequestReportModel);
|
|
30
|
+
return requestsAPI.activateDraftRequest(draftRequestReportModel, context);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const activateByRequest = async (request, context, { email, requirementId, additionalEmailList, dateModified, overrideDateModified } = {}) => {
|
|
34
|
+
const emailAddress = email || request.record.emailAddress;
|
|
35
|
+
const selectedRequirementsId = requirementId || request.record.requirementId;
|
|
36
|
+
const additionalEmails = additionalEmailList || request.record.additionalEmails;
|
|
37
|
+
const recordDateModified = dateModified || request.record.dateModified;
|
|
38
|
+
|
|
39
|
+
const draftRequestReportModel = new DraftRequestReportModel(
|
|
40
|
+
request.id,
|
|
41
|
+
{
|
|
42
|
+
emailAddress,
|
|
43
|
+
selectedRequirementsId,
|
|
44
|
+
additionalEmails,
|
|
45
|
+
recordDateModified,
|
|
46
|
+
overrideDateModified
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
return activateDraftRequest(draftRequestReportModel, context);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const saveDraftRequest = (draftRequestReportModel, context) => {
|
|
54
|
+
validateType(draftRequestReportModel, DraftRequestReportModel);
|
|
55
|
+
return requestsAPI.saveDraftRequest(draftRequestReportModel, context);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const saveDraftByRequest = async (request, context, { email, requirementId, additionalEmailList, dateModified, overrideDateModified } = {}) => {
|
|
59
|
+
const emailAddress = email || request.record.emailAddress;
|
|
60
|
+
const selectedRequirementsId = requirementId || request.record.requirementId;
|
|
61
|
+
const additionalEmails = additionalEmailList || request.record.additionalEmails;
|
|
62
|
+
const recordDateModified = dateModified || request.record.dateModified;
|
|
63
|
+
|
|
64
|
+
const draftRequestReportModel = new DraftRequestReportModel(
|
|
65
|
+
request.id,
|
|
66
|
+
{
|
|
67
|
+
emailAddress,
|
|
68
|
+
selectedRequirementsId,
|
|
69
|
+
additionalEmails,
|
|
70
|
+
recordDateModified,
|
|
71
|
+
overrideDateModified
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
return saveDraftRequest(draftRequestReportModel, context);
|
|
76
|
+
};
|
|
77
|
+
|
|
27
78
|
const getAutocompleteAutoSelect = async (params, context) => {
|
|
28
79
|
const { companyOrDba, tabId, requirementsId } = params;
|
|
29
80
|
const autoSelectedRequest = await requestsAPI.getAutocompleteAutoSelect({ companyOrDba, tabId, requirementsId }, context);
|
|
@@ -101,8 +152,8 @@ const getTabTenantRequestsInProject = async (projectId, context) => {
|
|
|
101
152
|
return response.data;
|
|
102
153
|
};
|
|
103
154
|
|
|
104
|
-
const getRequestFromTabByRecordId = async (recordId, tabId, context) => {
|
|
105
|
-
const { data: requestsInTab } = await requestsAPI.getRequestsByTabId(tabId, context);
|
|
155
|
+
const getRequestFromTabByRecordId = async (recordId, tabId, context, activationStatus) => {
|
|
156
|
+
const { data: requestsInTab } = await requestsAPI.getRequestsByTabId(tabId, context, activationStatus);
|
|
106
157
|
const request = requestsInTab.find(({ record }) => record.contractorId === recordId);
|
|
107
158
|
|
|
108
159
|
return request;
|
|
@@ -139,6 +190,10 @@ module.exports = {
|
|
|
139
190
|
addRequestToRecord,
|
|
140
191
|
inviteRequestViaPublicLink,
|
|
141
192
|
editRequestAndRecordDetails,
|
|
193
|
+
activateByRequest,
|
|
194
|
+
saveDraftRequest,
|
|
195
|
+
saveDraftByRequest,
|
|
196
|
+
activateDraftRequest,
|
|
142
197
|
getRequestsByTabId,
|
|
143
198
|
getRequestById,
|
|
144
199
|
getRequestsByAccountId,
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
class DraftRequestReportModel {
|
|
2
|
+
constructor(requestId, { emailAddress, selectedRequirementsId, additionalEmails, recordDateModified, overrideDateModified } = {}) {
|
|
3
|
+
this.requestId = requestId;
|
|
4
|
+
this.emailAddress = emailAddress;
|
|
5
|
+
this.selectedRequirementsId = selectedRequirementsId;
|
|
6
|
+
this.additionalEmails = additionalEmails;
|
|
7
|
+
this.recordDateModified = recordDateModified;
|
|
8
|
+
this.overrideDateModified = overrideDateModified;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
module.exports = {
|
|
13
|
+
DraftRequestReportModel
|
|
14
|
+
};
|
|
@@ -41,7 +41,7 @@ const getTenantUserByEmail = async (projectId, email, context) => {
|
|
|
41
41
|
return tenant;
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
const getOrCreateTenantUser = async (projectId, email, company, requestId, context, { fullName = 'Tenant User', password = credentials.strongPassword, toSignUp = true } = {}) => {
|
|
44
|
+
const getOrCreateTenantUser = async (projectId, email, company, requestId, context, { fullName = 'Tenant User', password = credentials.strongPassword, toSignUp = true, expectError } = {}) => {
|
|
45
45
|
let tenantUser = await getTenantUserByEmail(projectId, email, context);
|
|
46
46
|
|
|
47
47
|
if (tenantUser && tenantUser.subuserId && tenantUser.isVerified) {
|
|
@@ -52,7 +52,11 @@ const getOrCreateTenantUser = async (projectId, email, company, requestId, conte
|
|
|
52
52
|
const inviteResponse = await inviteTenantUser(projectId, inviteUserModel, context);
|
|
53
53
|
|
|
54
54
|
if (inviteResponse.status !== httpResponseStatusCodes.OK) {
|
|
55
|
-
|
|
55
|
+
if (expectError) {
|
|
56
|
+
return inviteResponse;
|
|
57
|
+
} else {
|
|
58
|
+
throw new Error(`Failed to invite tenant user with email: ${email}\n${inviteResponse}`);
|
|
59
|
+
}
|
|
56
60
|
}
|
|
57
61
|
|
|
58
62
|
tenantUser = await getTenantUserByEmail(projectId, email, context);
|