forest-express
Version:
Official package for all Forest Express Lianas
101 lines (97 loc) • 4.35 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var moment = require('moment');
var stringify = require('csv-stringify/lib/sync');
var _require = require('@forestadmin/context'),
inject = _require.inject;
var ParamsFieldsDeserializer = require('../deserializers/params-fields');
var SmartFieldsValuesInjector = require('./smart-fields-values-injector');
// NOTICE: Prevent bad date formatting into timestamps.
var CSV_OPTIONS = {
cast: {
date: function date(value) {
return moment(value).format();
}
}
};
function CSVExporter(params, response, modelName, recordsExporter) {
var _inject = inject(),
configStore = _inject.configStore;
function getValueForAttribute(record, attribute) {
var value;
if (params.fields[attribute]) {
if (record[attribute]) {
if (params.fields[attribute] && record[attribute][params.fields[attribute]]) {
value = record[attribute][params.fields[attribute]];
} else {
// eslint-disable-next-line
value = record[attribute].id || record[attribute]._id;
}
}
} else {
value = record[attribute];
}
return value || '';
}
// eslint-disable-next-line sonarjs/cognitive-complexity
this.perform = /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
var filename, CSVHeader, CSVAttributes, fieldsPerModel;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
filename = "".concat(params.filename, ".csv");
response.setHeader('Content-Type', 'text/csv; charset=utf-8');
response.setHeader('Content-disposition', "attachment; filename=".concat(filename));
response.setHeader('Last-Modified', moment());
// NOTICE: From nginx doc: Setting this to "no" will allow unbuffered
// responses suitable for Comet and HTTP streaming applications.
response.setHeader('X-Accel-Buffering', 'no');
response.setHeader('Cache-Control', 'no-cache');
CSVHeader = "".concat(params.header, "\n");
CSVAttributes = params.fields[modelName].split(',');
response.write(CSVHeader);
fieldsPerModel = new ParamsFieldsDeserializer(params.fields).perform();
_context2.next = 12;
return recordsExporter.perform( /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(records) {
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return Promise.all(
// eslint-disable-next-line max-len
records.map(function (record) {
return new SmartFieldsValuesInjector(record, modelName, fieldsPerModel).perform();
}));
case 2:
if (configStore.Implementation.Flattener) {
records = configStore.Implementation.Flattener.flattenRecordsForExport(modelName, records);
}
records.forEach(function (record) {
// eslint-disable-next-line max-len
response.write(stringify([CSVAttributes.map(function (attribute) {
return getValueForAttribute(record, attribute, params);
})], CSV_OPTIONS));
});
case 4:
case "end":
return _context.stop();
}
}, _callee);
}));
return function (_x) {
return _ref2.apply(this, arguments);
};
}());
case 12:
response.end();
case 13:
case "end":
return _context2.stop();
}
}, _callee2);
}));
}
module.exports = CSVExporter;