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