-
Notifications
You must be signed in to change notification settings - Fork 55
Expand file tree
/
Copy path_b2cServicesCreate.js
More file actions
139 lines (114 loc) · 6.78 KB
/
_b2cServicesCreate.js
File metadata and controls
139 lines (114 loc) · 6.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
'use strict';
// Initialize constants
const config = require('config');
const fs = require('fs');
const path = require('path');
/**
* @function _b2cServicesCreate
* @description Attempts to create a version of the services.xml b2C Commerce metadata
*
* @param {Object} environmentDef Represents the already-validated environment details to use
* @returns {Promise} Returns the results of the service creation request
*/
module.exports = environmentDef => new Promise(async (resolve, reject) => {
// Initialize the output variable
const output = {};
try {
// First, read the connected App credentials file, if it does not exists, abort
const connectedAppCredentialsFilePath = path.join(
config.get('paths.source.dx.config').toString(),
`${environmentDef.b2cInstanceName}.${config.get('paths.connectedAppFileName').toString()}`);
if (!fs.existsSync(connectedAppCredentialsFilePath)) {
throw new Error('The connected app credentials are not available yet; please execute the "crm-sync:sf:connectedapps" command.');
}
const connectedAppCredentials = JSON.parse(
fs.readFileSync(connectedAppCredentialsFilePath, 'utf8').toString());
const perSiteServiceTemplatePath = path.join(
config.get('paths.source.b2c.meta-templates').toString(), 'service_per_site.xml');
const perSiteServiceTemplateFileAsString = fs.readFileSync(
perSiteServiceTemplatePath, 'utf8');
const perSiteServiceProfileTemplatePath = path.join(
config.get('paths.source.b2c.meta-templates').toString(), 'service_profile_per_site.xml');
const perSiteServiceProfileTemplateFileAsString = fs.readFileSync(
perSiteServiceProfileTemplatePath, 'utf8');
const perSiteServiceCredentialTemplatePath = path.join(
config.get('paths.source.b2c.meta-templates').toString(), 'service_credential_per_site.xml');
const perSiteServiceCredentialTemplateFileAsString = fs.readFileSync(
perSiteServiceCredentialTemplatePath, 'utf8');
const fileName = 'services.xml';
const targetFolderPath = config.get('paths.source.b2c.metadata').toString();
const filePath = path.join(targetFolderPath, fileName);
const templatePath = path.join(config.get('paths.source.b2c.meta-templates').toString(), fileName);
let templateFileAsString = fs.readFileSync(templatePath, 'utf8');
let logPrefixLength = 9;
let allServiceString = '';
let allServiceProfileString = '';
let allServiceCredentialString = '';
// Clean-up the siteList for service-processing
let siteList = environmentDef.b2cSiteIds.trim();
siteList = siteList.replace(/\s/g, '');
siteList = siteList.split(',');
// Loop over the collection of cleaned-up site identifiers (whitespace removed)
siteList.filter(siteId => connectedAppCredentials.siteIds.indexOf(siteId) > -1).forEach(siteId => {
// Create a reference to the connectedApp credentials for the current site
const {consumerKey, consumerSecret} = connectedAppCredentials.credentials[siteId];
// Perform the service template
let serviceTemplateString = `${perSiteServiceTemplateFileAsString}`;
// Use a regex to replace the site ID as it appears multiple times within the template file
serviceTemplateString = serviceTemplateString.replace(
/{{B2C_SITEID}}/gm, siteId);
// Use a regex to replace the log prefix site ID, errors after 25 characters
let logPrefixSiteId = siteId;
if (logPrefixLength + logPrefixSiteId.length > 25) {
// remove underscores and dashes and limit site id to first 16 characters
logPrefixSiteId = logPrefixSiteId.replace(
/[_-]/g, '').substring(0, 16);
}
serviceTemplateString = serviceTemplateString.replace(
/{{B2C_SITEID_LOG_PREFIX}}/gm, logPrefixSiteId);
allServiceString = allServiceString + `\n${serviceTemplateString}`;
// Perform the service profile template
let serviceProfileTemplateString = `${perSiteServiceProfileTemplateFileAsString}`;
// Use a regex to replace the site ID as it appears multiple times within the template file
serviceProfileTemplateString = serviceProfileTemplateString.replace(
/{{B2C_SITEID}}/gm, siteId);
allServiceProfileString = allServiceProfileString + `\n${serviceProfileTemplateString}`;
// Perform the service credential template
let serviceCredentialTemplateString = `${perSiteServiceCredentialTemplateFileAsString}`;
// Use a regex to replace the site ID as it appears multiple times within the template file
serviceCredentialTemplateString = serviceCredentialTemplateString.replace(
/{{B2C_SITEID}}/gm, siteId);
serviceCredentialTemplateString = serviceCredentialTemplateString.replace(
'{{SF_LOGINURL}}', environmentDef.sfLoginUrl);
serviceCredentialTemplateString = serviceCredentialTemplateString.replace(
'{{SF_USERNAME}}', environmentDef.sfUsername);
serviceCredentialTemplateString = serviceCredentialTemplateString.replace(
'{{SF_PASSWORD}}', environmentDef.sfPassword);
serviceCredentialTemplateString = serviceCredentialTemplateString.replace(
'{{SF_SECURITYTOKEN}}', environmentDef.sfSecurityToken);
serviceCredentialTemplateString = serviceCredentialTemplateString.replace(
'{{SF_CONSUMERKEY}}', consumerKey);
serviceCredentialTemplateString = serviceCredentialTemplateString.replace(
'{{SF_CONSUMERSECRET}}', consumerSecret);
allServiceCredentialString = allServiceCredentialString + `\n${serviceCredentialTemplateString}`;
});
// Replace the placeholder with all the services details
templateFileAsString = templateFileAsString.replace(
'{{ALL_SERVICES}}',
`${allServiceCredentialString}\n${allServiceProfileString}\n${allServiceString}`);
// Create the destination path to the meta-data file being written
if (!fs.existsSync(targetFolderPath)) {
fs.mkdirSync(targetFolderPath, {recursive: true});
}
// Write the destination file personalized by the environment properties
fs.writeFileSync(filePath, templateFileAsString, 'utf8');
// Default the output properties
output.success = true;
output.filePath = filePath;
output.fileContents = templateFileAsString;
resolve(output);
} catch (e) {
// Exit with the error
reject(e);
}
});