UNPKG

forest-express

Version:

Official package for all Forest Express Lianas

101 lines (97 loc) 4.35 kB
"use strict"; 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;