@contentstack/cli-cm-import 0.1.1-beta.7 → 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.
@@ -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 util = require('../util')
21
- let config = require('../../config/default')
22
- const assetsConfig = config.modules.assets
23
- let assetBatchLimit = (assetsConfig.hasOwnProperty('batchLimit') && typeof assetBatchLimit === 'number') ?
24
- assetsConfig.assetBatchLimit : 2
25
- let assetsFolderPath
26
- let mapperDirPath
27
- let environmentPath
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.importFolders().then(function () {
75
- return Promise.map(batches, async function (batch, index) {
76
- return Promise.map(batch, function (assetUid) {
77
- if (self.uidMapping.hasOwnProperty(assetUid)) {
78
- addlogs(config, 'Skipping upload of asset: ' + assetUid + '. Its mapped to: ' + self.uidMapping[
79
- assetUid], 'success')
80
- // the asset has been already imported
81
- return
82
- }
83
- let currentAssetFolderPath = path.join(assetsFolderPath, assetUid)
84
- if (fs.existsSync(currentAssetFolderPath)) {
85
- // if this is true, means, the exported asset data is versioned
86
- // hence, upload each asset with its version
87
- if (config.versioning) {
88
- return self.uploadVersionedAssets(assetUid, currentAssetFolderPath).then(function () {
89
- }).catch(function (error) {
90
- addlogs(config, (chalk.red('Asset upload failed \n' + error), 'error'))
91
- })
92
- }
93
- let assetPath = path.resolve(currentAssetFolderPath, self.assets[assetUid].filename)
94
- let uidContainer = {}
95
- let urlContainer = {}
96
- if (self.assets[assetUid].parent_uid && typeof self.assets[assetUid].parent_uid === 'string') {
97
- if (self.mappedFolderUids.hasOwnProperty(self.assets[assetUid].parent_uid)) {
98
- self.assets[assetUid].parent_uid = self.mappedFolderUids[self.assets[assetUid].parent_uid]
99
- } else {
100
- addlogs(config, (self.assets[assetUid].parent_uid + ' parent_uid was not found! Thus, setting it as \'null\'', 'error'))
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
- return self.uploadAsset(assetPath, self.assets[assetUid], uidContainer, urlContainer).then(async function () {
105
- self.uidMapping[assetUid] = uidContainer[assetUid]
106
- self.urlMapping[self.assets[assetUid].url] = urlContainer[self.assets[assetUid].url]
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
- if (config.entriesPublish && self.assets[assetUid].publish_details.length > 0) {
109
- let assetsUid = uidContainer[assetUid]
110
- try {
111
- return await self.publish(assetsUid, self.assets[assetUid])
112
- } catch (error) {
113
- return error
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
- // assetUid has been successfully uploaded
117
- // log them onto /mapper/assets/success.json
118
- }).catch(function (error) {
119
- addlogs(config, chalk.red('Asset upload failed \n' + error, 'error'))
120
- return error
121
- // asset failed to upload
122
- // log them onto /mapper/assets/fail.json
123
- })
124
- }
125
- addlogs(config, (currentAssetFolderPath + ' does not exist!'), 'error')
126
- }, {
127
- concurrency: 1,
128
- }).then(function () {
129
- helper.writeFile(self.uidMapperPath, self.uidMapping)
130
- helper.writeFile(self.urlMapperPath, self.urlMapping)
131
- // completed uploading assets
132
- addlogs(config, 'Completed asset import of batch no: ' + (index + 1), 'success')
133
- return index + 1
134
- // TODO: if there are failures, retry
135
- })
136
- }, {
137
- concurrency: 1,
138
- }).then(function () {
139
- let numberOfSuccessfulAssetUploads = Object.keys(self.uidMapping).length
140
- if (numberOfSuccessfulAssetUploads > 0) {
141
- addlogs(config, chalk.green(numberOfSuccessfulAssetUploads + ' assets uploaded successfully!'), 'success')
142
- }
143
- // TODO: if there are failures, retry
144
- return resolve()
145
- }).catch(function () {
146
- return reject()
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
- }).catch(function (error) {
149
- return reject()
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 + ' parent_uid was not found! Thus, setting it as \'null\'', 'error'))
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(versionedAssetMetadata, function () {
178
- let assetMetadata = versionedAssetMetadata[counter]
179
- let assetPath = path.join(assetFolderPath, assetMetadata.filename)
180
- if (++counter === 1) {
181
- // delete assetMetadata.uid;
182
- return self.uploadAsset(assetPath, assetMetadata, uidContainer, urlContainer).then(function () {
183
- filesStreamed.push(assetMetadata.filename)
184
- }).catch(reject)
185
- }
186
- return self.updateAsset(assetPath, assetMetadata, filesStreamed, uidContainer, urlContainer)
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
- filesStreamed.push(assetMetadata.filename)
189
- }).catch(error => {
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
- concurrency: 1,
193
- }).then(function () {
194
- self.uidMapping[uid] = uidContainer[uid]
195
- for (let url in urlContainer) {
196
- self.urlMapping[url] = urlContainer[url]
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, uidContainer, urlContainer) {
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 && (filesStreamed.indexOf(metadata.filename) !== -1)) {
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).then(function (response) {
238
- urlContainer[metadata.url] = response.url
239
- return resolve()
240
- }).catch(function (error) {
241
- return reject(error)
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).then(function (response) {
267
- uidContainer[metadata.uid] = response.uid
268
- urlContainer[metadata.url] = response.url
269
- return resolve()
270
- }).catch(function (error) {
271
- addlogs(config, error, 'error')
272
- return reject(error)
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(self.folderBucket, function () {
301
- let folder = self.folderBucket[idx]
302
- if (createdFolders.hasOwnProperty(folder.json.asset.parent_uid)) {
303
- // replace old uid with new
304
- folder.json.asset.parent_uid = createdFolders[folder.json.asset.parent_uid]
305
- }
306
- return client.stack({api_key: config.target_stack, management_token: config.management_token}).asset().folder().create(folder.json)
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 error
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
- concurrency: 1,
323
- }).then(function () {
324
- self.mappedFolderUids = helper.readFile(mappedFolderPath)
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,75 +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
- for (let leaf in branch) {
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] = {}
377
- self.findBranches(branch[parent_uid], coll)
430
+ branch[parent_uid][coll[j].uid] = {};
431
+ coll.splice(j, 1);
432
+ self.findBranches(branch[parent_uid], coll);
433
+ --j;
378
434
  }
379
435
  }
380
- }
436
+ })
381
437
  },
382
438
  publish: function (assetUid, assetObject) {
383
- let self = this
384
- let envId = []
385
- let locales = []
439
+ let self = this;
440
+ let envId = [];
441
+ let locales = [];
386
442
 
387
443
  let requestObject = {
388
444
  json: {
389
445
  asset: {},
390
446
  },
391
- }
447
+ };
392
448
 
393
449
  return new Promise(function (resolve, reject) {
394
450
  _.forEach(assetObject.publish_details, function (pubObject) {
395
451
  if (self.environment.hasOwnProperty(pubObject.environment)) {
396
- envId.push(self.environment[pubObject.environment].name)
397
- let idx = _.indexOf(locales, pubObject.locale)
452
+ envId.push(self.environment[pubObject.environment].name);
453
+ let idx = _.indexOf(locales, pubObject.locale);
398
454
  if (idx === -1) {
399
- locales.push(pubObject.locale)
455
+ locales.push(pubObject.locale);
400
456
  }
401
457
  }
402
- })
403
- requestObject.json.asset.environments = envId
404
- requestObject.json.asset.locales = locales
405
- return client.stack({api_key: config.target_stack, management_token: config.management_token}).asset(assetUid).publish({publishDetails: requestObject.json.asset})
406
- .then(function () {
407
- addlogs(config, 'Asset ' + assetUid + ' published successfully', 'success')
408
- return resolve()
409
- }).catch(function (err) {
410
- if (err && err.message) {
411
- let error = JSON.parse(err.message)
412
- addlogs(config, chalk.red('Asset ' + assetUid + ' not published, ' + error.errorMessage), 'error')
413
- return reject(err)
414
- }
415
- return reject(err)
416
- })
417
- })
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
+ });
418
484
  },
419
- }
485
+ };
420
486
 
421
- module.exports = new importAssets()
487
+ module.exports = new importAssets();