@commercetools/personal-data-erasure
Version:
Export and delete all data related to a single customer
125 lines (121 loc) • 4.79 kB
JavaScript
;
var _fs = _interopRequireDefault(require("fs"));
var _getCredentials = require("@commercetools/get-credentials");
var _pino = _interopRequireDefault(require("pino"));
var _prettyError = _interopRequireDefault(require("pretty-error"));
var _yargs = _interopRequireDefault(require("yargs"));
var _promptConfirm = _interopRequireDefault(require("prompt-confirm"));
var _main = _interopRequireDefault(require("./main"));
var _package = require("../package.json");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
process.title = 'personal-data-erasure';
var args = _yargs["default"].usage("\nUsage: $0 [options]\n".concat(_package.description)).showHelpOnFail(false).option('output', {
alias: 'o',
"default": 'stdout',
describe: 'Path to output file.'
}).option('customerId', {
alias: 'c',
describe: 'Customer to fetch or delete.',
demand: true
}).option('apiUrl', {
"default": 'https://api.europe-west1.gcp.commercetools.com',
describe: 'The host URL of the HTTP API service.'
}).option('authUrl', {
"default": 'https://auth.europe-west1.gcp.commercetools.com',
describe: 'The host URL of the OAuth API service.'
}).option('accessToken', {
describe: 'CTP client access token.'
}).option('projectKey', {
alias: 'p',
describe: 'API project key.',
demand: true
}).option('deleteAll', {
type: 'boolean',
alias: 'D',
describe: 'Delete all data related to customer.'
}).option('force', {
type: 'boolean',
describe: 'Continue without confirmation when combined with --deleteAll.'
}).option('logLevel', {
"default": 'info',
describe: 'Logging level: error, warn, info or debug.'
}).option('prettyLogs ', {
describe: 'Pretty print logs to the terminal',
type: 'boolean'
}).option('logFile', {
"default": 'personal-data-erasure.log',
describe: 'Path to where to save logs file.',
type: 'string'
}).argv;
// instantiate logger
var loggerConfig = {
level: args.logLevel,
prettyPrint: args.prettyLogs
};
// If the stdout is used for a data output, save all logs to a log file.
// pino writes logs to stdout by default
var logDestination;
if (args.output === process.stdout) logDestination = _fs["default"].createWriteStream(args.logFile);
var logger = (0, _pino["default"])(loggerConfig, logDestination);
// print errors to stderr if we use stdout for data output
// if we save data to output file errors are already logged by pino
var logError = function logError(error) {
var errorFormatter = new _prettyError["default"]();
if (args.logLevel === 'debug') process.stderr.write("ERR: ".concat(errorFormatter.render(error)));else process.stderr.write("ERR: ".concat(error.message || error));
};
var errorHandler = function errorHandler(errors) {
if (Array.isArray(errors)) errors.forEach(logError);else logError(errors);
process.exitCode = 1;
};
var resolveCredentials = function resolveCredentials(options) {
if (options.accessToken) return Promise.resolve({});
return (0, _getCredentials.getCredentials)(options.projectKey);
};
var deleteOrNot = function deleteOrNot(personalDataEraser, answer) {
if (answer === true) {
personalDataEraser.deleteAll(args.customerId);
logger.info("All data related to customer with id '".concat(args.customerId, "' has successfully been deleted."));
} else {
logger.info('No data was deleted.');
}
};
resolveCredentials(args).then(function (credentials) {
var apiConfig = {
host: args.authUrl,
apiUrl: args.apiUrl,
projectKey: args.projectKey,
credentials: credentials
};
var exporterOptions = {
apiConfig: apiConfig,
accessToken: args.accessToken,
predicate: args.where,
logger: {
error: logger.error.bind(logger),
warn: logger.warn.bind(logger),
info: logger.info.bind(logger),
debug: logger.debug.bind(logger)
}
};
return new _main["default"](exporterOptions);
}).then(function (personalDataEraser) {
if (args.deleteAll) {
if (args.force) deleteOrNot(personalDataEraser, args.force);else {
var confirm = new _promptConfirm["default"]("Are you sure you want to delete all data related to customer with \nid: \"".concat(args.customerId, "\"?"));
confirm.run().then(function (answer) {
deleteOrNot(personalDataEraser, answer);
});
}
} else {
personalDataEraser.getCustomerData(args.customerId).then(function (result) {
if (args.output === 'stdout') {
// eslint-disable-next-line
} else {
_fs["default"].writeFile(args.output, JSON.stringify(result, null, 2), function (err) {
if (err) throw err;
logger.info("".concat(result.length, " entities has been successfully written to file '").concat(args.output, "'"));
});
}
});
}
})["catch"](errorHandler);