@contentstack/cli-cm-import 0.1.1-beta.9 → 1.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/LICENSE +21 -0
- package/README.md +54 -23
- package/oclif.manifest.json +1 -1
- package/package.json +69 -65
- package/src/app.js +170 -103
- package/src/commands/cm/stacks/import.js +186 -0
- package/src/config/default.js +17 -57
- package/src/lib/import/assets.js +346 -281
- package/src/lib/import/content-types.js +198 -178
- package/src/lib/import/entries.js +1274 -684
- package/src/lib/import/environments.js +97 -82
- package/src/lib/import/extensions.js +95 -77
- package/src/lib/import/global-fields.js +114 -103
- package/src/lib/import/labels.js +118 -98
- package/src/lib/import/locales.js +124 -111
- package/src/lib/import/webhooks.js +76 -59
- package/src/lib/import/workflows.js +88 -68
- package/src/lib/util/contentstack-management-sdk.js +21 -8
- package/src/lib/util/extensionsUidReplace.js +34 -22
- package/src/lib/util/fs.js +3 -4
- package/src/lib/util/import-flags.js +150 -111
- package/src/lib/util/index.js +134 -130
- package/src/lib/util/log.js +73 -35
- package/src/lib/util/login.js +37 -36
- package/src/lib/util/lookupReplaceAssets.js +167 -61
- package/src/lib/util/lookupReplaceEntries.js +144 -66
- package/src/lib/util/removeReferenceFields.js +29 -26
- package/src/lib/util/schemaTemplate.js +31 -33
- package/src/lib/util/supress-mandatory-fields.js +14 -8
- package/src/lib/util/upload.js +29 -28
- package/src/commands/cm/import.js +0 -159
- package/src/lib/util/request.js +0 -82
package/src/lib/import/assets.js
CHANGED
|
@@ -5,340 +5,394 @@
|
|
|
5
5
|
* MIT Licensed
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
const mkdirp = require('mkdirp')
|
|
9
|
-
const path = require('path')
|
|
10
|
-
const Promise = require('bluebird')
|
|
11
|
-
const fs = require('fs')
|
|
12
|
-
const _ = require('lodash')
|
|
13
|
-
const chalk = require('chalk')
|
|
8
|
+
const mkdirp = require('mkdirp');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const Promise = require('bluebird');
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const _ = require('lodash');
|
|
13
|
+
const chalk = require('chalk');
|
|
14
14
|
|
|
15
|
-
let upload = require('../util/upload')
|
|
16
|
-
const helper = require('../util/fs')
|
|
17
|
-
const {addlogs} = require('../util/log')
|
|
18
|
-
const stack = require('../util/contentstack-management-sdk')
|
|
15
|
+
let upload = require('../util/upload');
|
|
16
|
+
const helper = require('../util/fs');
|
|
17
|
+
const { addlogs } = require('../util/log');
|
|
18
|
+
const stack = require('../util/contentstack-management-sdk');
|
|
19
19
|
|
|
20
|
-
let
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
let
|
|
26
|
-
let
|
|
27
|
-
let
|
|
28
|
-
let client
|
|
20
|
+
let config = require('../../config/default');
|
|
21
|
+
const assetsConfig = config.modules.assets;
|
|
22
|
+
let assetBatchLimit =
|
|
23
|
+
assetsConfig.hasOwnProperty('batchLimit') && typeof assetBatchLimit === 'number' ? assetsConfig.assetBatchLimit : 2;
|
|
24
|
+
let assetsFolderPath;
|
|
25
|
+
let mapperDirPath;
|
|
26
|
+
let environmentPath;
|
|
27
|
+
let client;
|
|
29
28
|
|
|
30
29
|
function importAssets() {
|
|
31
|
-
this.uidMapping = {}
|
|
32
|
-
this.urlMapping = {}
|
|
33
|
-
this.fails = []
|
|
34
|
-
this.assetBucket = []
|
|
35
|
-
this.folderDetails = []
|
|
36
|
-
this.folderBucket = []
|
|
37
|
-
this.mappedFolderUids = {}
|
|
30
|
+
this.uidMapping = {};
|
|
31
|
+
this.urlMapping = {};
|
|
32
|
+
this.fails = [];
|
|
33
|
+
this.assetBucket = [];
|
|
34
|
+
this.folderDetails = [];
|
|
35
|
+
this.folderBucket = [];
|
|
36
|
+
this.mappedFolderUids = {};
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
importAssets.prototype = {
|
|
41
40
|
start: function (credential) {
|
|
42
|
-
addlogs(config, 'Migrating assets', 'success')
|
|
43
|
-
let self = this
|
|
44
|
-
config = credential
|
|
45
|
-
client = stack.Client(config)
|
|
46
|
-
assetsFolderPath = path.join(config.data, config.modules.assets.dirName)
|
|
47
|
-
mapperDirPath = path.resolve(config.data, 'mapper', 'assets')
|
|
48
|
-
environmentPath = path.resolve(config.data, 'environments', 'environments.json')
|
|
49
|
-
self.uidMapperPath = path.join(mapperDirPath, 'uid-mapping.json')
|
|
50
|
-
self.urlMapperPath = path.join(mapperDirPath, 'url-mapping.json')
|
|
51
|
-
self.failsPath = path.join(mapperDirPath, 'fail.json')
|
|
52
|
-
self.assets = helper.readFile(path.join(assetsFolderPath, assetsConfig.fileName))
|
|
53
|
-
self.environment = helper.readFile(environmentPath)
|
|
41
|
+
addlogs(config, 'Migrating assets', 'success');
|
|
42
|
+
let self = this;
|
|
43
|
+
config = credential;
|
|
44
|
+
client = stack.Client(config);
|
|
45
|
+
assetsFolderPath = path.join(config.data, config.modules.assets.dirName);
|
|
46
|
+
mapperDirPath = path.resolve(config.data, 'mapper', 'assets');
|
|
47
|
+
environmentPath = path.resolve(config.data, 'environments', 'environments.json');
|
|
48
|
+
self.uidMapperPath = path.join(mapperDirPath, 'uid-mapping.json');
|
|
49
|
+
self.urlMapperPath = path.join(mapperDirPath, 'url-mapping.json');
|
|
50
|
+
self.failsPath = path.join(mapperDirPath, 'fail.json');
|
|
51
|
+
self.assets = helper.readFile(path.join(assetsFolderPath, assetsConfig.fileName));
|
|
52
|
+
self.environment = helper.readFile(environmentPath);
|
|
54
53
|
if (fs.existsSync(self.uidMapperPath)) {
|
|
55
|
-
self.uidMapping = helper.readFile(self.uidMapperPath)
|
|
54
|
+
self.uidMapping = helper.readFile(self.uidMapperPath);
|
|
56
55
|
}
|
|
57
56
|
if (fs.existsSync(self.urlMapperPath)) {
|
|
58
|
-
self.urlMapping = helper.readFile(self.urlMapperPath)
|
|
57
|
+
self.urlMapping = helper.readFile(self.urlMapperPath);
|
|
59
58
|
}
|
|
60
59
|
|
|
61
|
-
mkdirp.sync(mapperDirPath)
|
|
60
|
+
mkdirp.sync(mapperDirPath);
|
|
62
61
|
|
|
63
62
|
return new Promise(function (resolve, reject) {
|
|
64
|
-
if (self.assets === undefined) {
|
|
65
|
-
addlogs(config, 'No Assets Found', 'success')
|
|
66
|
-
return resolve()
|
|
63
|
+
if (self.assets === undefined || _.isEmpty(self.assets)) {
|
|
64
|
+
addlogs(config, 'No Assets Found', 'success');
|
|
65
|
+
return resolve({ empty: true });
|
|
67
66
|
}
|
|
68
|
-
let assetUids = Object.keys(self.assets)
|
|
69
|
-
let batches = []
|
|
67
|
+
let assetUids = Object.keys(self.assets);
|
|
68
|
+
let batches = [];
|
|
70
69
|
for (let i = 0; i < assetUids.length; i += assetBatchLimit) {
|
|
71
|
-
batches.push(assetUids.slice(i, i + assetBatchLimit))
|
|
70
|
+
batches.push(assetUids.slice(i, i + assetBatchLimit));
|
|
72
71
|
}
|
|
73
72
|
|
|
74
|
-
return self
|
|
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
|
-
|
|
73
|
+
return self
|
|
74
|
+
.importFolders()
|
|
75
|
+
.then(function () {
|
|
76
|
+
return Promise.map(
|
|
77
|
+
batches,
|
|
78
|
+
async function (batch, index) {
|
|
79
|
+
return Promise.map(
|
|
80
|
+
batch,
|
|
81
|
+
function (assetUid) {
|
|
82
|
+
if (self.uidMapping.hasOwnProperty(assetUid)) {
|
|
83
|
+
addlogs(
|
|
84
|
+
config,
|
|
85
|
+
'Skipping upload of asset: ' + assetUid + '. Its mapped to: ' + self.uidMapping[assetUid],
|
|
86
|
+
'success',
|
|
87
|
+
);
|
|
88
|
+
// the asset has been already imported
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
let currentAssetFolderPath = path.join(assetsFolderPath, assetUid);
|
|
92
|
+
if (fs.existsSync(currentAssetFolderPath)) {
|
|
93
|
+
// if this is true, means, the exported asset data is versioned
|
|
94
|
+
// hence, upload each asset with its version
|
|
95
|
+
if (config.versioning) {
|
|
96
|
+
return self
|
|
97
|
+
.uploadVersionedAssets(assetUid, currentAssetFolderPath)
|
|
98
|
+
.then(function () {
|
|
99
|
+
// empty function
|
|
100
|
+
})
|
|
101
|
+
.catch(function (error) {
|
|
102
|
+
addlogs(config, (chalk.red('Asset upload failed \n' + error), 'error'));
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
let assetPath = path.resolve(currentAssetFolderPath, self.assets[assetUid].filename);
|
|
106
|
+
let uidContainer = {};
|
|
107
|
+
let urlContainer = {};
|
|
108
|
+
if (self.assets[assetUid].parent_uid && typeof self.assets[assetUid].parent_uid === 'string') {
|
|
109
|
+
if (self.mappedFolderUids.hasOwnProperty(self.assets[assetUid].parent_uid)) {
|
|
110
|
+
self.assets[assetUid].parent_uid = self.mappedFolderUids[self.assets[assetUid].parent_uid];
|
|
111
|
+
} else {
|
|
112
|
+
addlogs(
|
|
113
|
+
config,
|
|
114
|
+
(self.assets[assetUid].parent_uid + " parent_uid was not found! Thus, setting it as 'null'",
|
|
115
|
+
'error'),
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
103
119
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
120
|
+
return self
|
|
121
|
+
.uploadAsset(assetPath, self.assets[assetUid], uidContainer, urlContainer)
|
|
122
|
+
.then(async function () {
|
|
123
|
+
self.uidMapping[assetUid] = uidContainer[assetUid];
|
|
124
|
+
self.urlMapping[self.assets[assetUid].url] = urlContainer[self.assets[assetUid].url];
|
|
107
125
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
126
|
+
if (config.entriesPublish && self.assets[assetUid].publish_details.length > 0) {
|
|
127
|
+
let assetsUid = uidContainer[assetUid];
|
|
128
|
+
try {
|
|
129
|
+
return await self.publish(assetsUid, self.assets[assetUid]);
|
|
130
|
+
} catch (error) {
|
|
131
|
+
return error;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// assetUid has been successfully uploaded
|
|
135
|
+
// log them onto /mapper/assets/success.json
|
|
136
|
+
})
|
|
137
|
+
.catch(function (error) {
|
|
138
|
+
addlogs(config, chalk.red('Asset upload failed \n' + error, 'error'));
|
|
139
|
+
return error;
|
|
140
|
+
// asset failed to upload
|
|
141
|
+
// log them onto /mapper/assets/fail.json
|
|
142
|
+
});
|
|
114
143
|
}
|
|
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
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
144
|
+
addlogs(config, currentAssetFolderPath + ' does not exist!', 'error');
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
concurrency: 1,
|
|
148
|
+
},
|
|
149
|
+
).then(function () {
|
|
150
|
+
helper.writeFile(self.uidMapperPath, self.uidMapping);
|
|
151
|
+
helper.writeFile(self.urlMapperPath, self.urlMapping);
|
|
152
|
+
// completed uploading assets
|
|
153
|
+
addlogs(config, 'Completed asset import of batch no: ' + (index + 1), 'success');
|
|
154
|
+
return index + 1;
|
|
155
|
+
// TODO: if there are failures, retry
|
|
156
|
+
});
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
concurrency: 1,
|
|
160
|
+
},
|
|
161
|
+
)
|
|
162
|
+
.then(function () {
|
|
163
|
+
let numberOfSuccessfulAssetUploads = Object.keys(self.uidMapping).length;
|
|
164
|
+
if (numberOfSuccessfulAssetUploads > 0) {
|
|
165
|
+
addlogs(
|
|
166
|
+
config,
|
|
167
|
+
chalk.green(numberOfSuccessfulAssetUploads + ' assets uploaded successfully!'),
|
|
168
|
+
'success',
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
// TODO: if there are failures, retry
|
|
172
|
+
return resolve();
|
|
173
|
+
})
|
|
174
|
+
.catch(function (error) {
|
|
175
|
+
return reject(error);
|
|
176
|
+
});
|
|
147
177
|
})
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
})
|
|
178
|
+
.catch(function (error) {
|
|
179
|
+
return reject(error);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
152
182
|
},
|
|
153
183
|
uploadVersionedAssets: function (uid, assetFolderPath) {
|
|
154
|
-
let self = this
|
|
184
|
+
let self = this;
|
|
155
185
|
return new Promise(function (resolve, reject) {
|
|
156
|
-
let versionedAssetMetadata = helper.readFile(path.join(assetFolderPath, '_contentstack_' + uid + '.json'))
|
|
186
|
+
let versionedAssetMetadata = helper.readFile(path.join(assetFolderPath, '_contentstack_' + uid + '.json'));
|
|
157
187
|
// using last version, find asset's parent
|
|
158
188
|
|
|
159
|
-
let lastVersion = versionedAssetMetadata[versionedAssetMetadata.length - 1]
|
|
189
|
+
let lastVersion = versionedAssetMetadata[versionedAssetMetadata.length - 1];
|
|
160
190
|
if (typeof lastVersion.parent_uid === 'string') {
|
|
161
191
|
if (self.mappedFolderUids.hasOwnProperty(lastVersion.parent_uid)) {
|
|
162
192
|
// update each version of that asset with the last version's parent_uid
|
|
163
193
|
versionedAssetMetadata.forEach(function (assetMetadata) {
|
|
164
|
-
assetMetadata.parent_uid = self.mappedFolderUids[lastVersion.parent_uid]
|
|
165
|
-
})
|
|
194
|
+
assetMetadata.parent_uid = self.mappedFolderUids[lastVersion.parent_uid];
|
|
195
|
+
});
|
|
166
196
|
} else {
|
|
167
|
-
addlogs(config, (lastVersion.parent_uid +
|
|
197
|
+
addlogs(config, (lastVersion.parent_uid + " parent_uid was not found! Thus, setting it as 'null'", 'error'));
|
|
168
198
|
versionedAssetMetadata.forEach(function (assetMetadata) {
|
|
169
|
-
assetMetadata.parent_uid = null
|
|
170
|
-
})
|
|
199
|
+
assetMetadata.parent_uid = null;
|
|
200
|
+
});
|
|
171
201
|
}
|
|
172
202
|
}
|
|
173
|
-
let counter = 0
|
|
174
|
-
let filesStreamed = []
|
|
175
|
-
let uidContainer = {}
|
|
176
|
-
let urlContainer = {}
|
|
177
|
-
return Promise.map(
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
203
|
+
let counter = 0;
|
|
204
|
+
let filesStreamed = [];
|
|
205
|
+
let uidContainer = {};
|
|
206
|
+
let urlContainer = {};
|
|
207
|
+
return Promise.map(
|
|
208
|
+
versionedAssetMetadata,
|
|
209
|
+
function () {
|
|
210
|
+
let assetMetadata = versionedAssetMetadata[counter];
|
|
211
|
+
let assetPath = path.join(assetFolderPath, assetMetadata.filename);
|
|
212
|
+
if (++counter === 1) {
|
|
213
|
+
return self
|
|
214
|
+
.uploadAsset(assetPath, assetMetadata, uidContainer, urlContainer)
|
|
215
|
+
.then(function () {
|
|
216
|
+
filesStreamed.push(assetMetadata.filename);
|
|
217
|
+
})
|
|
218
|
+
.catch(reject);
|
|
219
|
+
}
|
|
220
|
+
return self
|
|
221
|
+
.updateAsset(assetPath, assetMetadata, filesStreamed, uidContainer, urlContainer)
|
|
222
|
+
.then(function () {
|
|
223
|
+
filesStreamed.push(assetMetadata.filename);
|
|
224
|
+
})
|
|
225
|
+
.catch((_error) => {
|
|
226
|
+
// empty function
|
|
227
|
+
});
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
concurrency: 1,
|
|
231
|
+
},
|
|
232
|
+
)
|
|
187
233
|
.then(function () {
|
|
188
|
-
|
|
189
|
-
|
|
234
|
+
self.uidMapping[uid] = uidContainer[uid];
|
|
235
|
+
for (let url in urlContainer) {
|
|
236
|
+
self.urlMapping[url] = urlContainer[url];
|
|
237
|
+
}
|
|
238
|
+
// completed uploading all the versions of the asset
|
|
239
|
+
return resolve();
|
|
190
240
|
})
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
// completed uploading all the versions of the asset
|
|
199
|
-
return resolve()
|
|
200
|
-
}).catch(function (error) {
|
|
201
|
-
// failed to upload asset
|
|
202
|
-
// write it on fail logs, but do not stop the process
|
|
203
|
-
addlogs(config, chalk.red('Failed to upload asset\n' + error), 'error')
|
|
204
|
-
return resolve()
|
|
205
|
-
})
|
|
206
|
-
})
|
|
241
|
+
.catch(function (error) {
|
|
242
|
+
// failed to upload asset
|
|
243
|
+
// write it on fail logs, but do not stop the process
|
|
244
|
+
addlogs(config, chalk.red('Failed to upload asset\n' + error), 'error');
|
|
245
|
+
return resolve();
|
|
246
|
+
});
|
|
247
|
+
});
|
|
207
248
|
},
|
|
208
|
-
updateAsset: function (assetPath, metadata, filesStreamed,
|
|
209
|
-
// let self = this
|
|
249
|
+
updateAsset: function (assetPath, metadata, filesStreamed, _uidContainer, urlContainer) {
|
|
210
250
|
return new Promise(function (resolve, reject) {
|
|
211
|
-
let requestOption = {}
|
|
212
|
-
if (filesStreamed &&
|
|
213
|
-
addlogs(config, 'Skipping re-upload/streaming of ' + metadata.uid + '/' + metadata.filename, 'success')
|
|
214
|
-
requestOption.formData = {}
|
|
215
|
-
return resolve()
|
|
251
|
+
let requestOption = {};
|
|
252
|
+
if (filesStreamed && filesStreamed.indexOf(metadata.filename) !== -1) {
|
|
253
|
+
addlogs(config, 'Skipping re-upload/streaming of ' + metadata.uid + '/' + metadata.filename, 'success');
|
|
254
|
+
requestOption.formData = {};
|
|
255
|
+
return resolve();
|
|
216
256
|
}
|
|
217
257
|
|
|
218
|
-
addlogs(config, 'Streaming: ' + metadata.uid + '/' + metadata.filename, 'success')
|
|
219
|
-
requestOption.formData = {}
|
|
258
|
+
addlogs(config, 'Streaming: ' + metadata.uid + '/' + metadata.filename, 'success');
|
|
259
|
+
requestOption.formData = {};
|
|
220
260
|
|
|
221
261
|
if (metadata.hasOwnProperty('parent_uid') && typeof metadata.parent_uid === 'string') {
|
|
222
|
-
requestOption.formData['asset[parent_uid]'] = metadata.parent_uid
|
|
262
|
+
requestOption.formData['asset[parent_uid]'] = metadata.parent_uid;
|
|
223
263
|
}
|
|
224
264
|
|
|
225
265
|
if (metadata.hasOwnProperty('description') && typeof metadata.description === 'string') {
|
|
226
|
-
requestOption.formData['asset[description]'] = metadata.description
|
|
266
|
+
requestOption.formData['asset[description]'] = metadata.description;
|
|
227
267
|
}
|
|
228
268
|
|
|
229
269
|
if (metadata.hasOwnProperty('tags') && Array.isArray(metadata.tags)) {
|
|
230
|
-
requestOption.formData['asset[tags]'] = metadata.tags
|
|
270
|
+
requestOption.formData['asset[tags]'] = metadata.tags;
|
|
231
271
|
}
|
|
232
272
|
|
|
233
273
|
if (metadata.hasOwnProperty('title') && typeof metadata.title === 'string') {
|
|
234
|
-
requestOption.formData['asset[title]'] = metadata.title
|
|
274
|
+
requestOption.formData['asset[title]'] = metadata.title;
|
|
235
275
|
}
|
|
236
276
|
|
|
237
|
-
return upload(requestOption, assetPath)
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
277
|
+
return upload(requestOption, assetPath)
|
|
278
|
+
.then(function (response) {
|
|
279
|
+
urlContainer[metadata.url] = response.url;
|
|
280
|
+
return resolve();
|
|
281
|
+
})
|
|
282
|
+
.catch(function (error) {
|
|
283
|
+
return reject(error);
|
|
284
|
+
});
|
|
285
|
+
});
|
|
244
286
|
},
|
|
245
287
|
uploadAsset: function (assetPath, metadata, uidContainer, urlContainer) {
|
|
246
|
-
// let self = this
|
|
247
288
|
return new Promise(function (resolve, reject) {
|
|
248
|
-
let requestOption = {}
|
|
289
|
+
let requestOption = {};
|
|
249
290
|
|
|
250
291
|
if (metadata.hasOwnProperty('parent_uid') && typeof metadata.parent_uid === 'string') {
|
|
251
|
-
requestOption.parent_uid = metadata.parent_uid
|
|
292
|
+
requestOption.parent_uid = metadata.parent_uid;
|
|
252
293
|
}
|
|
253
294
|
|
|
254
295
|
if (metadata.hasOwnProperty('description') && typeof metadata.description === 'string') {
|
|
255
|
-
requestOption.description = metadata.description
|
|
296
|
+
requestOption.description = metadata.description;
|
|
256
297
|
}
|
|
257
298
|
|
|
258
299
|
// eslint-disable-next-line no-prototype-builtins
|
|
259
300
|
if (metadata.hasOwnProperty('tags') && Array.isArray(metadata.tags)) {
|
|
260
|
-
requestOption.tags = metadata.tags
|
|
301
|
+
requestOption.tags = metadata.tags;
|
|
261
302
|
}
|
|
262
303
|
|
|
263
304
|
if (metadata.hasOwnProperty('title') && typeof metadata.title === 'string') {
|
|
264
|
-
requestOption.title = metadata.title
|
|
305
|
+
requestOption.title = metadata.title;
|
|
265
306
|
}
|
|
266
|
-
return upload(requestOption, assetPath)
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
307
|
+
return upload(requestOption, assetPath)
|
|
308
|
+
.then(function (response) {
|
|
309
|
+
uidContainer[metadata.uid] = response.uid;
|
|
310
|
+
urlContainer[metadata.url] = response.url;
|
|
311
|
+
return resolve();
|
|
312
|
+
})
|
|
313
|
+
.catch(function (error) {
|
|
314
|
+
addlogs(config, error, 'error');
|
|
315
|
+
return reject(error);
|
|
316
|
+
});
|
|
317
|
+
});
|
|
275
318
|
},
|
|
276
319
|
|
|
277
320
|
importFolders: function () {
|
|
278
|
-
let self = this
|
|
321
|
+
let self = this;
|
|
279
322
|
return new Promise(function (resolve, reject) {
|
|
280
|
-
let mappedFolderPath = path.resolve(config.data, 'mapper', 'assets', 'folder-mapping.json')
|
|
281
|
-
self.folderDetails = helper.readFile(path.resolve(assetsFolderPath, 'folders.json'))
|
|
323
|
+
let mappedFolderPath = path.resolve(config.data, 'mapper', 'assets', 'folder-mapping.json');
|
|
324
|
+
self.folderDetails = helper.readFile(path.resolve(assetsFolderPath, 'folders.json'));
|
|
282
325
|
|
|
283
326
|
if (_.isEmpty(self.folderDetails)) {
|
|
284
|
-
addlogs(config, 'No folders were found at: ' + path.join(assetsFolderPath, 'folders.json'), 'success')
|
|
285
|
-
return resolve()
|
|
327
|
+
addlogs(config, 'No folders were found at: ' + path.join(assetsFolderPath, 'folders.json'), 'success');
|
|
328
|
+
return resolve();
|
|
286
329
|
}
|
|
287
|
-
let tree = self.buildTree(_.cloneDeep(self.folderDetails))
|
|
288
|
-
let createdFolders = {}
|
|
289
|
-
let createdFolderUids = []
|
|
330
|
+
let tree = self.buildTree(_.cloneDeep(self.folderDetails));
|
|
331
|
+
let createdFolders = {};
|
|
332
|
+
let createdFolderUids = [];
|
|
290
333
|
// if a few folders have already been created, skip re-creating them
|
|
291
334
|
if (fs.existsSync(mappedFolderPath)) {
|
|
292
|
-
createdFolders = helper.readFile(mappedFolderPath)
|
|
335
|
+
createdFolders = helper.readFile(mappedFolderPath);
|
|
293
336
|
// check if the read file has mapped objects
|
|
294
337
|
if (_.isPlainObject(createdFolders)) {
|
|
295
|
-
createdFolderUids = Object.keys(createdFolders)
|
|
338
|
+
createdFolderUids = Object.keys(createdFolders);
|
|
296
339
|
}
|
|
297
340
|
}
|
|
298
|
-
self.buildFolderReqObjs(createdFolderUids, tree, null)
|
|
299
|
-
let idx = 0
|
|
300
|
-
return Promise.map(
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
.then(response => {
|
|
308
|
-
addlogs(config, 'Created folder: \'' + folder.json.asset.name + '\'', 'success')
|
|
309
|
-
// { oldUid: newUid }
|
|
310
|
-
createdFolders[folder.oldUid] = response.uid
|
|
311
|
-
helper.writeFile(mappedFolderPath, createdFolders)
|
|
312
|
-
idx++
|
|
313
|
-
}).catch(function (err) {
|
|
314
|
-
let error = JSON.parse(err.message)
|
|
315
|
-
if (error.errors.authorization || error.errors.api_key) {
|
|
316
|
-
addlogs(config, chalk.red('Api_key or management_token is not valid'), 'error')
|
|
317
|
-
return reject(error)
|
|
341
|
+
self.buildFolderReqObjs(createdFolderUids, tree, null);
|
|
342
|
+
let idx = 0;
|
|
343
|
+
return Promise.map(
|
|
344
|
+
self.folderBucket,
|
|
345
|
+
function () {
|
|
346
|
+
let folder = self.folderBucket[idx];
|
|
347
|
+
if (createdFolders.hasOwnProperty(folder.json.asset.parent_uid)) {
|
|
348
|
+
// replace old uid with new
|
|
349
|
+
folder.json.asset.parent_uid = createdFolders[folder.json.asset.parent_uid];
|
|
318
350
|
}
|
|
319
|
-
return
|
|
351
|
+
return client
|
|
352
|
+
.stack({ api_key: config.target_stack, management_token: config.management_token })
|
|
353
|
+
.asset()
|
|
354
|
+
.folder()
|
|
355
|
+
.create(folder.json)
|
|
356
|
+
.then((response) => {
|
|
357
|
+
addlogs(config, "Created folder: '" + folder.json.asset.name + "'", 'success');
|
|
358
|
+
// assigning newUid to oldUid
|
|
359
|
+
createdFolders[folder.oldUid] = response.uid;
|
|
360
|
+
helper.writeFile(mappedFolderPath, createdFolders);
|
|
361
|
+
idx++;
|
|
362
|
+
})
|
|
363
|
+
.catch(function (err) {
|
|
364
|
+
let error = JSON.parse(err.message);
|
|
365
|
+
if (error.errors.authorization || error.errors.api_key) {
|
|
366
|
+
addlogs(config, chalk.red('Api_key or management_token is not valid'), 'error');
|
|
367
|
+
return reject(error);
|
|
368
|
+
}
|
|
369
|
+
return error;
|
|
370
|
+
});
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
concurrency: 1,
|
|
374
|
+
},
|
|
375
|
+
)
|
|
376
|
+
.then(function () {
|
|
377
|
+
self.mappedFolderUids = helper.readFile(mappedFolderPath);
|
|
378
|
+
// completed creating folders
|
|
379
|
+
return resolve();
|
|
320
380
|
})
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
// completed creating folders
|
|
326
|
-
return resolve()
|
|
327
|
-
}).catch(function (error) {
|
|
328
|
-
return reject(error)
|
|
329
|
-
})
|
|
330
|
-
})
|
|
381
|
+
.catch(function (error) {
|
|
382
|
+
return reject(error);
|
|
383
|
+
});
|
|
384
|
+
});
|
|
331
385
|
},
|
|
332
386
|
buildFolderReqObjs: function (createdFolderUids, tree, parent_uid) {
|
|
333
|
-
let self = this
|
|
387
|
+
let self = this;
|
|
334
388
|
for (let leaf in tree) {
|
|
335
389
|
// if the folder is already created, skip
|
|
336
390
|
if (createdFolderUids.indexOf(leaf) !== -1) {
|
|
337
|
-
continue
|
|
391
|
+
continue;
|
|
338
392
|
}
|
|
339
393
|
let folderObj = _.find(self.folderDetails, function (folder) {
|
|
340
|
-
return folder.uid === leaf
|
|
341
|
-
})
|
|
394
|
+
return folder.uid === leaf;
|
|
395
|
+
});
|
|
342
396
|
let requestOption = {
|
|
343
397
|
json: {
|
|
344
398
|
asset: {
|
|
@@ -347,76 +401,87 @@ importAssets.prototype = {
|
|
|
347
401
|
},
|
|
348
402
|
},
|
|
349
403
|
oldUid: leaf,
|
|
350
|
-
}
|
|
351
|
-
self.folderBucket.push(requestOption)
|
|
404
|
+
};
|
|
405
|
+
self.folderBucket.push(requestOption);
|
|
352
406
|
if (Object.keys(tree[leaf]).length > 0) {
|
|
353
|
-
self.buildFolderReqObjs(createdFolderUids, tree[leaf], leaf)
|
|
407
|
+
self.buildFolderReqObjs(createdFolderUids, tree[leaf], leaf);
|
|
354
408
|
}
|
|
355
409
|
}
|
|
356
410
|
},
|
|
357
411
|
buildTree: function (coll) {
|
|
358
|
-
let tree = {}
|
|
412
|
+
let tree = {};
|
|
359
413
|
for (let i = 0; i < coll.length; i++) {
|
|
360
414
|
// ! hasOwnProperty('parent_uid') added, as some folders do not have `parent_uid`
|
|
361
415
|
if (coll[i].parent_uid === null || !coll[i].hasOwnProperty('parent_uid')) {
|
|
362
|
-
tree[coll[i].uid] = {}
|
|
363
|
-
coll.splice(i, 1)
|
|
364
|
-
i
|
|
416
|
+
tree[coll[i].uid] = {};
|
|
417
|
+
coll.splice(i, 1);
|
|
418
|
+
i--;
|
|
365
419
|
}
|
|
366
420
|
}
|
|
367
|
-
this.findBranches(tree, coll)
|
|
368
|
-
return tree
|
|
421
|
+
this.findBranches(tree, coll);
|
|
422
|
+
return tree;
|
|
369
423
|
},
|
|
370
424
|
findBranches: function (branch, coll) {
|
|
371
|
-
let self = this
|
|
372
|
-
|
|
425
|
+
let self = this;
|
|
426
|
+
_.forEach(_.keys(branch), () => {
|
|
373
427
|
for (let j = 0; j < coll.length; j++) {
|
|
374
|
-
let parent_uid = coll[j].parent_uid
|
|
428
|
+
let parent_uid = coll[j].parent_uid;
|
|
375
429
|
if (branch.hasOwnProperty(parent_uid)) {
|
|
376
|
-
branch[parent_uid][coll[j].uid] = {}
|
|
430
|
+
branch[parent_uid][coll[j].uid] = {};
|
|
377
431
|
coll.splice(j, 1);
|
|
378
|
-
self.findBranches(branch[parent_uid], coll)
|
|
432
|
+
self.findBranches(branch[parent_uid], coll);
|
|
433
|
+
--j;
|
|
379
434
|
}
|
|
380
435
|
}
|
|
381
|
-
}
|
|
436
|
+
})
|
|
382
437
|
},
|
|
383
438
|
publish: function (assetUid, assetObject) {
|
|
384
|
-
let self = this
|
|
385
|
-
let envId = []
|
|
386
|
-
let locales = []
|
|
439
|
+
let self = this;
|
|
440
|
+
let envId = [];
|
|
441
|
+
let locales = [];
|
|
387
442
|
|
|
388
443
|
let requestObject = {
|
|
389
444
|
json: {
|
|
390
445
|
asset: {},
|
|
391
446
|
},
|
|
392
|
-
}
|
|
447
|
+
};
|
|
393
448
|
|
|
394
449
|
return new Promise(function (resolve, reject) {
|
|
395
450
|
_.forEach(assetObject.publish_details, function (pubObject) {
|
|
396
451
|
if (self.environment.hasOwnProperty(pubObject.environment)) {
|
|
397
|
-
envId.push(self.environment[pubObject.environment].name)
|
|
398
|
-
let idx = _.indexOf(locales, pubObject.locale)
|
|
452
|
+
envId.push(self.environment[pubObject.environment].name);
|
|
453
|
+
let idx = _.indexOf(locales, pubObject.locale);
|
|
399
454
|
if (idx === -1) {
|
|
400
|
-
locales.push(pubObject.locale)
|
|
455
|
+
locales.push(pubObject.locale);
|
|
401
456
|
}
|
|
402
457
|
}
|
|
403
|
-
})
|
|
404
|
-
requestObject.json.asset.environments = envId
|
|
405
|
-
requestObject.json.asset.locales = locales
|
|
406
|
-
return client
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
458
|
+
});
|
|
459
|
+
requestObject.json.asset.environments = envId;
|
|
460
|
+
requestObject.json.asset.locales = locales;
|
|
461
|
+
return client
|
|
462
|
+
.stack({ api_key: config.target_stack, management_token: config.management_token })
|
|
463
|
+
.asset(assetUid)
|
|
464
|
+
.publish({ publishDetails: requestObject.json.asset })
|
|
465
|
+
.then(function () {
|
|
466
|
+
addlogs(config, 'Asset ' + assetUid + ' published successfully', 'success');
|
|
467
|
+
return resolve();
|
|
468
|
+
})
|
|
469
|
+
.catch(function (err) {
|
|
470
|
+
if (err && err.message) {
|
|
471
|
+
let error;
|
|
472
|
+
try {
|
|
473
|
+
error = JSON.parse(err.message);
|
|
474
|
+
} catch (cError) {
|
|
475
|
+
error = { errorMessage: err.message };
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
addlogs(config, chalk.red('Asset ' + assetUid + ' not published, ' + error.errorMessage), 'error');
|
|
479
|
+
return reject(err);
|
|
480
|
+
}
|
|
481
|
+
return reject(err);
|
|
482
|
+
});
|
|
483
|
+
});
|
|
419
484
|
},
|
|
420
|
-
}
|
|
485
|
+
};
|
|
421
486
|
|
|
422
|
-
module.exports = new importAssets()
|
|
487
|
+
module.exports = new importAssets();
|