1 | #!/usr/bin/env node
|
2 |
|
3 | const program = require('commander'),
|
4 | fs = require('fs'),
|
5 | ora = require('ora'),
|
6 | shell = require('shelljs'),
|
7 | Gateway = require('./lib/proxy'),
|
8 | logger = require('./lib/logger'),
|
9 | fetchAuthData = require('./lib/settings').fetchSettings,
|
10 | fetchFiles = require('./lib/data/fetchFiles'),
|
11 | waitForStatus = require('./lib/data/waitForStatus'),
|
12 | version = require('./package.json').version;
|
13 |
|
14 | let gateway;
|
15 | const spinner = ora({ text: 'Exporting', stream: process.stdout, spinner: 'bouncingBar' });
|
16 | const transform = ({ users = { results: [] }, transactables = { results: [] }, models = { results: [] } }) => {
|
17 | return {
|
18 | users: users.results,
|
19 | transactables: transactables.results,
|
20 | models: models.results
|
21 | };
|
22 | };
|
23 |
|
24 | const fetchFilesForData = async(data) => {
|
25 |
|
26 | data.users = await Promise.all(data.users.map(async(user) => {
|
27 | user.profiles = await Promise.all(user.profiles.map(profile => fetchFiles(profile)));
|
28 | return user;
|
29 | }));
|
30 | data.transactables = await Promise.all(data.transactables.map(model => fetchFiles(model)));
|
31 | data.models = await Promise.all(data.models.map(model => fetchFiles(model)));
|
32 |
|
33 | return data;
|
34 | };
|
35 |
|
36 | program
|
37 | .version(version)
|
38 | .arguments('[environment]', 'name of the environment. Example: staging')
|
39 | .option('-p --path <export-file-path>', 'output for exported data', 'data.json')
|
40 | .option('-e --export-internal-ids <export-internal-ids>', 'use normal object `id` instead of `external_id` in exported json data',
|
41 | 'false')
|
42 | .option('-c --config-file <config-file>', 'config file path', '.marketplace-kit')
|
43 | .action((environment, params) => {
|
44 | process.env.CONFIG_FILE_PATH = params.configFile;
|
45 | const filename = params.path;
|
46 | const exportInternalIds = params.exportInternalIds;
|
47 | const authData = fetchAuthData(environment, program, program);
|
48 | gateway = new Gateway(authData);
|
49 | spinner.start();
|
50 | gateway
|
51 | .dataExportStart(exportInternalIds)
|
52 | .then(exportTask => {
|
53 | waitForStatus(() => gateway.dataExportStatus(exportTask.id)).then(exportTask => {
|
54 | shell.mkdir('-p', 'tmp');
|
55 | fs.writeFileSync('tmp/exported.json', JSON.stringify(exportTask.data));
|
56 | let data = transform(exportTask.data);
|
57 | spinner.succeed('Downloading files');
|
58 | fetchFilesForData(data).then(data => {
|
59 | fs.writeFileSync(filename, JSON.stringify(data));
|
60 | spinner.stopAndPersist().succeed(`Done. Exported to: ${filename}`);
|
61 | }).catch(e => {
|
62 | logger.Warn('export error');
|
63 | logger.Warn(e.message);
|
64 | });
|
65 | }).catch(error => {
|
66 | logger.Debug(error);
|
67 | spinner.fail('Export failed');
|
68 | });
|
69 | })
|
70 | .catch(
|
71 | { statusCode: 404 },
|
72 | () => {
|
73 | spinner.fail('Export failed');
|
74 | logger.Error('[404] Data export is not supported by the server');
|
75 | }
|
76 | )
|
77 | .catch(e => {
|
78 | spinner.fail('Export failed');
|
79 | logger.Error(e.message);
|
80 | });
|
81 | });
|
82 |
|
83 | program.parse(process.argv);
|