Some small refactoring (column widths) of rendering tables in Lists, Templates, and Campaigns so that it is the same as Reports.
133 lines
4.1 KiB
JavaScript
133 lines
4.1 KiB
JavaScript
'use strict';
|
|
|
|
const reports = require('../lib/models/reports');
|
|
const reportTemplates = require('../lib/models/report-templates');
|
|
const lists = require('../lib/models/lists');
|
|
const campaigns = require('../lib/models/campaigns');
|
|
const handlebars = require('handlebars');
|
|
const handlebarsHelpers = require('../lib/handlebars-helpers');
|
|
const _ = require('../lib/translate')._;
|
|
const hbs = require('hbs');
|
|
const vm = require('vm');
|
|
const log = require('npmlog');
|
|
const fs = require('fs');
|
|
const reportProcessor = require('./report-processor');
|
|
|
|
handlebarsHelpers.registerHelpers(handlebars);
|
|
|
|
function resolveEntities(getter, ids, callback) {
|
|
const idsRemaining = ids.slice();
|
|
const resolved = [];
|
|
|
|
function doWork() {
|
|
if (idsRemaining.length == 0) {
|
|
return callback(null, resolved);
|
|
}
|
|
|
|
getter(idsRemaining.shift(), (err, entity) => {
|
|
if (err) {
|
|
return callback(err);
|
|
}
|
|
|
|
resolved.push(entity);
|
|
return doWork();
|
|
});
|
|
}
|
|
|
|
setImmediate(doWork);
|
|
}
|
|
|
|
const userFieldTypeToGetter = {
|
|
'campaign': (id, callback) => campaigns.get(id, false, callback),
|
|
'list': lists.get
|
|
};
|
|
|
|
function resolveUserFields(userFields, params, callback) {
|
|
const userFieldsRemaining = userFields.slice();
|
|
const resolved = {};
|
|
|
|
function doWork() {
|
|
if (userFieldsRemaining.length == 0) {
|
|
return callback(null, resolved);
|
|
}
|
|
|
|
const spec = userFieldsRemaining.shift();
|
|
const getter = userFieldTypeToGetter[spec.type];
|
|
|
|
if (getter) {
|
|
return resolveEntities(getter, params[spec.id], (err, entities) => {
|
|
if (spec.minOccurences == 1 && spec.maxOccurences == 1) {
|
|
resolved[spec.id] = entities[0];
|
|
} else {
|
|
resolved[spec.id] = entities;
|
|
}
|
|
|
|
doWork();
|
|
});
|
|
} else {
|
|
return callback(new Error(_('Unknown user field type "' + spec.type + '".')));
|
|
}
|
|
}
|
|
|
|
setImmediate(doWork);
|
|
}
|
|
|
|
function doneSuccess(id) {
|
|
process.exit(0);
|
|
}
|
|
|
|
function doneFail(id) {
|
|
process.exit(1);
|
|
}
|
|
|
|
function processReport(reportId) {
|
|
reports.get(reportId, (err, report) => {
|
|
if (err || !report) {
|
|
log.error('reports', err && err.message || err || _('Could not find report with specified ID'));
|
|
doneFail();
|
|
}
|
|
|
|
reportTemplates.get(report.reportTemplate, (err, reportTemplate) => {
|
|
if (err) {
|
|
log.error('reports', err && err.message || err || _('Could not find report template'));
|
|
doneFail();
|
|
}
|
|
|
|
resolveUserFields(reportTemplate.userFieldsObject, report.paramsObject, (err, inputs) => {
|
|
if (err) {
|
|
log.error('reports', err.message || err);
|
|
doneFail();
|
|
}
|
|
|
|
const sandbox = {
|
|
require: require,
|
|
inputs: inputs,
|
|
console: console,
|
|
callback: (err, outputs) => {
|
|
if (err) {
|
|
log.error('reports', err.message || err);
|
|
doneFail();
|
|
}
|
|
|
|
const hbsTmpl = handlebars.compile(reportTemplate.hbs);
|
|
const reportText = hbsTmpl(outputs);
|
|
|
|
fs.writeFile(reportProcessor.getFileName(report, 'report'), reportText, (err, reportContent) => {
|
|
if (err) {
|
|
log.error('reports', err && err.message || err || _('Could not find report with specified ID'));
|
|
doneFail();
|
|
}
|
|
|
|
doneSuccess();
|
|
});
|
|
}
|
|
};
|
|
|
|
const script = new vm.Script(reportTemplate.js);
|
|
script.runInNewContext(sandbox, {displayErrors: true, timeout: 120000});
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
processReport(Number(process.argv[2]));
|