@getjones/test-infra 2.8.10 → 2.8.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getjones/test-infra",
3
- "version": "2.8.10",
3
+ "version": "2.8.12",
4
4
  "description": "Providing internal and openapi interface",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -15,6 +15,7 @@
15
15
  "chai": "^4.3.4",
16
16
  "dotenv": "^8.2.0",
17
17
  "enum": "^3.0.4",
18
+ "form-data": "^4.0.0",
18
19
  "mocha": "^8.3.2"
19
20
  },
20
21
  "devDependencies": {
@@ -2,5 +2,7 @@ module.exports = {
2
2
  ICS: 'ICS',
3
3
  PM: 'PM',
4
4
  AUDITOR: 'AUDITOR',
5
- VENDOR: 'Vendor'
5
+ VENDOR: 'Vendor',
6
+ auditor: 'Auditor',
7
+ operator: 'Operator'
6
8
  };
@@ -6,7 +6,7 @@ const DEFAULT_POLICY_DATE = '24/05/2030';
6
6
  const DEFAULT_AM_SCORE = 'A';
7
7
 
8
8
  //Excluded from creating global record: 'ABC-12345-XYZ', 'ABC-123-XYZ', 'ABC-123'. When GR is needed - use different GL number.
9
- const DEFAULT_POLICY_NUMBER = 'ABC-12345-XYZ';
9
+ const DEFAULT_POLICY_NUMBER = 'ABC-12345-XYZ';
10
10
 
11
11
  const {
12
12
  certificateIssueDate,
package/src/index.js CHANGED
@@ -39,6 +39,7 @@ const getInternalAPI = () => {
39
39
  const threadScheduler = require('./saas/internal-api/thread-scheduler/runner');
40
40
  const dbEmails = require('./saas/internal-api/dbEmails/index');
41
41
  const agreement = require('./saas/internal-api/agreement/index');
42
+ const uploadFile = require('./saas/internal-api/uploadFiles/index');
42
43
 
43
44
  const internalAPI = {
44
45
  defaults,
@@ -63,7 +64,8 @@ const getInternalAPI = () => {
63
64
  threadScheduler,
64
65
  dbEmails,
65
66
  factory,
66
- agreement
67
+ agreement,
68
+ uploadFile
67
69
  };
68
70
 
69
71
  return internalAPI;
@@ -1,6 +1,5 @@
1
1
  const CreateAccountModel = require('./models/core/create.account.model');
2
2
  const coreModels = { CreateAccountModel };
3
-
4
3
  const UpdateAccountSettingsModel = require('./models/settings/update.settings.model');
5
4
  const settingsModels = { UpdateAccountSettingsModel };
6
5
 
@@ -4,6 +4,7 @@ const EMAIL_TYPES = {
4
4
  COMPLIANT: 'compliant',
5
5
  NOT_COMPLIANT: 'notCompliant',
6
6
  SEND_GAPS: 'sendGaps',
7
+ SEND_GAPS_TENANT: 'sendGapsForTenant',
7
8
  REQUEST_NEW_COI_EXPIRED: 'requestNewCoiExpired',
8
9
  FIRST_REMINDER: 'firstReminder',
9
10
  SECOND_REMINDER: 'secondReminder',
@@ -20,14 +21,14 @@ const EMAIL_TYPES = {
20
21
 
21
22
  const EMAIL_SUBJECT = {
22
23
  compliant: ({ recordCompanyName }) => `Compliant COI - ${recordCompanyName}`,
24
+ sendGaps: ({ requesterName }) => `New Insurance Docs Required for ${requesterName} - `, //For this email type, guest is the same as vendor
25
+ sendGapsForTenant: ({ requesterName }) => `New Insurance Docs Required for leased space at ${requesterName} - `,
23
26
  notCompliant: ({ recordCompanyName, requesterName }) => `Please Review COI Gaps - ${recordCompanyName} (${requesterName})`,
24
27
  wrongCoi: ({ recordCompanyName, requesterName }) => `Incorrect File Submission - COI Still Required for ${recordCompanyName} - ${requesterName}`,
25
- sendGaps: ({ requesterName }) => `New Insurance Docs Required for ${requesterName}`, //doesn't includes text for guest or tenant
26
28
  sendGapsRecordFullName: ({ requesterName, recordFirstName, recordLastName }) => `New Insurance Docs Required for ${requesterName} - ${recordFirstName} ${recordLastName}`,
27
29
  requestNewCoiExpired: ({ recordCompanyName }) => `${recordCompanyName}'s COI is`,
28
30
  firstReminder: ({ requesterName }) => `We are still awaiting the Insurance Docs for ${requesterName}`,
29
- secondReminder: ({ requesterName }) => `We are still awaiting the Insurance Docs for ${requesterName}`,
30
- secondReminderAccountRequirement: ({ requesterName }) => `${requesterName} still needs your Insurance Docs`,
31
+ secondReminder: ({ requesterName }) => `${requesterName} still needs`,
31
32
  finalReminder: ({ recordCompanyName, requesterName }) => `Missing ${recordCompanyName}'s Insurance Docs for ${requesterName}`,
32
33
  aboutToExpirePM: ({ recordCompanyName }) => `Insurance Policy of ${recordCompanyName} expires Soon`,
33
34
  aboutToExpireMonthAutoRenewal: ({ requesterName }) => `Your COI for ${requesterName} expires in 30 days`,
@@ -37,6 +38,8 @@ const EMAIL_SUBJECT = {
37
38
  sameDayExpirationPMAutoRenewal: ({ recordCompanyName }) => `COI expired for ${recordCompanyName} at`,
38
39
  requirementsUpdatedNotification: ({ requesterName }) => `Updated Requirements - Your Insurance Docs are needed for ${requesterName}`,
39
40
  updatedRequirementsSubjectPrefix: () => 'Updated Requirements - ',
41
+ malwareFileFound: ({ recordCompanyName }) => `File upload failed to pass security scan for ${recordCompanyName}`,
42
+ fraudAuditorReview: ({ recordCompanyName, requesterName }) => `Authentication check for ${recordCompanyName} at ${requesterName}`,
40
43
  requestNewCoi: ({ recordCompanyName, requesterName, isExpired }) => `${recordCompanyName}'s COI is ${isExpired ? 'expired' : 'about to expire'} - ${requesterName}`,
41
44
  malwareCoiFound: 'COI upload failed to pass security scan',
42
45
  thankYou: 'Thank you for submitting your COI'
@@ -0,0 +1,25 @@
1
+ const requests = require('../../../../common/requests/cookieAuth/requests');
2
+ const { backendUrl } = require('../../../../env').getEnv();
3
+
4
+ const Endpoints = {
5
+ getRelatedDocPreSignedUrl: `${backendUrl}/pre-signed-url/upload/document`,
6
+ uploadRelatedDoc: recordId => `${backendUrl}/saas/contractor/${recordId}/document`
7
+ };
8
+
9
+ const getRelatedDocPreSignedUrl = (formData, context) => {
10
+ return requests.postRequestHandler(Endpoints.getRelatedDocPreSignedUrl, formData, context, formData.getHeaders());
11
+ };
12
+
13
+ const uploadFileToS3 = (preSignedUrl, file) => {
14
+ return requests.putRequestHandler(preSignedUrl, file);
15
+ };
16
+
17
+ const uploadRelatedDoc = (recordId, uploadDocumentModel, context) => {
18
+ return requests.postRequestHandler(Endpoints.uploadRelatedDoc(recordId), uploadDocumentModel, context);
19
+ };
20
+
21
+ module.exports = {
22
+ getRelatedDocPreSignedUrl,
23
+ uploadRelatedDoc,
24
+ uploadFileToS3
25
+ };
@@ -0,0 +1,32 @@
1
+ const uploadFileApi = require('./upload.file.api');
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+ const FormData = require('form-data');
5
+ const consts = require('../consts');
6
+
7
+ const { RELATED_DOC_TYPES, S3_FILE_TYPE } = consts;
8
+
9
+ const getRelatedDocPreSignedUrl = (recordId, context, { filePath }) => {
10
+ const formData = new FormData();
11
+ const file = fs.createReadStream(filePath);
12
+ formData.append('recordId', recordId);
13
+ formData.append('fileType', S3_FILE_TYPE.DOCUMENT);
14
+ formData.append('file', file) ;
15
+
16
+ return uploadFileApi.getRelatedDocPreSignedUrl(formData, context);
17
+ };
18
+
19
+ const uploadFileToS3 = (preSignedUrl, filePath) => {
20
+ return uploadFileApi.uploadFileToS3(preSignedUrl, fs.readFileSync(filePath));
21
+ };
22
+
23
+ const uploadRelatedDoc = async (recordId, context, { filePath, type = RELATED_DOC_TYPES.LEASE } = {}) => {
24
+ const { data: { preSignedUrl, fileName: fullFilePath } } = await getRelatedDocPreSignedUrl(recordId, context, { filePath });
25
+ await uploadFileToS3(preSignedUrl, filePath);
26
+ const originalFileName = path.basename(filePath);
27
+ const file = fs.statSync(filePath);
28
+ return uploadFileApi.uploadRelatedDoc(recordId, { name: originalFileName, type, fullFilePath, fileSize: file.size }, context);
29
+ };
30
+ module.exports = {
31
+ uploadRelatedDoc
32
+ };
@@ -0,0 +1,25 @@
1
+ const RELATED_DOC_TYPES = {
2
+ LEASE: 'LEASE',
3
+ W9: 'W9',
4
+ SIGNED_AGREEMENT: 'SIGNED_AGREEMENT',
5
+ WAIVER_APPROVAL: 'WAIVER_APPROVAL',
6
+ POLICIES: 'POLICIES',
7
+ OTHER: 'OTHER'
8
+ };
9
+
10
+ S3_FILE_TYPE = {
11
+ DOCUMENT: 'DOCUMENT',
12
+ REPORTS: 'REPORTS',
13
+ SNIPPET: 'SNIPPET',
14
+ CONTRACT: 'CONTRACT',
15
+ TEMPCOI: 'TEMPCOI',
16
+ COI: 'COI',
17
+ ATTACHMENT: 'ATTACHMENT',
18
+ OCRDATA: 'OCRDATA',
19
+ VENDORREPORT: 'VENDORREPORT'
20
+ };
21
+
22
+ module.exports = {
23
+ RELATED_DOC_TYPES,
24
+ S3_FILE_TYPE
25
+ };
@@ -0,0 +1,3 @@
1
+ const services = require('./api/upload.file.service');
2
+
3
+ module.exports = { services };
@@ -14,7 +14,10 @@ const Endpoints = {
14
14
  getUserEncryptedData: (email, userRole) => `${backendUrl}/saas/team-member/email/${email}/role/${userRole}/signup-data`,
15
15
  signupUser: `${backendUrl}/_saas/guests/signup`,
16
16
  removeAllUserTraceFromDb: userId => `${backendUrl}/saas/user/automation/${userId}`,
17
- userEmailNotificationsSettings: `${backendUrl}/saas/account/notification/set`
17
+ userEmailNotificationsSettings: `${backendUrl}/saas/account/notification/set`,
18
+ sendForgetPasswordMail: `${backendUrl}/_saas/forgotPassword`,
19
+ createInnerSystemUser: `${backendUrl}/saas/superuser/user`,
20
+ getInnerSystemUsersPerRole: `${backendUrl}/saas/users`
18
21
  };
19
22
 
20
23
  const invite = (invitedUser, context, { disableSendMail = true } = {}) => {
@@ -68,6 +71,20 @@ const editUserEmailNotificationsSettings = (userId, notificationSettingsModel, c
68
71
  return requests.postRequestHandler(Endpoints.userEmailNotificationsSettings, notificationSettingsModel, context, {}, params);
69
72
  };
70
73
 
74
+ const createInnerSystemUser = (innerSystemUser, icsContext) => {
75
+ return requests.postRequestHandler(Endpoints.createInnerSystemUser, innerSystemUser, icsContext);
76
+ };
77
+
78
+ const getInnerSystemUsersPerRole = (roles, icsContext) => {
79
+ const params = { roles };
80
+ return requests.getRequestHandler(Endpoints.getInnerSystemUsersPerRole, params, icsContext);
81
+ };
82
+
83
+ const sendForgetPasswordMail = userEmail => {
84
+ const body = { email: userEmail };
85
+ return requests.postRequestHandler(Endpoints.sendForgetPasswordMail, body);
86
+ };
87
+
71
88
  module.exports = {
72
89
  invite,
73
90
  signupUser,
@@ -80,5 +97,8 @@ module.exports = {
80
97
  editUserRole,
81
98
  editUserProjects,
82
99
  reinviteUser,
83
- editUserEmailNotificationsSettings
100
+ editUserEmailNotificationsSettings,
101
+ sendForgetPasswordMail,
102
+ createInnerSystemUser,
103
+ getInnerSystemUsersPerRole
84
104
  };
@@ -6,6 +6,9 @@ const userAPI = require('./users.api');
6
6
  const util = require('../utils/util');
7
7
  const httpResponseStatusCodes = require('../../../../common/httpResponseStatusCodes.json');
8
8
  const { NotificationSettingsModel } = require('../models/notification.settings.model');
9
+ const CreateInnerSystemAccountModel = require('../models/create.inner.system.user.model');
10
+
11
+ const userTypes = require('../../../../common/consts/userTypes');
9
12
 
10
13
  const inviteUser = async (invitedUser, context, { disableSendMail } = {}) => {
11
14
  return userAPI.invite(invitedUser, context, { disableSendMail });
@@ -91,6 +94,52 @@ const editUserEmailNotificationsSettings = (userId, notificationSettingsModel, c
91
94
  return userAPI.editUserEmailNotificationsSettings(userId, notificationSettingsModel, context);
92
95
  };
93
96
 
97
+ const createInnerSystemUser = async (createInnerSystemUserModel, icsContext) => {
98
+ validateType(createInnerSystemUserModel, CreateInnerSystemAccountModel);
99
+ const response = await userAPI.createInnerSystemUser(createInnerSystemUserModel, icsContext);
100
+
101
+ if (response.status !== httpResponseStatusCodes.OK) {
102
+ throw Error(`Create inner system account failed\n${response}`);
103
+ }
104
+
105
+ return response.data;
106
+ };
107
+
108
+ const getInnerSystemUsersPerRole = async icsContext => {
109
+ const roles = `${userTypes.ICS},${userTypes.auditor},${userTypes.operator}`;
110
+ const response = await userAPI.getInnerSystemUsersPerRole(roles, icsContext);
111
+
112
+ if (response.status !== httpResponseStatusCodes.OK) {
113
+ throw Error(`Get inner system accounts failed\n${response}`);
114
+ }
115
+
116
+ return response.data;
117
+ };
118
+
119
+ const getOrCreateInnerSystemUser = async (innerSystemCreateAccountModel, role, icsContext) => {
120
+ const accountEmail = innerSystemCreateAccountModel.email;
121
+ const account = await getInnerSystemUserByEmail(accountEmail, role, icsContext);
122
+
123
+ if (account) {
124
+ return account;
125
+ }
126
+
127
+ await createInnerSystemUser(innerSystemCreateAccountModel, icsContext);
128
+ return getInnerSystemUserByEmail(accountEmail, role, icsContext);
129
+ };
130
+
131
+ const getInnerSystemUserByEmail = async (accountEmail, role, icsContext) => {
132
+ const accountsPerRole = await getInnerSystemUsersPerRole(icsContext);
133
+ const accountsOfRole = accountsPerRole[role];
134
+ const account = accountsOfRole.find(({ email }) => email === accountEmail);
135
+
136
+ return account;
137
+ };
138
+
139
+ const sendForgetPasswordMail = userEmail => {
140
+ return userAPI.sendForgetPasswordMail(userEmail);
141
+ };
142
+
94
143
  module.exports = {
95
144
  inviteUser,
96
145
  signupUser,
@@ -104,5 +153,7 @@ module.exports = {
104
153
  editUserRole,
105
154
  editUserProjects,
106
155
  reinviteUser,
107
- editUserEmailNotificationsSettings
156
+ editUserEmailNotificationsSettings,
157
+ sendForgetPasswordMail,
158
+ getOrCreateInnerSystemUser
108
159
  };
@@ -1,5 +1,7 @@
1
1
  const userModels = require('./models/users.model');
2
2
  const { NotificationSettingsModel } = require('./models/notification.settings.model');
3
+ const CreateInnerSystemUserModel = require('./models/create.inner.system.user.model');
4
+
3
5
  const services = require('./api/users.service');
4
6
  const util = require('./utils/util');
5
7
 
@@ -9,6 +11,6 @@ const tenants = {
9
11
  services: tenantUserService
10
12
  };
11
13
 
12
- const models = { ... userModels, NotificationSettingsModel };
14
+ const models = { ... userModels, NotificationSettingsModel, CreateInnerSystemUserModel };
13
15
 
14
16
  module.exports = { services, models, util, tenants };
@@ -0,0 +1,18 @@
1
+ const env = require('../../../../env');
2
+ const { credentials } = env.getEnv();
3
+
4
+ class CreateInnerSystemUserModel {
5
+ constructor({
6
+ fullName = '',
7
+ email = '',
8
+ password = credentials.strongPassword,
9
+ userRole
10
+ }) {
11
+ this.fullName = fullName;
12
+ this.email = email;
13
+ this.password = password;
14
+ this.role = userRole;
15
+ }
16
+ }
17
+
18
+ module.exports = CreateInnerSystemUserModel;