forest-express
Advanced tools
Comparing version 10.2.18 to 10.2.19
@@ -83,9 +83,22 @@ "use strict"; | ||
} | ||
function exportCSV(request, response, next) { | ||
var _getContext3 = getContext(request), | ||
params = _getContext3.params, | ||
associationModel = _getContext3.associationModel; | ||
var recordsExporter = new Implementation.ResourcesExporter(model, opts, params, associationModel, request.user); | ||
return new CSVExporter(params, response, Implementation.getModelName(associationModel), recordsExporter).perform()["catch"](next); | ||
function exportCSV(_x, _x2, _x3) { | ||
return _exportCSV.apply(this, arguments); | ||
} | ||
function _exportCSV() { | ||
_exportCSV = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(request, response, next) { | ||
var _getContext3, params, associationModel, recordsExporter; | ||
return _regenerator["default"].wrap(function _callee$(_context) { | ||
while (1) switch (_context.prev = _context.next) { | ||
case 0: | ||
_getContext3 = getContext(request), params = _getContext3.params, associationModel = _getContext3.associationModel; | ||
recordsExporter = new Implementation.ResourcesExporter(model, opts, params, associationModel, request.user); | ||
return _context.abrupt("return", new CSVExporter(params, response, Implementation.getModelName(associationModel), recordsExporter).perform()["catch"](next)); | ||
case 3: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
}, _callee); | ||
})); | ||
return _exportCSV.apply(this, arguments); | ||
} | ||
function add(request, response, next) { | ||
@@ -103,10 +116,10 @@ var params = _.extend(request.params, getAssociation(request)); | ||
} | ||
function remove(_x, _x2, _x3) { | ||
function remove(_x4, _x5, _x6) { | ||
return _remove.apply(this, arguments); | ||
} | ||
function _remove() { | ||
_remove = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(request, response, next) { | ||
_remove = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(request, response, next) { | ||
var _getContext4, params, associationModel, body, hasBodyAttributes, isLegacyRequest, getter, ids; | ||
return _regenerator["default"].wrap(function _callee$(_context) { | ||
while (1) switch (_context.prev = _context.next) { | ||
return _regenerator["default"].wrap(function _callee2$(_context2) { | ||
while (1) switch (_context2.prev = _context2.next) { | ||
case 0: | ||
@@ -124,18 +137,18 @@ _getContext4 = getContext(request), params = _getContext4.params, associationModel = _getContext4.associationModel; | ||
if (!(!hasBodyAttributes && isLegacyRequest)) { | ||
_context.next = 7; | ||
_context2.next = 7; | ||
break; | ||
} | ||
body = request.body; | ||
_context.next = 13; | ||
_context2.next = 13; | ||
break; | ||
case 7: | ||
if (!hasBodyAttributes) { | ||
_context.next = 13; | ||
_context2.next = 13; | ||
break; | ||
} | ||
getter = new RecordsGetter(associationModel, request.user, request.query); | ||
_context.next = 11; | ||
_context2.next = 11; | ||
return getter.getIdsFromRequest(request); | ||
case 11: | ||
ids = _context.sent; | ||
ids = _context2.sent; | ||
body = { | ||
@@ -149,3 +162,3 @@ data: ids.map(function (id) { | ||
case 13: | ||
return _context.abrupt("return", new Implementation.HasManyDissociator(model, associationModel, opts, params, body).perform().then(function () { | ||
return _context2.abrupt("return", new Implementation.HasManyDissociator(model, associationModel, opts, params, body).perform().then(function () { | ||
response.status(204).send(); | ||
@@ -155,5 +168,5 @@ })["catch"](next)); | ||
case "end": | ||
return _context.stop(); | ||
return _context2.stop(); | ||
} | ||
}, _callee); | ||
}, _callee2); | ||
})); | ||
@@ -160,0 +173,0 @@ return _remove.apply(this, arguments); |
@@ -5,4 +5,4 @@ "use strict"; | ||
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); | ||
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); | ||
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); | ||
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); | ||
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } | ||
@@ -47,7 +47,21 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } | ||
}; | ||
this.exportCSV = function (request, response, next) { | ||
var params = request.query; | ||
var recordsExporter = new Implementation.ResourcesExporter(model, lianaOptions, params, null, request.user); | ||
return new CSVExporter(params, response, modelName, recordsExporter).perform()["catch"](next); | ||
}; | ||
this.exportCSV = /*#__PURE__*/function () { | ||
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(request, response, next) { | ||
var params, recordsExporter; | ||
return _regenerator["default"].wrap(function _callee$(_context) { | ||
while (1) switch (_context.prev = _context.next) { | ||
case 0: | ||
params = request.query; | ||
recordsExporter = new Implementation.ResourcesExporter(model, lianaOptions, params, null, request.user); | ||
return _context.abrupt("return", new CSVExporter(params, response, modelName, recordsExporter).perform()["catch"](next)); | ||
case 3: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
}, _callee); | ||
})); | ||
return function (_x, _x2, _x3) { | ||
return _ref2.apply(this, arguments); | ||
}; | ||
}(); | ||
this.get = function (request, response, next) { | ||
@@ -87,6 +101,6 @@ return new Implementation.ResourceGetter(model, _objectSpread(_objectSpread({}, request.query), {}, { | ||
this.remove = /*#__PURE__*/function () { | ||
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(request, response, next) { | ||
var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(request, response, next) { | ||
var remover; | ||
return _regenerator["default"].wrap(function _callee$(_context) { | ||
while (1) switch (_context.prev = _context.next) { | ||
return _regenerator["default"].wrap(function _callee2$(_context2) { | ||
while (1) switch (_context2.prev = _context2.next) { | ||
case 0: | ||
@@ -96,53 +110,53 @@ remover = new Implementation.ResourceRemover(model, _objectSpread(_objectSpread({}, request.query), {}, { | ||
}), request.user); | ||
_context.prev = 1; | ||
_context.next = 4; | ||
_context2.prev = 1; | ||
_context2.next = 4; | ||
return remover.perform(); | ||
case 4: | ||
response.status(204).send(); | ||
_context.next = 10; | ||
_context2.next = 10; | ||
break; | ||
case 7: | ||
_context.prev = 7; | ||
_context.t0 = _context["catch"](1); | ||
next(_context.t0); | ||
_context2.prev = 7; | ||
_context2.t0 = _context2["catch"](1); | ||
next(_context2.t0); | ||
case 10: | ||
case "end": | ||
return _context.stop(); | ||
return _context2.stop(); | ||
} | ||
}, _callee, null, [[1, 7]]); | ||
}, _callee2, null, [[1, 7]]); | ||
})); | ||
return function (_x, _x2, _x3) { | ||
return _ref2.apply(this, arguments); | ||
return function (_x4, _x5, _x6) { | ||
return _ref3.apply(this, arguments); | ||
}; | ||
}(); | ||
this.removeMany = /*#__PURE__*/function () { | ||
var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(request, response, next) { | ||
var _ref4 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(request, response, next) { | ||
var getter, ids; | ||
return _regenerator["default"].wrap(function _callee2$(_context2) { | ||
while (1) switch (_context2.prev = _context2.next) { | ||
return _regenerator["default"].wrap(function _callee3$(_context3) { | ||
while (1) switch (_context3.prev = _context3.next) { | ||
case 0: | ||
getter = new RecordsGetter(model, request.user, request.query); | ||
_context2.next = 3; | ||
_context3.next = 3; | ||
return getter.getIdsFromRequest(request); | ||
case 3: | ||
ids = _context2.sent; | ||
_context2.prev = 4; | ||
_context2.next = 7; | ||
ids = _context3.sent; | ||
_context3.prev = 4; | ||
_context3.next = 7; | ||
return new Implementation.ResourcesRemover(model, request.query, ids, request.user).perform(); | ||
case 7: | ||
response.status(204).send(); | ||
_context2.next = 13; | ||
_context3.next = 13; | ||
break; | ||
case 10: | ||
_context2.prev = 10; | ||
_context2.t0 = _context2["catch"](4); | ||
next(_context2.t0); | ||
_context3.prev = 10; | ||
_context3.t0 = _context3["catch"](4); | ||
next(_context3.t0); | ||
case 13: | ||
case "end": | ||
return _context2.stop(); | ||
return _context3.stop(); | ||
} | ||
}, _callee2, null, [[4, 10]]); | ||
}, _callee3, null, [[4, 10]]); | ||
})); | ||
return function (_x4, _x5, _x6) { | ||
return _ref3.apply(this, arguments); | ||
return function (_x7, _x8, _x9) { | ||
return _ref4.apply(this, arguments); | ||
}; | ||
@@ -149,0 +163,0 @@ }(); |
"use strict"; | ||
var P = require('bluebird'); | ||
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'); | ||
var _require = require('@forestadmin/context'), | ||
inject = _require.inject; | ||
// eslint-disable-next-line import/no-unresolved | ||
var _require = require('csv-stringify/sync'), | ||
stringify = _require.stringify; | ||
var _require2 = require('@forestadmin/context'), | ||
inject = _require2.inject; | ||
var ParamsFieldsDeserializer = require('../deserializers/params-fields'); | ||
@@ -13,3 +17,3 @@ var SmartFieldsValuesInjector = require('./smart-fields-values-injector'); | ||
var CSV_OPTIONS = { | ||
formatters: { | ||
cast: { | ||
date: function date(value) { | ||
@@ -23,56 +27,79 @@ return moment(value).format(); | ||
configStore = _inject.configStore; | ||
this.perform = function () { | ||
var 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()); | ||
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 || ''; | ||
} | ||
// 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'); | ||
var CSVHeader = "".concat(params.header, "\n"); | ||
var CSVAttributes = params.fields[modelName].split(','); | ||
response.write(CSVHeader); | ||
var fieldsPerModel = new ParamsFieldsDeserializer(params.fields).perform(); | ||
return recordsExporter.perform(function (records) { | ||
return P.map(records, function (record) { | ||
return new SmartFieldsValuesInjector(record, modelName, fieldsPerModel).perform(); | ||
}).then(function (recordsWithSmartFieldsValues) { | ||
return new P(function (resolve) { | ||
if (configStore.Implementation.Flattener) { | ||
recordsWithSmartFieldsValues = configStore.Implementation.Flattener.flattenRecordsForExport(modelName, recordsWithSmartFieldsValues); | ||
} | ||
var CSVLines = []; | ||
recordsWithSmartFieldsValues.forEach(function (record) { | ||
var CSVLine = []; | ||
CSVAttributes.forEach(function (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; | ||
} | ||
// 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(); | ||
} | ||
} else { | ||
value = record[attribute]; | ||
} | ||
CSVLine.push(value || ''); | ||
}); | ||
CSVLines.push(CSVLine); | ||
}); | ||
stringify(CSVLines, CSV_OPTIONS, function (error, csv) { | ||
response.write(csv); | ||
resolve(); | ||
}); | ||
}); | ||
}); | ||
}).then(function () { | ||
response.end(); | ||
}); | ||
}; | ||
}, _callee); | ||
})); | ||
return function (_x) { | ||
return _ref2.apply(this, arguments); | ||
}; | ||
}()); | ||
case 12: | ||
response.end(); | ||
case 13: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
}, _callee2); | ||
})); | ||
} | ||
module.exports = CSVExporter; |
@@ -7,3 +7,2 @@ "use strict"; | ||
var _ = require('lodash'); | ||
var P = require('bluebird'); | ||
var logger = require('./logger'); | ||
@@ -80,40 +79,53 @@ var Schemas = require('../generators/schemas'); | ||
} | ||
this.perform = function () { | ||
return P.each(schema.fields, function (field) { | ||
var fieldWasRequested = isRequestedField(requestedField || modelName, field.field); | ||
if (record && field.isVirtual && (field.get || field.value)) { | ||
if (fieldsPerModel && !fieldWasRequested) { | ||
return null; | ||
} | ||
return setSmartFieldValue(record, field, modelName); | ||
// eslint-disable-next-line sonarjs/cognitive-complexity | ||
function injectSmartFieldValue(field) { | ||
var fieldWasRequested = isRequestedField(requestedField || modelName, field.field); | ||
if (record && field.isVirtual && (field.get || field.value)) { | ||
if (fieldsPerModel && !fieldWasRequested) { | ||
return null; | ||
} | ||
if (!record[field.field] && _.isArray(field.type) && (field.relationship || field.isVirtual)) { | ||
// Add empty arrays on relation fields so that JsonApiSerializer add the relevant | ||
// `data.x.relationships` section in the response. | ||
// | ||
// The field must match the following condition | ||
// - field is a real or a smart HasMany / BelongsToMany relation | ||
// - field is NOT an 'embedded' relationship (@see mongoose) | ||
return setSmartFieldValue(record, field, modelName); | ||
} | ||
if (!record[field.field] && _.isArray(field.type) && (field.relationship || field.isVirtual)) { | ||
// Add empty arrays on relation fields so that JsonApiSerializer add the relevant | ||
// `data.x.relationships` section in the response. | ||
// | ||
// The field must match the following condition | ||
// - field is a real or a smart HasMany / BelongsToMany relation | ||
// - field is NOT an 'embedded' relationship (@see mongoose) | ||
record[field.field] = []; | ||
} else if (field.reference && !_.isArray(field.type)) { | ||
// NOTICE: Set Smart Fields values to "belongsTo" associated records. | ||
var modelNameAssociation = getReferencedModelName(field); | ||
var schemaAssociation = Schemas.schemas[modelNameAssociation]; | ||
if (schemaAssociation && !_.isArray(field.type)) { | ||
return P.each(schemaAssociation.fields, function (fieldAssociation) { | ||
if (record && record[field.field] && fieldAssociation.isVirtual && (fieldAssociation.get || fieldAssociation.value)) { | ||
if (fieldsPerModel && !isRequestedField(field.field, fieldAssociation.field)) { | ||
return null; | ||
} | ||
return setSmartFieldValue(record[field.field], fieldAssociation, modelNameAssociation); | ||
record[field.field] = []; | ||
} else if (field.reference && !_.isArray(field.type)) { | ||
// NOTICE: Set Smart Fields values to "belongsTo" associated records. | ||
var modelNameAssociation = getReferencedModelName(field); | ||
var schemaAssociation = Schemas.schemas[modelNameAssociation]; | ||
if (schemaAssociation && !_.isArray(field.type)) { | ||
return Promise.all(schemaAssociation.fields.map(function (fieldAssociation) { | ||
if (record && record[field.field] && fieldAssociation.isVirtual && (fieldAssociation.get || fieldAssociation.value)) { | ||
if (fieldsPerModel && !isRequestedField(field.field, fieldAssociation.field)) { | ||
return null; | ||
} | ||
return null; | ||
}); | ||
} | ||
return setSmartFieldValue(record[field.field], fieldAssociation, modelNameAssociation); | ||
} | ||
return null; | ||
})); | ||
} | ||
return null; | ||
}).thenReturn(record); | ||
}; | ||
} | ||
return null; | ||
} | ||
this.perform = /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() { | ||
return _regenerator["default"].wrap(function _callee2$(_context2) { | ||
while (1) switch (_context2.prev = _context2.next) { | ||
case 0: | ||
return _context2.abrupt("return", Promise.all(schema.fields.map(function (field) { | ||
return injectSmartFieldValue(field); | ||
}))); | ||
case 1: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
}, _callee2); | ||
})); | ||
} | ||
module.exports = SmartFieldsValuesInjector; |
{ | ||
"name": "forest-express", | ||
"description": "Official package for all Forest Express Lianas", | ||
"version": "10.2.18", | ||
"version": "10.2.19", | ||
"author": "Sandro Munda <sandro@munda.me>", | ||
@@ -38,3 +38,3 @@ "contributors": [ | ||
"cors": "2.8.5", | ||
"csv-stringify": "1.0.4", | ||
"csv-stringify": "6.5.0", | ||
"express": "^4.18.2", | ||
@@ -41,0 +41,0 @@ "express-jwt": "8.4.1", |
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
902304
17581
+ Addedcsv-stringify@6.5.0(transitive)
- Removedcsv-stringify@1.0.4(transitive)
- Removedlodash.get@4.4.2(transitive)
Updatedcsv-stringify@6.5.0