UNPKG

3.06 kBJavaScriptView Raw
1#!/usr/bin/env node
2
3const 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
14let gateway;
15const spinner = ora({ text: 'Exporting', stream: process.stdout, spinner: 'bouncingBar' });
16const transform = ({ users = { results: [] }, transactables = { results: [] }, models = { results: [] } }) => {
17 return {
18 users: users.results,
19 transactables: transactables.results,
20 models: models.results
21 };
22};
23
24const fetchFilesForData = async(data) => {
25 // TODO: user properties
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
36program
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
83program.parse(process.argv);